Index: test/cctest/test-modules.cc |
diff --git a/test/cctest/test-modules.cc b/test/cctest/test-modules.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c74446bf18c7dc7add364db54a2c7830bff3efa3 |
--- /dev/null |
+++ b/test/cctest/test-modules.cc |
@@ -0,0 +1,91 @@ |
+// Copyright 2016 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "src/flags.h" |
+ |
+#include "test/cctest/cctest.h" |
+ |
+using v8::Context; |
+using v8::HandleScope; |
+using v8::Isolate; |
+using v8::Local; |
+using v8::MaybeLocal; |
+using v8::Module; |
+using v8::ScriptCompiler; |
+using v8::ScriptOrigin; |
+using v8::String; |
+using v8::Value; |
+ |
+static MaybeLocal<Module> AlwaysEmptyResolveCallback(Local<Context> context, |
+ Local<String> specifier, |
+ Local<Module> referrer, |
+ Local<Value> data) { |
+ return MaybeLocal<Module>(); |
+} |
+ |
+static int g_count = 0; |
+static MaybeLocal<Module> FailOnSecondCallResolveCallback( |
+ Local<Context> context, Local<String> specifier, Local<Module> referrer, |
+ Local<Value> data) { |
+ if (g_count++ > 0) return MaybeLocal<Module>(); |
+ Local<String> source_text = v8_str(""); |
+ ScriptOrigin origin(v8_str("module.js")); |
+ ScriptCompiler::Source source(source_text, origin); |
+ return ScriptCompiler::CompileModule(CcTest::isolate(), &source) |
+ .ToLocalChecked(); |
+} |
+ |
+TEST(ModuleInstantiationFailures) { |
+ Isolate* isolate = CcTest::isolate(); |
+ HandleScope scope(isolate); |
+ LocalContext env; |
+ |
+ Local<String> source_text = v8_str( |
+ "import './foo.js';" |
+ "export {} from './bar.js';"); |
+ ScriptOrigin origin(v8_str("file.js")); |
+ ScriptCompiler::Source source(source_text, origin); |
+ Local<Module> module = |
+ ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); |
+ CHECK_EQ(2, module->GetModuleRequestsLength()); |
+ CHECK(v8_str("./foo.js")->StrictEquals(module->GetModuleRequest(0))); |
+ CHECK(v8_str("./bar.js")->StrictEquals(module->GetModuleRequest(1))); |
+ |
+ // Instantiation should fail. |
+ CHECK(!module->Instantiate(env.local(), AlwaysEmptyResolveCallback)); |
+ |
+ // Start over again... |
+ module = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); |
+ |
+ // Instantiation should fail if a sub-module fails to resolve. |
+ g_count = 0; |
+ CHECK(!module->Instantiate(env.local(), FailOnSecondCallResolveCallback)); |
+} |
+ |
+static MaybeLocal<Module> CompileSpecifierAsModuleResolveCallback( |
+ Local<Context> context, Local<String> specifier, Local<Module> referrer, |
+ Local<Value> data) { |
+ ScriptOrigin origin(v8_str("module.js")); |
+ ScriptCompiler::Source source(specifier, origin); |
+ return ScriptCompiler::CompileModule(CcTest::isolate(), &source) |
+ .ToLocalChecked(); |
+} |
+ |
+TEST(ModuleEvaluation) { |
+ Isolate* isolate = CcTest::isolate(); |
+ HandleScope scope(isolate); |
+ LocalContext env; |
+ |
+ Local<String> source_text = v8_str( |
+ "import 'Object.expando = 5';" |
+ "import 'Object.expando *= 2';"); |
+ ScriptOrigin origin(v8_str("file.js")); |
+ ScriptCompiler::Source source(source_text, origin); |
+ Local<Module> module = |
+ ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); |
+ CHECK(module->Instantiate(env.local(), |
+ CompileSpecifierAsModuleResolveCallback)); |
+ CHECK(!module->Evaluate(env.local()).IsEmpty()); |
+ ExpectInt32("Object.expando", 10); |
+} |