diff options
Diffstat (limited to 'deps/v8/test/cctest')
-rw-r--r-- | deps/v8/test/cctest/SConscript | 1 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-api.cc | 148 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-conversions.cc | 32 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-heap-profiler.cc | 80 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-strtod.cc | 201 |
5 files changed, 429 insertions, 33 deletions
diff --git a/deps/v8/test/cctest/SConscript b/deps/v8/test/cctest/SConscript index 3ec621e677..006653c2e8 100644 --- a/deps/v8/test/cctest/SConscript +++ b/deps/v8/test/cctest/SConscript @@ -70,6 +70,7 @@ SOURCES = { 'test-sockets.cc', 'test-spaces.cc', 'test-strings.cc', + 'test-strtod.cc', 'test-thread-termination.cc', 'test-threads.cc', 'test-type-info.cc', diff --git a/deps/v8/test/cctest/test-api.cc b/deps/v8/test/cctest/test-api.cc index f1a6eada40..af50d3d0ee 100644 --- a/deps/v8/test/cctest/test-api.cc +++ b/deps/v8/test/cctest/test-api.cc @@ -766,6 +766,12 @@ static v8::Handle<Value> construct_call(const v8::Arguments& args) { return args.This(); } +static v8::Handle<Value> Return239(Local<String> name, const AccessorInfo&) { + ApiTestFuzzer::Fuzz(); + return v8_num(239); +} + + THREADED_TEST(FunctionTemplate) { v8::HandleScope scope; LocalContext env; @@ -792,6 +798,7 @@ THREADED_TEST(FunctionTemplate) { Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(construct_call); fun_templ->SetClassName(v8_str("funky")); + fun_templ->InstanceTemplate()->SetAccessor(v8_str("m"), Return239); Local<Function> fun = fun_templ->GetFunction(); env->Global()->Set(v8_str("obj"), fun); Local<Script> script = v8_compile("var s = new obj(); s.x"); @@ -799,6 +806,9 @@ THREADED_TEST(FunctionTemplate) { Local<Value> result = v8_compile("(new obj()).toString()")->Run(); CHECK_EQ(v8_str("[object funky]"), result); + + result = v8_compile("(new obj()).m")->Run(); + CHECK_EQ(239, result->Int32Value()); } } @@ -6509,12 +6519,6 @@ THREADED_TEST(InterceptorLoadICInvalidatedFieldViaGlobal) { } -static v8::Handle<Value> Return239(Local<String> name, const AccessorInfo&) { - ApiTestFuzzer::Fuzz(); - return v8_num(239); -} - - static void SetOnThis(Local<String> name, Local<Value> value, const AccessorInfo& info) { @@ -10555,6 +10559,45 @@ TEST(CaptureStackTraceForUncaughtException) { } +v8::Handle<Value> AnalyzeStackOfEvalWithSourceURL(const v8::Arguments& args) { + v8::HandleScope scope; + v8::Handle<v8::StackTrace> stackTrace = + v8::StackTrace::CurrentStackTrace(10, v8::StackTrace::kDetailed); + CHECK_EQ(5, stackTrace->GetFrameCount()); + v8::Handle<v8::String> url = v8_str("eval_url"); + for (int i = 0; i < 3; i++) { + v8::Handle<v8::String> name = + stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); + CHECK(!name.IsEmpty()); + CHECK_EQ(url, name); + } + return v8::Undefined(); +} + + +TEST(SourceURLInStackTrace) { + v8::HandleScope scope; + Local<ObjectTemplate> templ = ObjectTemplate::New(); + templ->Set(v8_str("AnalyzeStackOfEvalWithSourceURL"), + v8::FunctionTemplate::New(AnalyzeStackOfEvalWithSourceURL)); + LocalContext context(0, templ); + + const char *source = + "function outer() {\n" + "function bar() {\n" + " AnalyzeStackOfEvalWithSourceURL();\n" + "}\n" + "function foo() {\n" + "\n" + " bar();\n" + "}\n" + "foo();\n" + "}\n" + "eval('(' + outer +')()//@ sourceURL=eval_url');"; + CHECK(CompileRun(source)->IsUndefined()); +} + + // Test that idle notification can be handled and eventually returns true. THREADED_TEST(IdleNotification) { bool rv = false; @@ -11619,3 +11662,96 @@ TEST(GlobalLoadICGC) { CheckSurvivingGlobalObjectsCount(1); } } + + +TEST(RegExp) { + v8::HandleScope scope; + LocalContext context; + + v8::Handle<v8::RegExp> re = v8::RegExp::New(v8_str("foo"), v8::RegExp::kNone); + CHECK(re->IsRegExp()); + CHECK(re->GetSource()->Equals(v8_str("foo"))); + CHECK_EQ(re->GetFlags(), v8::RegExp::kNone); + + re = v8::RegExp::New(v8_str("bar"), + static_cast<v8::RegExp::Flags>(v8::RegExp::kIgnoreCase | + v8::RegExp::kGlobal)); + CHECK(re->IsRegExp()); + CHECK(re->GetSource()->Equals(v8_str("bar"))); + CHECK_EQ(static_cast<int>(re->GetFlags()), + v8::RegExp::kIgnoreCase | v8::RegExp::kGlobal); + + re = v8::RegExp::New(v8_str("baz"), + static_cast<v8::RegExp::Flags>(v8::RegExp::kIgnoreCase | + v8::RegExp::kMultiline)); + CHECK(re->IsRegExp()); + CHECK(re->GetSource()->Equals(v8_str("baz"))); + CHECK_EQ(static_cast<int>(re->GetFlags()), + v8::RegExp::kIgnoreCase | v8::RegExp::kMultiline); + + re = CompileRun("/quux/").As<v8::RegExp>(); + CHECK(re->IsRegExp()); + CHECK(re->GetSource()->Equals(v8_str("quux"))); + CHECK_EQ(re->GetFlags(), v8::RegExp::kNone); + + re = CompileRun("/quux/gm").As<v8::RegExp>(); + CHECK(re->IsRegExp()); + CHECK(re->GetSource()->Equals(v8_str("quux"))); + CHECK_EQ(static_cast<int>(re->GetFlags()), + v8::RegExp::kGlobal | v8::RegExp::kMultiline); + + // Override the RegExp constructor and check the API constructor + // still works. + CompileRun("RegExp = function() {}"); + + re = v8::RegExp::New(v8_str("foobar"), v8::RegExp::kNone); + CHECK(re->IsRegExp()); + CHECK(re->GetSource()->Equals(v8_str("foobar"))); + CHECK_EQ(re->GetFlags(), v8::RegExp::kNone); + + re = v8::RegExp::New(v8_str("foobarbaz"), + static_cast<v8::RegExp::Flags>(v8::RegExp::kIgnoreCase | + v8::RegExp::kMultiline)); + CHECK(re->IsRegExp()); + CHECK(re->GetSource()->Equals(v8_str("foobarbaz"))); + CHECK_EQ(static_cast<int>(re->GetFlags()), + v8::RegExp::kIgnoreCase | v8::RegExp::kMultiline); + + context->Global()->Set(v8_str("re"), re); + ExpectTrue("re.test('FoobarbaZ')"); + + v8::TryCatch try_catch; + re = v8::RegExp::New(v8_str("foo["), v8::RegExp::kNone); + CHECK(re.IsEmpty()); + CHECK(try_catch.HasCaught()); + context->Global()->Set(v8_str("ex"), try_catch.Exception()); + ExpectTrue("ex instanceof SyntaxError"); +} + + +static v8::Handle<v8::Value> Getter(v8::Local<v8::String> property, + const v8::AccessorInfo& info ) { + return v8_str("42!"); +} + + +static v8::Handle<v8::Array> Enumerator(const v8::AccessorInfo& info) { + v8::Handle<v8::Array> result = v8::Array::New(); + result->Set(0, v8_str("universalAnswer")); + return result; +} + + +TEST(NamedEnumeratorAndForIn) { + v8::HandleScope handle_scope; + LocalContext context; + v8::Context::Scope context_scope(context.local()); + + v8::Handle<v8::ObjectTemplate> tmpl = v8::ObjectTemplate::New(); + tmpl->SetNamedPropertyHandler(Getter, NULL, NULL, NULL, Enumerator); + context->Global()->Set(v8_str("o"), tmpl->NewInstance()); + v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun( + "var result = []; for (var k in o) result.push(k); result")); + CHECK_EQ(1, result->Length()); + CHECK_EQ(v8_str("universalAnswer"), result->Get(0)); +} diff --git a/deps/v8/test/cctest/test-conversions.cc b/deps/v8/test/cctest/test-conversions.cc index abcd426ec4..c62bbaaabb 100644 --- a/deps/v8/test/cctest/test-conversions.cc +++ b/deps/v8/test/cctest/test-conversions.cc @@ -168,6 +168,38 @@ TEST(MaximumSignificantDigits) { CHECK_EQ(gay_strtod(num, NULL), StringToDouble(num, NO_FLAGS)); } +TEST(MinimumExponent) { + // Same test but with different point-position. + char num[] = + "445014771701440202508199667279499186358524265859260511351695091" + "228726223124931264069530541271189424317838013700808305231545782" + "515453032382772695923684574304409936197089118747150815050941806" + "048037511737832041185193533879641611520514874130831632725201246" + "060231058690536206311752656217652146466431814205051640436322226" + "680064743260560117135282915796422274554896821334728738317548403" + "413978098469341510556195293821919814730032341053661708792231510" + "873354131880491105553390278848567812190177545006298062245710295" + "816371174594568773301103242116891776567137054973871082078224775" + "842509670618916870627821633352993761380751142008862499795052791" + "018709663463944015644907297315659352441231715398102212132212018" + "470035807616260163568645811358486831521563686919762403704226016" + "998291015625000000000000000000000000000000000e-1108"; + + CHECK_EQ(gay_strtod(num, NULL), StringToDouble(num, NO_FLAGS)); + + // Changes the result of strtod (at least in glibc implementation). + num[sizeof(num) - 8] = '1'; + + CHECK_EQ(gay_strtod(num, NULL), StringToDouble(num, NO_FLAGS)); +} + + +TEST(MaximumExponent) { + char num[] = "0.16e309"; + + CHECK_EQ(gay_strtod(num, NULL), StringToDouble(num, NO_FLAGS)); +} + TEST(ExponentNumberStr) { CHECK_EQ(1e1, StringToDouble("1e1", NO_FLAGS)); diff --git a/deps/v8/test/cctest/test-heap-profiler.cc b/deps/v8/test/cctest/test-heap-profiler.cc index 6340da53d8..b86a336160 100644 --- a/deps/v8/test/cctest/test-heap-profiler.cc +++ b/deps/v8/test/cctest/test-heap-profiler.cc @@ -20,11 +20,6 @@ using i::JSObjectsClusterTree; using i::RetainerHeapProfile; -static void CompileAndRunScript(const char *src) { - v8::Script::Compile(v8::String::New(src))->Run(); -} - - namespace { class ConstructorHeapProfileTestHelper : public i::ConstructorHeapProfile { @@ -58,7 +53,7 @@ TEST(ConstructorProfile) { v8::HandleScope scope; LocalContext env; - CompileAndRunScript( + CompileRun( "function F() {} // A constructor\n" "var f1 = new F();\n" "var f2 = new F();\n"); @@ -359,7 +354,7 @@ TEST(RetainerProfile) { v8::HandleScope scope; LocalContext env; - CompileAndRunScript( + CompileRun( "function A() {}\n" "function B(x) { this.x = x; }\n" "function C(x) { this.x1 = x; this.x2 = x; }\n" @@ -473,7 +468,7 @@ TEST(HeapSnapshot) { LocalContext env1; env1->SetSecurityToken(token1); - CompileAndRunScript( + CompileRun( "function A1() {}\n" "function B1(x) { this.x = x; }\n" "function C1(x) { this.x1 = x; this.x2 = x; }\n" @@ -485,7 +480,7 @@ TEST(HeapSnapshot) { LocalContext env2; env2->SetSecurityToken(token2); - CompileAndRunScript( + CompileRun( "function A2() {}\n" "function B2(x) { return function() { return typeof x; }; }\n" "function C2(x) { this.x1 = x; this.x2 = x; this[1] = x; }\n" @@ -583,7 +578,7 @@ TEST(HeapSnapshotObjectSizes) { // -a-> X1 --a // x -b-> X2 <-| - CompileAndRunScript( + CompileRun( "function X(a, b) { this.a = a; this.b = b; }\n" "x = new X(new X(), new X());\n" "x.a.a = x.b;"); @@ -594,7 +589,7 @@ TEST(HeapSnapshotObjectSizes) { GetProperty(global, v8::HeapGraphEdge::kProperty, "x"); CHECK_NE(NULL, x); const v8::HeapGraphNode* x_prototype = - GetProperty(x, v8::HeapGraphEdge::kProperty, "prototype"); + GetProperty(x, v8::HeapGraphEdge::kProperty, "__proto__"); CHECK_NE(NULL, x_prototype); const v8::HeapGraphNode* x1 = GetProperty(x, v8::HeapGraphEdge::kProperty, "a"); @@ -606,7 +601,7 @@ TEST(HeapSnapshotObjectSizes) { x->GetSelfSize() * 3, x->GetReachableSize() - x_prototype->GetReachableSize()); CHECK_EQ( - x->GetSelfSize() * 3 + x_prototype->GetSelfSize(), x->GetRetainedSize()); + x->GetSelfSize() * 3, x->GetRetainedSize()); CHECK_EQ( x1->GetSelfSize() * 2, x1->GetReachableSize() - x_prototype->GetReachableSize()); @@ -624,7 +619,7 @@ TEST(HeapSnapshotEntryChildren) { v8::HandleScope scope; LocalContext env; - CompileAndRunScript( + CompileRun( "function A() { }\n" "a = new A;"); const v8::HeapSnapshot* snapshot = @@ -648,10 +643,9 @@ TEST(HeapSnapshotCodeObjects) { v8::HandleScope scope; LocalContext env; - CompileAndRunScript( + CompileRun( "function lazy(x) { return x - 1; }\n" "function compiled(x) { return x + 1; }\n" - "var inferred = function(x) { return x; }\n" "var anonymous = (function() { return function() { return 0; } })();\n" "compiled(1)"); const v8::HeapSnapshot* snapshot = @@ -666,18 +660,12 @@ TEST(HeapSnapshotCodeObjects) { GetProperty(global, v8::HeapGraphEdge::kProperty, "lazy"); CHECK_NE(NULL, lazy); CHECK_EQ(v8::HeapGraphNode::kClosure, lazy->GetType()); - const v8::HeapGraphNode* inferred = - GetProperty(global, v8::HeapGraphEdge::kProperty, "inferred"); - CHECK_NE(NULL, inferred); - CHECK_EQ(v8::HeapGraphNode::kClosure, inferred->GetType()); - v8::String::AsciiValue inferred_name(inferred->GetName()); - CHECK_EQ("inferred", *inferred_name); const v8::HeapGraphNode* anonymous = GetProperty(global, v8::HeapGraphEdge::kProperty, "anonymous"); CHECK_NE(NULL, anonymous); CHECK_EQ(v8::HeapGraphNode::kClosure, anonymous->GetType()); v8::String::AsciiValue anonymous_name(anonymous->GetName()); - CHECK_EQ("(anonymous function)", *anonymous_name); + CHECK_EQ("", *anonymous_name); // Find references to code. const v8::HeapGraphNode* compiled_code = @@ -716,6 +704,44 @@ TEST(HeapSnapshotCodeObjects) { } +TEST(HeapSnapshotHeapNumbers) { + v8::HandleScope scope; + LocalContext env; + CompileRun( + "a = 1; // a is Smi\n" + "b = 2.5; // b is HeapNumber"); + const v8::HeapSnapshot* snapshot = + v8::HeapProfiler::TakeSnapshot(v8::String::New("numbers")); + const v8::HeapGraphNode* global = GetGlobalObject(snapshot); + CHECK_EQ(NULL, GetProperty(global, v8::HeapGraphEdge::kProperty, "a")); + const v8::HeapGraphNode* b = + GetProperty(global, v8::HeapGraphEdge::kProperty, "b"); + CHECK_NE(NULL, b); + CHECK_EQ(v8::HeapGraphNode::kHeapNumber, b->GetType()); +} + + +TEST(HeapSnapshotInternalReferences) { + v8::HandleScope scope; + v8::Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); + global_template->SetInternalFieldCount(2); + LocalContext env(NULL, global_template); + v8::Handle<v8::Object> global_proxy = env->Global(); + v8::Handle<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>(); + CHECK_EQ(2, global->InternalFieldCount()); + v8::Local<v8::Object> obj = v8::Object::New(); + global->SetInternalField(0, v8_num(17)); + global->SetInternalField(1, obj); + const v8::HeapSnapshot* snapshot = + v8::HeapProfiler::TakeSnapshot(v8::String::New("internals")); + const v8::HeapGraphNode* global_node = GetGlobalObject(snapshot); + // The first reference will not present, because it's a Smi. + CHECK_EQ(NULL, GetProperty(global_node, v8::HeapGraphEdge::kInternal, "0")); + // The second reference is to an object. + CHECK_NE(NULL, GetProperty(global_node, v8::HeapGraphEdge::kInternal, "1")); +} + + // Trying to introduce a check helper for uint64_t causes many // overloading ambiguities, so it seems easier just to cast // them to a signed type. @@ -728,7 +754,7 @@ TEST(HeapEntryIdsAndGC) { v8::HandleScope scope; LocalContext env; - CompileAndRunScript( + CompileRun( "function A() {}\n" "function B(x) { this.x = x; }\n" "var a = new A();\n" @@ -784,7 +810,7 @@ TEST(HeapSnapshotsDiff) { v8::HandleScope scope; LocalContext env; - CompileAndRunScript( + CompileRun( "function A() {}\n" "function B(x) { this.x = x; }\n" "function A2(a) { for (var i = 0; i < a; ++i) this[i] = i; }\n" @@ -793,7 +819,7 @@ TEST(HeapSnapshotsDiff) { const v8::HeapSnapshot* snapshot1 = v8::HeapProfiler::TakeSnapshot(v8::String::New("s1")); - CompileAndRunScript( + CompileRun( "delete a;\n" "b.x = null;\n" "var a = new A2(20);\n" @@ -928,7 +954,7 @@ TEST(AggregatedHeapSnapshot) { v8::HandleScope scope; LocalContext env; - CompileAndRunScript( + CompileRun( "function A() {}\n" "function B(x) { this.x = x; }\n" "var a = new A();\n" @@ -1049,7 +1075,7 @@ TEST(HeapSnapshotJSONSerialization) { #define STRING_LITERAL_FOR_TEST \ "\"String \\n\\r\\u0008\\u0081\\u0101\\u0801\\u8001\"" - CompileAndRunScript( + CompileRun( "function A(s) { this.s = s; }\n" "function B(x) { this.x = x; }\n" "var a = new A(" STRING_LITERAL_FOR_TEST ");\n" diff --git a/deps/v8/test/cctest/test-strtod.cc b/deps/v8/test/cctest/test-strtod.cc new file mode 100644 index 0000000000..6102db6ddc --- /dev/null +++ b/deps/v8/test/cctest/test-strtod.cc @@ -0,0 +1,201 @@ +// Copyright 2006-2008 the V8 project authors. All rights reserved. + +#include <stdlib.h> + +#include "v8.h" + +#include "cctest.h" +#include "strtod.h" + +using namespace v8::internal; + +static Vector<const char> StringToVector(const char* str) { + return Vector<const char>(str, StrLength(str)); +} + + +static double StrtodChar(const char* str, int exponent) { + return Strtod(StringToVector(str), exponent); +} + + +TEST(Strtod) { + Vector<const char> vector; + + vector = StringToVector("0"); + CHECK_EQ(0.0, Strtod(vector, 1)); + CHECK_EQ(0.0, Strtod(vector, 2)); + CHECK_EQ(0.0, Strtod(vector, -2)); + CHECK_EQ(0.0, Strtod(vector, -999)); + CHECK_EQ(0.0, Strtod(vector, +999)); + + vector = StringToVector("1"); + CHECK_EQ(1.0, Strtod(vector, 0)); + CHECK_EQ(10.0, Strtod(vector, 1)); + CHECK_EQ(100.0, Strtod(vector, 2)); + CHECK_EQ(1e20, Strtod(vector, 20)); + CHECK_EQ(1e22, Strtod(vector, 22)); + CHECK_EQ(1e23, Strtod(vector, 23)); + CHECK_EQ(1e35, Strtod(vector, 35)); + CHECK_EQ(1e36, Strtod(vector, 36)); + CHECK_EQ(1e37, Strtod(vector, 37)); + CHECK_EQ(1e-1, Strtod(vector, -1)); + CHECK_EQ(1e-2, Strtod(vector, -2)); + CHECK_EQ(1e-5, Strtod(vector, -5)); + CHECK_EQ(1e-20, Strtod(vector, -20)); + CHECK_EQ(1e-22, Strtod(vector, -22)); + CHECK_EQ(1e-23, Strtod(vector, -23)); + CHECK_EQ(1e-25, Strtod(vector, -25)); + CHECK_EQ(1e-39, Strtod(vector, -39)); + + vector = StringToVector("2"); + CHECK_EQ(2.0, Strtod(vector, 0)); + CHECK_EQ(20.0, Strtod(vector, 1)); + CHECK_EQ(200.0, Strtod(vector, 2)); + CHECK_EQ(2e20, Strtod(vector, 20)); + CHECK_EQ(2e22, Strtod(vector, 22)); + CHECK_EQ(2e23, Strtod(vector, 23)); + CHECK_EQ(2e35, Strtod(vector, 35)); + CHECK_EQ(2e36, Strtod(vector, 36)); + CHECK_EQ(2e37, Strtod(vector, 37)); + CHECK_EQ(2e-1, Strtod(vector, -1)); + CHECK_EQ(2e-2, Strtod(vector, -2)); + CHECK_EQ(2e-5, Strtod(vector, -5)); + CHECK_EQ(2e-20, Strtod(vector, -20)); + CHECK_EQ(2e-22, Strtod(vector, -22)); + CHECK_EQ(2e-23, Strtod(vector, -23)); + CHECK_EQ(2e-25, Strtod(vector, -25)); + CHECK_EQ(2e-39, Strtod(vector, -39)); + + vector = StringToVector("9"); + CHECK_EQ(9.0, Strtod(vector, 0)); + CHECK_EQ(90.0, Strtod(vector, 1)); + CHECK_EQ(900.0, Strtod(vector, 2)); + CHECK_EQ(9e20, Strtod(vector, 20)); + CHECK_EQ(9e22, Strtod(vector, 22)); + CHECK_EQ(9e23, Strtod(vector, 23)); + CHECK_EQ(9e35, Strtod(vector, 35)); + CHECK_EQ(9e36, Strtod(vector, 36)); + CHECK_EQ(9e37, Strtod(vector, 37)); + CHECK_EQ(9e-1, Strtod(vector, -1)); + CHECK_EQ(9e-2, Strtod(vector, -2)); + CHECK_EQ(9e-5, Strtod(vector, -5)); + CHECK_EQ(9e-20, Strtod(vector, -20)); + CHECK_EQ(9e-22, Strtod(vector, -22)); + CHECK_EQ(9e-23, Strtod(vector, -23)); + CHECK_EQ(9e-25, Strtod(vector, -25)); + CHECK_EQ(9e-39, Strtod(vector, -39)); + + vector = StringToVector("12345"); + CHECK_EQ(12345.0, Strtod(vector, 0)); + CHECK_EQ(123450.0, Strtod(vector, 1)); + CHECK_EQ(1234500.0, Strtod(vector, 2)); + CHECK_EQ(12345e20, Strtod(vector, 20)); + CHECK_EQ(12345e22, Strtod(vector, 22)); + CHECK_EQ(12345e23, Strtod(vector, 23)); + CHECK_EQ(12345e30, Strtod(vector, 30)); + CHECK_EQ(12345e31, Strtod(vector, 31)); + CHECK_EQ(12345e32, Strtod(vector, 32)); + CHECK_EQ(12345e35, Strtod(vector, 35)); + CHECK_EQ(12345e36, Strtod(vector, 36)); + CHECK_EQ(12345e37, Strtod(vector, 37)); + CHECK_EQ(12345e-1, Strtod(vector, -1)); + CHECK_EQ(12345e-2, Strtod(vector, -2)); + CHECK_EQ(12345e-5, Strtod(vector, -5)); + CHECK_EQ(12345e-20, Strtod(vector, -20)); + CHECK_EQ(12345e-22, Strtod(vector, -22)); + CHECK_EQ(12345e-23, Strtod(vector, -23)); + CHECK_EQ(12345e-25, Strtod(vector, -25)); + CHECK_EQ(12345e-39, Strtod(vector, -39)); + + vector = StringToVector("12345678901234"); + CHECK_EQ(12345678901234.0, Strtod(vector, 0)); + CHECK_EQ(123456789012340.0, Strtod(vector, 1)); + CHECK_EQ(1234567890123400.0, Strtod(vector, 2)); + CHECK_EQ(12345678901234e20, Strtod(vector, 20)); + CHECK_EQ(12345678901234e22, Strtod(vector, 22)); + CHECK_EQ(12345678901234e23, Strtod(vector, 23)); + CHECK_EQ(12345678901234e30, Strtod(vector, 30)); + CHECK_EQ(12345678901234e31, Strtod(vector, 31)); + CHECK_EQ(12345678901234e32, Strtod(vector, 32)); + CHECK_EQ(12345678901234e35, Strtod(vector, 35)); + CHECK_EQ(12345678901234e36, Strtod(vector, 36)); + CHECK_EQ(12345678901234e37, Strtod(vector, 37)); + CHECK_EQ(12345678901234e-1, Strtod(vector, -1)); + CHECK_EQ(12345678901234e-2, Strtod(vector, -2)); + CHECK_EQ(12345678901234e-5, Strtod(vector, -5)); + CHECK_EQ(12345678901234e-20, Strtod(vector, -20)); + CHECK_EQ(12345678901234e-22, Strtod(vector, -22)); + CHECK_EQ(12345678901234e-23, Strtod(vector, -23)); + CHECK_EQ(12345678901234e-25, Strtod(vector, -25)); + CHECK_EQ(12345678901234e-39, Strtod(vector, -39)); + + vector = StringToVector("123456789012345"); + CHECK_EQ(123456789012345.0, Strtod(vector, 0)); + CHECK_EQ(1234567890123450.0, Strtod(vector, 1)); + CHECK_EQ(12345678901234500.0, Strtod(vector, 2)); + CHECK_EQ(123456789012345e20, Strtod(vector, 20)); + CHECK_EQ(123456789012345e22, Strtod(vector, 22)); + CHECK_EQ(123456789012345e23, Strtod(vector, 23)); + CHECK_EQ(123456789012345e35, Strtod(vector, 35)); + CHECK_EQ(123456789012345e36, Strtod(vector, 36)); + CHECK_EQ(123456789012345e37, Strtod(vector, 37)); + CHECK_EQ(123456789012345e39, Strtod(vector, 39)); + CHECK_EQ(123456789012345e-1, Strtod(vector, -1)); + CHECK_EQ(123456789012345e-2, Strtod(vector, -2)); + CHECK_EQ(123456789012345e-5, Strtod(vector, -5)); + CHECK_EQ(123456789012345e-20, Strtod(vector, -20)); + CHECK_EQ(123456789012345e-22, Strtod(vector, -22)); + CHECK_EQ(123456789012345e-23, Strtod(vector, -23)); + CHECK_EQ(123456789012345e-25, Strtod(vector, -25)); + CHECK_EQ(123456789012345e-39, Strtod(vector, -39)); + + CHECK_EQ(0.0, StrtodChar("0", 12345)); + CHECK_EQ(0.0, StrtodChar("", 1324)); + CHECK_EQ(0.0, StrtodChar("000000000", 123)); + CHECK_EQ(0.0, StrtodChar("2", -324)); + CHECK_EQ(4e-324, StrtodChar("3", -324)); + // It would be more readable to put non-zero literals on the left side (i.e. + // CHECK_EQ(1e-325, StrtodChar("1", -325))), but then Gcc complains that + // they are truncated to zero. + CHECK_EQ(0.0, StrtodChar("1", -325)); + CHECK_EQ(0.0, StrtodChar("1", -325)); + CHECK_EQ(0.0, StrtodChar("20000", -328)); + CHECK_EQ(40000e-328, StrtodChar("30000", -328)); + CHECK_EQ(0.0, StrtodChar("10000", -329)); + CHECK_EQ(0.0, StrtodChar("90000", -329)); + CHECK_EQ(0.0, StrtodChar("000000001", -325)); + CHECK_EQ(0.0, StrtodChar("000000001", -325)); + CHECK_EQ(0.0, StrtodChar("0000000020000", -328)); + CHECK_EQ(40000e-328, StrtodChar("00000030000", -328)); + CHECK_EQ(0.0, StrtodChar("0000000010000", -329)); + CHECK_EQ(0.0, StrtodChar("0000000090000", -329)); + + // It would be more readable to put the literals (and not V8_INFINITY) on the + // left side (i.e. CHECK_EQ(1e309, StrtodChar("1", 309))), but then Gcc + // complains that the floating constant exceeds range of 'double'. + CHECK_EQ(V8_INFINITY, StrtodChar("1", 309)); + CHECK_EQ(1e308, StrtodChar("1", 308)); + CHECK_EQ(1234e305, StrtodChar("1234", 305)); + CHECK_EQ(1234e304, StrtodChar("1234", 304)); + CHECK_EQ(V8_INFINITY, StrtodChar("18", 307)); + CHECK_EQ(17e307, StrtodChar("17", 307)); + CHECK_EQ(V8_INFINITY, StrtodChar("0000001", 309)); + CHECK_EQ(1e308, StrtodChar("00000001", 308)); + CHECK_EQ(1234e305, StrtodChar("00000001234", 305)); + CHECK_EQ(1234e304, StrtodChar("000000001234", 304)); + CHECK_EQ(V8_INFINITY, StrtodChar("0000000018", 307)); + CHECK_EQ(17e307, StrtodChar("0000000017", 307)); + CHECK_EQ(V8_INFINITY, StrtodChar("1000000", 303)); + CHECK_EQ(1e308, StrtodChar("100000", 303)); + CHECK_EQ(1234e305, StrtodChar("123400000", 300)); + CHECK_EQ(1234e304, StrtodChar("123400000", 299)); + CHECK_EQ(V8_INFINITY, StrtodChar("180000000", 300)); + CHECK_EQ(17e307, StrtodChar("170000000", 300)); + CHECK_EQ(V8_INFINITY, StrtodChar("00000001000000", 303)); + CHECK_EQ(1e308, StrtodChar("000000000000100000", 303)); + CHECK_EQ(1234e305, StrtodChar("00000000123400000", 300)); + CHECK_EQ(1234e304, StrtodChar("0000000123400000", 299)); + CHECK_EQ(V8_INFINITY, StrtodChar("00000000180000000", 300)); + CHECK_EQ(17e307, StrtodChar("00000000170000000", 300)); +} |