test-conversions.cc revision 6ded16be15dd865a9b21ea304d5273c8be299c87
1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2006-2008 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <stdlib.h>
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "v8.h"
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "platform.h"
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "cctest.h"
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockusing namespace v8::internal;
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockTEST(Hex) {
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0.0, StringToDouble("0x0", ALLOW_HEX | ALLOW_OCTALS));
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0.0, StringToDouble("0X0", ALLOW_HEX | ALLOW_OCTALS));
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(1.0, StringToDouble("0x1", ALLOW_HEX | ALLOW_OCTALS));
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(16.0, StringToDouble("0x10", ALLOW_HEX | ALLOW_OCTALS));
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(255.0, StringToDouble("0xff", ALLOW_HEX | ALLOW_OCTALS));
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(175.0, StringToDouble("0xAF", ALLOW_HEX | ALLOW_OCTALS));
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0.0, StringToDouble("0x0", ALLOW_HEX));
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0.0, StringToDouble("0X0", ALLOW_HEX));
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(1.0, StringToDouble("0x1", ALLOW_HEX));
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(16.0, StringToDouble("0x10", ALLOW_HEX));
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(255.0, StringToDouble("0xff", ALLOW_HEX));
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(175.0, StringToDouble("0xAF", ALLOW_HEX));
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockTEST(Octal) {
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0.0, StringToDouble("0", ALLOW_HEX | ALLOW_OCTALS));
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0.0, StringToDouble("00", ALLOW_HEX | ALLOW_OCTALS));
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(1.0, StringToDouble("01", ALLOW_HEX | ALLOW_OCTALS));
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(7.0, StringToDouble("07", ALLOW_HEX | ALLOW_OCTALS));
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(8.0, StringToDouble("010", ALLOW_HEX | ALLOW_OCTALS));
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(63.0, StringToDouble("077", ALLOW_HEX | ALLOW_OCTALS));
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0.0, StringToDouble("0", ALLOW_HEX));
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0.0, StringToDouble("00", ALLOW_HEX));
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(1.0, StringToDouble("01", ALLOW_HEX));
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(7.0, StringToDouble("07", ALLOW_HEX));
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(10.0, StringToDouble("010", ALLOW_HEX));
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(77.0, StringToDouble("077", ALLOW_HEX));
446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  const double x = 010000000000;  // Power of 2, no rounding errors.
466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(x * x * x * x * x, StringToDouble("01" "0000000000" "0000000000"
476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      "0000000000" "0000000000" "0000000000", ALLOW_OCTALS));
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockTEST(MalformedOctal) {
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(8.0, StringToDouble("08", ALLOW_HEX | ALLOW_OCTALS));
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(81.0, StringToDouble("081", ALLOW_HEX | ALLOW_OCTALS));
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(78.0, StringToDouble("078", ALLOW_HEX | ALLOW_OCTALS));
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(isnan(StringToDouble("07.7", ALLOW_HEX | ALLOW_OCTALS)));
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(isnan(StringToDouble("07.8", ALLOW_HEX | ALLOW_OCTALS)));
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(isnan(StringToDouble("07e8", ALLOW_HEX | ALLOW_OCTALS)));
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(isnan(StringToDouble("07e7", ALLOW_HEX | ALLOW_OCTALS)));
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(8.7, StringToDouble("08.7", ALLOW_HEX | ALLOW_OCTALS));
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(8e7, StringToDouble("08e7", ALLOW_HEX | ALLOW_OCTALS));
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0.001, StringToDouble("0.001", ALLOW_HEX | ALLOW_OCTALS));
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0.713, StringToDouble("0.713", ALLOW_HEX | ALLOW_OCTALS));
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(8.0, StringToDouble("08", ALLOW_HEX));
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(81.0, StringToDouble("081", ALLOW_HEX));
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(78.0, StringToDouble("078", ALLOW_HEX));
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(7.7, StringToDouble("07.7", ALLOW_HEX));
72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(7.8, StringToDouble("07.8", ALLOW_HEX));
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(7e8, StringToDouble("07e8", ALLOW_HEX));
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(7e7, StringToDouble("07e7", ALLOW_HEX));
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(8.7, StringToDouble("08.7", ALLOW_HEX));
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(8e7, StringToDouble("08e7", ALLOW_HEX));
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0.001, StringToDouble("0.001", ALLOW_HEX));
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0.713, StringToDouble("0.713", ALLOW_HEX));
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockTEST(TrailingJunk) {
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(8.0, StringToDouble("8q", ALLOW_TRAILING_JUNK));
86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(63.0, StringToDouble("077qqq", ALLOW_OCTALS | ALLOW_TRAILING_JUNK));
876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(10.0, StringToDouble("10e", ALLOW_OCTALS | ALLOW_TRAILING_JUNK));
886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(10.0, StringToDouble("10e-", ALLOW_OCTALS | ALLOW_TRAILING_JUNK));
89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockTEST(NonStrDecimalLiteral) {
93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(isnan(StringToDouble(" ", NO_FLAGS, OS::nan_value())));
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(isnan(StringToDouble("", NO_FLAGS, OS::nan_value())));
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(isnan(StringToDouble(" ", NO_FLAGS, OS::nan_value())));
96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0.0, StringToDouble("", NO_FLAGS));
97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK_EQ(0.0, StringToDouble(" ", NO_FLAGS));
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1006ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockTEST(IntegerStrLiteral) {
1016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(0.0, StringToDouble("0.0", NO_FLAGS));
1026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(0.0, StringToDouble("0", NO_FLAGS));
1036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(0.0, StringToDouble("00", NO_FLAGS));
1046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(0.0, StringToDouble("000", NO_FLAGS));
1056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(1.0, StringToDouble("1", NO_FLAGS));
1066ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(-1.0, StringToDouble("-1", NO_FLAGS));
1076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(-1.0, StringToDouble("  -  1  ", NO_FLAGS));
1086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(1.0, StringToDouble("  +  1  ", NO_FLAGS));
1096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(0.0, StringToDouble("0e0", ALLOW_HEX | ALLOW_OCTALS));
1116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(0.0, StringToDouble("0e1", ALLOW_HEX | ALLOW_OCTALS));
1126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(0.0, StringToDouble("0e-1", ALLOW_HEX | ALLOW_OCTALS));
1136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(0.0, StringToDouble("0e-100000", ALLOW_HEX | ALLOW_OCTALS));
1146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(0.0, StringToDouble("0e+100000", ALLOW_HEX | ALLOW_OCTALS));
1156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(0.0, StringToDouble("0.", ALLOW_HEX | ALLOW_OCTALS));
1166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
1176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1186ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockTEST(LongNumberStr) {
1196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(1e10, StringToDouble("1" "0000000000", NO_FLAGS));
1206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(1e20, StringToDouble("1" "0000000000" "0000000000", NO_FLAGS));
1216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(1e60, StringToDouble("1" "0000000000" "0000000000" "0000000000"
1236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      "0000000000" "0000000000" "0000000000", NO_FLAGS));
1246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(1e-2, StringToDouble("." "0" "1", NO_FLAGS));
1266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(1e-11, StringToDouble("." "0000000000" "1", NO_FLAGS));
1276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(1e-21, StringToDouble("." "0000000000" "0000000000" "1", NO_FLAGS));
1286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(1e-61, StringToDouble("." "0000000000" "0000000000" "0000000000"
1306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      "0000000000" "0000000000" "0000000000" "1", NO_FLAGS));
1316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // x = 24414062505131248.0 and y = 24414062505131252.0 are representable in
1346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // double. Check chat z = (x + y) / 2 is rounded to x...
1356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(24414062505131248.0,
1366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block           StringToDouble("24414062505131250.0", NO_FLAGS));
1376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // ... and z = (x + y) / 2 + delta is rounded to y.
1396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(24414062505131252.0,
1406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block           StringToDouble("24414062505131250.000000001", NO_FLAGS));
1416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
1426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1446ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockextern "C" double gay_strtod(const char* s00, const char** se);
1456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1476ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockTEST(MaximumSignificantDigits) {
1486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  char num[] =
1496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      "4.4501477170144020250819966727949918635852426585926051135169509"
1506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      "122872622312493126406953054127118942431783801370080830523154578"
1516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      "251545303238277269592368457430440993619708911874715081505094180"
1526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      "604803751173783204118519353387964161152051487413083163272520124"
1536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      "606023105869053620631175265621765214646643181420505164043632222"
1546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      "668006474326056011713528291579642227455489682133472873831754840"
1556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      "341397809846934151055619529382191981473003234105366170879223151"
1566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      "087335413188049110555339027884856781219017754500629806224571029"
1576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      "581637117459456877330110324211689177656713705497387108207822477"
1586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      "584250967061891687062782163335299376138075114200886249979505279"
1596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      "101870966346394401564490729731565935244123171539810221213221201"
1606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      "847003580761626016356864581135848683152156368691976240370422601"
1616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      "6998291015625000000000000000000000000000000000e-308";
1626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(gay_strtod(num, NULL), StringToDouble(num, NO_FLAGS));
1646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Changes the result of strtod (at least in glibc implementation).
1666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  num[sizeof(num) - 8] = '1';
1676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(gay_strtod(num, NULL), StringToDouble(num, NO_FLAGS));
1696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
1706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1726ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockTEST(ExponentNumberStr) {
1736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(1e1, StringToDouble("1e1", NO_FLAGS));
1746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(1e1, StringToDouble("1e+1", NO_FLAGS));
1756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(1e-1, StringToDouble("1e-1", NO_FLAGS));
1766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(1e100, StringToDouble("1e+100", NO_FLAGS));
1776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(1e-100, StringToDouble("1e-100", NO_FLAGS));
1786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(1e-106, StringToDouble(".000001e-100", NO_FLAGS));
1796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
1806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass OneBit1: public BitField<uint32_t, 0, 1> {};
182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass OneBit2: public BitField<uint32_t, 7, 1> {};
183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass EightBit1: public BitField<uint32_t, 0, 8> {};
184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass EightBit2: public BitField<uint32_t, 13, 8> {};
185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockTEST(BitField) {
187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint32_t x;
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // One bit bit field can hold values 0 and 1.
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(!OneBit1::is_valid(static_cast<uint32_t>(-1)));
191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(!OneBit2::is_valid(static_cast<uint32_t>(-1)));
192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < 2; i++) {
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    CHECK(OneBit1::is_valid(i));
194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    x = OneBit1::encode(i);
195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    CHECK_EQ(i, OneBit1::decode(x));
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    CHECK(OneBit2::is_valid(i));
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    x = OneBit2::encode(i);
199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    CHECK_EQ(i, OneBit2::decode(x));
200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(!OneBit1::is_valid(2));
202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(!OneBit2::is_valid(2));
203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Eight bit bit field can hold values from 0 tp 255.
205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(!EightBit1::is_valid(static_cast<uint32_t>(-1)));
206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(!EightBit2::is_valid(static_cast<uint32_t>(-1)));
207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < 256; i++) {
208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    CHECK(EightBit1::is_valid(i));
209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    x = EightBit1::encode(i);
210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    CHECK_EQ(i, EightBit1::decode(x));
211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    CHECK(EightBit2::is_valid(i));
212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    x = EightBit2::encode(i);
213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    CHECK_EQ(i, EightBit2::decode(x));
214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(!EightBit1::is_valid(256));
216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CHECK(!EightBit2::is_valid(256));
217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
218