package main

import (
	"os"
	"testing"
)

func Test_NumFailed(t *testing.T) {
	suite := &Suite{
		Tests: []*Test{},
	}
	if suite.NumFailed() != 0 {
		t.Fatal("found more than 1 failure in empty list")
	}

	suite.Tests = []*Test{
		&Test{Failed: false},
		&Test{Failed: true},
		&Test{Failed: false},
	}

	if suite.NumFailed() != 1 {
		t.Fatal("can't count")
	}
}

func loadGotest(filename string, t *testing.T) ([]*Suite, error) {
	file, err := os.Open(filename)
	if err != nil {
		t.Fatalf("can't open %s - %s", filename, err)
	}

	return gt_Parse(file)
}

func Test_parseOutput(t *testing.T) {
	filename := "data/gotest.out"
	suites, err := loadGotest(filename, t)
	if err != nil {
		t.Fatalf("error loading %s - %s", filename, err)
	}

	numSuites := 2
	if len(suites) != numSuites {
		t.Fatalf("got %d suites instead of %d", len(suites), numSuites)
	}
	if suites[0].Name != "_/home/miki/Projects/goroot/src/xunit" {
		t.Fatalf("bad Suite name %s, expected _/home/miki/Projects/goroot/src/xunit", suites[0].Name)
	}
	if suites[1].Name != "_/home/miki/Projects/goroot/src/anotherTest" {
		t.Fatalf("bad Suite name %s, expected _/home/miki/Projects/goroot/src/anotherTest", suites[1].Name)
	}

	suite := suites[0]
	tests := suite.Tests
	numTests := 5
	if len(tests) != numTests {
		t.Fatalf("got %d tests instead of %d", len(tests), numTests)
	}

	numFailed := 1
	if suite.NumFailed() != numFailed {
		t.Fatalf("wrong number of failed %d, should be %d", suite.NumFailed(), numFailed)
	}

	numSkipped := 1
	if suite.NumSkipped() != numSkipped {
		t.Fatalf("wrong number of skipped %d, should be %d", suite.NumSkipped(), numSkipped)
	}

	test := tests[0]
	if test.Name != "TestAdd" {
		t.Fatalf("bad test name %s, expected TestAdd", test.Name)
	}

	if test.Time != "0.00" {
		t.Fatalf("bad test time %s, expected 0.00", test.Time)
	}

	if len(test.Message) != 0 {
		t.Fatalf("bad message (should be empty): %s", test.Message)
	}

	suite = suites[1]
	tests = suite.Tests
	numTests = 1
	if len(tests) != numTests {
		t.Fatalf("got %d tests instead of %d", len(tests), numTests)
	}

	numFailed = 0
	if suite.NumFailed() != numFailed {
		t.Fatalf("wrong number of failed %d, should be %d", suite.NumFailed(), numFailed)
	}

	test = tests[0]
	if test.Name != "TestAdd" {
		t.Fatalf("bad test name %s, expected TestAdd", test.Name)
	}

	if test.Time != "0.00" {
		t.Fatalf("bad test time %s, expected 0.00", test.Time)
	}

	if len(test.Message) != 0 {
		t.Fatalf("bad message (should be empty): %s", test.Message)
	}
}

func Test_parseOutputBad(t *testing.T) {
	filename := "go2xunit.go"
	suites, err := loadGotest(filename, t)
	if err != nil {
		t.Fatalf("error loading %s - %s", filename, err)
	}
	if len(suites) > 0 {
		t.Fatalf("managed to find suites in junk")
	}
}

