1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
14 type atoui64Test
struct {
20 var atoui64tests
= []atoui64Test
{
24 {"12345", 12345, nil},
25 {"012345", 12345, nil},
26 {"12345x", 0, ErrSyntax
},
27 {"98765432100", 98765432100, nil},
28 {"18446744073709551615", 1<<64 - 1, nil},
29 {"18446744073709551616", 1<<64 - 1, ErrRange
},
30 {"18446744073709551620", 1<<64 - 1, ErrRange
},
33 var btoui64tests
= []atoui64Test
{
37 {"12345", 12345, nil},
38 {"012345", 012345, nil},
39 {"0x12345", 0x12345, nil},
40 {"0X12345", 0x12345, nil},
41 {"12345x", 0, ErrSyntax
},
42 {"98765432100", 98765432100, nil},
43 {"18446744073709551615", 1<<64 - 1, nil},
44 {"18446744073709551616", 1<<64 - 1, ErrRange
},
45 {"18446744073709551620", 1<<64 - 1, ErrRange
},
46 {"0xFFFFFFFFFFFFFFFF", 1<<64 - 1, nil},
47 {"0x10000000000000000", 1<<64 - 1, ErrRange
},
48 {"01777777777777777777777", 1<<64 - 1, nil},
49 {"01777777777777777777778", 0, ErrSyntax
},
50 {"02000000000000000000000", 1<<64 - 1, ErrRange
},
51 {"0200000000000000000000", 1 << 61, nil},
54 type atoi64Test
struct {
60 var atoi64tests
= []atoi64Test
{
66 {"12345", 12345, nil},
67 {"-12345", -12345, nil},
68 {"012345", 12345, nil},
69 {"-012345", -12345, nil},
70 {"98765432100", 98765432100, nil},
71 {"-98765432100", -98765432100, nil},
72 {"9223372036854775807", 1<<63 - 1, nil},
73 {"-9223372036854775807", -(1<<63 - 1), nil},
74 {"9223372036854775808", 1<<63 - 1, ErrRange
},
75 {"-9223372036854775808", -1 << 63, nil},
76 {"9223372036854775809", 1<<63 - 1, ErrRange
},
77 {"-9223372036854775809", -1 << 63, ErrRange
},
80 var btoi64tests
= []atoi64Test
{
86 {"12345", 12345, nil},
87 {"-12345", -12345, nil},
88 {"012345", 012345, nil},
89 {"-012345", -012345, nil},
90 {"0x12345", 0x12345, nil},
91 {"-0X12345", -0x12345, nil},
92 {"12345x", 0, ErrSyntax
},
93 {"-12345x", 0, ErrSyntax
},
94 {"98765432100", 98765432100, nil},
95 {"-98765432100", -98765432100, nil},
96 {"9223372036854775807", 1<<63 - 1, nil},
97 {"-9223372036854775807", -(1<<63 - 1), nil},
98 {"9223372036854775808", 1<<63 - 1, ErrRange
},
99 {"-9223372036854775808", -1 << 63, nil},
100 {"9223372036854775809", 1<<63 - 1, ErrRange
},
101 {"-9223372036854775809", -1 << 63, ErrRange
},
104 type atoui32Test
struct {
110 var atoui32tests
= []atoui32Test
{
114 {"12345", 12345, nil},
115 {"012345", 12345, nil},
116 {"12345x", 0, ErrSyntax
},
117 {"987654321", 987654321, nil},
118 {"4294967295", 1<<32 - 1, nil},
119 {"4294967296", 1<<32 - 1, ErrRange
},
122 type atoi32Test
struct {
128 var atoi32tests
= []atoi32Test
{
134 {"12345", 12345, nil},
135 {"-12345", -12345, nil},
136 {"012345", 12345, nil},
137 {"-012345", -12345, nil},
138 {"12345x", 0, ErrSyntax
},
139 {"-12345x", 0, ErrSyntax
},
140 {"987654321", 987654321, nil},
141 {"-987654321", -987654321, nil},
142 {"2147483647", 1<<31 - 1, nil},
143 {"-2147483647", -(1<<31 - 1), nil},
144 {"2147483648", 1<<31 - 1, ErrRange
},
145 {"-2147483648", -1 << 31, nil},
146 {"2147483649", 1<<31 - 1, ErrRange
},
147 {"-2147483649", -1 << 31, ErrRange
},
150 type numErrorTest
struct {
154 var numErrorTests
= []numErrorTest
{
155 {"0", `strconv.ParseFloat: parsing "0": failed`},
156 {"`", "strconv.ParseFloat: parsing \"`\": failed"},
157 {"1\x00.2", `strconv.ParseFloat: parsing "1\x00.2": failed`},
161 // The atoi routines return NumErrors wrapping
162 // the error and the string. Convert the tables above.
163 for i
:= range atoui64tests
{
164 test
:= &atoui64tests
[i
]
166 test
.err
= &NumError
{"ParseUint", test
.in
, test
.err
}
169 for i
:= range btoui64tests
{
170 test
:= &btoui64tests
[i
]
172 test
.err
= &NumError
{"ParseUint", test
.in
, test
.err
}
175 for i
:= range atoi64tests
{
176 test
:= &atoi64tests
[i
]
178 test
.err
= &NumError
{"ParseInt", test
.in
, test
.err
}
181 for i
:= range btoi64tests
{
182 test
:= &btoi64tests
[i
]
184 test
.err
= &NumError
{"ParseInt", test
.in
, test
.err
}
187 for i
:= range atoui32tests
{
188 test
:= &atoui32tests
[i
]
190 test
.err
= &NumError
{"ParseUint", test
.in
, test
.err
}
193 for i
:= range atoi32tests
{
194 test
:= &atoi32tests
[i
]
196 test
.err
= &NumError
{"ParseInt", test
.in
, test
.err
}
201 func TestParseUint64(t
*testing
.T
) {
202 for i
:= range atoui64tests
{
203 test
:= &atoui64tests
[i
]
204 out
, err
:= ParseUint(test
.in
, 10, 64)
205 if test
.out
!= out ||
!reflect
.DeepEqual(test
.err
, err
) {
206 t
.Errorf("Atoui64(%q) = %v, %v want %v, %v",
207 test
.in
, out
, err
, test
.out
, test
.err
)
212 func TestParseUint64Base(t
*testing
.T
) {
213 for i
:= range btoui64tests
{
214 test
:= &btoui64tests
[i
]
215 out
, err
:= ParseUint(test
.in
, 0, 64)
216 if test
.out
!= out ||
!reflect
.DeepEqual(test
.err
, err
) {
217 t
.Errorf("ParseUint(%q) = %v, %v want %v, %v",
218 test
.in
, out
, err
, test
.out
, test
.err
)
223 func TestParseInt64(t
*testing
.T
) {
224 for i
:= range atoi64tests
{
225 test
:= &atoi64tests
[i
]
226 out
, err
:= ParseInt(test
.in
, 10, 64)
227 if test
.out
!= out ||
!reflect
.DeepEqual(test
.err
, err
) {
228 t
.Errorf("Atoi64(%q) = %v, %v want %v, %v",
229 test
.in
, out
, err
, test
.out
, test
.err
)
234 func TestParseInt64Base(t
*testing
.T
) {
235 for i
:= range btoi64tests
{
236 test
:= &btoi64tests
[i
]
237 out
, err
:= ParseInt(test
.in
, 0, 64)
238 if test
.out
!= out ||
!reflect
.DeepEqual(test
.err
, err
) {
239 t
.Errorf("ParseInt(%q) = %v, %v want %v, %v",
240 test
.in
, out
, err
, test
.out
, test
.err
)
245 func TestParseUint(t
*testing
.T
) {
248 for i
:= range atoui32tests
{
249 test
:= &atoui32tests
[i
]
250 out
, err
:= ParseUint(test
.in
, 10, 0)
251 if test
.out
!= uint32(out
) ||
!reflect
.DeepEqual(test
.err
, err
) {
252 t
.Errorf("Atoui(%q) = %v, %v want %v, %v",
253 test
.in
, out
, err
, test
.out
, test
.err
)
257 for i
:= range atoui64tests
{
258 test
:= &atoui64tests
[i
]
259 out
, err
:= ParseUint(test
.in
, 10, 0)
260 if test
.out
!= uint64(out
) ||
!reflect
.DeepEqual(test
.err
, err
) {
261 t
.Errorf("Atoui(%q) = %v, %v want %v, %v",
262 test
.in
, out
, err
, test
.out
, test
.err
)
268 func TestParseInt(t
*testing
.T
) {
271 for i
:= range atoi32tests
{
272 test
:= &atoi32tests
[i
]
273 out
, err
:= ParseInt(test
.in
, 10, 0)
274 if test
.out
!= int32(out
) ||
!reflect
.DeepEqual(test
.err
, err
) {
275 t
.Errorf("Atoi(%q) = %v, %v want %v, %v",
276 test
.in
, out
, err
, test
.out
, test
.err
)
280 for i
:= range atoi64tests
{
281 test
:= &atoi64tests
[i
]
282 out
, err
:= ParseInt(test
.in
, 10, 0)
283 if test
.out
!= int64(out
) ||
!reflect
.DeepEqual(test
.err
, err
) {
284 t
.Errorf("Atoi(%q) = %v, %v want %v, %v",
285 test
.in
, out
, err
, test
.out
, test
.err
)
291 func TestNumError(t
*testing
.T
) {
292 for _
, test
:= range numErrorTests
{
296 Err
: errors
.New("failed"),
298 if got
:= err
.Error(); got
!= test
.want
{
299 t
.Errorf(`(&NumError{"ParseFloat", %q, "failed"}).Error() = %v, want %v`, test
.num
, got
, test
.want
)
304 func BenchmarkAtoi(b
*testing
.B
) {
305 for i
:= 0; i
< b
.N
; i
++ {
306 ParseInt("12345678", 10, 0)
310 func BenchmarkAtoiNeg(b
*testing
.B
) {
311 for i
:= 0; i
< b
.N
; i
++ {
312 ParseInt("-12345678", 10, 0)
316 func BenchmarkAtoi64(b
*testing
.B
) {
317 for i
:= 0; i
< b
.N
; i
++ {
318 ParseInt("12345678901234", 10, 64)
322 func BenchmarkAtoi64Neg(b
*testing
.B
) {
323 for i
:= 0; i
< b
.N
; i
++ {
324 ParseInt("-12345678901234", 10, 64)