Index: gin/wrappable_unittest.cc |
diff --git a/gin/wrappable_unittest.cc b/gin/wrappable_unittest.cc |
index 9843329906468655a65d31916eb8ae1bd0a9194d..f3de48fe09ae278e34d2302b3aedd94beb017b11 100644 |
--- a/gin/wrappable_unittest.cc |
+++ b/gin/wrappable_unittest.cc |
@@ -97,8 +97,11 @@ class MyCallableObject : public Wrappable<MyCallableObject> { |
virtual ~MyCallableObject() { |
} |
- void Call(int val) { |
- result_ = val; |
+ void Call(int val, const gin::Arguments& arguments) { |
+ if (arguments.IsConstructCall()) |
+ arguments.ThrowTypeError("Cannot be called as constructor."); |
+ else |
+ result_ = val; |
} |
int result_; |
@@ -245,4 +248,26 @@ TEST_F(WrappableTest, CallAsFunction) { |
EXPECT_EQ(42, object->result()); |
} |
+TEST_F(WrappableTest, CallAsConstructor) { |
+ v8::Isolate* isolate = instance_->isolate(); |
+ v8::HandleScope handle_scope(isolate); |
+ |
+ gin::Handle<MyCallableObject> object(MyCallableObject::Create(isolate)); |
+ EXPECT_EQ(0, object->result()); |
+ v8::Handle<v8::String> source = StringToV8(isolate, |
+ "(function(obj) {" |
+ "new obj(42);" |
+ "})"); |
+ gin::TryCatch try_catch; |
+ v8::Handle<v8::Script> script = v8::Script::Compile(source); |
+ v8::Handle<v8::Value> val = script->Run(); |
+ v8::Handle<v8::Function> func; |
+ EXPECT_TRUE(ConvertFromV8(isolate, val, &func)); |
+ v8::Handle<v8::Value> argv[] = { |
+ ConvertToV8(isolate, object.get()) |
+ }; |
+ func->Call(v8::Undefined(isolate), 1, argv); |
+ EXPECT_TRUE(try_catch.HasCaught()); |
+} |
+ |
} // namespace gin |