123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- // 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
|