Skip to content

Commit 95dad56

Browse files
committed
test: few more examples for testing
simplify errors a little bit
1 parent d3041fc commit 95dad56

2 files changed

Lines changed: 47 additions & 27 deletions

File tree

decimal/decimal.go

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -49,26 +49,34 @@ func NewFromInt(i int64) Decimal {
4949
return Decimal(i) * scaleFactor
5050
}
5151

52+
var errEmpty = errors.New("empty string")
53+
var errTooBig = errors.New("number too big")
54+
var errInvalid = errors.New("invalid syntax")
55+
5256
// atoi64 is equivalent to strconv.Atoi
5357
func atoi64(s string) (bool, int64, error) {
5458
sLen := len(s)
55-
if sLen < 1 || sLen > 18 {
56-
return false, 0, errors.New("atoi failed")
59+
if sLen < 1 {
60+
return false, 0, errEmpty
61+
}
62+
if sLen > 18 {
63+
return false, 0, errTooBig
5764
}
65+
5866
neg := false
5967
if s[0] == '-' {
6068
neg = true
6169
s = s[1:]
6270
if len(s) < 1 {
63-
return false, 0, errors.New("atoi failed")
71+
return neg, 0, errEmpty
6472
}
6573
}
6674

6775
var n int64
6876
for _, ch := range []byte(s) {
6977
ch -= '0'
7078
if ch > 9 {
71-
return false, 0, errors.New("atoi failed")
79+
return neg, 0, errInvalid
7280
}
7381
n = n*10 + int64(ch)
7482
}
@@ -82,21 +90,15 @@ func atoi64(s string) (bool, int64, error) {
8290
// error if integer parsing fails.
8391
func NewFromString(s string) (Decimal, error) {
8492
if whole, frac, split := strings.Cut(s, "."); split {
85-
var neg bool
86-
var w int64
87-
if whole == "-" {
88-
neg = true
89-
} else if whole != "" {
90-
var err error
91-
neg, w, err = atoi64(whole)
92-
if err != nil {
93-
return Zero, err
94-
}
93+
neg, w, err := atoi64(whole)
94+
// if fractional portion exists, whole part can be empty
95+
if err != nil && err != errEmpty {
96+
return Zero, err
9597
}
9698

9799
// overflow
98100
if w > parseMax || w < parseMin {
99-
return Zero, errors.New("number too big")
101+
return Zero, errTooBig
100102
}
101103
w = w * int64(scaleFactor)
102104

@@ -106,7 +108,7 @@ func NewFromString(s string) (Decimal, error) {
106108
for _, b := range frac {
107109
f *= 10
108110
if b < '0' || b > '9' {
109-
return Zero, errors.New("invalid syntax")
111+
return Zero, errInvalid
110112
}
111113
f += int64(b - '0')
112114
seen++
@@ -126,7 +128,7 @@ func NewFromString(s string) (Decimal, error) {
126128
} else {
127129
_, i, err := atoi64(s)
128130
if i > parseMax || i < parseMin {
129-
return Zero, errors.New("number too big")
131+
return Zero, errTooBig
130132
}
131133
i = i * int64(scaleFactor)
132134
return Decimal(i), err

decimal/decimal_test.go

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -298,47 +298,47 @@ var testParseCases = []testCase{
298298
},
299299
{
300300
"error-1",
301-
"number too big",
301+
errTooBig.Error(),
302302
"100000000000000000",
303303
},
304304
{
305305
"error-2",
306-
"number too big",
306+
errTooBig.Error(),
307307
"10000000000000000",
308308
},
309309
{
310310
"error-3",
311-
"number too big",
311+
errTooBig.Error(),
312312
"10000000000000000.56",
313313
},
314314
{
315315
"error-4",
316-
"invalid syntax",
316+
errInvalid.Error(),
317317
"0.e0",
318318
},
319319
{
320320
"error-5",
321-
"atoi failed",
321+
errTooBig.Error(),
322322
"5555555555555555555555555550000000000000000",
323323
},
324324
{
325325
"error-6",
326-
"atoi failed",
326+
errEmpty.Error(),
327327
"-",
328328
},
329329
{
330330
"error-7",
331-
"atoi failed",
331+
errEmpty.Error(),
332332
"",
333333
},
334334
{
335335
"error-badint-1",
336-
`atoi failed`,
336+
errInvalid.Error(),
337337
"1QZ.56",
338338
},
339339
{
340340
"error-expr-1",
341-
`atoi failed`,
341+
errInvalid.Error(),
342342
"(123 * 6)",
343343
},
344344
{
@@ -351,6 +351,21 @@ var testParseCases = []testCase{
351351
"-0.50",
352352
"-.50",
353353
},
354+
{
355+
"missingfrac",
356+
"5.00",
357+
"5.",
358+
},
359+
{
360+
"neg-missingfrac",
361+
"-5.00",
362+
"-5.",
363+
},
364+
{
365+
"just-a-decimal",
366+
"0.00",
367+
".",
368+
},
354369
}
355370

356371
func TestStringParse(t *testing.T) {
@@ -364,6 +379,9 @@ func TestStringParse(t *testing.T) {
364379
t.Fatalf("Error(%s): expected `%s`, got `%s`", tc.name, tc.Result, err)
365380
}
366381
}
382+
if !strings.HasPrefix(tc.name, "error") && err != nil {
383+
t.Fatalf("Error(%s): unexpected error `%s`", tc.name, err)
384+
}
367385
if !strings.HasPrefix(tc.name, "error") && tc.Result != d.StringFixedBank() {
368386
t.Errorf("Error(%s): expected \n`%s`, \ngot \n`%s`", tc.name, tc.Result, d.StringFixedBank())
369387
}
@@ -395,7 +413,7 @@ func FuzzStringParse(f *testing.F) {
395413
}
396414

397415
func BenchmarkNewFromString(b *testing.B) {
398-
numbers := []string{"10.0", "245.6", "354", "2.456"}
416+
numbers := []string{"10.0", "245.6", "354", "2.456", "-31.2"}
399417
for n := 0; n < b.N; n++ {
400418
for _, numStr := range numbers {
401419
NewFromString(numStr)

0 commit comments

Comments
 (0)