context.gno
2.02 Kb ยท 82 lines
1package expect
2
3import (
4 "strings"
5
6 "gno.land/p/demo/ufmt"
7)
8
9const defaultAssertFailMsg = "assert expectation failed"
10
11// NewContext creates a new testing context.
12func NewContext(t TestingT) Context {
13 return Context{t: t}
14}
15
16// Context preserves the current testing context.
17type Context struct {
18 t TestingT
19 negated bool
20 prefix string
21}
22
23// T returns context's testing T instance.
24func (c Context) T() TestingT {
25 if c.t == nil {
26 panic("expect: context is not initialized")
27 }
28 return c.t
29}
30
31// Prefix returns context's error prefix.
32func (c Context) Prefix() string {
33 return c.prefix
34}
35
36// IsNegated checks if current context negates current assert expectations.
37func (c Context) IsNegated() bool {
38 return c.negated
39}
40
41// CheckExpectation checks an assert expectation and calls a callback on fail.
42// It returns true when the asserted expectation fails.
43// Callback is called when a negated assertion succeeds or when non negated assertion fails.
44func (c Context) CheckExpectation(success bool, cb func(Context) string) bool {
45 failed := (c.negated && success) || (!c.negated && !success)
46 if failed {
47 msg := cb(c)
48 if strings.TrimSpace(msg) == "" {
49 msg = defaultAssertFailMsg
50 }
51
52 c.Fail(msg)
53 }
54 return failed
55}
56
57// Fail makes the current test fail with a custom message.
58func (c Context) Fail(msg string, args ...any) {
59 if c.prefix != "" {
60 msg = c.prefix + " - " + msg
61 }
62
63 c.t.Fatalf(msg, args...)
64}
65
66// TestingT defines a minimal interface for `testing.T` instances.
67type TestingT interface {
68 Helper()
69 Fatal(args ...any)
70 Fatalf(format string, args ...any)
71}
72
73// MockTestingT creates a new testing mock that writes testing output to a string builder.
74func MockTestingT(output *strings.Builder) TestingT {
75 return &testingT{output}
76}
77
78type testingT struct{ buf *strings.Builder }
79
80func (testingT) Helper() {}
81func (t testingT) Fatal(args ...any) { t.buf.WriteString(ufmt.Sprintln(args...)) }
82func (t testingT) Fatalf(fmt string, args ...any) { t.buf.WriteString(ufmt.Sprintf(fmt+"\n", args...)) }