Skip to content

Commit 353c275

Browse files
committed
Add first assert tests
1 parent c27d199 commit 353c275

2 files changed

Lines changed: 85 additions & 0 deletions

File tree

internal/assert/assert.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package assert
22

33
import (
44
"cmp"
5+
"context"
56
"strings"
67
"testing"
8+
"time"
79
)
810

911
func Equal[V comparable](t testing.TB, expected, actual V) {
@@ -42,3 +44,48 @@ func ContainsSubstring(t testing.TB, subject, substring string) {
4244
expected '%v' to contain '%v'`, subject, substring)
4345
}
4446
}
47+
48+
type PanicConfig struct {
49+
Timeout time.Duration
50+
}
51+
52+
type PanicOption func(*PanicConfig)
53+
54+
func WithTimeout(timeout time.Duration) PanicOption {
55+
return func(c *PanicConfig) {
56+
c.Timeout = timeout
57+
}
58+
}
59+
60+
func NewPanicConfig(options ...PanicOption) *PanicConfig {
61+
cfg := &PanicConfig{Timeout: 100 * time.Millisecond}
62+
for _, opt := range options {
63+
opt(cfg)
64+
}
65+
return cfg
66+
}
67+
68+
func Panics(t testing.TB, fn func(), options ...PanicOption) any {
69+
t.Helper()
70+
recovered := make(chan any)
71+
config := NewPanicConfig(options...)
72+
ctx, cancel := context.WithTimeout(t.Context(), config.Timeout)
73+
defer cancel()
74+
75+
// Run in a goroutine to catch any rumtime.Goexit calls
76+
go func() {
77+
defer func() {
78+
recovered <- recover()
79+
}()
80+
fn()
81+
t.Fatal("Expected function to panic")
82+
}()
83+
84+
select {
85+
case r := <-recovered:
86+
return r
87+
case <-ctx.Done():
88+
t.Fatalf("Timeout (limit %v) waiting for panic", config.Timeout)
89+
return nil
90+
}
91+
}

internal/assert/assert_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package assert_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/initialcapacity/pi/internal/assert"
7+
)
8+
9+
func assertPasses(t *testing.T, assertion func(testing.TB)) {
10+
subjectTest := new(testing.T)
11+
12+
assertion(subjectTest)
13+
14+
if subjectTest.Failed() {
15+
t.Error("Expected assertion to pass, but it failed")
16+
}
17+
}
18+
19+
func assertFails(t *testing.T, assertion func(testing.TB)) {
20+
subjectTest := new(testing.T)
21+
22+
assert.Panics(t, func() {
23+
assertion(subjectTest)
24+
})
25+
26+
if !subjectTest.Failed() {
27+
t.Error("Expected assertion to fail, but it passed")
28+
}
29+
}
30+
31+
func TestEquals(t *testing.T) {
32+
assertPasses(t, func(tb testing.TB) {
33+
assert.Equal(tb, 3, 3)
34+
})
35+
assertFails(t, func(tb testing.TB) {
36+
assert.Equal(tb, 3, 4)
37+
})
38+
}

0 commit comments

Comments
 (0)