blob: 15d440e5cf1328112409fcf89e39371efd7a28f8 [file] [log] [blame]
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[1]
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")
}
}
func Test_TestifySuite(t *testing.T) {
suites, err := loadGotest("data/gotest-testify-suite.out", t)
if err != nil {
t.Fatalf("Failed to parse")
}
if len(suites) != 2 {
t.Fatalf("Wrong number of suites", len(suites))
}
}