• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

gravitton / assert / 18604002556

17 Oct 2025 08:24PM UTC coverage: 93.981% (-3.2%) from 97.183%
18604002556

push

github

tomas-novotny
Add support for custom error messages in assert methods

40 of 40 new or added lines in 2 files covered. (100.0%)

7 existing lines in 1 file now uncovered.

203 of 216 relevant lines covered (93.98%)

12.68 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

94.96
/assert.go
1
package assert
2

3
import (
4
        "encoding/json"
5
        "errors"
6
)
7

8
// Testing is an interface wrapper around *testing.T
9
type Testing interface {
10
        Helper()
11
        Errorf(format string, args ...any)
12
}
13

14
// Fail reports a failure message through
UNCOV
15
func Fail(t Testing, message string) bool {
×
UNCOV
16
        t.Helper()
×
UNCOV
17

×
UNCOV
18
        t.Errorf(message)
×
UNCOV
19

×
UNCOV
20
        return false
×
UNCOV
21
}
×
22

23
// Failf reports a failure formatted message through
24
func Failf(t Testing, format string, args ...any) bool {
67✔
25
        t.Helper()
67✔
26

67✔
27
        t.Errorf(format, args...)
67✔
28

67✔
29
        return false
67✔
30
}
67✔
31

32
// True asserts that the specified value is true.
33
func True(t Testing, condition bool, messages ...string) bool {
2✔
34
        t.Helper()
2✔
35

2✔
36
        if !condition {
3✔
37
                return Failf(t, "%sShould be true", message(messages))
1✔
38
        }
1✔
39

40
        return true
1✔
41
}
42

43
// False asserts that the specified value is false.
44
func False(t Testing, condition bool, messages ...string) bool {
2✔
45
        t.Helper()
2✔
46

2✔
47
        if condition {
3✔
48
                return Failf(t, "%sShould be false", message(messages))
1✔
49
        }
1✔
50

51
        return true
1✔
52
}
53

54
// Equal asserts that two objects are equal.
55
//
56
// Pointer variable equality is determined based on the equality of the
57
// referenced values (as opposed to the memory addresses).
58
func Equal[T Comparable](t Testing, actual, expected T, messages ...string) bool {
33✔
59
        t.Helper()
33✔
60

33✔
61
        if !equal(actual, expected) {
41✔
62
                return Failf(t, "%sShould be equal:\n  actual: %s\nexpected: %s", message(messages), print(actual), print(expected))
8✔
63
        }
8✔
64

65
        return true
25✔
66
}
67

68
// NotEqual asserts that the specified values are NOT equal.
69
//
70
// Pointer variable equality is determined based on the equality of the
71
// referenced values (as opposed to the memory addresses).
72
func NotEqual[T Comparable](t Testing, actual, expected T, messages ...string) bool {
24✔
73
        t.Helper()
24✔
74

24✔
75
        if equal(actual, expected) {
42✔
76
                return Failf(t, "%sShould not be equal\n  actual: %s", message(messages), print(actual))
18✔
77
        }
18✔
78

79
        return true
6✔
80
}
81

82
// EqualDelta asserts that two numeric values difference is less then delta.
83
//
84
// Method panics if delta value is not positive.
85
func EqualDelta[T Numeric](t Testing, actual, expected, delta T, messages ...string) bool {
14✔
86
        t.Helper()
14✔
87

14✔
88
        if !equalDelta(actual, expected, delta) {
20✔
89
                return Failf(t, "%sShould be equal in delta:\n  actual: %s\nexpected: %s", message(messages), print(actual), print(expected))
6✔
90
        }
6✔
91

92
        return true
8✔
93
}
94

95
// Same asserts that two pointers reference the same object.
96
//
97
// Both arguments must be pointer variables. Pointer variable equality is
98
// determined based on the equality of both type and value.
99
func Same[T Reference](t Testing, actual, expected T, messages ...string) bool {
13✔
100
        t.Helper()
13✔
101

13✔
102
        if valid, ok := same[T](expected, actual); !ok {
16✔
103
                return Failf(t, "%sShould be pointers\n  actual: %s\nexpected: %s", message(messages), print(actual), print(expected))
3✔
104
        } else if !valid {
17✔
105
                return Failf(t, "%sShould be same\n  actual: %s\nexpected: %s", message(messages), print(actual), print(expected))
4✔
106
        }
4✔
107

108
        return true
6✔
109
}
110

111
// NotSame asserts that two pointers do NOT reference the same object.
112
//
113
// Both arguments must be pointer variables. Pointer variable equality is
114
// determined based on the equality of both type and value.
115
func NotSame[T Reference](t Testing, actual, expected T, messages ...string) bool {
13✔
116
        t.Helper()
13✔
117

13✔
118
        if valid, ok := same(expected, actual); !ok {
16✔
119
                Failf(t, "%sShould be pointers\n  actual: %s\nexpected: %s", message(messages), print(actual), print(expected))
3✔
120
        } else if valid {
19✔
121
                return Failf(t, "%sShould not be same\n  actual: %s", message(messages), print(actual))
6✔
122
        }
6✔
123

124
        return true
7✔
125
}
126

