Chromium Code Reviews| Index: test/cctest/test-api.cc |
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
| index c6affe53ced6eb32b2503dbda2780d7f667307a2..d92fb6b52691c8ba7eda9d3f88f7af59c2aff824 100644 |
| --- a/test/cctest/test-api.cc |
| +++ b/test/cctest/test-api.cc |
| @@ -6746,6 +6746,99 @@ THREADED_TEST(Constructor) { |
| CHECK(value->BooleanValue()); |
| } |
| + |
| +static Handle<Value> ConstructorCallback(const Arguments& args) { |
| + ApiTestFuzzer::Fuzz(); |
| + if (args[0]->IsInt32()) { |
|
Mads Ager (chromium)
2011/05/05 09:03:33
Add a test where the input is a string, undefined,
|
| + Local<Object> This; |
| + |
| + if (args.IsConstructCall()) { |
| + Local<Object> Holder = args.Holder(); |
| + This = Object::New(); |
| + Local<Value> proto = Holder->GetPrototype(); |
| + if (proto->IsObject()) { |
| + This->SetPrototype(proto); |
| + } |
| + } else { |
| + This = args.This(); |
| + } |
| + |
| + This->Set(v8_str("a"), v8_num(args[0]->Int32Value())); |
| + return This; |
| + } |
| + |
| + return args[0]; |
| +} |
| + |
| + |
| +THREADED_TEST(ConstructorForObject) { |
| + v8::HandleScope handle_scope; |
| + LocalContext context; |
| + |
| + { Local<ObjectTemplate> instance_template = ObjectTemplate::New(); |
| + instance_template->SetCallAsFunctionHandler(ConstructorCallback); |
| + Local<Object> instance = instance_template->NewInstance(); |
| + context->Global()->Set(v8_str("obj"), instance); |
| + v8::TryCatch try_catch; |
| + Local<Value> value; |
| + CHECK(!try_catch.HasCaught()); |
| + |
| + value = CompileRun("(function() { var o = new obj(28); return o.a; })()"); |
| + CHECK(!try_catch.HasCaught()); |
| + CHECK_EQ(28, value->Int32Value()); |
| + |
| + Local<Value> args[] = { v8_num(29) }; |
| + Local<Object> object = instance->CallAsConstructor(1, args); |
| + Local<Value> value2 = object->Get(v8_str("a")); |
| + CHECK(!try_catch.HasCaught()); |
| + CHECK_EQ(29, value2->Int32Value()); |
| + } |
| + |
| + { Local<ObjectTemplate> instance_template = ObjectTemplate::New(); |
| + Local<Object> instance = instance_template->NewInstance(); |
| + context->Global()->Set(v8_str("obj2"), instance); |
| + v8::TryCatch try_catch; |
| + Local<Value> value; |
| + CHECK(!try_catch.HasCaught()); |
| + |
| + value = CompileRun("new obj2(28)"); |
| + CHECK(try_catch.HasCaught()); |
| + String::AsciiValue exception_value1(try_catch.Exception()); |
| + CHECK_EQ("TypeError: object is not a function", *exception_value1); |
| + try_catch.Reset(); |
| + |
| + Local<Value> args[] = { v8_num(29) }; |
| + Local<Object> object = instance->CallAsConstructor(1, args); |
| + CHECK(try_catch.HasCaught()); |
| + String::AsciiValue exception_value2(try_catch.Exception()); |
| + CHECK_EQ("TypeError: #<Object> is not a function", *exception_value2); |
| + try_catch.Reset(); |
| + } |
| + |
| + { Local<ObjectTemplate> instance_template = ObjectTemplate::New(); |
| + instance_template->SetCallAsFunctionHandler(ThrowValue); |
| + Local<Object> instance = instance_template->NewInstance(); |
| + context->Global()->Set(v8_str("obj3"), instance); |
| + v8::TryCatch try_catch; |
| + Local<Value> value; |
| + CHECK(!try_catch.HasCaught()); |
| + |
| + value = CompileRun("new obj3(22)"); |
| + CHECK(try_catch.HasCaught()); |
| + String::AsciiValue exception_value1(try_catch.Exception()); |
| + CHECK_EQ(*exception_value1, "22"); |
| + try_catch.Reset(); |
| + |
| + Local<Value> args[] = { v8_num(23) }; |
| + Local<Object> object = instance->CallAsConstructor(1, args); |
| + CHECK(try_catch.HasCaught()); |
| + String::AsciiValue exception_value2(try_catch.Exception()); |
| + CHECK_EQ(*exception_value2, "23"); |
| + try_catch.Reset(); |
| + } |
| +} |
| + |
| + |
| THREADED_TEST(FunctionDescriptorException) { |
| v8::HandleScope handle_scope; |
| LocalContext context; |
| @@ -7028,9 +7121,8 @@ THREADED_TEST(CallAsFunction) { |
| CHECK(value.IsEmpty()); |
| CHECK(try_catch.HasCaught()); |
| String::AsciiValue exception_value1(try_catch.Exception()); |
| - CHECK_EQ(*exception_value1, |
| - "TypeError: Property 'obj2' of object " |
| - "#<Object> is not a function"); |
| + CHECK_EQ("TypeError: Property 'obj2' of object #<Object> is not a function", |
| + *exception_value1); |
| try_catch.Reset(); |
| // Call an object without call-as-function handler through the API |
| @@ -7040,7 +7132,7 @@ THREADED_TEST(CallAsFunction) { |
| CHECK(value.IsEmpty()); |
| CHECK(try_catch.HasCaught()); |
| String::AsciiValue exception_value2(try_catch.Exception()); |
| - CHECK_EQ(*exception_value2, "TypeError: [object Object] is not a function"); |
| + CHECK_EQ("TypeError: [object Object] is not a function", *exception_value2); |
| try_catch.Reset(); |
| } |