mirror of https://github.com/stretchr/testify.git
parent
de7fcff264
commit
9b60631791
|
@ -0,0 +1,43 @@
|
||||||
|
package is
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// decorate prefixes the string with the file and line of the call site
|
||||||
|
// and inserts the final newline if needed and indentation tabs for formatting.
|
||||||
|
// this function was copied from the testing framework.
|
||||||
|
func decorate(s string) string {
|
||||||
|
_, file, line, ok := runtime.Caller(3) // decorate + log + public function.
|
||||||
|
if ok {
|
||||||
|
// Truncate file name at last file name separator.
|
||||||
|
if index := strings.LastIndex(file, "/"); index >= 0 {
|
||||||
|
file = file[index+1:]
|
||||||
|
} else if index = strings.LastIndex(file, "\\"); index >= 0 {
|
||||||
|
file = file[index+1:]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
file = "???"
|
||||||
|
line = 1
|
||||||
|
}
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
// Every line is indented at least one tab.
|
||||||
|
buf.WriteByte('\t')
|
||||||
|
fmt.Fprintf(buf, "%s:%d: ", file, line)
|
||||||
|
lines := strings.Split(s, "\n")
|
||||||
|
if l := len(lines); l > 1 && lines[l-1] == "" {
|
||||||
|
lines = lines[:l-1]
|
||||||
|
}
|
||||||
|
for i, line := range lines {
|
||||||
|
if i > 0 {
|
||||||
|
// Second and subsequent lines are indented an extra tab.
|
||||||
|
buf.WriteString("\n\t\t")
|
||||||
|
}
|
||||||
|
buf.WriteString(line)
|
||||||
|
}
|
||||||
|
buf.WriteByte('\n')
|
||||||
|
return buf.String()
|
||||||
|
}
|
|
@ -0,0 +1,71 @@
|
||||||
|
package is
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TB is an interface that defines an assertion-style
|
||||||
|
// testing syntax to condense and make more efficient
|
||||||
|
// the writing of tests. The output of TB is identical
|
||||||
|
// to the output of the testing framework, allowing any
|
||||||
|
// scripts, parsers, etc to parse it appropriately.
|
||||||
|
type TB interface {
|
||||||
|
// Equal determines if the two arguments are equal.
|
||||||
|
// If not, a failure is printed.
|
||||||
|
Equal(actual, expected interface{}) Result
|
||||||
|
// NotEqual determines if the two arguments are not equal.
|
||||||
|
// If they are, a failure is printed.
|
||||||
|
NotEqual(actual, expected interface{}) Result
|
||||||
|
}
|
||||||
|
|
||||||
|
// tb implements TB
|
||||||
|
type tb struct {
|
||||||
|
tb testing.TB
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensure tb implements TB
|
||||||
|
var _ TB = (*tb)(nil)
|
||||||
|
|
||||||
|
// New creates a new object that satisfies the TB interface.
|
||||||
|
func New(testObj testing.TB) TB {
|
||||||
|
return &tb{tb: testObj}
|
||||||
|
}
|
||||||
|
|
||||||
|
// equal tests for equality of two objects.
|
||||||
|
func equal(actual, expected interface{}) bool {
|
||||||
|
return reflect.DeepEqual(actual, expected)
|
||||||
|
}
|
||||||
|
|
||||||
|
// printFailure assembles a string from the arguments
|
||||||
|
// and decorates it, then prints it.
|
||||||
|
func printFailure(args ...interface{}) {
|
||||||
|
fmt.Println(decorate(fmt.Sprintln(args...)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equal determines if the two arguments are equal.
|
||||||
|
// If not, a failure is printed.
|
||||||
|
func (t *tb) Equal(actual, expected interface{}) Result {
|
||||||
|
r := &result{tb: t.tb}
|
||||||
|
if equal(actual, expected) {
|
||||||
|
r.success = true
|
||||||
|
} else {
|
||||||
|
r.success = false
|
||||||
|
printFailure(actual, "should be equal to", expected)
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
// NotEqual determines if the two arguments are not equal.
|
||||||
|
// If they are, a failure is printed.
|
||||||
|
func (t *tb) NotEqual(actual, expected interface{}) Result {
|
||||||
|
r := &result{tb: t.tb}
|
||||||
|
if !equal(actual, expected) {
|
||||||
|
r.success = true
|
||||||
|
} else {
|
||||||
|
r.success = false
|
||||||
|
printFailure(actual, "should not be equal to", expected)
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
package is
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestIsEqual(t *testing.T) {
|
||||||
|
mockT := &testing.T{}
|
||||||
|
is := New(mockT)
|
||||||
|
if is == nil {
|
||||||
|
t.Fatal("is should not be nil")
|
||||||
|
}
|
||||||
|
r := is.Equal(1, 1)
|
||||||
|
if r == nil {
|
||||||
|
t.Fatal("Equal should return a result object")
|
||||||
|
}
|
||||||
|
if !r.Success() {
|
||||||
|
t.Fatal("should be equal")
|
||||||
|
}
|
||||||
|
if is.Equal(1, 2).Success() {
|
||||||
|
t.Fatal("1 is not 2")
|
||||||
|
}
|
||||||
|
// is.Equal(1,2).Require() cannot be tested as it
|
||||||
|
// either fails the test or causes a panic and we cannot
|
||||||
|
// mock testing.TB as there is a private method to prevent that.
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestIsNotEqual(t *testing.T) {
|
||||||
|
mockT := &testing.T{}
|
||||||
|
is := New(mockT)
|
||||||
|
if is == nil {
|
||||||
|
t.Fatal("is should not be nil")
|
||||||
|
}
|
||||||
|
r := is.NotEqual(1, 2)
|
||||||
|
if r == nil {
|
||||||
|
t.Fatal("NotEqual should return a result object")
|
||||||
|
}
|
||||||
|
if !r.Success() {
|
||||||
|
t.Fatal("should not be equal")
|
||||||
|
}
|
||||||
|
if is.NotEqual(1, 1).Success() {
|
||||||
|
t.Fatal("1 is 1")
|
||||||
|
}
|
||||||
|
// is.Equal(1,2).Require() cannot be tested as it
|
||||||
|
// either fails the test or causes a panic and we cannot
|
||||||
|
// mock testing.TB as there is a private method to prevent that.
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
package is
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
// Result is an interface that defines methods for
|
||||||
|
// acting on the result of a test.
|
||||||
|
type Result interface {
|
||||||
|
// Success returns the success value of the last test.
|
||||||
|
Success() bool
|
||||||
|
// Require causes the testing procedure to abort
|
||||||
|
// if the test failed.
|
||||||
|
Require()
|
||||||
|
}
|
||||||
|
|
||||||
|
// result implements Result
|
||||||
|
type result struct {
|
||||||
|
success bool
|
||||||
|
tb testing.TB
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensure result implements Result
|
||||||
|
var _ Result = (*result)(nil)
|
||||||
|
|
||||||
|
// Success returns the success value of the test that
|
||||||
|
// returned it.
|
||||||
|
func (r *result) Success() bool {
|
||||||
|
return r.success
|
||||||
|
}
|
||||||
|
|
||||||
|
// Require causes the testing procedure to abort
|
||||||
|
// if the test failed.
|
||||||
|
func (r *result) Require() {
|
||||||
|
if r.success == false {
|
||||||
|
r.tb.FailNow()
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue