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}