Log expected failures in verbose mode, and present them in the status line.
diff --git a/foundation_test.go b/foundation_test.go
index 83adafa..fe2b724 100644
--- a/foundation_test.go
+++ b/foundation_test.go
@@ -185,26 +185,28 @@
// -----------------------------------------------------------------------
// ExpectFailure() inverts the logic of failure.
-type ExpectFailureHelper struct{}
+type ExpectFailureSucceedHelper struct{}
-func (s *ExpectFailureHelper) TestFail(c *gocheck.C) {
+func (s *ExpectFailureSucceedHelper) TestSucceed(c *gocheck.C) {
c.ExpectFailure("It booms!")
c.Error("Boom!")
}
-func (s *ExpectFailureHelper) TestSucceed(c *gocheck.C) {
+type ExpectFailureFailHelper struct{}
+
+func (s *ExpectFailureFailHelper) TestFail(c *gocheck.C) {
c.ExpectFailure("Bug #XYZ")
}
-func (s *FoundationS) TestExpectFailure(c *gocheck.C) {
- helper := ExpectFailureHelper{}
+func (s *FoundationS) TestExpectFailureFail(c *gocheck.C) {
+ helper := ExpectFailureFailHelper{}
output := String{}
- gocheck.Run(&helper, &gocheck.RunConf{Output: &output})
+ result := gocheck.Run(&helper, &gocheck.RunConf{Output: &output})
expected := "" +
"^\n-+\n" +
"FAIL: foundation_test\\.go:[0-9]+:" +
- " ExpectFailureHelper\\.TestSucceed\n\n" +
+ " ExpectFailureFailHelper\\.TestFail\n\n" +
"\\.\\.\\. Error: Test succeeded, but was expected to fail\n" +
"\\.\\.\\. Reason: Bug #XYZ\n$"
@@ -214,6 +216,36 @@
} else if !matched {
c.Error("ExpectFailure() didn't log properly:\n", output.value)
}
+
+ c.Assert(result.ExpectedFailures, gocheck.Equals, 0)
+}
+
+func (s *FoundationS) TestExpectFailureSucceed(c *gocheck.C) {
+ helper := ExpectFailureSucceedHelper{}
+ output := String{}
+ result := gocheck.Run(&helper, &gocheck.RunConf{Output: &output})
+
+ c.Assert(output.value, gocheck.Equals, "")
+ c.Assert(result.ExpectedFailures, gocheck.Equals, 1)
+}
+
+func (s *FoundationS) TestExpectFailureSucceedVerbose(c *gocheck.C) {
+ helper := ExpectFailureSucceedHelper{}
+ output := String{}
+ result := gocheck.Run(&helper, &gocheck.RunConf{Output: &output, Verbose: true})
+
+ expected := "" +
+ "FAIL EXPECTED: foundation_test\\.go:[0-9]+:" +
+ " ExpectFailureSucceedHelper\\.TestSucceed \\(It booms!\\)\n"
+
+ matched, err := regexp.MatchString(expected, output.value)
+ if err != nil {
+ c.Error("Bad expression: ", expected)
+ } else if !matched {
+ c.Error("ExpectFailure() didn't log properly:\n", output.value)
+ }
+
+ c.Assert(result.ExpectedFailures, gocheck.Equals, 1)
}
diff --git a/gocheck.go b/gocheck.go
index 791ad2b..afad53a 100644
--- a/gocheck.go
+++ b/gocheck.go
@@ -278,13 +278,14 @@
// Result tracker to aggregate call results.
type Result struct {
- Succeeded int
- Failed int
- Skipped int
- Panicked int
- FixturePanicked int
- Missed int // Not even tried to run, related to a panic in the fixture.
- RunError os.Error // Houston, we've got a problem.
+ Succeeded int
+ Failed int
+ Skipped int
+ Panicked int
+ FixturePanicked int
+ ExpectedFailures int
+ Missed int // Not even tried to run, related to a panic in the fixture.
+ RunError os.Error // Houston, we've got a problem.
}
type resultTracker struct {
@@ -333,7 +334,11 @@
switch c.status {
case succeededSt:
if c.kind == testKd {
- tracker.result.Succeeded++
+ if c.mustFail {
+ tracker.result.ExpectedFailures++
+ } else {
+ tracker.result.Succeeded++
+ }
}
case failedSt:
tracker.result.Failed++
@@ -677,7 +682,11 @@
runner.tracker.callDone(c)
switch c.status {
case succeededSt:
- runner.output.WriteCallSuccess("PASS", c)
+ if c.mustFail {
+ runner.output.WriteCallSuccess("FAIL EXPECTED", c)
+ } else {
+ runner.output.WriteCallSuccess("PASS", c)
+ }
case skippedSt:
runner.output.WriteCallSuccess("SKIP", c)
case failedSt:
diff --git a/run.go b/run.go
index ab83225..94847ed 100644
--- a/run.go
+++ b/run.go
@@ -109,6 +109,9 @@
if r.Skipped != 0 {
value += fmt.Sprintf(", %d skipped", r.Skipped)
}
+ if r.ExpectedFailures != 0 {
+ value += fmt.Sprintf(", %d expected failures", r.ExpectedFailures)
+ }
if r.Failed != 0 {
value += fmt.Sprintf(", %d FAILED", r.Failed)
}
@@ -116,7 +119,7 @@
value += fmt.Sprintf(", %d PANICKED", r.Panicked)
}
if r.FixturePanicked != 0 {
- value += fmt.Sprintf(", %d FIXTURE PANICKED", r.FixturePanicked)
+ value += fmt.Sprintf(", %d FIXTURE-PANICKED", r.FixturePanicked)
}
if r.Missed != 0 {
value += fmt.Sprintf(", %d MISSED", r.Missed)
diff --git a/run_test.go b/run_test.go
index 54402a5..8ac687e 100644
--- a/run_test.go
+++ b/run_test.go
@@ -147,6 +147,11 @@
c.Check(result.String(), Equals, "OK: 0 passed, 5 skipped")
}
+func (s *RunS) TestPrintExpectedFailures(c *C) {
+ result := &Result{ExpectedFailures: 5}
+ c.Check(result.String(), Equals, "OK: 0 passed, 5 expected failures")
+}
+
func (s *RunS) TestPrintPanicked(c *C) {
result := &Result{Panicked: 5}
c.Check(result.String(), Equals, "OOPS: 0 passed, 5 PANICKED")
@@ -154,7 +159,7 @@
func (s *RunS) TestPrintFixturePanicked(c *C) {
result := &Result{FixturePanicked: 5}
- c.Check(result.String(), Equals, "OOPS: 0 passed, 5 FIXTURE PANICKED")
+ c.Check(result.String(), Equals, "OOPS: 0 passed, 5 FIXTURE-PANICKED")
}
func (s *RunS) TestPrintMissed(c *C) {
@@ -163,11 +168,11 @@
}
func (s *RunS) TestPrintAll(c *C) {
- result := &Result{Succeeded: 1, Skipped: 2, Panicked: 3,
- FixturePanicked: 4, Missed: 5}
+ result := &Result{Succeeded: 1, Skipped: 2, ExpectedFailures: 3,
+ Panicked: 4, FixturePanicked: 5, Missed: 6}
c.Check(result.String(), Equals,
- "OOPS: 1 passed, 2 skipped, 3 PANICKED, "+
- "4 FIXTURE PANICKED, 5 MISSED")
+ "OOPS: 1 passed, 2 skipped, 3 expected failures, 4 PANICKED, "+
+ "5 FIXTURE-PANICKED, 6 MISSED")
}
func (s *RunS) TestPrintRunError(c *C) {