summaryrefslogtreecommitdiff
path: root/deps/v8/test/unittests/api/context-unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/unittests/api/context-unittest.cc')
-rw-r--r--deps/v8/test/unittests/api/context-unittest.cc96
1 files changed, 96 insertions, 0 deletions
diff --git a/deps/v8/test/unittests/api/context-unittest.cc b/deps/v8/test/unittests/api/context-unittest.cc
new file mode 100644
index 0000000000..e144a60ca4
--- /dev/null
+++ b/deps/v8/test/unittests/api/context-unittest.cc
@@ -0,0 +1,96 @@
+// Copyright 2022 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 "include/libplatform/libplatform.h"
+#include "include/v8-context.h"
+#include "include/v8-data.h"
+#include "include/v8-isolate.h"
+#include "include/v8-local-handle.h"
+#include "include/v8-value.h"
+#include "test/unittests/test-utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ContextTest = v8::TestWithIsolate;
+
+TEST_F(ContextTest, HasTemplateLiteralObjectBasic) {
+ v8::Local<v8::Context> context = v8::Context::New(isolate());
+ v8::Context::Scope scope(context);
+ ASSERT_FALSE(
+ context->HasTemplateLiteralObject(v8::Number::New(isolate(), 1)));
+ ASSERT_FALSE(context->HasTemplateLiteralObject(v8::String::Empty(isolate())));
+ ASSERT_FALSE(
+ context->HasTemplateLiteralObject(v8::Array::New(isolate(), 10)));
+}
+
+TEST_F(ContextTest, HasTemplateLiteralObject) {
+ const char* source = R"(
+ function ret(literal) {
+ return literal;
+ };
+ ret`one_${'two'}_three`;
+ )";
+ const char* otherObject1Source = R"(
+ Object.freeze(
+ Object.defineProperty(['one_', '_three'], 'raw', {
+ value: ['asdf'],
+ writable: false,
+ enumerable: false,
+ configurable: false,
+ })
+ );
+ )";
+ const char* otherObject2Source = R"(
+ Object.freeze(
+ Object.defineProperty(['one_', '_three'], 'raw', {
+ get() { return ['asdf']; },
+ enumerable: false,
+ configurable: false,
+ })
+ );
+ )";
+
+ v8::Local<v8::Context> context1 = v8::Context::New(isolate());
+ v8::Local<v8::Value> templateLiteral1;
+ v8::Local<v8::Value> templateLiteral1_2;
+ v8::Local<v8::Value> otherObject1_ctx1;
+ v8::Local<v8::Value> otherObject2_ctx1;
+ {
+ v8::Context::Scope scope(context1);
+ auto script =
+ v8::Script::Compile(context1, NewString(source)).ToLocalChecked();
+ templateLiteral1 = script->Run(context1).ToLocalChecked();
+ templateLiteral1_2 = script->Run(context1).ToLocalChecked();
+ otherObject1_ctx1 = RunJS(context1, otherObject1Source);
+ otherObject2_ctx1 = RunJS(context1, otherObject2Source);
+ }
+
+ v8::Local<v8::Value> templateLiteral2;
+ v8::Local<v8::Context> context2 = v8::Context::New(isolate());
+ v8::Local<v8::Value> otherObject1_ctx2;
+ v8::Local<v8::Value> otherObject2_ctx2;
+ {
+ v8::Context::Scope scope(context2);
+ templateLiteral2 = RunJS(context2, source);
+ otherObject1_ctx2 = RunJS(context2, otherObject1Source);
+ otherObject2_ctx2 = RunJS(context1, otherObject2Source);
+ }
+
+ ASSERT_TRUE(context1->HasTemplateLiteralObject(templateLiteral1));
+ ASSERT_TRUE(context1->HasTemplateLiteralObject(templateLiteral1_2));
+ ASSERT_FALSE(context1->HasTemplateLiteralObject(templateLiteral2));
+
+ ASSERT_FALSE(context2->HasTemplateLiteralObject(templateLiteral1));
+ ASSERT_FALSE(context2->HasTemplateLiteralObject(templateLiteral1_2));
+ ASSERT_TRUE(context2->HasTemplateLiteralObject(templateLiteral2));
+
+ // Neither otherObject is a template object
+ ASSERT_FALSE(context1->HasTemplateLiteralObject(otherObject1_ctx1));
+ ASSERT_FALSE(context1->HasTemplateLiteralObject(otherObject2_ctx1));
+ ASSERT_FALSE(context1->HasTemplateLiteralObject(otherObject1_ctx2));
+ ASSERT_FALSE(context1->HasTemplateLiteralObject(otherObject1_ctx1));
+ ASSERT_FALSE(context2->HasTemplateLiteralObject(otherObject2_ctx1));
+ ASSERT_FALSE(context2->HasTemplateLiteralObject(otherObject1_ctx2));
+ ASSERT_FALSE(context2->HasTemplateLiteralObject(otherObject2_ctx2));
+ ASSERT_FALSE(context2->HasTemplateLiteralObject(otherObject2_ctx2));
+}