Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(80)

Side by Side Diff: base/strings/string_number_conversions_unittest.cc

Issue 14794002: add more string -> unsigned number conversion unit tests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: size_t cast fixups Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <math.h> 5 #include <math.h>
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "base/utf_string_conversions.h" 10 #include "base/utf_string_conversions.h"
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 output = 0; 128 output = 0;
129 EXPECT_FALSE(StringToInt(utf16_input, &output)); 129 EXPECT_FALSE(StringToInt(utf16_input, &output));
130 EXPECT_EQ(6, output); 130 EXPECT_EQ(6, output);
131 131
132 output = 0; 132 output = 0;
133 const char16 negative_wide_input[] = { 0xFF4D, '4', '2', 0}; 133 const char16 negative_wide_input[] = { 0xFF4D, '4', '2', 0};
134 EXPECT_FALSE(StringToInt(string16(negative_wide_input), &output)); 134 EXPECT_FALSE(StringToInt(string16(negative_wide_input), &output));
135 EXPECT_EQ(0, output); 135 EXPECT_EQ(0, output);
136 } 136 }
137 137
138 TEST(StringNumberConversionsTest, StringToUint) {
139 static const struct {
140 std::string input;
141 unsigned output;
142 bool success;
143 } cases[] = {
144 {"0", 0, true},
145 {"42", 42, true},
146 {"42\x99", 42, false},
147 {"\x99" "42\x99", 0, false},
148 {"-2147483648", 0, false},
149 {"2147483647", INT_MAX, true},
150 {"", 0, false},
151 {" 42", 42, false},
152 {"42 ", 42, false},
153 {"\t\n\v\f\r 42", 42, false},
154 {"blah42", 0, false},
155 {"42blah", 42, false},
156 {"blah42blah", 0, false},
157 {"-273.15", 0, false},
158 {"+98.6", 98, false},
159 {"--123", 0, false},
160 {"++123", 0, false},
161 {"-+123", 0, false},
162 {"+-123", 0, false},
163 {"-", 0, false},
164 {"-2147483649", 0, false},
165 {"-99999999999", 0, false},
166 {"4294967295", UINT_MAX, true},
167 {"4294967296", UINT_MAX, false},
168 {"99999999999", UINT_MAX, false},
169 };
170
171 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
172 unsigned output = 0;
173 EXPECT_EQ(cases[i].success, StringToUint(cases[i].input, &output));
174 EXPECT_EQ(cases[i].output, output);
175
176 string16 utf16_input = UTF8ToUTF16(cases[i].input);
177 output = 0;
178 EXPECT_EQ(cases[i].success, StringToUint(utf16_input, &output));
179 EXPECT_EQ(cases[i].output, output);
180 }
181
182 // One additional test to verify that conversion of numbers in strings with
183 // embedded NUL characters. The NUL and extra data after it should be
184 // interpreted as junk after the number.
185 const char input[] = "6\06";
186 std::string input_string(input, arraysize(input) - 1);
187 unsigned output;
188 EXPECT_FALSE(StringToUint(input_string, &output));
189 EXPECT_EQ(6U, output);
190
191 string16 utf16_input = UTF8ToUTF16(input_string);
192 output = 0;
193 EXPECT_FALSE(StringToUint(utf16_input, &output));
194 EXPECT_EQ(6U, output);
195
196 output = 0;
197 const char16 negative_wide_input[] = { 0xFF4D, '4', '2', 0};
198 EXPECT_FALSE(StringToUint(string16(negative_wide_input), &output));
199 EXPECT_EQ(0U, output);
200 }
201
138 TEST(StringNumberConversionsTest, StringToInt64) { 202 TEST(StringNumberConversionsTest, StringToInt64) {
139 static const struct { 203 static const struct {
140 std::string input; 204 std::string input;
141 int64 output; 205 int64 output;
142 bool success; 206 bool success;
143 } cases[] = { 207 } cases[] = {
144 {"0", 0, true}, 208 {"0", 0, true},
145 {"42", 42, true}, 209 {"42", 42, true},
146 {"-2147483648", INT_MIN, true}, 210 {"-2147483648", INT_MIN, true},
147 {"2147483647", INT_MAX, true}, 211 {"2147483647", INT_MAX, true},
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 int64 output; 257 int64 output;
194 EXPECT_FALSE(StringToInt64(input_string, &output)); 258 EXPECT_FALSE(StringToInt64(input_string, &output));
195 EXPECT_EQ(6, output); 259 EXPECT_EQ(6, output);
196 260
197 string16 utf16_input = UTF8ToUTF16(input_string); 261 string16 utf16_input = UTF8ToUTF16(input_string);
198 output = 0; 262 output = 0;
199 EXPECT_FALSE(StringToInt64(utf16_input, &output)); 263 EXPECT_FALSE(StringToInt64(utf16_input, &output));
200 EXPECT_EQ(6, output); 264 EXPECT_EQ(6, output);
201 } 265 }
202 266
267 TEST(StringNumberConversionsTest, StringToUint64) {
268 static const struct {
269 std::string input;
270 uint64 output;
271 bool success;
272 } cases[] = {
273 {"0", 0, true},
274 {"42", 42, true},
275 {"-2147483648", 0, false},
276 {"2147483647", INT_MAX, true},
277 {"-2147483649", 0, false},
278 {"-99999999999", 0, false},
279 {"2147483648", GG_INT64_C(2147483648), true},
280 {"99999999999", GG_INT64_C(99999999999), true},
281 {"9223372036854775807", kint64max, true},
282 {"-9223372036854775808", 0, false},
283 {"09", 9, true},
284 {"-09", 0, false},
285 {"", 0, false},
286 {" 42", 42, false},
287 {"42 ", 42, false},
288 {"0x42", 0, false},
289 {"\t\n\v\f\r 42", 42, false},
290 {"blah42", 0, false},
291 {"42blah", 42, false},
292 {"blah42blah", 0, false},
293 {"-273.15", 0, false},
294 {"+98.6", 98, false},
295 {"--123", 0, false},
296 {"++123", 0, false},
297 {"-+123", 0, false},
298 {"+-123", 0, false},
299 {"-", 0, false},
300 {"-9223372036854775809", 0, false},
301 {"-99999999999999999999", 0, false},
302 {"9223372036854775808", 9223372036854775808U, true},
303 {"99999999999999999999", kuint64max, false},
304 {"18446744073709551615", kuint64max, true},
305 {"18446744073709551616", kuint64max, false},
306 };
307
308 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
309 uint64 output = 0;
310 EXPECT_EQ(cases[i].success, StringToUint64(cases[i].input, &output));
311 EXPECT_EQ(cases[i].output, output);
312
313 string16 utf16_input = UTF8ToUTF16(cases[i].input);
314 output = 0;
315 EXPECT_EQ(cases[i].success, StringToUint64(utf16_input, &output));
316 EXPECT_EQ(cases[i].output, output);
317 }
318
319 // One additional test to verify that conversion of numbers in strings with
320 // embedded NUL characters. The NUL and extra data after it should be
321 // interpreted as junk after the number.
322 const char input[] = "6\06";
323 std::string input_string(input, arraysize(input) - 1);
324 uint64 output;
325 EXPECT_FALSE(StringToUint64(input_string, &output));
326 EXPECT_EQ(6U, output);
327
328 string16 utf16_input = UTF8ToUTF16(input_string);
329 output = 0;
330 EXPECT_FALSE(StringToUint64(utf16_input, &output));
331 EXPECT_EQ(6U, output);
332 }
333
334 TEST(StringNumberConversionsTest, StringToSizeT) {
335 static const struct {
336 std::string input;
337 size_t output;
338 bool success;
339 } cases[] = {
340 {"0", 0, true},
341 {"42", 42, true},
342 {"-2147483648", 0, false},
343 {"2147483647", INT_MAX, true},
344 {"-2147483649", 0, false},
345 {"-99999999999", 0, false},
346 {"2147483648", static_cast<size_t>(2147483648), true},
347 {"99999999999", static_cast<size_t>(99999999999), true},
Vitaly Buka corp 2013/05/18 08:55:17 it cant work on 32bit platform where size_t 32bit
Mostyn Bramley-Moore 2013/05/18 10:49:06 Thanks for the review. On 2013/05/18 08:55:17, Vi
348 {"9223372036854775807", static_cast<size_t>(kint64max), true},
349 {"-9223372036854775808", 0, false},
350 {"09", 9, true},
351 {"-09", 0, false},
352 {"", 0, false},
353 {" 42", 42, false},
354 {"42 ", 42, false},
355 {"0x42", 0, false},
356 {"\t\n\v\f\r 42", 42, false},
357 {"blah42", 0, false},
358 {"42blah", 42, false},
359 {"blah42blah", 0, false},
360 {"-273.15", 0, false},
361 {"+98.6", 98, false},
362 {"--123", 0, false},
363 {"++123", 0, false},
364 {"-+123", 0, false},
365 {"+-123", 0, false},
366 {"-", 0, false},
367 {"-9223372036854775809", 0, false},
368 {"-99999999999999999999", 0, false},
369 {"999999999999999999999999", std::numeric_limits<size_t>::max(), false},
370 };
371
372 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
373 size_t output = 0;
374 EXPECT_EQ(cases[i].success, StringToSizeT(cases[i].input, &output));
375 EXPECT_EQ(cases[i].output, output);
376
377 string16 utf16_input = UTF8ToUTF16(cases[i].input);
378 output = 0;
379 EXPECT_EQ(cases[i].success, StringToSizeT(utf16_input, &output));
380 EXPECT_EQ(cases[i].output, output);
381 }
382
383 // One additional test to verify that conversion of numbers in strings with
384 // embedded NUL characters. The NUL and extra data after it should be
385 // interpreted as junk after the number.
386 const char input[] = "6\06";
387 std::string input_string(input, arraysize(input) - 1);
388 size_t output;
389 EXPECT_FALSE(StringToSizeT(input_string, &output));
390 EXPECT_EQ(6U, output);
391
392 string16 utf16_input = UTF8ToUTF16(input_string);
393 output = 0;
394 EXPECT_FALSE(StringToSizeT(utf16_input, &output));
395 EXPECT_EQ(6U, output);
396 }
397
203 TEST(StringNumberConversionsTest, HexStringToInt) { 398 TEST(StringNumberConversionsTest, HexStringToInt) {
204 static const struct { 399 static const struct {
205 std::string input; 400 std::string input;
206 int64 output; 401 int64 output;
207 bool success; 402 bool success;
208 } cases[] = { 403 } cases[] = {
209 {"0", 0, true}, 404 {"0", 0, true},
210 {"42", 66, true}, 405 {"42", 66, true},
211 {"-42", -66, true}, 406 {"-42", -66, true},
212 {"+42", 66, true}, 407 {"+42", 66, true},
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 690
496 TEST(StringNumberConversionsTest, HexEncode) { 691 TEST(StringNumberConversionsTest, HexEncode) {
497 std::string hex(HexEncode(NULL, 0)); 692 std::string hex(HexEncode(NULL, 0));
498 EXPECT_EQ(hex.length(), 0U); 693 EXPECT_EQ(hex.length(), 0U);
499 unsigned char bytes[] = {0x01, 0xff, 0x02, 0xfe, 0x03, 0x80, 0x81}; 694 unsigned char bytes[] = {0x01, 0xff, 0x02, 0xfe, 0x03, 0x80, 0x81};
500 hex = HexEncode(bytes, sizeof(bytes)); 695 hex = HexEncode(bytes, sizeof(bytes));
501 EXPECT_EQ(hex.compare("01FF02FE038081"), 0); 696 EXPECT_EQ(hex.compare("01FF02FE038081"), 0);
502 } 697 }
503 698
504 } // namespace base 699 } // namespace base
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698