@@ -6,6 +6,7 @@ package strconv_test
6
6
7
7
import (
8
8
"errors"
9
+ "fmt"
9
10
"reflect"
10
11
. "strconv"
11
12
"testing"
@@ -354,6 +355,37 @@ func TestParseInt(t *testing.T) {
354
355
}
355
356
}
356
357
358
+ func TestAtoi (t * testing.T ) {
359
+ switch IntSize {
360
+ case 32 :
361
+ for i := range parseInt32Tests {
362
+ test := & parseInt32Tests [i ]
363
+ out , err := Atoi (test .in )
364
+ var testErr error
365
+ if test .err != nil {
366
+ testErr = & NumError {"Atoi" , test .in , test .err .(* NumError ).Err }
367
+ }
368
+ if int (test .out ) != out || ! reflect .DeepEqual (testErr , err ) {
369
+ t .Errorf ("Atoi(%q) = %v, %v want %v, %v" ,
370
+ test .in , out , err , test .out , testErr )
371
+ }
372
+ }
373
+ case 64 :
374
+ for i := range parseInt64Tests {
375
+ test := & parseInt64Tests [i ]
376
+ out , err := Atoi (test .in )
377
+ var testErr error
378
+ if test .err != nil {
379
+ testErr = & NumError {"Atoi" , test .in , test .err .(* NumError ).Err }
380
+ }
381
+ if test .out != int64 (out ) || ! reflect .DeepEqual (testErr , err ) {
382
+ t .Errorf ("Atoi(%q) = %v, %v want %v, %v" ,
383
+ test .in , out , err , test .out , testErr )
384
+ }
385
+ }
386
+ }
387
+ }
388
+
357
389
func bitSizeErrStub (name string , bitSize int ) error {
358
390
return BitSizeError (name , "0" , bitSize )
359
391
}
@@ -448,26 +480,67 @@ func TestNumError(t *testing.T) {
448
480
}
449
481
}
450
482
451
- func BenchmarkAtoi (b * testing.B ) {
452
- for i := 0 ; i < b .N ; i ++ {
453
- ParseInt ("12345678" , 10 , 0 )
454
- }
483
+ func BenchmarkParseInt (b * testing.B ) {
484
+ b .Run ("Pos" , func (b * testing.B ) {
485
+ benchmarkParseInt (b , 1 )
486
+ })
487
+ b .Run ("Neg" , func (b * testing.B ) {
488
+ benchmarkParseInt (b , - 1 )
489
+ })
455
490
}
456
491
457
- func BenchmarkAtoiNeg (b * testing.B ) {
458
- for i := 0 ; i < b .N ; i ++ {
459
- ParseInt ("-12345678" , 10 , 0 )
460
- }
492
+ type benchCase struct {
493
+ name string
494
+ num int64
461
495
}
462
496
463
- func BenchmarkAtoi64 (b * testing.B ) {
464
- for i := 0 ; i < b .N ; i ++ {
465
- ParseInt ("12345678901234" , 10 , 64 )
497
+ func benchmarkParseInt (b * testing.B , neg int ) {
498
+ cases := []benchCase {
499
+ {"7bit" , 1 << 7 - 1 },
500
+ {"26bit" , 1 << 26 - 1 },
501
+ {"31bit" , 1 << 31 - 1 },
502
+ {"56bit" , 1 << 56 - 1 },
503
+ {"63bit" , 1 << 63 - 1 },
504
+ }
505
+ for _ , cs := range cases {
506
+ b .Run (cs .name , func (b * testing.B ) {
507
+ s := fmt .Sprintf ("%d" , cs .num * int64 (neg ))
508
+ for i := 0 ; i < b .N ; i ++ {
509
+ out , _ := ParseInt (s , 10 , 64 )
510
+ BenchSink += int (out )
511
+ }
512
+ })
466
513
}
467
514
}
468
515
469
- func BenchmarkAtoi64Neg (b * testing.B ) {
470
- for i := 0 ; i < b .N ; i ++ {
471
- ParseInt ("-12345678901234" , 10 , 64 )
516
+ func BenchmarkAtoi (b * testing.B ) {
517
+ b .Run ("Pos" , func (b * testing.B ) {
518
+ benchmarkAtoi (b , 1 )
519
+ })
520
+ b .Run ("Neg" , func (b * testing.B ) {
521
+ benchmarkAtoi (b , - 1 )
522
+ })
523
+ }
524
+
525
+ func benchmarkAtoi (b * testing.B , neg int ) {
526
+ cases := []benchCase {
527
+ {"7bit" , 1 << 7 - 1 },
528
+ {"26bit" , 1 << 26 - 1 },
529
+ {"31bit" , 1 << 31 - 1 },
530
+ }
531
+ if IntSize == 64 {
532
+ cases = append (cases , []benchCase {
533
+ {"56bit" , 1 << 56 - 1 },
534
+ {"63bit" , 1 << 63 - 1 },
535
+ }... )
536
+ }
537
+ for _ , cs := range cases {
538
+ b .Run (cs .name , func (b * testing.B ) {
539
+ s := fmt .Sprintf ("%d" , cs .num * int64 (neg ))
540
+ for i := 0 ; i < b .N ; i ++ {
541
+ out , _ := Atoi (s )
542
+ BenchSink += out
543
+ }
544
+ })
472
545
}
473
546
}
0 commit comments