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