13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved.
23345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Use of this source code is governed by a BSD-style license that can be
33345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// found in the LICENSE file.
43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <math.h>
6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <limits>
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "testing/gtest/include/gtest/gtest.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace base {
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace {
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricktemplate <typename INT>
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstruct IntToStringTest {
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  INT num;
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const char* sexpected;
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const char* uexpected;
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(StringNumberConversionsTest, IntToString) {
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const IntToStringTest<int> int_tests[] = {
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      { 0, "0", "0" },
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      { -1, "-1", "4294967295" },
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      { std::numeric_limits<int>::max(), "2147483647", "2147483647" },
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      { std::numeric_limits<int>::min(), "-2147483648", "2147483648" },
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const IntToStringTest<int64> int64_tests[] = {
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      { 0, "0", "0" },
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      { -1, "-1", "18446744073709551615" },
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      { std::numeric_limits<int64>::max(),
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "9223372036854775807",
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "9223372036854775807", },
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      { std::numeric_limits<int64>::min(),
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "-9223372036854775808",
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "9223372036854775808" },
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (size_t i = 0; i < arraysize(int_tests); ++i) {
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const IntToStringTest<int>* test = &int_tests[i];
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(IntToString(test->num), test->sexpected);
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(IntToString16(test->num), UTF8ToUTF16(test->sexpected));
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(UintToString(test->num), test->uexpected);
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(UintToString16(test->num), UTF8ToUTF16(test->uexpected));
503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (size_t i = 0; i < arraysize(int64_tests); ++i) {
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const IntToStringTest<int64>* test = &int64_tests[i];
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(Int64ToString(test->num), test->sexpected);
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(Int64ToString16(test->num), UTF8ToUTF16(test->sexpected));
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(Uint64ToString(test->num), test->uexpected);
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(Uint64ToString16(test->num), UTF8ToUTF16(test->uexpected));
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
603345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(StringNumberConversionsTest, Uint64ToString) {
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const struct {
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    uint64 input;
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::string output;
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } cases[] = {
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {0, "0"},
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {42, "42"},
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {INT_MAX, "2147483647"},
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {kuint64max, "18446744073709551615"},
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i)
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(cases[i].output, Uint64ToString(cases[i].input));
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(StringNumberConversionsTest, StringToInt) {
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const struct {
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::string input;
783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    int output;
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool success;
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } cases[] = {
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"0", 0, true},
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"42", 42, true},
83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    {"42\x99", 42, false},
84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    {"\x99" "42\x99", 0, false},
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-2147483648", INT_MIN, true},
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"2147483647", INT_MAX, true},
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"", 0, false},
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {" 42", 42, false},
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"42 ", 42, false},
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"\t\n\v\f\r 42", 42, false},
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"blah42", 0, false},
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"42blah", 42, false},
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"blah42blah", 0, false},
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-273.15", -273, false},
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"+98.6", 98, false},
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"--123", 0, false},
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"++123", 0, false},
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-+123", 0, false},
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"+-123", 0, false},
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-", 0, false},
1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-2147483649", INT_MIN, false},
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-99999999999", INT_MIN, false},
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"2147483648", INT_MAX, false},
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"99999999999", INT_MAX, false},
1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const char* ascii_chars = cases[i].input.c_str();
109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    int output = 0;
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(cases[i].success, StringToInt(cases[i].input, &output));
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(cases[i].output, output);
112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    output = 0;
113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].success, StringToInt(cases[i].input.begin(),
114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                            cases[i].input.end(),
115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                            &output));
116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].output, output);
117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    output = 0;
118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].success, StringToInt(
119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        ascii_chars, ascii_chars + cases[i].input.length(), &output));
120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].output, output);
1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    string16 utf16_input = UTF8ToUTF16(cases[i].input);
123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const char16* utf16_chars = utf16_input.c_str();
124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    output = 0;
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(cases[i].success, StringToInt(utf16_input, &output));
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(cases[i].output, output);
127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    output = 0;
128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].success, StringToInt(utf16_input.begin(),
129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                            utf16_input.end(),
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                            &output));
131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].output, output);
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    output = 0;
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].success, StringToInt(
134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        utf16_chars, utf16_chars + utf16_input.length(), &output));
135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].output, output);
1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // One additional test to verify that conversion of numbers in strings with
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // embedded NUL characters.  The NUL and extra data after it should be
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // interpreted as junk after the number.
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const char input[] = "6\06";
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string input_string(input, arraysize(input) - 1);
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int output;
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_FALSE(StringToInt(input_string, &output));
1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(6, output);
146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  output = 0;
147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(StringToInt(input_string.begin(), input_string.end(), &output));
148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(6, output);
149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  output = 0;
150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(StringToInt(input, input + arraysize(input), &output));
151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(6, output);
1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  string16 utf16_input = UTF8ToUTF16(input_string);
154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const char16* utf16_chars = utf16_input.c_str();
155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  output = 0;
1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_FALSE(StringToInt(utf16_input, &output));
1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(6, output);
158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  output = 0;
159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(StringToInt(utf16_input.begin(), utf16_input.end(), &output));
160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(6, output);
161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  output = 0;
162731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(StringToInt(utf16_chars,
163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                           utf16_chars + utf16_input.length(),
164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                           &output));
165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(6, output);
166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  output = 0;
168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const char16 negative_wide_input[] = { 0xFF4D, '4', '2', 0};
169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(StringToInt(string16(negative_wide_input), &output));
170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(0, output);
1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(StringNumberConversionsTest, StringToInt64) {
1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const struct {
1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::string input;
1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    int64 output;
1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool success;
1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } cases[] = {
1793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"0", 0, true},
1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"42", 42, true},
1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-2147483648", INT_MIN, true},
1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"2147483647", INT_MAX, true},
1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-2147483649", GG_INT64_C(-2147483649), true},
1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-99999999999", GG_INT64_C(-99999999999), true},
1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"2147483648", GG_INT64_C(2147483648), true},
1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"99999999999", GG_INT64_C(99999999999), true},
1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"9223372036854775807", kint64max, true},
1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-9223372036854775808", kint64min, true},
1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"09", 9, true},
1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-09", -9, true},
1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"", 0, false},
1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {" 42", 42, false},
1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"42 ", 42, false},
194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    {"0x42", 0, false},
1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"\t\n\v\f\r 42", 42, false},
1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"blah42", 0, false},
1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"42blah", 42, false},
1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"blah42blah", 0, false},
1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-273.15", -273, false},
2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"+98.6", 98, false},
2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"--123", 0, false},
2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"++123", 0, false},
2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-+123", 0, false},
2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"+-123", 0, false},
2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-", 0, false},
2063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-9223372036854775809", kint64min, false},
2073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-99999999999999999999", kint64min, false},
2083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"9223372036854775808", kint64max, false},
2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"99999999999999999999", kint64max, false},
2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const char* ascii_chars = cases[i].input.c_str();
214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    int64 output = 0;
2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(cases[i].success, StringToInt64(cases[i].input, &output));
2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(cases[i].output, output);
217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    output = 0;
218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].success, StringToInt64(cases[i].input.begin(),
219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                              cases[i].input.end(),
220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                              &output));
221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].output, output);
222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    output = 0;
223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].success, StringToInt64(
224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        ascii_chars, ascii_chars + cases[i].input.length(), &output));
225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].output, output);
2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    string16 utf16_input = UTF8ToUTF16(cases[i].input);
228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const char16* utf16_chars = utf16_input.c_str();
229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    output = 0;
2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(cases[i].success, StringToInt64(utf16_input, &output));
2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(cases[i].output, output);
232731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    output = 0;
233731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].success, StringToInt64(utf16_input.begin(),
234731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                              utf16_input.end(),
235731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                              &output));
236731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].output, output);
237731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    output = 0;
238731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].success, StringToInt64(
239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        utf16_chars, utf16_chars + utf16_input.length(), &output));
240731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].output, output);
2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // One additional test to verify that conversion of numbers in strings with
2443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // embedded NUL characters.  The NUL and extra data after it should be
2453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // interpreted as junk after the number.
2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const char input[] = "6\06";
2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string input_string(input, arraysize(input) - 1);
2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int64 output;
2493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_FALSE(StringToInt64(input_string, &output));
2503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(6, output);
251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  output = 0;
252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(StringToInt64(input_string.begin(),
253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                             input_string.end(),
254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                             &output));
255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(6, output);
256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  output = 0;
257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(StringToInt64(input, input + arraysize(input), &output));
258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(6, output);
2593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  string16 utf16_input = UTF8ToUTF16(input_string);
261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const char16* utf16_chars = utf16_input.c_str();
262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  output = 0;
2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_FALSE(StringToInt64(utf16_input, &output));
2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(6, output);
265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  output = 0;
266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(StringToInt64(utf16_input.begin(), utf16_input.end(), &output));
267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(6, output);
268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  output = 0;
269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(StringToInt64(utf16_chars,
270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                             utf16_chars + utf16_input.length(),
271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                             &output));
272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(6, output);
2733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2753345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(StringNumberConversionsTest, HexStringToInt) {
2763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const struct {
2773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::string input;
2783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    int output;
2793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool success;
2803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } cases[] = {
2813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"0", 0, true},
2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"42", 66, true},
2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-42", -66, true},
2843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"+42", 66, true},
2853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"7fffffff", INT_MAX, true},
2863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"80000000", INT_MIN, true},
2873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"ffffffff", -1, true},
2883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"DeadBeef", 0xdeadbeef, true},
2893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"0x42", 66, true},
2903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-0x42", -66, true},
2913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"+0x42", 66, true},
2923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"0x7fffffff", INT_MAX, true},
2933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"0x80000000", INT_MIN, true},
2943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"0xffffffff", -1, true},
2953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"0XDeadBeef", 0xdeadbeef, true},
2963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"0x0f", 15, true},
2973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"0f", 15, true},
2983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {" 45", 0x45, false},
2993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"\t\n\v\f\r 0x45", 0x45, false},
3003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {" 45", 0x45, false},
3013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"45 ", 0x45, false},
302731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    {"45:", 0x45, false},
3033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"efgh", 0xef, false},
3043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"0xefgh", 0xef, false},
3053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"hgfe", 0, false},
3063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"100000000", -1, false},  // don't care about |output|, just |success|
3073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-", 0, false},
3083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"", 0, false},
3093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
3103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
312731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const char* ascii_chars = cases[i].input.c_str();
313731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    int output = 0;
3143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(cases[i].success, HexStringToInt(cases[i].input, &output));
3153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(cases[i].output, output);
316731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    output = 0;
317731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].success, HexStringToInt(cases[i].input.begin(),
318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                               cases[i].input.end(),
319731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                               &output));
320731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].output, output);
321731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    output = 0;
322731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].success, HexStringToInt(
323731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        ascii_chars, ascii_chars + cases[i].input.length(), &output));
324731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EXPECT_EQ(cases[i].output, output);
3253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // One additional test to verify that conversion of numbers in strings with
3273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // embedded NUL characters.  The NUL and extra data after it should be
3283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // interpreted as junk after the number.
3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const char input[] = "0xc0ffee\09";
3303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string input_string(input, arraysize(input) - 1);
3313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int output;
3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_FALSE(HexStringToInt(input_string, &output));
3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(0xc0ffee, output);
334731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  output = 0;
335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(HexStringToInt(input_string.begin(),
336731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              input_string.end(),
337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              &output));
338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(0xc0ffee, output);
339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  output = 0;
340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(HexStringToInt(input, input + arraysize(input), &output));
341731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(0xc0ffee, output);
3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3443345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(StringNumberConversionsTest, HexStringToBytes) {
3453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const struct {
3463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const std::string input;
3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const char* output;
3483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    size_t output_len;
3493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool success;
3503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } cases[] = {
3513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"0", "", 0, false},  // odd number of characters fails
3523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"00", "\0", 1, true},
3533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"42", "\x42", 1, true},
3543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-42", "", 0, false},  // any non-hex value fails
3553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"+42", "", 0, false},
3563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"7fffffff", "\x7f\xff\xff\xff", 4, true},
3573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"80000000", "\x80\0\0\0", 4, true},
3583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"deadbeef", "\xde\xad\xbe\xef", 4, true},
3593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"DeadBeef", "\xde\xad\xbe\xef", 4, true},
3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"0x42", "", 0, false},  // leading 0x fails (x is not hex)
3613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"0f", "\xf", 1, true},
3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"45  ", "\x45", 1, false},
3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"efgh", "\xef", 1, false},
3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"", "", 0, false},
3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"0123456789ABCDEF", "\x01\x23\x45\x67\x89\xAB\xCD\xEF", 8, true},
3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"0123456789ABCDEF012345",
3673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     "\x01\x23\x45\x67\x89\xAB\xCD\xEF\x01\x23\x45", 11, true},
3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
3723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::vector<uint8> output;
3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::vector<uint8> compare;
3743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(cases[i].success, HexStringToBytes(cases[i].input, &output)) <<
3753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        i << ": " << cases[i].input;
3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    for (size_t j = 0; j < cases[i].output_len; ++j)
3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      compare.push_back(static_cast<uint8>(cases[i].output[j]));
3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ASSERT_EQ(output.size(), compare.size()) << i << ": " << cases[i].input;
3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_TRUE(std::equal(output.begin(), output.end(), compare.begin())) <<
3803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        i << ": " << cases[i].input;
3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3843345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(StringNumberConversionsTest, StringToDouble) {
3853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const struct {
3863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::string input;
3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    double output;
3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool success;
3893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } cases[] = {
3903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"0", 0.0, true},
3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"42", 42.0, true},
3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-42", -42.0, true},
3933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"123.45", 123.45, true},
3943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-123.45", -123.45, true},
3953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"+123.45", 123.45, true},
3963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"2.99792458e8", 299792458.0, true},
3973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"149597870.691E+3", 149597870691.0, true},
3983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"6.", 6.0, true},
3993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"9e99999999999999999999", HUGE_VAL, false},
4003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-9e99999999999999999999", -HUGE_VAL, false},
4013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"1e-2", 0.01, true},
402731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    {"42 ", 42.0, false},
4033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {" 1e-2", 0.01, false},
4043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"1e-2 ", 0.01, false},
4053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-1E-7", -0.0000001, true},
4063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"01e02", 100, true},
4073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"2.3e15", 2.3e15, true},
4083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"\t\n\v\f\r -123.45e2", -12345.0, false},
4093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"+123 e4", 123.0, false},
4103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"123e ", 123.0, false},
4113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"123e", 123.0, false},
4123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {" 2.99", 2.99, false},
4133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"1e3.4", 1000.0, false},
4143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"nothing", 0.0, false},
4153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"-", 0.0, false},
4163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"+", 0.0, false},
4173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    {"", 0.0, false},
4183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
4193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
4213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    double output;
4223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(cases[i].success, StringToDouble(cases[i].input, &output));
4233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_DOUBLE_EQ(cases[i].output, output);
4243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // One additional test to verify that conversion of numbers in strings with
4273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // embedded NUL characters.  The NUL and extra data after it should be
4283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // interpreted as junk after the number.
4293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const char input[] = "3.14\0159";
4303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string input_string(input, arraysize(input) - 1);
4313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  double output;
4323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_FALSE(StringToDouble(input_string, &output));
4333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_DOUBLE_EQ(3.14, output);
4343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
4353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4363345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(StringNumberConversionsTest, HexEncode) {
4373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string hex(HexEncode(NULL, 0));
4383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(hex.length(), 0U);
4393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  unsigned char bytes[] = {0x01, 0xff, 0x02, 0xfe, 0x03, 0x80, 0x81};
4403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  hex = HexEncode(bytes, sizeof(bytes));
4413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(hex.compare("01FF02FE038081"), 0);
4423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
4433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace base
445