@@ -116,6 +116,17 @@ var correctnessSamples = []struct {
116
116
{"-1234567891234567890.0987654321987654321" , "c7150113012345678912345678900987654321987654321d" , false },
117
117
}
118
118
119
+ var correctnessDecodeSamples = []struct {
120
+ numString string
121
+ mpBuf string
122
+ fixExt bool
123
+ }{
124
+ {"1e2" , "d501fe1c" , true },
125
+ {"1.1e31" , "c70301e2011c" , false },
126
+ {"13e-2" , "c7030102013c" , false },
127
+ {"-1e3" , "d501fd1d" , true },
128
+ }
129
+
119
130
// There is a difference between encoding result from a raw string and from
120
131
// decimal.Decimal. It's expected because decimal.Decimal simplifies decimals:
121
132
// 0.00010000 -> 0.0001
@@ -387,18 +398,23 @@ func TestEncodeStringToBCD(t *testing.T) {
387
398
}
388
399
389
400
func TestDecodeStringFromBCD (t * testing.T ) {
390
- samples := append (correctnessSamples , rawSamples ... )
401
+ samples := correctnessSamples
402
+ samples = append (samples , correctnessDecodeSamples ... )
403
+ samples = append (samples , rawSamples ... )
391
404
samples = append (samples , benchmarkSamples ... )
392
405
for _ , testcase := range samples {
393
406
t .Run (testcase .numString , func (t * testing.T ) {
394
407
b , _ := hex .DecodeString (testcase .mpBuf )
395
408
bcdBuf := trimMPHeader (b , testcase .fixExt )
396
- s , err := DecodeStringFromBCD (bcdBuf )
409
+ s , exp , err := DecodeStringFromBCD (bcdBuf )
397
410
if err != nil {
398
411
t .Fatalf ("Failed to decode BCD '%x' to decimal: %s" , bcdBuf , err )
399
412
}
400
413
401
414
decActual , err := decimal .NewFromString (s )
415
+ if exp != 0 {
416
+ decActual = decActual .Shift (int32 (exp ))
417
+ }
402
418
if err != nil {
403
419
t .Fatalf ("Failed to msgpack.Encoder string ('%s') to decimal" , s )
404
420
}
0 commit comments