| // Tests for the behavior of the test fixture system. | |
| package gocheck_test | |
| import ( | |
| . "launchpad.net/gocheck" | |
| ) | |
| // ----------------------------------------------------------------------- | |
| // Fixture test suite. | |
| type FixtureS struct{} | |
| var fixtureS = Suite(&FixtureS{}) | |
| func (s *FixtureS) TestCountSuite(c *C) { | |
| suitesRun += 1 | |
| } | |
| // ----------------------------------------------------------------------- | |
| // Basic fixture ordering verification. | |
| func (s *FixtureS) TestOrder(c *C) { | |
| helper := FixtureHelper{} | |
| Run(&helper, nil) | |
| c.Check(helper.calls[0], Equals, "SetUpSuite") | |
| c.Check(helper.calls[1], Equals, "SetUpTest") | |
| c.Check(helper.calls[2], Equals, "Test1") | |
| c.Check(helper.calls[3], Equals, "TearDownTest") | |
| c.Check(helper.calls[4], Equals, "SetUpTest") | |
| c.Check(helper.calls[5], Equals, "Test2") | |
| c.Check(helper.calls[6], Equals, "TearDownTest") | |
| c.Check(helper.calls[7], Equals, "TearDownSuite") | |
| c.Check(helper.n, Equals, 8) | |
| } | |
| // ----------------------------------------------------------------------- | |
| // Check the behavior when panics occur within tests and fixtures. | |
| func (s *FixtureS) TestPanicOnTest(c *C) { | |
| helper := FixtureHelper{panicOn: "Test1"} | |
| output := String{} | |
| Run(&helper, &RunConf{Output: &output}) | |
| c.Check(helper.calls[0], Equals, "SetUpSuite") | |
| c.Check(helper.calls[1], Equals, "SetUpTest") | |
| c.Check(helper.calls[2], Equals, "Test1") | |
| c.Check(helper.calls[3], Equals, "TearDownTest") | |
| c.Check(helper.calls[4], Equals, "SetUpTest") | |
| c.Check(helper.calls[5], Equals, "Test2") | |
| c.Check(helper.calls[6], Equals, "TearDownTest") | |
| c.Check(helper.calls[7], Equals, "TearDownSuite") | |
| c.Check(helper.n, Equals, 8) | |
| expected := "^\n-+\n" + | |
| "PANIC: gocheck_test\\.go:[0-9]+: FixtureHelper.Test1\n\n" + | |
| "\\.\\.\\. Panic: Test1 \\(PC=[xA-F0-9]+\\)\n\n" + | |
| ".+:[0-9]+\n" + | |
| " in runtime.panic\n" + | |
| ".*gocheck_test.go:[0-9]+\n" + | |
| " in FixtureHelper.trace\n" + | |
| ".*gocheck_test.go:[0-9]+\n" + | |
| " in FixtureHelper.Test1\n$" | |
| c.Check(output.value, Matches, expected) | |
| } | |
| func (s *FixtureS) TestPanicOnSetUpTest(c *C) { | |
| helper := FixtureHelper{panicOn: "SetUpTest"} | |
| output := String{} | |
| Run(&helper, &RunConf{Output: &output}) | |
| c.Check(helper.calls[0], Equals, "SetUpSuite") | |
| c.Check(helper.calls[1], Equals, "SetUpTest") | |
| c.Check(helper.calls[2], Equals, "TearDownTest") | |
| c.Check(helper.calls[3], Equals, "TearDownSuite") | |
| c.Check(helper.n, Equals, 4) | |
| expected := "^\n-+\n" + | |
| "PANIC: gocheck_test\\.go:[0-9]+: " + | |
| "FixtureHelper\\.SetUpTest\n\n" + | |
| "\\.\\.\\. Panic: SetUpTest \\(PC=[xA-F0-9]+\\)\n\n" + | |
| ".+:[0-9]+\n" + | |
| " in runtime.panic\n" + | |
| ".*gocheck_test.go:[0-9]+\n" + | |
| " in FixtureHelper.trace\n" + | |
| ".*gocheck_test.go:[0-9]+\n" + | |
| " in FixtureHelper.SetUpTest\n" + | |
| "\n-+\n" + | |
| "PANIC: gocheck_test\\.go:[0-9]+: " + | |
| "FixtureHelper\\.Test1\n\n" + | |
| "\\.\\.\\. Panic: Fixture has panicked " + | |
| "\\(see related PANIC\\)\n$" | |
| c.Check(output.value, Matches, expected) | |
| } | |
| func (s *FixtureS) TestPanicOnTearDownTest(c *C) { | |
| helper := FixtureHelper{panicOn: "TearDownTest"} | |
| output := String{} | |
| Run(&helper, &RunConf{Output: &output}) | |
| c.Check(helper.calls[0], Equals, "SetUpSuite") | |
| c.Check(helper.calls[1], Equals, "SetUpTest") | |
| c.Check(helper.calls[2], Equals, "Test1") | |
| c.Check(helper.calls[3], Equals, "TearDownTest") | |
| c.Check(helper.calls[4], Equals, "TearDownSuite") | |
| c.Check(helper.n, Equals, 5) | |
| expected := "^\n-+\n" + | |
| "PANIC: gocheck_test\\.go:[0-9]+: " + | |
| "FixtureHelper.TearDownTest\n\n" + | |
| "\\.\\.\\. Panic: TearDownTest \\(PC=[xA-F0-9]+\\)\n\n" + | |
| ".+:[0-9]+\n" + | |
| " in runtime.panic\n" + | |
| ".*gocheck_test.go:[0-9]+\n" + | |
| " in FixtureHelper.trace\n" + | |
| ".*gocheck_test.go:[0-9]+\n" + | |
| " in FixtureHelper.TearDownTest\n" + | |
| "\n-+\n" + | |
| "PANIC: gocheck_test\\.go:[0-9]+: " + | |
| "FixtureHelper\\.Test1\n\n" + | |
| "\\.\\.\\. Panic: Fixture has panicked " + | |
| "\\(see related PANIC\\)\n$" | |
| c.Check(output.value, Matches, expected) | |
| } | |
| func (s *FixtureS) TestPanicOnSetUpSuite(c *C) { | |
| helper := FixtureHelper{panicOn: "SetUpSuite"} | |
| output := String{} | |
| Run(&helper, &RunConf{Output: &output}) | |
| c.Check(helper.calls[0], Equals, "SetUpSuite") | |
| c.Check(helper.calls[1], Equals, "TearDownSuite") | |
| c.Check(helper.n, Equals, 2) | |
| expected := "^\n-+\n" + | |
| "PANIC: gocheck_test\\.go:[0-9]+: " + | |
| "FixtureHelper.SetUpSuite\n\n" + | |
| "\\.\\.\\. Panic: SetUpSuite \\(PC=[xA-F0-9]+\\)\n\n" + | |
| ".+:[0-9]+\n" + | |
| " in runtime.panic\n" + | |
| ".*gocheck_test.go:[0-9]+\n" + | |
| " in FixtureHelper.trace\n" + | |
| ".*gocheck_test.go:[0-9]+\n" + | |
| " in FixtureHelper.SetUpSuite\n$" | |
| c.Check(output.value, Matches, expected) | |
| } | |
| func (s *FixtureS) TestPanicOnTearDownSuite(c *C) { | |
| helper := FixtureHelper{panicOn: "TearDownSuite"} | |
| output := String{} | |
| Run(&helper, &RunConf{Output: &output}) | |
| c.Check(helper.calls[0], Equals, "SetUpSuite") | |
| c.Check(helper.calls[1], Equals, "SetUpTest") | |
| c.Check(helper.calls[2], Equals, "Test1") | |
| c.Check(helper.calls[3], Equals, "TearDownTest") | |
| c.Check(helper.calls[4], Equals, "SetUpTest") | |
| c.Check(helper.calls[5], Equals, "Test2") | |
| c.Check(helper.calls[6], Equals, "TearDownTest") | |
| c.Check(helper.calls[7], Equals, "TearDownSuite") | |
| c.Check(helper.n, Equals, 8) | |
| expected := "^\n-+\n" + | |
| "PANIC: gocheck_test\\.go:[0-9]+: " + | |
| "FixtureHelper.TearDownSuite\n\n" + | |
| "\\.\\.\\. Panic: TearDownSuite \\(PC=[xA-F0-9]+\\)\n\n" + | |
| ".+:[0-9]+\n" + | |
| " in runtime.panic\n" + | |
| ".*gocheck_test.go:[0-9]+\n" + | |
| " in FixtureHelper.trace\n" + | |
| ".*gocheck_test.go:[0-9]+\n" + | |
| " in FixtureHelper.TearDownSuite\n$" | |
| c.Check(output.value, Matches, expected) | |
| } | |
| // ----------------------------------------------------------------------- | |
| // A wrong argument on a test or fixture will produce a nice error. | |
| func (s *FixtureS) TestPanicOnWrongTestArg(c *C) { | |
| helper := WrongTestArgHelper{} | |
| output := String{} | |
| Run(&helper, &RunConf{Output: &output}) | |
| c.Check(helper.calls[0], Equals, "SetUpSuite") | |
| c.Check(helper.calls[1], Equals, "SetUpTest") | |
| c.Check(helper.calls[2], Equals, "TearDownTest") | |
| c.Check(helper.calls[3], Equals, "SetUpTest") | |
| c.Check(helper.calls[4], Equals, "Test2") | |
| c.Check(helper.calls[5], Equals, "TearDownTest") | |
| c.Check(helper.calls[6], Equals, "TearDownSuite") | |
| c.Check(helper.n, Equals, 7) | |
| expected := "^\n-+\n" + | |
| "PANIC: fixture_test\\.go:[0-9]+: " + | |
| "WrongTestArgHelper\\.Test1\n\n" + | |
| "\\.\\.\\. Panic: WrongTestArgHelper\\.Test1 argument " + | |
| "should be \\*gocheck\\.C\n" | |
| c.Check(output.value, Matches, expected) | |
| } | |
| func (s *FixtureS) TestPanicOnWrongSetUpTestArg(c *C) { | |
| helper := WrongSetUpTestArgHelper{} | |
| output := String{} | |
| Run(&helper, &RunConf{Output: &output}) | |
| c.Check(helper.n, Equals, 0) | |
| expected := | |
| "^\n-+\n" + | |
| "PANIC: fixture_test\\.go:[0-9]+: " + | |
| "WrongSetUpTestArgHelper\\.SetUpTest\n\n" + | |
| "\\.\\.\\. Panic: WrongSetUpTestArgHelper\\.SetUpTest argument " + | |
| "should be \\*gocheck\\.C\n" | |
| c.Check(output.value, Matches, expected) | |
| } | |
| func (s *FixtureS) TestPanicOnWrongSetUpSuiteArg(c *C) { | |
| helper := WrongSetUpSuiteArgHelper{} | |
| output := String{} | |
| Run(&helper, &RunConf{Output: &output}) | |
| c.Check(helper.n, Equals, 0) | |
| expected := | |
| "^\n-+\n" + | |
| "PANIC: fixture_test\\.go:[0-9]+: " + | |
| "WrongSetUpSuiteArgHelper\\.SetUpSuite\n\n" + | |
| "\\.\\.\\. Panic: WrongSetUpSuiteArgHelper\\.SetUpSuite argument " + | |
| "should be \\*gocheck\\.C\n" | |
| c.Check(output.value, Matches, expected) | |
| } | |
| // ----------------------------------------------------------------------- | |
| // Nice errors also when tests or fixture have wrong arg count. | |
| func (s *FixtureS) TestPanicOnWrongTestArgCount(c *C) { | |
| helper := WrongTestArgCountHelper{} | |
| output := String{} | |
| Run(&helper, &RunConf{Output: &output}) | |
| c.Check(helper.calls[0], Equals, "SetUpSuite") | |
| c.Check(helper.calls[1], Equals, "SetUpTest") | |
| c.Check(helper.calls[2], Equals, "TearDownTest") | |
| c.Check(helper.calls[3], Equals, "SetUpTest") | |
| c.Check(helper.calls[4], Equals, "Test2") | |
| c.Check(helper.calls[5], Equals, "TearDownTest") | |
| c.Check(helper.calls[6], Equals, "TearDownSuite") | |
| c.Check(helper.n, Equals, 7) | |
| expected := "^\n-+\n" + | |
| "PANIC: fixture_test\\.go:[0-9]+: " + | |
| "WrongTestArgCountHelper\\.Test1\n\n" + | |
| "\\.\\.\\. Panic: WrongTestArgCountHelper\\.Test1 argument " + | |
| "should be \\*gocheck\\.C\n" | |
| c.Check(output.value, Matches, expected) | |
| } | |
| func (s *FixtureS) TestPanicOnWrongSetUpTestArgCount(c *C) { | |
| helper := WrongSetUpTestArgCountHelper{} | |
| output := String{} | |
| Run(&helper, &RunConf{Output: &output}) | |
| c.Check(helper.n, Equals, 0) | |
| expected := | |
| "^\n-+\n" + | |
| "PANIC: fixture_test\\.go:[0-9]+: " + | |
| "WrongSetUpTestArgCountHelper\\.SetUpTest\n\n" + | |
| "\\.\\.\\. Panic: WrongSetUpTestArgCountHelper\\.SetUpTest argument " + | |
| "should be \\*gocheck\\.C\n" | |
| c.Check(output.value, Matches, expected) | |
| } | |
| func (s *FixtureS) TestPanicOnWrongSetUpSuiteArgCount(c *C) { | |
| helper := WrongSetUpSuiteArgCountHelper{} | |
| output := String{} | |
| Run(&helper, &RunConf{Output: &output}) | |
| c.Check(helper.n, Equals, 0) | |
| expected := | |
| "^\n-+\n" + | |
| "PANIC: fixture_test\\.go:[0-9]+: " + | |
| "WrongSetUpSuiteArgCountHelper\\.SetUpSuite\n\n" + | |
| "\\.\\.\\. Panic: WrongSetUpSuiteArgCountHelper" + | |
| "\\.SetUpSuite argument should be \\*gocheck\\.C\n" | |
| c.Check(output.value, Matches, expected) | |
| } | |
| // ----------------------------------------------------------------------- | |
| // Helper test suites with wrong function arguments. | |
| type WrongTestArgHelper struct { | |
| FixtureHelper | |
| } | |
| func (s *WrongTestArgHelper) Test1(t int) { | |
| } | |
| type WrongSetUpTestArgHelper struct { | |
| FixtureHelper | |
| } | |
| func (s *WrongSetUpTestArgHelper) SetUpTest(t int) { | |
| } | |
| type WrongSetUpSuiteArgHelper struct { | |
| FixtureHelper | |
| } | |
| func (s *WrongSetUpSuiteArgHelper) SetUpSuite(t int) { | |
| } | |
| type WrongTestArgCountHelper struct { | |
| FixtureHelper | |
| } | |
| func (s *WrongTestArgCountHelper) Test1(c *C, i int) { | |
| } | |
| type WrongSetUpTestArgCountHelper struct { | |
| FixtureHelper | |
| } | |
| func (s *WrongSetUpTestArgCountHelper) SetUpTest(c *C, i int) { | |
| } | |
| type WrongSetUpSuiteArgCountHelper struct { | |
| FixtureHelper | |
| } | |
| func (s *WrongSetUpSuiteArgCountHelper) SetUpSuite(c *C, i int) { | |
| } | |
| // ----------------------------------------------------------------------- | |
| // Ensure fixture doesn't run without tests. | |
| type NoTestsHelper struct { | |
| hasRun bool | |
| } | |
| func (s *NoTestsHelper) SetUpSuite(c *C) { | |
| s.hasRun = true | |
| } | |
| func (s *NoTestsHelper) TearDownSuite(c *C) { | |
| s.hasRun = true | |
| } | |
| func (s *FixtureS) TestFixtureDoesntRunWithoutTests(c *C) { | |
| helper := NoTestsHelper{} | |
| output := String{} | |
| Run(&helper, &RunConf{Output: &output}) | |
| c.Check(helper.hasRun, Equals, false) | |
| } | |
| // ----------------------------------------------------------------------- | |
| // Verify that checks and assertions work correctly inside the fixture. | |
| type FixtureCheckHelper struct { | |
| fail string | |
| completed bool | |
| } | |
| func (s *FixtureCheckHelper) SetUpSuite(c *C) { | |
| switch s.fail { | |
| case "SetUpSuiteAssert": | |
| c.Assert(false, Equals, true) | |
| case "SetUpSuiteCheck": | |
| c.Check(false, Equals, true) | |
| } | |
| s.completed = true | |
| } | |
| func (s *FixtureCheckHelper) SetUpTest(c *C) { | |
| switch s.fail { | |
| case "SetUpTestAssert": | |
| c.Assert(false, Equals, true) | |
| case "SetUpTestCheck": | |
| c.Check(false, Equals, true) | |
| } | |
| s.completed = true | |
| } | |
| func (s *FixtureCheckHelper) Test(c *C) { | |
| // Do nothing. | |
| } | |
| func (s *FixtureS) TestSetUpSuiteCheck(c *C) { | |
| helper := FixtureCheckHelper{fail: "SetUpSuiteCheck"} | |
| output := String{} | |
| Run(&helper, &RunConf{Output: &output}) | |
| c.Assert(output.value, Matches, | |
| "\n---+\n"+ | |
| "FAIL: fixture_test\\.go:[0-9]+: "+ | |
| "FixtureCheckHelper\\.SetUpSuite\n\n"+ | |
| "fixture_test\\.go:[0-9]+:\n"+ | |
| " c\\.Check\\(false, Equals, true\\)\n"+ | |
| "\\.+ obtained bool = false\n"+ | |
| "\\.+ expected bool = true\n\n") | |
| c.Assert(helper.completed, Equals, true) | |
| } | |
| func (s *FixtureS) TestSetUpSuiteAssert(c *C) { | |
| helper := FixtureCheckHelper{fail: "SetUpSuiteAssert"} | |
| output := String{} | |
| Run(&helper, &RunConf{Output: &output}) | |
| c.Assert(output.value, Matches, | |
| "\n---+\n"+ | |
| "FAIL: fixture_test\\.go:[0-9]+: "+ | |
| "FixtureCheckHelper\\.SetUpSuite\n\n"+ | |
| "fixture_test\\.go:[0-9]+:\n"+ | |
| " c\\.Assert\\(false, Equals, true\\)\n"+ | |
| "\\.+ obtained bool = false\n"+ | |
| "\\.+ expected bool = true\n\n") | |
| c.Assert(helper.completed, Equals, false) | |
| } | |
| // ----------------------------------------------------------------------- | |
| // Verify that logging within SetUpTest() persists within the test log itself. | |
| type FixtureLogHelper struct { | |
| c *C | |
| } | |
| func (s *FixtureLogHelper) SetUpTest(c *C) { | |
| s.c = c | |
| c.Log("1") | |
| } | |
| func (s *FixtureLogHelper) Test(c *C) { | |
| c.Log("2") | |
| s.c.Log("3") | |
| c.Log("4") | |
| c.Fail() | |
| } | |
| func (s *FixtureLogHelper) TearDownTest(c *C) { | |
| s.c.Log("5") | |
| } | |
| func (s *FixtureS) TestFixtureLogging(c *C) { | |
| helper := FixtureLogHelper{} | |
| output := String{} | |
| Run(&helper, &RunConf{Output: &output}) | |
| c.Assert(output.value, Matches, | |
| "\n---+\n"+ | |
| "FAIL: fixture_test\\.go:[0-9]+: "+ | |
| "FixtureLogHelper\\.Test\n\n"+ | |
| "1\n2\n3\n4\n5\n") | |
| } | |
| // ----------------------------------------------------------------------- | |
| // Skip() within fixture methods. | |
| func (s *FixtureS) TestSkipSuite(c *C) { | |
| helper := FixtureHelper{skip: true, skipOnN: 0} | |
| output := String{} | |
| result := Run(&helper, &RunConf{Output: &output}) | |
| c.Assert(output.value, Equals, "") | |
| c.Assert(helper.calls[0], Equals, "SetUpSuite") | |
| c.Assert(helper.calls[1], Equals, "TearDownSuite") | |
| c.Assert(helper.n, Equals, 2) | |
| c.Assert(result.Skipped, Equals, 2) | |
| } | |
| func (s *FixtureS) TestSkipTest(c *C) { | |
| helper := FixtureHelper{skip: true, skipOnN: 1} | |
| output := String{} | |
| result := Run(&helper, &RunConf{Output: &output}) | |
| c.Assert(helper.calls[0], Equals, "SetUpSuite") | |
| c.Assert(helper.calls[1], Equals, "SetUpTest") | |
| c.Assert(helper.calls[2], Equals, "SetUpTest") | |
| c.Assert(helper.calls[3], Equals, "Test2") | |
| c.Assert(helper.calls[4], Equals, "TearDownTest") | |
| c.Assert(helper.calls[5], Equals, "TearDownSuite") | |
| c.Assert(helper.n, Equals, 6) | |
| c.Assert(result.Skipped, Equals, 1) | |
| } |