blob: 879d90462dfcab3b32f73b4f9beb23e0682753c8 [file] [log] [blame]
Tom Sepez3f8ee5e2018-02-09 18:26:09 +00001// Copyright 2018 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Tom Sepez3e5fac82018-02-12 21:49:04 +00005#include "fxjs/cfx_v8_unittest.h"
Tom Sepez3f8ee5e2018-02-09 18:26:09 +00006
7#include <memory>
8
9#include "testing/gtest/include/gtest/gtest.h"
10#include "testing/test_support.h"
11#include "third_party/base/ptr_util.h"
12
Tom Sepez3e5fac82018-02-12 21:49:04 +000013void FXV8UnitTest::V8IsolateDeleter::operator()(v8::Isolate* ptr) const {
14 ptr->Dispose();
15}
Tom Sepez3f8ee5e2018-02-09 18:26:09 +000016
Tom Sepez3e5fac82018-02-12 21:49:04 +000017FXV8UnitTest::FXV8UnitTest() = default;
Tom Sepez3f8ee5e2018-02-09 18:26:09 +000018
Tom Sepez3e5fac82018-02-12 21:49:04 +000019FXV8UnitTest::~FXV8UnitTest() = default;
Tom Sepez3f8ee5e2018-02-09 18:26:09 +000020
Tom Sepez3e5fac82018-02-12 21:49:04 +000021void FXV8UnitTest::SetUp() {
22 array_buffer_allocator_ = pdfium::MakeUnique<CFX_V8ArrayBufferAllocator>();
Tom Sepez3f8ee5e2018-02-09 18:26:09 +000023
Tom Sepez3e5fac82018-02-12 21:49:04 +000024 v8::Isolate::CreateParams params;
25 params.array_buffer_allocator = array_buffer_allocator_.get();
26 isolate_.reset(v8::Isolate::New(params));
Tom Sepez3f8ee5e2018-02-09 18:26:09 +000027
Tom Sepez3e5fac82018-02-12 21:49:04 +000028 cfx_v8_ = pdfium::MakeUnique<CFX_V8>(isolate_.get());
29}
Tom Sepez3f8ee5e2018-02-09 18:26:09 +000030
31TEST_F(FXV8UnitTest, EmptyLocal) {
32 v8::Isolate::Scope isolate_scope(isolate());
33 v8::HandleScope handle_scope(isolate());
34 v8::Context::Scope context_scope(v8::Context::New(isolate()));
35
36 v8::Local<v8::Value> empty;
37 EXPECT_FALSE(cfx_v8()->ToBoolean(empty));
38 EXPECT_EQ(0, cfx_v8()->ToInt32(empty));
39 EXPECT_EQ(0.0, cfx_v8()->ToDouble(empty));
40 EXPECT_EQ(L"", cfx_v8()->ToWideString(empty));
41 EXPECT_TRUE(cfx_v8()->ToObject(empty).IsEmpty());
42 EXPECT_TRUE(cfx_v8()->ToArray(empty).IsEmpty());
43}
44
45TEST_F(FXV8UnitTest, NewNull) {
46 v8::Isolate::Scope isolate_scope(isolate());
47 v8::HandleScope handle_scope(isolate());
48 v8::Context::Scope context_scope(v8::Context::New(isolate()));
49
50 auto nullz = cfx_v8()->NewNull();
51 EXPECT_FALSE(cfx_v8()->ToBoolean(nullz));
52 EXPECT_EQ(0, cfx_v8()->ToInt32(nullz));
53 EXPECT_EQ(0.0, cfx_v8()->ToDouble(nullz));
54 EXPECT_EQ(L"null", cfx_v8()->ToWideString(nullz));
55 EXPECT_TRUE(cfx_v8()->ToObject(nullz).IsEmpty());
56 EXPECT_TRUE(cfx_v8()->ToArray(nullz).IsEmpty());
57}
58
59TEST_F(FXV8UnitTest, NewUndefined) {
60 v8::Isolate::Scope isolate_scope(isolate());
61 v8::HandleScope handle_scope(isolate());
62 v8::Context::Scope context_scope(v8::Context::New(isolate()));
63
64 auto undef = cfx_v8()->NewUndefined();
65 EXPECT_FALSE(cfx_v8()->ToBoolean(undef));
66 EXPECT_EQ(0, cfx_v8()->ToInt32(undef));
67 EXPECT_TRUE(std::isnan(cfx_v8()->ToDouble(undef)));
68 EXPECT_EQ(L"undefined", cfx_v8()->ToWideString(undef));
69 EXPECT_TRUE(cfx_v8()->ToObject(undef).IsEmpty());
70 EXPECT_TRUE(cfx_v8()->ToArray(undef).IsEmpty());
71}
72
73TEST_F(FXV8UnitTest, NewBoolean) {
74 v8::Isolate::Scope isolate_scope(isolate());
75 v8::HandleScope handle_scope(isolate());
76 v8::Context::Scope context_scope(v8::Context::New(isolate()));
77
78 auto boolz = cfx_v8()->NewBoolean(true);
79 EXPECT_TRUE(cfx_v8()->ToBoolean(boolz));
80 EXPECT_EQ(1, cfx_v8()->ToInt32(boolz));
81 EXPECT_EQ(1.0, cfx_v8()->ToDouble(boolz));
82 EXPECT_EQ(L"true", cfx_v8()->ToWideString(boolz));
83 EXPECT_TRUE(cfx_v8()->ToObject(boolz).IsEmpty());
84 EXPECT_TRUE(cfx_v8()->ToArray(boolz).IsEmpty());
85
86 boolz = cfx_v8()->NewBoolean(false);
87 EXPECT_FALSE(cfx_v8()->ToBoolean(boolz));
88 EXPECT_EQ(0, cfx_v8()->ToInt32(boolz));
89 EXPECT_EQ(0.0, cfx_v8()->ToDouble(boolz));
90 EXPECT_EQ(L"false", cfx_v8()->ToWideString(boolz));
91 EXPECT_TRUE(cfx_v8()->ToObject(boolz).IsEmpty());
92 EXPECT_TRUE(cfx_v8()->ToArray(boolz).IsEmpty());
93}
94
95TEST_F(FXV8UnitTest, NewNumber) {
96 v8::Isolate::Scope isolate_scope(isolate());
97 v8::HandleScope handle_scope(isolate());
98 v8::Context::Scope context_scope(v8::Context::New(isolate()));
99
100 auto num = cfx_v8()->NewNumber(42.1);
101 EXPECT_TRUE(cfx_v8()->ToBoolean(num));
102 EXPECT_EQ(42, cfx_v8()->ToInt32(num));
103 EXPECT_EQ(42.1, cfx_v8()->ToDouble(num));
104 EXPECT_EQ(L"42.1", cfx_v8()->ToWideString(num));
105 EXPECT_TRUE(cfx_v8()->ToObject(num).IsEmpty());
106 EXPECT_TRUE(cfx_v8()->ToArray(num).IsEmpty());
107}
108
109TEST_F(FXV8UnitTest, NewString) {
110 v8::Isolate::Scope isolate_scope(isolate());
111 v8::HandleScope handle_scope(isolate());
112 v8::Context::Scope context_scope(v8::Context::New(isolate()));
113
114 auto str = cfx_v8()->NewString(L"123");
115 EXPECT_TRUE(cfx_v8()->ToBoolean(str));
116 EXPECT_EQ(123, cfx_v8()->ToInt32(str));
117 EXPECT_EQ(123, cfx_v8()->ToDouble(str));
118 EXPECT_EQ(L"123", cfx_v8()->ToWideString(str));
119 EXPECT_TRUE(cfx_v8()->ToObject(str).IsEmpty());
120 EXPECT_TRUE(cfx_v8()->ToArray(str).IsEmpty());
121}
122
123TEST_F(FXV8UnitTest, NewDate) {
124 v8::Isolate::Scope isolate_scope(isolate());
125 v8::HandleScope handle_scope(isolate());
126 v8::Context::Scope context_scope(v8::Context::New(isolate()));
127
128 auto date = cfx_v8()->NewDate(1111111111);
129 EXPECT_TRUE(cfx_v8()->ToBoolean(date));
130 EXPECT_EQ(1111111111, cfx_v8()->ToInt32(date));
131 EXPECT_EQ(1111111111.0, cfx_v8()->ToDouble(date));
132 EXPECT_NE(L"", cfx_v8()->ToWideString(date)); // exact format varies.
133 EXPECT_TRUE(cfx_v8()->ToObject(date)->IsObject());
134 EXPECT_TRUE(cfx_v8()->ToArray(date).IsEmpty());
135}
136
137TEST_F(FXV8UnitTest, NewArray) {
138 v8::Isolate::Scope isolate_scope(isolate());
139 v8::HandleScope handle_scope(isolate());
140 v8::Context::Scope context_scope(v8::Context::New(isolate()));
141
142 auto array = cfx_v8()->NewArray();
143 EXPECT_EQ(0u, cfx_v8()->GetArrayLength(array));
144 EXPECT_FALSE(cfx_v8()->GetArrayElement(array, 2).IsEmpty());
145 EXPECT_TRUE(cfx_v8()->GetArrayElement(array, 2)->IsUndefined());
146 EXPECT_EQ(0u, cfx_v8()->GetArrayLength(array));
147
148 cfx_v8()->PutArrayElement(array, 3, cfx_v8()->NewNumber(12));
149 EXPECT_FALSE(cfx_v8()->GetArrayElement(array, 2).IsEmpty());
150 EXPECT_TRUE(cfx_v8()->GetArrayElement(array, 2)->IsUndefined());
151 EXPECT_FALSE(cfx_v8()->GetArrayElement(array, 3).IsEmpty());
152 EXPECT_TRUE(cfx_v8()->GetArrayElement(array, 3)->IsNumber());
153 EXPECT_EQ(4u, cfx_v8()->GetArrayLength(array));
154
155 EXPECT_TRUE(cfx_v8()->ToBoolean(array));
156 EXPECT_EQ(0, cfx_v8()->ToInt32(array));
157 double d = cfx_v8()->ToDouble(array);
158 EXPECT_NE(d, d); // i.e. NaN.
159 EXPECT_EQ(L",,,12", cfx_v8()->ToWideString(array));
160 EXPECT_TRUE(cfx_v8()->ToObject(array)->IsObject());
161 EXPECT_TRUE(cfx_v8()->ToArray(array)->IsArray());
162}
163
164TEST_F(FXV8UnitTest, NewObject) {
165 v8::Isolate::Scope isolate_scope(isolate());
166 v8::HandleScope handle_scope(isolate());
167 v8::Context::Scope context_scope(v8::Context::New(isolate()));
168
169 auto object = cfx_v8()->NewObject();
170 ASSERT_FALSE(object.IsEmpty());
171 EXPECT_EQ(0u, cfx_v8()->GetObjectPropertyNames(object).size());
172 EXPECT_FALSE(cfx_v8()->GetObjectProperty(object, L"clams").IsEmpty());
173 EXPECT_TRUE(cfx_v8()->GetObjectProperty(object, L"clams")->IsUndefined());
174 EXPECT_EQ(0u, cfx_v8()->GetObjectPropertyNames(object).size());
175
176 cfx_v8()->PutObjectProperty(object, L"clams", cfx_v8()->NewNumber(12));
177 EXPECT_FALSE(cfx_v8()->GetObjectProperty(object, L"clams").IsEmpty());
178 EXPECT_TRUE(cfx_v8()->GetObjectProperty(object, L"clams")->IsNumber());
179 EXPECT_EQ(1u, cfx_v8()->GetObjectPropertyNames(object).size());
180 EXPECT_EQ(L"clams", cfx_v8()->GetObjectPropertyNames(object)[0]);
181
182 EXPECT_TRUE(cfx_v8()->ToBoolean(object));
183 EXPECT_EQ(0, cfx_v8()->ToInt32(object));
184 double d = cfx_v8()->ToDouble(object);
185 EXPECT_NE(d, d); // i.e. NaN.
186 EXPECT_EQ(L"[object Object]", cfx_v8()->ToWideString(object));
187 EXPECT_TRUE(cfx_v8()->ToObject(object)->IsObject());
188 EXPECT_TRUE(cfx_v8()->ToArray(object).IsEmpty());
189}