1a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
2750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// Redistribution and use in source and binary forms, with or without
3750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// modification, are permitted provided that the following conditions are
4750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// met:
5750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//
6750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//     * Redistributions of source code must retain the above copyright
7750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       notice, this list of conditions and the following disclaimer.
8750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//     * Redistributions in binary form must reproduce the above
9750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       copyright notice, this list of conditions and the following
10750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       disclaimer in the documentation and/or other materials provided
11750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       with the distribution.
12750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//     * Neither the name of Google Inc. nor the names of its
13750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       contributors may be used to endorse or promote products derived
14750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       from this software without specific prior written permission.
15750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//
16750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <stdlib.h>
299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
30196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
325de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/platform.h"
33196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h"
349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing namespace v8::internal;
369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Hex) {
39a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  UnicodeCache uc;
40ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0x0", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
41ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0X0", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
42ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(1.0, StringToDouble(&uc, "0x1", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
43ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(16.0, StringToDouble(&uc, "0x10", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
44ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(255.0, StringToDouble(&uc, "0xff",
45ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                 ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
46ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(175.0, StringToDouble(&uc, "0xAF",
47ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                 ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
48a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
49a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0x0", ALLOW_HEX));
50a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0X0", ALLOW_HEX));
51a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1.0, StringToDouble(&uc, "0x1", ALLOW_HEX));
52a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(16.0, StringToDouble(&uc, "0x10", ALLOW_HEX));
53a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(255.0, StringToDouble(&uc, "0xff", ALLOW_HEX));
54a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(175.0, StringToDouble(&uc, "0xAF", ALLOW_HEX));
559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(Octal) {
59a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  UnicodeCache uc;
60ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0o0", ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL));
61ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0O0", ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL));
62ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(1.0, StringToDouble(&uc, "0o1", ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL));
63ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(7.0, StringToDouble(&uc, "0o7", ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL));
64ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(8.0, StringToDouble(&uc, "0o10",
65ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                               ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL));
66ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(63.0, StringToDouble(&uc, "0o77",
67ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                ALLOW_OCTAL | ALLOW_IMPLICIT_OCTAL));
68ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
69ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0o0", ALLOW_OCTAL));
70ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0O0", ALLOW_OCTAL));
71ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(1.0, StringToDouble(&uc, "0o1", ALLOW_OCTAL));
72ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(7.0, StringToDouble(&uc, "0o7", ALLOW_OCTAL));
73ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(8.0, StringToDouble(&uc, "0o10", ALLOW_OCTAL));
74ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(63.0, StringToDouble(&uc, "0o77", ALLOW_OCTAL));
75ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org}
76ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
77ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
78ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgTEST(ImplicitOctal) {
79ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  UnicodeCache uc;
80ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
81ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "00", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
82ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(1.0, StringToDouble(&uc, "01", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
83ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(7.0, StringToDouble(&uc, "07", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
84ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(8.0, StringToDouble(&uc, "010", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
85ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(63.0, StringToDouble(&uc, "077", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
86a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
87a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0", ALLOW_HEX));
88a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "00", ALLOW_HEX));
89a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1.0, StringToDouble(&uc, "01", ALLOW_HEX));
90a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(7.0, StringToDouble(&uc, "07", ALLOW_HEX));
91a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(10.0, StringToDouble(&uc, "010", ALLOW_HEX));
92a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(77.0, StringToDouble(&uc, "077", ALLOW_HEX));
93b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
94b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  const double x = 010000000000;  // Power of 2, no rounding errors.
95a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(x * x * x * x * x, StringToDouble(&uc, "01" "0000000000" "0000000000"
96ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      "0000000000" "0000000000" "0000000000", ALLOW_IMPLICIT_OCTAL));
979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
100ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgTEST(Binary) {
101a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  UnicodeCache uc;
102ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0b0",
103ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                               ALLOW_BINARY | ALLOW_IMPLICIT_OCTAL));
104ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0B0",
105ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                               ALLOW_BINARY | ALLOW_IMPLICIT_OCTAL));
106ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(1.0, StringToDouble(&uc, "0b1",
107ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                               ALLOW_BINARY | ALLOW_IMPLICIT_OCTAL));
108ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(2.0, StringToDouble(&uc, "0b10",
109ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                               ALLOW_BINARY | ALLOW_IMPLICIT_OCTAL));
110ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(3.0, StringToDouble(&uc, "0b11",
111ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                               ALLOW_BINARY | ALLOW_IMPLICIT_OCTAL));
112ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
113ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0b0", ALLOW_BINARY));
114ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0B0", ALLOW_BINARY));
115ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(1.0, StringToDouble(&uc, "0b1", ALLOW_BINARY));
116ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(2.0, StringToDouble(&uc, "0b10", ALLOW_BINARY));
117ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(3.0, StringToDouble(&uc, "0b11", ALLOW_BINARY));
118ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org}
1199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
121ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgTEST(MalformedOctal) {
122ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  UnicodeCache uc;
123ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(8.0, StringToDouble(&uc, "08", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
124ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(81.0, StringToDouble(&uc, "081", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
125ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(78.0, StringToDouble(&uc, "078", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
126ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
127ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK(std::isnan(StringToDouble(&uc, "07.7",
128ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                  ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)));
129ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK(std::isnan(StringToDouble(&uc, "07.8",
130ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                  ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)));
131ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK(std::isnan(StringToDouble(&uc, "07e8",
132ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                  ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)));
133ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK(std::isnan(StringToDouble(&uc, "07e7",
134ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                  ALLOW_HEX | ALLOW_IMPLICIT_OCTAL)));
135ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
136ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(8.7, StringToDouble(&uc, "08.7", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
137ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(8e7, StringToDouble(&uc, "08e7", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
138ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
139ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.001, StringToDouble(&uc, "0.001",
140ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                 ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
141ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.713, StringToDouble(&uc, "0.713",
142ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                 ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
1439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
144a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(8.0, StringToDouble(&uc, "08", ALLOW_HEX));
145a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(81.0, StringToDouble(&uc, "081", ALLOW_HEX));
146a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(78.0, StringToDouble(&uc, "078", ALLOW_HEX));
1479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
148a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(7.7, StringToDouble(&uc, "07.7", ALLOW_HEX));
149a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(7.8, StringToDouble(&uc, "07.8", ALLOW_HEX));
150a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(7e8, StringToDouble(&uc, "07e8", ALLOW_HEX));
151a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(7e7, StringToDouble(&uc, "07e7", ALLOW_HEX));
1529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
153a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(8.7, StringToDouble(&uc, "08.7", ALLOW_HEX));
154a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(8e7, StringToDouble(&uc, "08e7", ALLOW_HEX));
1559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
156a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(0.001, StringToDouble(&uc, "0.001", ALLOW_HEX));
157a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(0.713, StringToDouble(&uc, "0.713", ALLOW_HEX));
1589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(TrailingJunk) {
162a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  UnicodeCache uc;
163a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(8.0, StringToDouble(&uc, "8q", ALLOW_TRAILING_JUNK));
164ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(63.0, StringToDouble(&uc, "077qqq",
165ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                ALLOW_IMPLICIT_OCTAL | ALLOW_TRAILING_JUNK));
166ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(10.0, StringToDouble(&uc, "10e",
167ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                ALLOW_IMPLICIT_OCTAL | ALLOW_TRAILING_JUNK));
168ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(10.0, StringToDouble(&uc, "10e-",
169ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                                ALLOW_IMPLICIT_OCTAL | ALLOW_TRAILING_JUNK));
1709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(NonStrDecimalLiteral) {
174a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  UnicodeCache uc;
1755de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  CHECK(std::isnan(
1765de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      StringToDouble(&uc, " ", NO_FLAGS, v8::base::OS::nan_value())));
1775de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  CHECK(
1785de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      std::isnan(StringToDouble(&uc, "", NO_FLAGS, v8::base::OS::nan_value())));
1795de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  CHECK(std::isnan(
1805de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      StringToDouble(&uc, " ", NO_FLAGS, v8::base::OS::nan_value())));
181a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "", NO_FLAGS));
182a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, " ", NO_FLAGS));
1839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
185e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
186b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.orgTEST(IntegerStrLiteral) {
187a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  UnicodeCache uc;
188a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0.0", NO_FLAGS));
189a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0", NO_FLAGS));
190a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "00", NO_FLAGS));
191a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "000", NO_FLAGS));
192a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1.0, StringToDouble(&uc, "1", NO_FLAGS));
193a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(-1.0, StringToDouble(&uc, "-1", NO_FLAGS));
194a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(-1.0, StringToDouble(&uc, "  -1  ", NO_FLAGS));
195a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1.0, StringToDouble(&uc, "  +1  ", NO_FLAGS));
19677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  CHECK(std::isnan(StringToDouble(&uc, "  -  1  ", NO_FLAGS)));
19777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  CHECK(std::isnan(StringToDouble(&uc, "  +  1  ", NO_FLAGS)));
198a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
199ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0e0", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
200ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0e1", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
201ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0e-1", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
202ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0e-100000",
203ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                               ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
204ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0e+100000",
205ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                               ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
206ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  CHECK_EQ(0.0, StringToDouble(&uc, "0.", ALLOW_HEX | ALLOW_IMPLICIT_OCTAL));
207b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org}
208b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
209e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
210b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.orgTEST(LongNumberStr) {
211a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  UnicodeCache uc;
212a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1e10, StringToDouble(&uc, "1" "0000000000", NO_FLAGS));
213a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1e20, StringToDouble(&uc, "1" "0000000000" "0000000000", NO_FLAGS));
214b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
215a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1e60, StringToDouble(&uc, "1" "0000000000" "0000000000" "0000000000"
216b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      "0000000000" "0000000000" "0000000000", NO_FLAGS));
217b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
218a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1e-2, StringToDouble(&uc, "." "0" "1", NO_FLAGS));
219a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1e-11, StringToDouble(&uc, "." "0000000000" "1", NO_FLAGS));
220a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1e-21, StringToDouble(&uc, "." "0000000000" "0000000000" "1",
221a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org                                 NO_FLAGS));
222b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
223a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1e-61, StringToDouble(&uc, "." "0000000000" "0000000000" "0000000000"
224b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      "0000000000" "0000000000" "0000000000" "1", NO_FLAGS));
225b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
226b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
227b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // x = 24414062505131248.0 and y = 24414062505131252.0 are representable in
228b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // double. Check chat z = (x + y) / 2 is rounded to x...
229b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  CHECK_EQ(24414062505131248.0,
230a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org           StringToDouble(&uc, "24414062505131250.0", NO_FLAGS));
231b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
232b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // ... and z = (x + y) / 2 + delta is rounded to y.
233b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  CHECK_EQ(24414062505131252.0,
234a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org           StringToDouble(&uc, "24414062505131250.000000001", NO_FLAGS));
235b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org}
236b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
237b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
238b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.orgTEST(MaximumSignificantDigits) {
239a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  UnicodeCache uc;
240b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  char num[] =
241b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      "4.4501477170144020250819966727949918635852426585926051135169509"
242b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      "122872622312493126406953054127118942431783801370080830523154578"
243b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      "251545303238277269592368457430440993619708911874715081505094180"
244b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      "604803751173783204118519353387964161152051487413083163272520124"
245b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      "606023105869053620631175265621765214646643181420505164043632222"
246b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      "668006474326056011713528291579642227455489682133472873831754840"
247b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      "341397809846934151055619529382191981473003234105366170879223151"
248b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      "087335413188049110555339027884856781219017754500629806224571029"
249b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      "581637117459456877330110324211689177656713705497387108207822477"
250b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      "584250967061891687062782163335299376138075114200886249979505279"
251b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      "101870966346394401564490729731565935244123171539810221213221201"
252b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      "847003580761626016356864581135848683152156368691976240370422601"
253b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org      "6998291015625000000000000000000000000000000000e-308";
254b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
255a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(4.4501477170144017780491e-308, StringToDouble(&uc, num, NO_FLAGS));
256b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
257b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  // Changes the result of strtod (at least in glibc implementation).
258b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org  num[sizeof(num) - 8] = '1';
259b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
260a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(4.4501477170144022721148e-308, StringToDouble(&uc, num, NO_FLAGS));
261b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org}
262b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
263e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
264b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgTEST(MinimumExponent) {
265a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  UnicodeCache uc;
266b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  // Same test but with different point-position.
267b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  char num[] =
268b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  "445014771701440202508199667279499186358524265859260511351695091"
269b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  "228726223124931264069530541271189424317838013700808305231545782"
270b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  "515453032382772695923684574304409936197089118747150815050941806"
271b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  "048037511737832041185193533879641611520514874130831632725201246"
272b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  "060231058690536206311752656217652146466431814205051640436322226"
273b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  "680064743260560117135282915796422274554896821334728738317548403"
274b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  "413978098469341510556195293821919814730032341053661708792231510"
275b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  "873354131880491105553390278848567812190177545006298062245710295"
276b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  "816371174594568773301103242116891776567137054973871082078224775"
277b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  "842509670618916870627821633352993761380751142008862499795052791"
278b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  "018709663463944015644907297315659352441231715398102212132212018"
279b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  "470035807616260163568645811358486831521563686919762403704226016"
280b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  "998291015625000000000000000000000000000000000e-1108";
281b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
282a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(4.4501477170144017780491e-308, StringToDouble(&uc, num, NO_FLAGS));
283b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
284b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  // Changes the result of strtod (at least in glibc implementation).
285b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  num[sizeof(num) - 8] = '1';
286b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
287a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(4.4501477170144022721148e-308, StringToDouble(&uc, num, NO_FLAGS));
288b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org}
289b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
290b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
291b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgTEST(MaximumExponent) {
292a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  UnicodeCache uc;
293b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  char num[] = "0.16e309";
294b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
295a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1.59999999999999997765e+308, StringToDouble(&uc, num, NO_FLAGS));
296b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org}
297b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
298b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
299b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.orgTEST(ExponentNumberStr) {
300a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  UnicodeCache uc;
301a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1e1, StringToDouble(&uc, "1e1", NO_FLAGS));
302a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1e1, StringToDouble(&uc, "1e+1", NO_FLAGS));
303a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1e-1, StringToDouble(&uc, "1e-1", NO_FLAGS));
304a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1e100, StringToDouble(&uc, "1e+100", NO_FLAGS));
305a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1e-100, StringToDouble(&uc, "1e-100", NO_FLAGS));
306a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  CHECK_EQ(1e-106, StringToDouble(&uc, ".000001e-100", NO_FLAGS));
307b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org}
308b26c50a70863498de657ad44be2cffa49ccdcbeaager@chromium.org
3094e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
3104af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.orgclass OneBit1: public BitField<uint32_t, 0, 1> {};
3114af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.orgclass OneBit2: public BitField<uint32_t, 7, 1> {};
3124af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.orgclass EightBit1: public BitField<uint32_t, 0, 8> {};
3134af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.orgclass EightBit2: public BitField<uint32_t, 13, 8> {};
3149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(BitField) {
3169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  uint32_t x;
3179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // One bit bit field can hold values 0 and 1.
3199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!OneBit1::is_valid(static_cast<uint32_t>(-1)));
3209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!OneBit2::is_valid(static_cast<uint32_t>(-1)));
3219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  for (int i = 0; i < 2; i++) {
3229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK(OneBit1::is_valid(i));
3239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    x = OneBit1::encode(i);
3249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK_EQ(i, OneBit1::decode(x));
3259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK(OneBit2::is_valid(i));
3279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    x = OneBit2::encode(i);
3289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK_EQ(i, OneBit2::decode(x));
3299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
3309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!OneBit1::is_valid(2));
3319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!OneBit2::is_valid(2));
3329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  // Eight bit bit field can hold values from 0 tp 255.
3349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!EightBit1::is_valid(static_cast<uint32_t>(-1)));
3359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!EightBit2::is_valid(static_cast<uint32_t>(-1)));
3369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  for (int i = 0; i < 256; i++) {
3379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK(EightBit1::is_valid(i));
3389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    x = EightBit1::encode(i);
3399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK_EQ(i, EightBit1::decode(x));
3409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK(EightBit2::is_valid(i));
3419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    x = EightBit2::encode(i);
3429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    CHECK_EQ(i, EightBit2::decode(x));
3439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
3449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!EightBit1::is_valid(256));
3459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK(!EightBit2::is_valid(256));
3469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3474e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
3484e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
3494e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.orgclass UpperBits: public BitField64<int, 61, 3> {};
3504e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.orgclass MiddleBits: public BitField64<int, 31, 2> {};
3514e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
3524e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.orgTEST(BitField64) {
3534e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  uint64_t x;
3544e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
3554e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  // Test most significant bits.
3564e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  x = V8_2PART_UINT64_C(0xE0000000, 00000000);
3574e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  CHECK(x == UpperBits::encode(7));
3584e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  CHECK_EQ(7, UpperBits::decode(x));
3594e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
3604e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  // Test the 32/64-bit boundary bits.
3614e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  x = V8_2PART_UINT64_C(0x00000001, 80000000);
3624e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  CHECK(x == MiddleBits::encode(3));
3634e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  CHECK_EQ(3, MiddleBits::decode(x));
3644e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org}
365