// 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(len(helper.calls), 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(len(helper.calls), 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 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(len(helper.calls), 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 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(len(helper.calls), 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 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(len(helper.calls), 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 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(len(helper.calls), 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 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(len(helper.calls), 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(len(helper.calls), 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(len(helper.calls), 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(len(helper.calls), 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(len(helper.calls), 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(len(helper.calls), 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(len(helper.calls), 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(len(helper.calls), Equals, 6)
	c.Assert(result.Skipped, Equals, 1)
}