127
// Length asserts that object have given length.
128
func Length[S Iterable[any]](t Testing, object S, expected int, messages ...string) bool {
5✔
129
        t.Helper()
5✔
130

5✔
131
        if actual := length(object); actual != expected {
6✔
132
                return Failf(t, "%sShould have element length\n  object: %#v\n  actual: %d\nexpected: %d", message(messages), object, actual, expected)
1✔
133
        }
1✔
134

135
        return true
4✔
136
}
137

138
// Contains asserts that object contains given element
139
//
140
// Works with strings, arrays, slices, maps values and channels
141
func Contains[S Iterable[E], E Comparable](t Testing, object S, element E, messages ...string) bool {
7✔
142
        t.Helper()
7✔
143

7✔
144
        if found, ok := contains(object, element); !ok {
8✔
145
                return Failf(t, "%sShould be iterable\n  object: %#v", object)
1✔
146
        } else if !found {
10✔
147
                return Failf(t, "%sShould contain element\n  object: %#v\n element: %#v", message(messages), object, element)
3✔
148
        }
3✔
149

150
        return true
3✔
151
}
152

153
// NotContains asserts that object do NOT contains given element
154
//
155
// Works with strings, arrays, slices, maps values and channels
156
func NotContains[S Iterable[E], E Comparable](t Testing, object S, element E, messages ...string) bool {
7✔
157
        t.Helper()
7✔
158

7✔
159
        if found, ok := contains(object, element); !ok {
8✔
160
                Failf(t, "%sShould be iterable\n  object: %#v", object)
1✔
161
        } else if found {
10✔
162
                return Failf(t, "%sShould not contain element\n  object: %#v\n element: %#v", message(messages), object, element)
3✔
163
        }
3✔
164

165
        return true
4✔
166
}
167

168
// Error asserts that error is NOT nil
169
func Error(t Testing, err error, messages ...string) bool {
2✔
170
        t.Helper()
2✔
171

2✔
172
        if err == nil {
3✔
173
                return Failf(t, "%sShould be error")
1✔
174
        }
1✔
175

176
        return true
1✔
177
}
178

179
// NoError asserts that error is nil
180
func NoError(t Testing, err error, messages ...string) bool {
5✔
181
        t.Helper()
5✔
182

5✔
183
        if err != nil {
6✔
184
                return Failf(t, "%sShould not be error\n   error: %#v", message(messages), err)
1✔
185
        }
1✔
186

187
        return true
4✔
188
}
189

190
// ErrorIs asserts that error is unwrappable to given target
191
func ErrorIs(t Testing, err error, target error, messages ...string) bool {
4✔
192
        t.Helper()
4✔
193

4✔
194
        if !errors.Is(err, target) {
5✔
195
                return Failf(t, "%sShould be same error\n   error: %#v\n  target: %#v", message(messages), err, target)
1✔
196
        }
1✔
197

198
        return true
3✔
199
}
200

201
// NotErrorIs asserts that error is NOT unwrappable to given target
202
func NotErrorIs(t Testing, err error, target error, messages ...string) bool {
4✔
203
        t.Helper()
4✔
204

4✔
205
        if errors.Is(err, target) {
7✔
206
                return Failf(t, "%sShould not be same error\n   error: %#v", message(messages), err, target)
3✔
207
        }
3✔
208

209
        return true
1✔
210
}
211

212
// EqualJSON asserts that JSON strings are equal
213
func EqualJSON(t Testing, actual, expected string, messages ...string) bool {
11✔
214
        t.Helper()
11✔
215

11✔
216
        var actualJSON, expectedJSON any
11✔
217

11✔
218
        if err := json.Unmarshal([]byte(actual), &actualJSON); err != nil {
12✔
219
                return Failf(t, "%sShould be valid JSON\n  actual: %s\n     err: %v", message(messages), expected, err)
1✔
220
        }
1✔
221

222
        if err := json.Unmarshal([]byte(expected), &expectedJSON); err != nil {
11✔
223
                return Failf(t, "%sShould be valid JSON\nexpected: %s\n     err: %v", message(messages), expected, err)
1✔
224
        }
1✔
225

226
        return Equal(t, actualJSON, expectedJSON)
9✔
227
}
228

229
// JSON asserts that object can be marshall to expected JSON string
230
func JSON(t Testing, actual any, expected string, messages ...string) bool {
3✔
231
        t.Helper()
3✔
232

3✔
233
        s, err := json.Marshal(actual)
3✔
234

3✔
235
        return NoError(t, err, messages...) && EqualJSON(t, string(s), expected, messages...)
3✔
236
}
3✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc