Skip to content Search Apps Documentation Source Content File Folder Download Copy Actions State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

Community realm. Read the code first. Community realm, deployed by its author. Read the code before you interact or send coins.

value.gno

4.63 Kb · 189 lines
  1package expect
  2
  3import (
  4	"strings"
  5
  6	"gno.land/p/nt/ufmt/v0"
  7)
  8
  9// Value creates a new checker values of different types.
 10func Value(t TestingT, value any) ValueChecker {
 11	return ValueChecker{
 12		ctx:   NewContext(t),
 13		value: value,
 14	}
 15}
 16
 17// ValueChecker asserts values of different types.
 18type ValueChecker struct {
 19	ctx   Context
 20	value any
 21}
 22
 23// WithFailPrefix assigns a prefix that will be prefixed to testing errors when an assertion fails.
 24func (c ValueChecker) WithFailPrefix(prefix string) ValueChecker {
 25	c.ctx.prefix = prefix
 26	return c
 27}
 28
 29// Not negates the next called expectation.
 30func (c ValueChecker) Not() ValueChecker {
 31	c.ctx.negated = !c.ctx.negated
 32	return c
 33}
 34
 35// ToBeNil asserts that current value is nil.
 36func (c ValueChecker) ToBeNil() {
 37	c.ctx.T().Helper()
 38	c.ctx.CheckExpectation(c.value == nil || istypednil(c.value), func(ctx Context) string {
 39		if !ctx.IsNegated() {
 40			return ufmt.Sprintf("Expected value to be nil\nGot: %v", c.value)
 41		}
 42		return "Expected a non nil value"
 43	})
 44}
 45
 46// ToEqual asserts that current value is equal to an expected value.
 47func (c ValueChecker) ToEqual(value any) {
 48	c.ctx.T().Helper()
 49
 50	// Assert error values first to allow comparing errors to string values
 51	if err, ok := c.value.(error); ok {
 52		want, ok := value.(error)
 53		if !ok {
 54			c.ctx.Fail("Failed: expected an error value\nGot: %T", value)
 55			return
 56		}
 57
 58		c.ctx.CheckExpectation(err.Error() == want.Error(), func(ctx Context) string {
 59			if !ctx.IsNegated() {
 60				return ufmt.Sprintf("Expected errors to match\nGot: %s\nWant: %s", err.Error(), want.Error())
 61			}
 62			return ufmt.Sprintf("Expected errors to be different\nGot: %s", err.Error())
 63		})
 64
 65		return
 66	}
 67
 68	switch v := value.(type) {
 69	case string:
 70		c.AsString().ToEqual(v)
 71	case []byte:
 72		c.AsString().ToEqual(string(v))
 73	case Stringer:
 74		c.AsString().ToEqual(v.String())
 75	case bool:
 76		c.AsBoolean().ToEqual(v)
 77	case float32:
 78		c.AsFloat().ToEqual(float64(v))
 79	case float64:
 80		c.AsFloat().ToEqual(v)
 81	case uint:
 82		c.AsUint().ToEqual(uint64(v))
 83	case uint8:
 84		c.AsUint().ToEqual(uint64(v))
 85	case uint16:
 86		c.AsUint().ToEqual(uint64(v))
 87	case uint32:
 88		c.AsUint().ToEqual(uint64(v))
 89	case uint64:
 90		c.AsUint().ToEqual(v)
 91	case int:
 92		c.AsInt().ToEqual(int64(v))
 93	case int8:
 94		c.AsInt().ToEqual(int64(v))
 95	case int16:
 96		c.AsInt().ToEqual(int64(v))
 97	case int32:
 98		c.AsInt().ToEqual(int64(v))
 99	case int64:
100		c.AsInt().ToEqual(v)
101	case error:
102		c.ctx.Fail("Error is not equal to value\nGot: %s", v.Error())
103	default:
104		c.ctx.Fail("Unsupported type: %T", value)
105	}
106}
107
108// ToContainErrorString asserts that current error value contains an error string.
109func (c ValueChecker) ToContainErrorString(msg string) {
110	c.ctx.T().Helper()
111
112	err, ok := c.value.(error)
113	if !ok {
114		c.ctx.Fail("Failed: expected an error value\nGot: %T", c.value)
115		return
116	}
117
118	c.ctx.CheckExpectation(strings.Contains(err.Error(), msg), func(ctx Context) string {
119		if !ctx.IsNegated() {
120			return ufmt.Sprintf("Expected error message to contain: %s\nGot: %s", msg, err.Error())
121		}
122		return ufmt.Sprintf("Expected error message not to contain: %s\nGot: %s", msg, err.Error())
123	})
124}
125
126// AsString returns a checker to assert current value as a string.
127func (c ValueChecker) AsString() StringChecker {
128	c.ctx.T().Helper()
129
130	v, err := asString(c.value)
131	if err != nil {
132		c.ctx.Fail("Failed: %s: expected a string value\nGot: %T", err.Error(), c.value)
133		return StringChecker{}
134	}
135
136	return NewStringChecker(c.ctx, v)
137}
138
139// AsBoolean returns a checker to assert current value as a boolean.
140func (c ValueChecker) AsBoolean() BooleanChecker {
141	c.ctx.T().Helper()
142
143	v, err := asBoolean(c.value)
144	if err != nil {
145		c.ctx.Fail("Failed: %s: expected a boolean value\nGot: %T", err.Error(), c.value)
146		return BooleanChecker{}
147	}
148
149	return NewBooleanChecker(c.ctx, v)
150}
151
152// AsFloat returns a checker to assert current value as a float64.
153func (c ValueChecker) AsFloat() FloatChecker {
154	c.ctx.T().Helper()
155
156	v, err := asFloat(c.value)
157	if err != nil {
158		c.ctx.Fail("%s: expected a float value\nGot: %T", err.Error(), c.value)
159		return FloatChecker{}
160	}
161
162	return NewFloatChecker(c.ctx, v)
163}
164
165// AsUint returns a checker to assert current value as a uint64.
166func (c ValueChecker) AsUint() UintChecker {
167	c.ctx.T().Helper()
168
169	v, err := asUint(c.value)
170	if err != nil {
171		c.ctx.Fail("Failed: %s: expected a uint value\nGot: %T", err.Error(), c.value)
172		return UintChecker{}
173	}
174
175	return NewUintChecker(c.ctx, v)
176}
177
178// AsInt returns a checker to assert current value as a int64.
179func (c ValueChecker) AsInt() IntChecker {
180	c.ctx.T().Helper()
181
182	v, err := asInt(c.value)
183	if err != nil {
184		c.ctx.Fail("Failed: %s: expected an int value\nGot: %T", err.Error(), c.value)
185		return IntChecker{}
186	}
187
188	return NewIntChecker(c.ctx, v)
189}