func Test_parseDatarace(t *testing.T) {
	failOnRace = true
	filename := "data/gotest-datarace.out"
	suites, err := loadGotest(filename, t)
	if err != nil {
		t.Fatalf("error loading %s - %s", filename, err)
	}

	suite := suites[0]
	tests := suite.Tests
	numTests := 1
	if len(tests) != numTests {
		t.Fatalf("got %d tests instead of %d", len(tests), numTests)
	}

	expectedMessage := "WARNING: DATA RACE"
	for i, test := range suite.Tests {
		if test.Message != expectedMessage {
			t.Errorf(
				"test %v message does not match expected result:\n\tGot: \"%v\"\n\tExpected: \"%v\"\n",
				i,
				test.Message,
				expectedMessage)
		}
	}
	numFailed := 1
	if suite.NumFailed() != numFailed {
		t.Fatalf("wrong number of failed %d, should be %d", suite.NumFailed(), numFailed)
	}
	failOnRace = false
}

func Test_ignoreDatarace(t *testing.T) {
	filename := "data/gotest-datarace.out"
	suites, err := loadGotest(filename, t)
	if err != nil {
		t.Fatalf("error loading %s - %s", filename, err)
	}

	suite := suites[0]
	tests := suite.Tests
	numTests := 1
	if len(tests) != numTests {
		t.Fatalf("got %d tests instead of %d", len(tests), numTests)
	}

	expectedMessage := "WARNING: DATA RACE"
	for i, test := range suite.Tests {
		if test.Message != expectedMessage {
			t.Errorf(
				"test %v message does not match expected result:\n\tGot: \"%v\"\n\tExpected: \"%v\"\n",
				i,
				test.Message,
				expectedMessage)
		}
	}
	numFailed := 0
	if suite.NumFailed() != numFailed {
		t.Fatalf("wrong number of failed %d, should be %d", suite.NumFailed(), numFailed)
	}
}

func Test_parseLogOutput(t *testing.T) {
	filename := "data/gotest-log.out"
	suites, err := loadGotest(filename, t)
	if err != nil {
		t.Fatalf("error loading %s - %s", filename, err)
	}

	suite := suites[0]
	tests := suite.Tests
	numTests := 1
	if len(tests) != numTests {
		t.Fatalf("got %d tests instead of %d", len(tests), numTests)
	}

	expectedMessage := "Log output."
	for i, test := range suite.Tests {
		if test.Message != expectedMessage {
			t.Errorf(
				"test %v message does not match expected result:\n\tGot: \"%v\"\n\tExpected: \"%v\"\n",
				i,
				test.Message,
				expectedMessage)
		}
	}
}

func Test_parsePanicOutput(t *testing.T) {
	filename := "data/gotest-panic.out"
	suites, err := loadGotest(filename, t)
	if err != nil {
		t.Fatalf("error loading %s - %s", filename, err)
	}

	suite := suites[0]
	tests := suite.Tests
	numTests := 1
	if len(tests) != numTests {
		t.Fatalf("got %d tests instead of %d", len(tests), numTests)
	}

	expectedMessage := "fatal error: all goroutines are asleep - deadlock!\n..."
	test := tests[0]
	if test.Message != expectedMessage {
		t.Errorf(
			"test message does not match expected result:\n\tGot: \"%v\"\n\tExpected: \"%v\"\n",
			test.Message,
			expectedMessage)
	}
}

func Test_parseEmptySuite(t *testing.T) {
	filename := "data/gotest-empty.out"
	suites, err := loadGotest(filename, t)
	if err != nil {
		t.Fatalf("error loading %s - %s", filename, err)
	}

	suite := suites[0]
	tests := suite.Tests
	numTests := 0
	if len(tests) != numTests {
		t.Fatalf("got %d tests instead of %d", len(tests), numTests)
	}
}

func Test_parseGocheckPass(t *testing.T) {
	filename := "data/gocheck-pass.out"
	file, err := os.Open(filename)
	if err != nil {
		t.Fatalf("can't open %s - %s", filename, err)
	}

	suites, err := gc_Parse(file)

	if err != nil {
		t.Fatalf("can't parse %s - %s", filename, err)
	}

	nsuites := 1
	if len(suites) != nsuites {
		t.Fatalf("bad number of suites %d != %d", len(suites), nsuites)
	}

	suite := suites[0]
	ntests := 3
	if len(suite.Tests) != ntests {
		t.Fatalf("bad number of tests %d != %d", len(suite.Tests), ntests)
	}

	name := "MySuite"
	if suite.Name != name {
		t.Fatalf("bad suite name %s != %s", suite.Name, name)
	}

	if suite.NumFailed() > 0 {
		t.Fatalf("suite failed, should have passed")
	}
}

