string.gno
2.11 Kb ยท 82 lines
1package expect
2
3import (
4 "errors"
5 "std"
6
7 "gno.land/p/demo/ufmt"
8)
9
10// ErrIncompatibleType indicates that a value can't be casted to a different type.
11var ErrIncompatibleType = errors.New("incompatible type")
12
13// NewStringChecker creates a new checker of string values.
14func NewStringChecker(ctx Context, value string) StringChecker {
15 return StringChecker{ctx, value}
16}
17
18// StringChecker asserts string values.
19type StringChecker struct {
20 ctx Context
21 value string
22}
23
24// Not negates the next called expectation.
25func (c StringChecker) Not() StringChecker {
26 c.ctx.negated = !c.ctx.negated
27 return c
28}
29
30// ToEqual asserts that current value is equal to an expected value.
31func (c StringChecker) ToEqual(v string) {
32 c.ctx.T().Helper()
33 c.ctx.CheckExpectation(c.value == v, func(ctx Context) string {
34 if !ctx.IsNegated() {
35 return ufmt.Sprintf("Expected values to match\nGot: %s\nWant: %s", c.value, v)
36 }
37 return ufmt.Sprintf("Expected values to be different\nGot: %s", c.value)
38 })
39}
40
41// ToBeEmpty asserts that current value is an empty string.
42func (c StringChecker) ToBeEmpty() {
43 c.ctx.T().Helper()
44 c.ctx.CheckExpectation(c.value == "", func(ctx Context) string {
45 if !ctx.IsNegated() {
46 return ufmt.Sprintf("Expected string to be empty\nGot: %s", c.value)
47 }
48 return ufmt.Sprintf("Unexpected empty string")
49 })
50}
51
52// ToHaveLength asserts that current value has an expected length.
53func (c StringChecker) ToHaveLength(length int) {
54 c.ctx.T().Helper()
55 c.ctx.CheckExpectation(len(c.value) == length, func(ctx Context) string {
56 got := len(c.value)
57 if !ctx.IsNegated() {
58 return ufmt.Sprintf("Expected string length to match\nGot: %d\nWant: %d", got, length)
59 }
60 return ufmt.Sprintf("Expected string lengths to be different\nGot: %d", got)
61 })
62}
63
64// Stringer defines an interface for values that has a String method.
65type Stringer interface {
66 String() string
67}
68
69func asString(value any) (string, error) {
70 switch v := value.(type) {
71 case string:
72 return v, nil
73 case []byte:
74 return string(v), nil
75 case Stringer:
76 return v.String(), nil
77 case std.Address:
78 return v.String(), nil
79 default:
80 return "", ErrIncompatibleType
81 }
82}