87 lines
2.1 KiB
Go
87 lines
2.1 KiB
Go
package mint
|
|
|
|
import (
|
|
"os"
|
|
"testing"
|
|
)
|
|
|
|
// Mint (mint.Mint) is wrapper for *testing.T
|
|
// blending testing type to omit repeated `t`.
|
|
type Mint struct {
|
|
t *testing.T
|
|
}
|
|
|
|
var (
|
|
failToBe = 0
|
|
failType = 1
|
|
failIn = 2
|
|
failToMatch = 3
|
|
failExitCode = 4
|
|
scolds = map[int]string{
|
|
failToBe: "%s:%d\n\tExpected %sto be\t`%+v`\n\tBut actual\t`%+v`",
|
|
failType: "%s:%d\n\tExpected %stype\t`%+v`\n\tBut actual\t`%T`",
|
|
failIn: "%s:%d\n\tExpected %sis in\t`%v`\n\tbut it's not",
|
|
failToMatch: "%s:%d\n\tExpected %v to match\t`%s`\n\tBut actual\t`%+v`",
|
|
failExitCode: "%s:%d\n\tExpected %sto exit with code `%d`\n\tBut actual\t`%d`",
|
|
}
|
|
)
|
|
var (
|
|
redB = "\033[1;31m"
|
|
reset = "\033[0m"
|
|
colorize = map[string]func(string) string{
|
|
"red": func(v string) string {
|
|
return redB + v + reset
|
|
},
|
|
}
|
|
)
|
|
|
|
// Blend provides (blended) *mint.Mint.
|
|
// You can save writing "t" repeatedly.
|
|
func Blend(t *testing.T) *Mint {
|
|
return &Mint{
|
|
t,
|
|
}
|
|
}
|
|
|
|
// Expect provides "*Testee".
|
|
// The blended mint is merely a proxy to instantiate testee.
|
|
func (m *Mint) Expect(actual interface{}) *Testee {
|
|
return expect(m.t, actual)
|
|
}
|
|
|
|
// Expect provides "*mint.Testee".
|
|
// It has assertion methods such as "ToBe".
|
|
func Expect(t *testing.T, actual interface{}) *Testee {
|
|
return expect(t, actual)
|
|
}
|
|
|
|
func expect(t *testing.T, actual interface{}) *Testee {
|
|
return &Testee{t: t, actual: actual, verbose: isVerbose(os.Args), result: MintResult{ok: true}}
|
|
}
|
|
|
|
// Require provides "*mint.Testee",
|
|
// which stops execution of goroutine when the assertion failed.
|
|
func Require(t *testing.T, actual interface{}) *Testee {
|
|
return require(t, actual)
|
|
}
|
|
|
|
func require(t *testing.T, actual interface{}) *Testee {
|
|
return &Testee{t: t, actual: actual, verbose: isVerbose(os.Args), required: true, result: MintResult{ok: true}}
|
|
}
|
|
|
|
func isVerbose(flags []string) bool {
|
|
for _, f := range flags {
|
|
if f == "-test.v=true" {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
func judge(a, b interface{}, not, deeply bool) bool {
|
|
comparer := getComparer(a, b, deeply)
|
|
if not {
|
|
return !comparer.Compare(a, b)
|
|
}
|
|
return comparer.Compare(a, b)
|
|
}
|