1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "ecmascript/ecma_vm.h"
17 #include "ecmascript/global_env.h"
18 #include "ecmascript/object_factory.h"
19 #include "ecmascript/js_function.h"
20 #include "ecmascript/js_hclass.h"
21 #include "ecmascript/js_object-inl.h"
22 #include "ecmascript/jspandafile/class_info_extractor.h"
23 #include "ecmascript/tests/test_helper.h"
24
25 using namespace panda;
26
27 using namespace panda::ecmascript;
28
29 namespace panda::test {
30 class SharedObjectFactoryTest : public BaseTestWithScope<false> {
31 };
32
HWTEST_F_L0(SharedObjectFactoryTest,NewSModuleNamespaceTest001)33 HWTEST_F_L0(SharedObjectFactoryTest, NewSModuleNamespaceTest001)
34 {
35 auto vm = thread->GetEcmaVM();
36 ObjectFactory *factory = instance->GetFactory();
37 JSHandle<ModuleNamespace> np = factory->NewSModuleNamespace();
38 ModuleNamespace::PreventExtensions();
39 JSHandle<JSTaggedValue> moduleNamespaceTag = JSHandle<JSTaggedValue>::Cast(np);
40 Local<JSValueRef> moduleNamespace = JSNApiHelper::ToLocal<ModuleNamespace>(moduleNamespaceTag);
41 ASSERT_EQ(moduleNamespace->IsModuleNamespaceObject(vm), true);
42 }
43
HWTEST_F_L0(SharedObjectFactoryTest,NewSImportEntryTest001)44 HWTEST_F_L0(SharedObjectFactoryTest, NewSImportEntryTest001)
45 {
46 ObjectFactory *factory = instance->GetFactory();
47 size_t requestIndex = 1;
48 JSHandle<EcmaString> importName = factory->NewFromASCII("importName");
49 JSHandle<EcmaString> localName = factory->NewFromASCII("localName");
50
51 JSHandle<ImportEntry> entry = factory->NewSImportEntry(requestIndex,
52 JSHandle<JSTaggedValue>::Cast(importName),
53 JSHandle<JSTaggedValue>::Cast(localName));
54 ASSERT_EQ(entry->GetImportName(thread).GetRawData(), JSHandle<JSTaggedValue>::Cast(importName)->GetRawData());
55 ASSERT_EQ(entry->GetLocalName(thread).GetRawData(), JSHandle<JSTaggedValue>::Cast(localName)->GetRawData());
56 ASSERT_EQ(entry->GetModuleRequestIndex(), 1);
57 }
58
HWTEST_F_L0(SharedObjectFactoryTest,NewSLocalExportEntryTest001)59 HWTEST_F_L0(SharedObjectFactoryTest, NewSLocalExportEntryTest001)
60 {
61 ObjectFactory *factory = instance->GetFactory();
62 JSHandle<LocalExportEntry> entry =
63 factory->NewSLocalExportEntry(JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("exportName")),
64 JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("localName")), 1);
65 ASSERT_EQ(entry->GetExportName(thread).GetRawData(),
66 JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("exportName"))->GetRawData());
67 ASSERT_EQ(entry->GetLocalName(thread).GetRawData(),
68 JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("localName"))->GetRawData());
69 }
70
HWTEST_F_L0(SharedObjectFactoryTest,NewSIndirectExportEntryTest001)71 HWTEST_F_L0(SharedObjectFactoryTest, NewSIndirectExportEntryTest001)
72 {
73 ObjectFactory *factory = instance->GetFactory();
74 JSHandle<IndirectExportEntry> entry = factory->NewSIndirectExportEntry(
75 JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("exportName")), 0,
76 JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("importName")));
77 ASSERT_EQ(entry->GetExportName(thread).GetRawData(),
78 JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("exportName"))->GetRawData());
79 ASSERT_EQ(entry->GetImportName(thread).GetRawData(),
80 JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("importName"))->GetRawData());
81 ASSERT_EQ(entry->GetModuleRequestIndex(), 0);
82 }
83
HWTEST_F_L0(SharedObjectFactoryTest,NewSStarExportEntryTest001)84 HWTEST_F_L0(SharedObjectFactoryTest, NewSStarExportEntryTest001)
85 {
86 ObjectFactory *factory = instance->GetFactory();
87
88 JSHandle<StarExportEntry> entry = factory->NewSStarExportEntry(0);
89 ASSERT_EQ(entry->GetModuleRequestIndex(), 0);
90 }
91
HWTEST_F_L0(SharedObjectFactoryTest,NewSResolvedIndexBindingRecordTest001)92 HWTEST_F_L0(SharedObjectFactoryTest, NewSResolvedIndexBindingRecordTest001)
93 {
94 ObjectFactory *factory = instance->GetFactory();
95 JSHandle<ResolvedIndexBinding> record = factory->NewSResolvedIndexBindingRecord();
96 ASSERT_NE(record->GetModule(thread).GetRawData(), JSTaggedValue::Exception().GetRawData());
97 }
98
HWTEST_F_L0(SharedObjectFactoryTest,NewSResolvedIndexBindingRecordTest002)99 HWTEST_F_L0(SharedObjectFactoryTest, NewSResolvedIndexBindingRecordTest002)
100 {
101 ObjectFactory *factory = instance->GetFactory();
102 JSHandle<JSTaggedValue> undefinedValue = thread->GlobalConstants()->GetHandledUndefined();
103 JSHandle<SourceTextModule> ecmaModule(undefinedValue);
104 JSHandle<ResolvedIndexBinding> record = factory->NewSResolvedIndexBindingRecord(ecmaModule, 2);
105 ASSERT_NE(record->GetModule(thread).GetRawData(), JSTaggedValue::Exception().GetRawData());
106 }
107
HWTEST_F_L0(SharedObjectFactoryTest,NewSResolvedBindingRecordTest001)108 HWTEST_F_L0(SharedObjectFactoryTest, NewSResolvedBindingRecordTest001)
109 {
110 ObjectFactory *factory = instance->GetFactory();
111 JSHandle<ResolvedRecordBinding> record = factory->NewSResolvedRecordBindingRecord();
112 JSHandle<JSTaggedValue> undefinedValue = thread->GlobalConstants()->GetHandledUndefined();
113 ASSERT_EQ(record->GetBindingName(thread).GetRawData(), undefinedValue->GetRawData());
114 }
115
HWTEST_F_L0(SharedObjectFactoryTest,NewSResolvedBindingRecordTest002)116 HWTEST_F_L0(SharedObjectFactoryTest, NewSResolvedBindingRecordTest002)
117 {
118 ObjectFactory *factory = instance->GetFactory();
119 JSHandle<ResolvedRecordBinding> record = factory->NewSResolvedRecordBindingRecord(
120 factory->NewFromASCII("moduleRecord"),
121 JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("bindName")));
122 ASSERT_EQ(record->GetBindingName(thread).GetRawData(),
123 JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("bindName"))->GetRawData());
124 }
125
HWTEST_F_L0(SharedObjectFactoryTest,CopySArrayTest001)126 HWTEST_F_L0(SharedObjectFactoryTest, CopySArrayTest001)
127 {
128 ObjectFactory *factory = instance->GetFactory();
129 JSHandle<TaggedArray> array = factory->NewTaggedArray(5);
130 JSHandle<TaggedArray> result = factory->CopySArray(array, 5, 10);
131 for (size_t i = 0; i < 5; i++)
132 {
133 ASSERT_EQ(array->Get(thread, i).GetRawData(), result->Get(thread, i).GetRawData());
134 }
135 for (size_t i = 5; i < 10; i++)
136 {
137 ASSERT_EQ(result->Get(thread, i).GetRawData(), JSTaggedValue::Hole().GetRawData());
138 }
139 }
140
HWTEST_F_L0(SharedObjectFactoryTest,CopySArrayTest002)141 HWTEST_F_L0(SharedObjectFactoryTest, CopySArrayTest002)
142 {
143 ObjectFactory *factory = instance->GetFactory();
144 JSHandle<TaggedArray> array = factory->NewTaggedArray(10);
145 JSHandle<TaggedArray> result = factory->CopySArray(array, 10, 5);
146 for (size_t i = 0; i < 5; i++)
147 {
148 ASSERT_EQ(array->Get(thread, i).GetRawData(), result->Get(thread, i).GetRawData());
149 }
150 }
151
HWTEST_F_L0(SharedObjectFactoryTest,CopySArrayTest003)152 HWTEST_F_L0(SharedObjectFactoryTest, CopySArrayTest003)
153 {
154 ObjectFactory *factory = instance->GetFactory();
155 JSHandle<TaggedArray> array = factory->NewTaggedArray(5);
156 JSHandle<TaggedArray> result = factory->CopySArray(array, 5, 0);
157 ASSERT_EQ(result->GetLength(), 0);
158 }
159
HWTEST_F_L0(SharedObjectFactoryTest,NewSClassInfoExtractorTest001)160 HWTEST_F_L0(SharedObjectFactoryTest, NewSClassInfoExtractorTest001)
161 {
162 ObjectFactory *factory = instance->GetFactory();
163 JSHandle<ClassInfoExtractor> info =
164 factory->NewSClassInfoExtractor(JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("method")));
165 ASSERT_EQ(info->GetConstructorMethod(thread).GetRawData(),
166 JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("method"))->GetRawData());
167 }
168 } // namespace panda::test