| // Copyright 2009 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package strconv_test |
| |
| import ( |
| . "strconv" |
| "testing" |
| ) |
| |
| type itob64Test struct { |
| in int64 |
| base int |
| out string |
| } |
| |
| var itob64tests = []itob64Test{ |
| {0, 10, "0"}, |
| {1, 10, "1"}, |
| {-1, 10, "-1"}, |
| {12345678, 10, "12345678"}, |
| {-987654321, 10, "-987654321"}, |
| {1<<31 - 1, 10, "2147483647"}, |
| {-1<<31 + 1, 10, "-2147483647"}, |
| {1 << 31, 10, "2147483648"}, |
| {-1 << 31, 10, "-2147483648"}, |
| {1<<31 + 1, 10, "2147483649"}, |
| {-1<<31 - 1, 10, "-2147483649"}, |
| {1<<32 - 1, 10, "4294967295"}, |
| {-1<<32 + 1, 10, "-4294967295"}, |
| {1 << 32, 10, "4294967296"}, |
| {-1 << 32, 10, "-4294967296"}, |
| {1<<32 + 1, 10, "4294967297"}, |
| {-1<<32 - 1, 10, "-4294967297"}, |
| {1 << 50, 10, "1125899906842624"}, |
| {1<<63 - 1, 10, "9223372036854775807"}, |
| {-1<<63 + 1, 10, "-9223372036854775807"}, |
| {-1 << 63, 10, "-9223372036854775808"}, |
| |
| {0, 2, "0"}, |
| {10, 2, "1010"}, |
| {-1, 2, "-1"}, |
| {1 << 15, 2, "1000000000000000"}, |
| |
| {-8, 8, "-10"}, |
| {057635436545, 8, "57635436545"}, |
| {1 << 24, 8, "100000000"}, |
| |
| {16, 16, "10"}, |
| {-0x123456789abcdef, 16, "-123456789abcdef"}, |
| {1<<63 - 1, 16, "7fffffffffffffff"}, |
| {1<<63 - 1, 2, "111111111111111111111111111111111111111111111111111111111111111"}, |
| {-1 << 63, 2, "-1000000000000000000000000000000000000000000000000000000000000000"}, |
| |
| {16, 17, "g"}, |
| {25, 25, "10"}, |
| {(((((17*35+24)*35+21)*35+34)*35+12)*35+24)*35 + 32, 35, "holycow"}, |
| {(((((17*36+24)*36+21)*36+34)*36+12)*36+24)*36 + 32, 36, "holycow"}, |
| } |
| |
| func TestItoa(t *testing.T) { |
| for _, test := range itob64tests { |
| s := FormatInt(test.in, test.base) |
| if s != test.out { |
| t.Errorf("FormatInt(%v, %v) = %v want %v", |
| test.in, test.base, s, test.out) |
| } |
| x := AppendInt([]byte("abc"), test.in, test.base) |
| if string(x) != "abc"+test.out { |
| t.Errorf("AppendInt(%q, %v, %v) = %q want %v", |
| "abc", test.in, test.base, x, test.out) |
| } |
| |
| if test.in >= 0 { |
| s := FormatUint(uint64(test.in), test.base) |
| if s != test.out { |
| t.Errorf("FormatUint(%v, %v) = %v want %v", |
| test.in, test.base, s, test.out) |
| } |
| x := AppendUint(nil, uint64(test.in), test.base) |
| if string(x) != test.out { |
| t.Errorf("AppendUint(%q, %v, %v) = %q want %v", |
| "abc", uint64(test.in), test.base, x, test.out) |
| } |
| } |
| |
| if test.base == 10 && int64(int(test.in)) == test.in { |
| s := Itoa(int(test.in)) |
| if s != test.out { |
| t.Errorf("Itoa(%v) = %v want %v", |
| test.in, s, test.out) |
| } |
| } |
| } |
| } |
| |
| type uitob64Test struct { |
| in uint64 |
| base int |
| out string |
| } |
| |
| var uitob64tests = []uitob64Test{ |
| {1<<63 - 1, 10, "9223372036854775807"}, |
| {1 << 63, 10, "9223372036854775808"}, |
| {1<<63 + 1, 10, "9223372036854775809"}, |
| {1<<64 - 2, 10, "18446744073709551614"}, |
| {1<<64 - 1, 10, "18446744073709551615"}, |
| {1<<64 - 1, 2, "1111111111111111111111111111111111111111111111111111111111111111"}, |
| } |
| |
| func TestUitoa(t *testing.T) { |
| for _, test := range uitob64tests { |
| s := FormatUint(test.in, test.base) |
| if s != test.out { |
| t.Errorf("FormatUint(%v, %v) = %v want %v", |
| test.in, test.base, s, test.out) |
| } |
| x := AppendUint([]byte("abc"), test.in, test.base) |
| if string(x) != "abc"+test.out { |
| t.Errorf("AppendUint(%q, %v, %v) = %q want %v", |
| "abc", test.in, test.base, x, test.out) |
| } |
| |
| } |
| } |
| |
| var varlenUints = []struct { |
| in uint64 |
| out string |
| }{ |
| {1, "1"}, |
| {12, "12"}, |
| {123, "123"}, |
| {1234, "1234"}, |
| {12345, "12345"}, |
| {123456, "123456"}, |
| {1234567, "1234567"}, |
| {12345678, "12345678"}, |
| {123456789, "123456789"}, |
| {1234567890, "1234567890"}, |
| {12345678901, "12345678901"}, |
| {123456789012, "123456789012"}, |
| {1234567890123, "1234567890123"}, |
| {12345678901234, "12345678901234"}, |
| {123456789012345, "123456789012345"}, |
| {1234567890123456, "1234567890123456"}, |
| {12345678901234567, "12345678901234567"}, |
| {123456789012345678, "123456789012345678"}, |
| {1234567890123456789, "1234567890123456789"}, |
| {12345678901234567890, "12345678901234567890"}, |
| } |
| |
| func TestFormatUintVarlen(t *testing.T) { |
| for _, test := range varlenUints { |
| s := FormatUint(test.in, 10) |
| if s != test.out { |
| t.Errorf("FormatUint(%v, 10) = %v want %v", test.in, s, test.out) |
| } |
| } |
| } |
| |
| func BenchmarkFormatInt(b *testing.B) { |
| for i := 0; i < b.N; i++ { |
| for _, test := range itob64tests { |
| s := FormatInt(test.in, test.base) |
| BenchSink += len(s) |
| } |
| } |
| } |
| |
| func BenchmarkAppendInt(b *testing.B) { |
| dst := make([]byte, 0, 30) |
| for i := 0; i < b.N; i++ { |
| for _, test := range itob64tests { |
| dst = AppendInt(dst[:0], test.in, test.base) |
| BenchSink += len(dst) |
| } |
| } |
| } |
| |
| func BenchmarkFormatUint(b *testing.B) { |
| for i := 0; i < b.N; i++ { |
| for _, test := range uitob64tests { |
| s := FormatUint(test.in, test.base) |
| BenchSink += len(s) |
| } |
| } |
| } |
| |
| func BenchmarkAppendUint(b *testing.B) { |
| dst := make([]byte, 0, 30) |
| for i := 0; i < b.N; i++ { |
| for _, test := range uitob64tests { |
| dst = AppendUint(dst[:0], test.in, test.base) |
| BenchSink += len(dst) |
| } |
| } |
| } |
| |
| func BenchmarkFormatIntSmall(b *testing.B) { |
| smallInts := []int64{7, 42} |
| for _, smallInt := range smallInts { |
| b.Run(Itoa(int(smallInt)), func(b *testing.B) { |
| for i := 0; i < b.N; i++ { |
| s := FormatInt(smallInt, 10) |
| BenchSink += len(s) |
| } |
| }) |
| } |
| } |
| |
| func BenchmarkAppendIntSmall(b *testing.B) { |
| dst := make([]byte, 0, 30) |
| const smallInt = 42 |
| for i := 0; i < b.N; i++ { |
| dst = AppendInt(dst[:0], smallInt, 10) |
| BenchSink += len(dst) |
| } |
| } |
| |
| func BenchmarkAppendUintVarlen(b *testing.B) { |
| for _, test := range varlenUints { |
| b.Run(test.out, func(b *testing.B) { |
| dst := make([]byte, 0, 30) |
| for j := 0; j < b.N; j++ { |
| dst = AppendUint(dst[:0], test.in, 10) |
| BenchSink += len(dst) |
| } |
| }) |
| } |
| } |
| |
| var BenchSink int // make sure compiler cannot optimize away benchmarks |