Skip to content

Commit 9b4d5e9

Browse files
authored
feat: support uint types (#695)
* feat: support uint types * feat: add test for uint types.
1 parent 963f338 commit 9b4d5e9

File tree

2 files changed

+99
-0
lines changed

2 files changed

+99
-0
lines changed

internal/models/stepdef.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,56 @@ func (sd *StepDefinition) Run(ctx context.Context) (context.Context, interface{}
110110
return ctx, fmt.Errorf(`%w %d: "%s" to int8: %s`, ErrCannotConvert, i, s, err)
111111
}
112112
values = append(values, reflect.ValueOf(int8(v)))
113+
case reflect.Uint:
114+
s, err := sd.shouldBeString(i)
115+
if err != nil {
116+
return ctx, err
117+
}
118+
v, err := strconv.ParseUint(s, 10, 0)
119+
if err != nil {
120+
return ctx, fmt.Errorf(`%w %d: "%s" to uint: %s`, ErrCannotConvert, i, s, err)
121+
}
122+
values = append(values, reflect.ValueOf(uint(v)))
123+
case reflect.Uint64:
124+
s, err := sd.shouldBeString(i)
125+
if err != nil {
126+
return ctx, err
127+
}
128+
v, err := strconv.ParseUint(s, 10, 64)
129+
if err != nil {
130+
return ctx, fmt.Errorf(`%w %d: "%s" to uint64: %s`, ErrCannotConvert, i, s, err)
131+
}
132+
values = append(values, reflect.ValueOf(v))
133+
case reflect.Uint32:
134+
s, err := sd.shouldBeString(i)
135+
if err != nil {
136+
return ctx, err
137+
}
138+
v, err := strconv.ParseUint(s, 10, 32)
139+
if err != nil {
140+
return ctx, fmt.Errorf(`%w %d: "%s" to uint32: %s`, ErrCannotConvert, i, s, err)
141+
}
142+
values = append(values, reflect.ValueOf(uint32(v)))
143+
case reflect.Uint16:
144+
s, err := sd.shouldBeString(i)
145+
if err != nil {
146+
return ctx, err
147+
}
148+
v, err := strconv.ParseUint(s, 10, 16)
149+
if err != nil {
150+
return ctx, fmt.Errorf(`%w %d: "%s" to uint16: %s`, ErrCannotConvert, i, s, err)
151+
}
152+
values = append(values, reflect.ValueOf(uint16(v)))
153+
case reflect.Uint8:
154+
s, err := sd.shouldBeString(i)
155+
if err != nil {
156+
return ctx, err
157+
}
158+
v, err := strconv.ParseUint(s, 10, 8)
159+
if err != nil {
160+
return ctx, fmt.Errorf(`%w %d: "%s" to uint8: %s`, ErrCannotConvert, i, s, err)
161+
}
162+
values = append(values, reflect.ValueOf(uint8(v)))
113163
case reflect.String:
114164
s, err := sd.shouldBeString(i)
115165
if err != nil {

internal/models/stepdef_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,55 @@ func TestShouldSupportIntTypes(t *testing.T) {
325325
assert.Equal(t, `cannot convert argument 0: "11111111111111111111111111111111" to int64: strconv.ParseInt: parsing "11111111111111111111111111111111": value out of range`, err.(error).Error())
326326
}
327327

328+
func TestShouldSupportUintTypes(t *testing.T) {
329+
var aActual uint64
330+
var bActual uint32
331+
var cActual uint16
332+
var dActual uint8
333+
334+
fn := func(a uint64, b uint32, c uint16, d uint8) {
335+
aActual = a
336+
bActual = b
337+
cActual = c
338+
dActual = d
339+
}
340+
341+
def := &models.StepDefinition{
342+
StepDefinition: formatters.StepDefinition{
343+
Handler: fn,
344+
},
345+
HandlerValue: reflect.ValueOf(fn),
346+
}
347+
348+
def.Args = []interface{}{"1", "2", "3", "4"}
349+
_, err := def.Run(context.Background())
350+
assert.Nil(t, err)
351+
assert.Equal(t, uint64(1), aActual)
352+
assert.Equal(t, uint32(2), bActual)
353+
assert.Equal(t, uint16(3), cActual)
354+
assert.Equal(t, uint8(4), dActual)
355+
356+
// 256 doesn't fit in uint8
357+
def.Args = []interface{}{"1", "2", "3", "256"}
358+
_, err = def.Run(context.Background())
359+
assert.Equal(t, `cannot convert argument 3: "256" to uint8: strconv.ParseUint: parsing "256": value out of range`, err.(error).Error())
360+
361+
// 65536 doesn't fit in uint16
362+
def.Args = []interface{}{"1", "2", "65536", "4"}
363+
_, err = def.Run(context.Background())
364+
assert.Equal(t, `cannot convert argument 2: "65536" to uint16: strconv.ParseUint: parsing "65536": value out of range`, err.(error).Error())
365+
366+
// 4294967296 too large for uint32
367+
def.Args = []interface{}{"1", "4294967296", "3", "4"}
368+
_, err = def.Run(context.Background())
369+
assert.Equal(t, `cannot convert argument 1: "4294967296" to uint32: strconv.ParseUint: parsing "4294967296": value out of range`, err.(error).Error())
370+
371+
// 18446744073709551616 too large for uint64
372+
def.Args = []interface{}{"18446744073709551616", "2", "3", "4"}
373+
_, err = def.Run(context.Background())
374+
assert.Equal(t, `cannot convert argument 0: "18446744073709551616" to uint64: strconv.ParseUint: parsing "18446744073709551616": value out of range`, err.(error).Error())
375+
}
376+
328377
func TestShouldSupportFloatTypes(t *testing.T) {
329378
var aActual float64
330379
var bActual float32

0 commit comments

Comments
 (0)