value.gno

3.37 Kb ยท 145 lines
  1package expect
  2
  3import "gno.land/p/demo/ufmt"
  4
  5// Value creates a new checker values of different types.
  6func Value(t TestingT, value any) ValueChecker {
  7	return ValueChecker{
  8		ctx:   NewContext(t),
  9		value: value,
 10	}
 11}
 12
 13// ValueChecker asserts values of different types.
 14type ValueChecker struct {
 15	ctx   Context
 16	value any
 17}
 18
 19// WithFailPrefix assigns a prefix that will be prefixed to testing errors when an assertion fails.
 20func (c ValueChecker) WithFailPrefix(prefix string) ValueChecker {
 21	c.ctx.prefix = prefix
 22	return c
 23}
 24
 25// Not negates the next called expectation.
 26func (c ValueChecker) Not() ValueChecker {
 27	c.ctx.negated = !c.ctx.negated
 28	return c
 29}
 30
 31// ToBeNil asserts that current value is nil.
 32func (c ValueChecker) ToBeNil() {
 33	c.ctx.T().Helper()
 34	c.ctx.CheckExpectation(c.value == nil, func(ctx Context) string {
 35		if !ctx.IsNegated() {
 36			return ufmt.Sprintf("Expected value to be nil\nGot: %v", c.value)
 37		}
 38		return "Expected a non nil value"
 39	})
 40}
 41
 42// ToEqual asserts that current value is equal to an expected value.
 43func (c ValueChecker) ToEqual(value any) {
 44	c.ctx.T().Helper()
 45
 46	switch v := value.(type) {
 47	case string:
 48		c.AsString().ToEqual(v)
 49	case []byte:
 50		c.AsString().ToEqual(string(v))
 51	case bool:
 52		c.AsBoolean().ToEqual(v)
 53	case float32:
 54		c.AsFloat().ToEqual(float64(v))
 55	case float64:
 56		c.AsFloat().ToEqual(v)
 57	case uint:
 58		c.AsUint().ToEqual(uint64(v))
 59	case uint8:
 60		c.AsUint().ToEqual(uint64(v))
 61	case uint16:
 62		c.AsUint().ToEqual(uint64(v))
 63	case uint32:
 64		c.AsUint().ToEqual(uint64(v))
 65	case uint64:
 66		c.AsUint().ToEqual(v)
 67	case int:
 68		c.AsInt().ToEqual(int64(v))
 69	case int8:
 70		c.AsInt().ToEqual(int64(v))
 71	case int16:
 72		c.AsInt().ToEqual(int64(v))
 73	case int32:
 74		c.AsInt().ToEqual(int64(v))
 75	case int64:
 76		c.AsInt().ToEqual(v)
 77	default:
 78		c.ctx.Fail("Unsupported type: %T", value)
 79	}
 80}
 81
 82// AsString returns a checker to assert current value as a string.
 83func (c ValueChecker) AsString() StringChecker {
 84	c.ctx.T().Helper()
 85
 86	v, err := asString(c.value)
 87	if err != nil {
 88		c.ctx.Fail("Failed: %s: expected a string value\nGot: %T", err.Error(), c.value)
 89		return StringChecker{}
 90	}
 91
 92	return NewStringChecker(c.ctx, v)
 93}
 94
 95// AsBoolean returns a checker to assert current value as a boolean.
 96func (c ValueChecker) AsBoolean() BooleanChecker {
 97	c.ctx.T().Helper()
 98
 99	v, err := asBoolean(c.value)
100	if err != nil {
101		c.ctx.Fail("Failed: %s: expected a boolean value\nGot: %T", err.Error(), c.value)
102		return BooleanChecker{}
103	}
104
105	return NewBooleanChecker(c.ctx, v)
106}
107
108// AsFloat returns a checker to assert current value as a float64.
109func (c ValueChecker) AsFloat() FloatChecker {
110	c.ctx.T().Helper()
111
112	v, err := asFloat(c.value)
113	if err != nil {
114		c.ctx.Fail("%s: expected a float value\nGot: %T", err.Error(), c.value)
115		return FloatChecker{}
116	}
117
118	return NewFloatChecker(c.ctx, v)
119}
120
121// AsUint returns a checker to assert current value as a uint64.
122func (c ValueChecker) AsUint() UintChecker {
123	c.ctx.T().Helper()
124
125	v, err := asUint(c.value)
126	if err != nil {
127		c.ctx.Fail("Failed: %s: expected a uint value\nGot: %T", err.Error(), c.value)
128		return UintChecker{}
129	}
130
131	return NewUintChecker(c.ctx, v)
132}
133
134// AsInt returns a checker to assert current value as a int64.
135func (c ValueChecker) AsInt() IntChecker {
136	c.ctx.T().Helper()
137
138	v, err := asInt(c.value)
139	if err != nil {
140		c.ctx.Fail("Failed: %s: expected an int value\nGot: %T", err.Error(), c.value)
141		return IntChecker{}
142	}
143
144	return NewIntChecker(c.ctx, v)
145}