1
1
package assert
2
2
3
3
import (
4
+ "bytes"
5
+ "encoding/json"
4
6
"fmt"
5
7
"reflect"
6
8
)
7
9
10
+ const (
11
+ jsonIndent = " "
12
+ )
13
+
8
14
// AssertableValue represents an under-test value that's expected to meet
9
15
// certain criteria.
10
16
type AssertableValue interface {
@@ -34,6 +40,12 @@ type AssertableValue interface {
34
40
// IsTrue asserts that the specified actual value is true.
35
41
// Returns a ValueAssertionResult that provides post-assert actions.
36
42
IsTrue () ValueAssertionResult
43
+
44
+ // MarshalsEquivalentJSON asserts that the specified actual value yields
45
+ // a JSON encoding equivalent to that of the specified expected value.
46
+ // See https://golang.org/pkg/encoding/json/#Marshal for encoding details.
47
+ // Returns a ValueAssertionResult that provides post-assert actions.
48
+ MarshalsEquivalentJSON (expected interface {}) ValueAssertionResult
37
49
}
38
50
39
51
type assertableValue struct {
@@ -50,16 +62,20 @@ type anyOtherValue struct{}
50
62
func (actual * assertableValue ) Equals (expected interface {}) ValueAssertionResult {
51
63
areEqual := reflect .DeepEqual (actual .value , expected )
52
64
if ! areEqual {
53
- if fmt .Sprint (actual .value ) == fmt .Sprint (expected ) {
54
- actual .testContext .decoratedErrorf (
55
- "Type mismatch.\n Actual: %T=%v\n Expected: %T=%v\n " , actual .value , actual .value , expected , expected )
56
- } else {
57
- actual .testContext .decoratedErrorf ("Value mismatch.\n Actual: %#v\n Expected: %#v\n " , actual .value , expected )
58
- }
65
+ actual .printValueMismatchError (expected )
59
66
}
60
67
return & valueAssertionResult {bool : areEqual , actual : actual .value , expected : expected }
61
68
}
62
69
70
+ func (actual * assertableValue ) printValueMismatchError (expected interface {}) {
71
+ if fmt .Sprint (actual .value ) == fmt .Sprint (expected ) {
72
+ actual .testContext .decoratedErrorf (
73
+ "Type mismatch.\n Actual: %T=%v\n Expected: %T=%v\n " , actual .value , actual .value , expected , expected )
74
+ } else {
75
+ actual .testContext .decoratedErrorf ("Value mismatch.\n Actual: %#v\n Expected: %#v\n " , actual .value , expected )
76
+ }
77
+ }
78
+
63
79
func (actual * assertableValue ) DoesNotEqual (value interface {}) ValueAssertionResult {
64
80
areEqual := reflect .DeepEqual (actual .value , value )
65
81
if areEqual {
@@ -83,3 +99,23 @@ func (actual *assertableValue) IsFalse() ValueAssertionResult {
83
99
func (actual * assertableValue ) IsTrue () ValueAssertionResult {
84
100
return actual .Equals (true )
85
101
}
102
+
103
+ func (actual * assertableValue ) MarshalsEquivalentJSON (expected interface {}) ValueAssertionResult {
104
+ var expectedBytes []byte
105
+ actualBytes , err := json .MarshalIndent (actual .value , "" , jsonIndent )
106
+ if err != nil {
107
+ goto mismatch
108
+ }
109
+ expectedBytes , err = json .MarshalIndent (expected , "" , jsonIndent )
110
+ if err != nil {
111
+ goto mismatch
112
+ }
113
+ if ! bytes .Equal (actualBytes , expectedBytes ) {
114
+ goto mismatch
115
+ }
116
+ return & valueAssertionResult {bool : true , actual : actual .value , expected : expected }
117
+
118
+ mismatch:
119
+ actual .testContext .decoratedErrorf ("JSON mismatch.\n Actual: %s\n Expected: %s\n " , actualBytes , expectedBytes )
120
+ return & valueAssertionResult {bool : false , actual : actual .value , expected : expected }
121
+ }
0 commit comments