Index: test/cctest/test-decls.cc |
diff --git a/test/cctest/test-decls.cc b/test/cctest/test-decls.cc |
index b55f417de867b2e760d294d2b517a1951f3fdf07..42e7e78d7f6c2015554f9c624621c2685312ac75 100644 |
--- a/test/cctest/test-decls.cc |
+++ b/test/cctest/test-decls.cc |
@@ -37,7 +37,8 @@ using namespace v8; |
enum Expectations { |
EXPECT_RESULT, |
- EXPECT_EXCEPTION |
+ EXPECT_EXCEPTION, |
+ EXPECT_ERROR |
}; |
@@ -95,7 +96,6 @@ class DeclarationContext { |
private: |
bool is_initialized_; |
Persistent<Context> context_; |
- Local<String> property_; |
int get_count_; |
int set_count_; |
@@ -139,7 +139,13 @@ void DeclarationContext::Check(const char* source, |
HandleScope scope; |
TryCatch catcher; |
catcher.SetVerbose(true); |
- Local<Value> result = Script::Compile(String::New(source))->Run(); |
+ Local<Script> script = Script::Compile(String::New(source)); |
+ if (expectations == EXPECT_ERROR) { |
+ CHECK(script.IsEmpty()); |
+ return; |
+ } |
+ CHECK(!script.IsEmpty()); |
+ Local<Value> result = script->Run(); |
CHECK_EQ(get, get_count()); |
CHECK_EQ(set, set_count()); |
CHECK_EQ(query, query_count()); |
@@ -681,3 +687,214 @@ TEST(ExistsInHiddenPrototype) { |
EXPECT_RESULT, Number::New(0)); |
} |
} |
+ |
+ |
+ |
+class SimpleContext { |
+ public: |
+ SimpleContext() { |
+ context_ = Context::New(0); |
+ context_->Enter(); |
+ } |
+ |
+ virtual ~SimpleContext() { |
+ context_->Exit(); |
+ context_.Dispose(); |
+ } |
+ |
+ void Check(const char* source, |
+ Expectations expectations, |
+ v8::Handle<Value> value = Local<Value>()) { |
+ HandleScope scope; |
+ TryCatch catcher; |
+ catcher.SetVerbose(true); |
+ Local<Script> script = Script::Compile(String::New(source)); |
+ if (expectations == EXPECT_ERROR) { |
+ CHECK(script.IsEmpty()); |
+ return; |
+ } |
+ CHECK(!script.IsEmpty()); |
+ Local<Value> result = script->Run(); |
+ if (expectations == EXPECT_RESULT) { |
+ CHECK(!catcher.HasCaught()); |
+ if (!value.IsEmpty()) { |
+ CHECK_EQ(value, result); |
+ } |
+ } else { |
+ CHECK(expectations == EXPECT_EXCEPTION); |
+ CHECK(catcher.HasCaught()); |
+ if (!value.IsEmpty()) { |
+ CHECK_EQ(value, catcher.Exception()); |
+ } |
+ } |
+ } |
+ |
+ private: |
+ Persistent<Context> context_; |
+}; |
+ |
+ |
+TEST(MultiScriptConflicts) { |
+ HandleScope scope; |
+ |
+ { SimpleContext context; |
+ context.Check("var x = 1; x", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("var x = 2; x", |
+ EXPECT_RESULT, Number::New(2)); |
+ context.Check("const x = 3; x", |
+ EXPECT_RESULT, Number::New(3)); |
+ context.Check("const x = 4; x", |
+ EXPECT_RESULT, Number::New(4)); |
+ context.Check("x = 5; x", |
+ EXPECT_RESULT, Number::New(5)); |
+ context.Check("var x = 6; x", |
+ EXPECT_RESULT, Number::New(6)); |
+ context.Check("this.x", |
+ EXPECT_RESULT, Number::New(6)); |
+ context.Check("function x() { return 7 }; x()", |
+ EXPECT_RESULT, Number::New(7)); |
+ } |
+ |
+ { SimpleContext context; |
+ context.Check("const x = 1; x", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("var x = 2; x", // assignment ignored |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("const x = 3; x", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("x = 4; x", // assignment ignored |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("var x = 5; x", // assignment ignored |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("this.x", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("function x() { return 7 }; x", |
+ EXPECT_EXCEPTION); |
+ } |
+ |
+ i::FLAG_use_strict = true; |
+ i::FLAG_harmony_scoping = true; |
+ |
+ { SimpleContext context; |
+ context.Check("var x = 1; x", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("x", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("this.x", |
+ EXPECT_RESULT, Number::New(1)); |
+ } |
+ |
+ { SimpleContext context; |
+ context.Check("let x = 2; x", |
+ EXPECT_RESULT, Number::New(2)); |
+ context.Check("x", |
+ EXPECT_RESULT, Number::New(2)); |
+ context.Check("this.x", |
+ EXPECT_RESULT, Number::New(2)); |
+ } |
+ |
+ { SimpleContext context; |
+ context.Check("const x = 3; x", |
+ EXPECT_RESULT, Number::New(3)); |
+ context.Check("x", |
+ EXPECT_RESULT, Number::New(3)); |
+ context.Check("this.x", |
+ EXPECT_RESULT, Number::New(3)); |
+ } |
+ |
+ { SimpleContext context; |
+ context.Check("function x() { return 4 }; x()", |
+ EXPECT_RESULT, Number::New(4)); |
+ context.Check("x()", |
+ EXPECT_RESULT, Number::New(4)); |
+ context.Check("this.x()", |
+ EXPECT_RESULT, Number::New(4)); |
+ } |
+ |
+ // TODO(rossberg): All of the below should actually be errors in Harmony. |
+ |
+ { SimpleContext context; |
+ context.Check("var x = 1; x", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("let x = 2; x", |
+ EXPECT_RESULT, Number::New(2)); |
+ } |
+ |
+ { SimpleContext context; |
+ context.Check("var x = 1; x", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("const x = 2; x", |
+ EXPECT_RESULT, Number::New(2)); |
+ } |
+ |
+ { SimpleContext context; |
+ context.Check("function x() { return 1 }; x()", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("let x = 2; x", |
+ EXPECT_RESULT, Number::New(2)); |
+ } |
+ |
+ { SimpleContext context; |
+ context.Check("function x() { return 1 }; x()", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("const x = 2; x", |
+ EXPECT_RESULT, Number::New(2)); |
+ } |
+ |
+ { SimpleContext context; |
+ context.Check("let x = 1; x", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("var x = 2; x", |
+ EXPECT_RESULT, Number::New(2)); |
+ } |
+ |
+ { SimpleContext context; |
+ context.Check("let x = 1; x", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("let x = 2; x", |
+ EXPECT_RESULT, Number::New(2)); |
+ } |
+ |
+ { SimpleContext context; |
+ context.Check("let x = 1; x", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("const x = 2; x", |
+ EXPECT_RESULT, Number::New(2)); |
+ } |
+ |
+ { SimpleContext context; |
+ context.Check("let x = 1; x", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("function x() { return 2 }; x()", |
+ EXPECT_RESULT, Number::New(2)); |
+ } |
+ |
+ { SimpleContext context; |
+ context.Check("const x = 1; x", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("var x = 2; x", |
+ EXPECT_RESULT, Number::New(1)); |
+ } |
+ |
+ { SimpleContext context; |
+ context.Check("const x = 1; x", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("let x = 2; x", |
+ EXPECT_EXCEPTION); |
+ } |
+ |
+ { SimpleContext context; |
+ context.Check("const x = 1; x", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("const x = 2; x", |
+ EXPECT_RESULT, Number::New(1)); |
+ } |
+ |
+ { SimpleContext context; |
+ context.Check("const x = 1; x", |
+ EXPECT_RESULT, Number::New(1)); |
+ context.Check("function x() { return 2 }; x()", |
+ EXPECT_EXCEPTION); |
+ } |
+} |