-
Notifications
You must be signed in to change notification settings - Fork 107
/
assert.go
77 lines (67 loc) · 1.69 KB
/
assert.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Copyright 2019, Chef. All rights reserved.
// https://github.com/q191201771/naza
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
// package assert 提供了单元测试时的断言功能,减少一些模板代码
package assert
import (
"bytes"
"reflect"
)
// 单元测试中的 *testing.T 和 *testing.B 都满足该接口
type TestingT interface {
Errorf(format string, args ...interface{})
}
type tHelper interface {
Helper()
}
func Equal(t TestingT, expected interface{}, actual interface{}, msg ...string) {
if h, ok := t.(tHelper); ok {
h.Helper()
}
if !equal(expected, actual) {
t.Errorf("%s expected=%+v, actual=%+v", msg, expected, actual)
}
return
}
// 比如有时我们需要对 error 类型不等于 nil 做断言,但是我们并不关心 error 的具体值是什么
func IsNotNil(t TestingT, actual interface{}, msg ...string) {
if h, ok := t.(tHelper); ok {
h.Helper()
}
if isNil(actual) {
t.Errorf("%s expected not nil, but actual=%+v", msg, actual)
}
return
}
func isNil(actual interface{}) bool {
if actual == nil {
return true
}
v := reflect.ValueOf(actual)
k := v.Kind()
if k == reflect.Chan || k == reflect.Map || k == reflect.Ptr || k == reflect.Interface || k == reflect.Slice {
return v.IsNil()
}
return false
}
func equal(expected, actual interface{}) bool {
if expected == nil {
return isNil(actual)
}
exp, ok := expected.([]byte)
if !ok {
return reflect.DeepEqual(expected, actual)
}
act, ok := actual.([]byte)
if !ok {
return false
}
//if exp == nil || act == nil {
// return exp == nil && act == nil
//}
return bytes.Equal(exp, act)
}