func Test_parseGocheckFail(t *testing.T) {
	filename := "data/gocheck-fail.out"
	file, err := os.Open(filename)
	if err != nil {
		t.Fatalf("can't open %s - %s", filename, err)
	}

	suites, err := gc_Parse(file)

	if err != nil {
		t.Fatalf("can't parse %s - %s", filename, err)
	}

	nsuites := 2
	if len(suites) != nsuites {
		t.Fatalf("bad number of suites %d != %d", len(suites), nsuites)
	}

	suite := suites[0]
	ntests := 3
	if len(suite.Tests) != ntests {
		t.Fatalf("bad number of tests %d != %d", len(suite.Tests), ntests)
	}

	name := "MySuite"
	if suite.Name != name {
		t.Fatalf("bad suite name %s != %s", suite.Name, name)
	}

	nfailed := 1
	if suite.NumFailed() != nfailed {
		t.Fatalf("num failed differ %d != %d", suite.NumFailed(), nfailed)
	}
}

func Test_NoFiles(t *testing.T) {
	filename := "data/gotest-nofiles.out"
	suites, err := loadGotest(filename, t)

	if err != nil {
		t.Fatalf("error loading %s - %s", filename, err)
	}

	count := 1
	if len(suites) != count {
		t.Fatalf("bad number of suites. expected %d got %d", count, len(suites))
	}
}

func Test_Multi(t *testing.T) {
	filename := "data/gotest-multi.out"
	suites, err := loadGotest(filename, t)
	if err != nil {
		t.Fatalf("error loading %s - %s", filename, err)
	}

	count := 1
	if len(suites) != count {
		t.Fatalf("bad number of suites. expected %d got %d", count, len(suites))
	}
}

func Test_ThatMessageIsParsedCorrectly_WhenThereIsAnErrorWithinTheLastTestInSuite(t *testing.T) {
	filename := "data/gotest-multierror.out"
	suites, err := loadGotest(filename, t)
	if err != nil {
		t.Fatalf("error loading %s - %s", filename, err)
	}

	count := 1
	if len(suites) != count {
		t.Fatalf("bad number of suites. expected %d got %d", count, len(suites))
	}

	suite := suites[0]

	if len(suite.Tests) != 2 {
		t.Fatalf("bad number of tests. expected %d got %d", 2, len(suite.Tests))
	}

	expectedMessages := []string{
		"\tmain_test.go:10: something went wrong",
		"\tmain_test.go:14: something new went wrong",
	}

	for i, test := range suite.Tests {
		if test.Message != expectedMessages[i] {
			t.Errorf(
				"test %v message does not match expected result:\n\tGot: \"%v\"\n\tExpected: \"%v\"\n",
				i,
				test.Message,
				expectedMessages[i])
		}
	}
}

func Test_parseBuildFailed(t *testing.T) {
	_, err := loadGotest("data/gotest-buildfailed.out", t)
	if err == nil {
		t.Fatalf("expected error when at least one package failed to build")
	}
}

func Test_nameWithNum(t *testing.T) {
	_, err := loadGotest("data/gotest-num.out", t)
	if err != nil {
		t.Fatalf("didn't parse name with number")
	}
}

func Test_0Time(t *testing.T) {
	suites, err := loadGotest("data/gotest-0.out", t)
	if err != nil {
		t.Fatalf("didn't parse name with number")
	}

	if len(suites) != 1 {
		t.Fatalf("bad number of suites - %d", len(suites))
	}

	suite := suites[0]
	if suite.Count() != 2 {
		t.Fatalf("bad number of tests. expected %d got %d", 2, len(suite.Tests))
	}
	if suite.NumFailed() != 0 {
		t.Fatalf("unexpected failure")
	}
}
