// 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)
}
