/* * Copyright (c) 2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ecmascript/ecma_vm.h" #include "ecmascript/global_env.h" #include "ecmascript/object_factory.h" #include "ecmascript/js_function.h" #include "ecmascript/js_hclass.h" #include "ecmascript/js_object-inl.h" #include "ecmascript/jspandafile/class_info_extractor.h" #include "ecmascript/tests/test_helper.h" using namespace panda; using namespace panda::ecmascript; namespace panda::test { class SharedObjectFactoryTest : public BaseTestWithScope { }; HWTEST_F_L0(SharedObjectFactoryTest, NewSModuleNamespaceTest001) { auto vm = thread->GetEcmaVM(); ObjectFactory *factory = instance->GetFactory(); JSHandle np = factory->NewSModuleNamespace(); ModuleNamespace::PreventExtensions(); JSHandle moduleNamespaceTag = JSHandle::Cast(np); Local moduleNamespace = JSNApiHelper::ToLocal(moduleNamespaceTag); ASSERT_EQ(moduleNamespace->IsModuleNamespaceObject(vm), true); } HWTEST_F_L0(SharedObjectFactoryTest, NewSImportEntryTest001) { ObjectFactory *factory = instance->GetFactory(); size_t requestIndex = 1; JSHandle importName = factory->NewFromASCII("importName"); JSHandle localName = factory->NewFromASCII("localName"); JSHandle entry = factory->NewSImportEntry(requestIndex, JSHandle::Cast(importName), JSHandle::Cast(localName)); ASSERT_EQ(entry->GetImportName().GetRawData(), JSHandle::Cast(importName)->GetRawData()); ASSERT_EQ(entry->GetLocalName().GetRawData(), JSHandle::Cast(localName)->GetRawData()); ASSERT_EQ(entry->GetModuleRequestIndex(), 1); } HWTEST_F_L0(SharedObjectFactoryTest, NewSLocalExportEntryTest001) { ObjectFactory *factory = instance->GetFactory(); JSHandle entry = factory->NewSLocalExportEntry(JSHandle::Cast(factory->NewFromASCII("exportName")), JSHandle::Cast(factory->NewFromASCII("localName")), 1); ASSERT_EQ(entry->GetExportName().GetRawData(), JSHandle::Cast(factory->NewFromASCII("exportName"))->GetRawData()); ASSERT_EQ(entry->GetLocalName().GetRawData(), JSHandle::Cast(factory->NewFromASCII("localName"))->GetRawData()); } HWTEST_F_L0(SharedObjectFactoryTest, NewSIndirectExportEntryTest001) { ObjectFactory *factory = instance->GetFactory(); JSHandle entry = factory->NewSIndirectExportEntry( JSHandle::Cast(factory->NewFromASCII("exportName")), 0, JSHandle::Cast(factory->NewFromASCII("importName"))); ASSERT_EQ(entry->GetExportName().GetRawData(), JSHandle::Cast(factory->NewFromASCII("exportName"))->GetRawData()); ASSERT_EQ(entry->GetImportName().GetRawData(), JSHandle::Cast(factory->NewFromASCII("importName"))->GetRawData()); ASSERT_EQ(entry->GetModuleRequestIndex(), 0); } HWTEST_F_L0(SharedObjectFactoryTest, NewSStarExportEntryTest001) { ObjectFactory *factory = instance->GetFactory(); JSHandle entry = factory->NewSStarExportEntry(0); ASSERT_EQ(entry->GetModuleRequestIndex(), 0); } HWTEST_F_L0(SharedObjectFactoryTest, NewSResolvedIndexBindingRecordTest001) { ObjectFactory *factory = instance->GetFactory(); JSHandle record = factory->NewSResolvedIndexBindingRecord(); ASSERT_NE(record->GetModule().GetRawData(), JSTaggedValue::Exception().GetRawData()); } HWTEST_F_L0(SharedObjectFactoryTest, NewSResolvedIndexBindingRecordTest002) { ObjectFactory *factory = instance->GetFactory(); JSHandle undefinedValue = thread->GlobalConstants()->GetHandledUndefined(); JSHandle ecmaModule(undefinedValue); JSHandle record = factory->NewSResolvedIndexBindingRecord(ecmaModule, 2); ASSERT_NE(record->GetModule().GetRawData(), JSTaggedValue::Exception().GetRawData()); } HWTEST_F_L0(SharedObjectFactoryTest, NewSResolvedBindingRecordTest001) { ObjectFactory *factory = instance->GetFactory(); JSHandle record = factory->NewSResolvedRecordBindingRecord(); JSHandle undefinedValue = thread->GlobalConstants()->GetHandledUndefined(); ASSERT_EQ(record->GetBindingName().GetRawData(), undefinedValue->GetRawData()); } HWTEST_F_L0(SharedObjectFactoryTest, NewSResolvedBindingRecordTest002) { ObjectFactory *factory = instance->GetFactory(); JSHandle record = factory->NewSResolvedRecordBindingRecord( factory->NewFromASCII("moduleRecord"), JSHandle::Cast(factory->NewFromASCII("bindName"))); ASSERT_EQ(record->GetBindingName().GetRawData(), JSHandle::Cast(factory->NewFromASCII("bindName"))->GetRawData()); } HWTEST_F_L0(SharedObjectFactoryTest, CopySArrayTest001) { ObjectFactory *factory = instance->GetFactory(); JSHandle array = factory->NewTaggedArray(5); JSHandle result = factory->CopySArray(array, 5, 10); for (size_t i = 0; i < 5; i++) { ASSERT_EQ(array->Get(i).GetRawData(), result->Get(i).GetRawData()); } for (size_t i = 5; i < 10; i++) { ASSERT_EQ(result->Get(i).GetRawData(), JSTaggedValue::Hole().GetRawData()); } } HWTEST_F_L0(SharedObjectFactoryTest, CopySArrayTest002) { ObjectFactory *factory = instance->GetFactory(); JSHandle array = factory->NewTaggedArray(10); JSHandle result = factory->CopySArray(array, 10, 5); for (size_t i = 0; i < 5; i++) { ASSERT_EQ(array->Get(i).GetRawData(), result->Get(i).GetRawData()); } } HWTEST_F_L0(SharedObjectFactoryTest, CopySArrayTest003) { ObjectFactory *factory = instance->GetFactory(); JSHandle array = factory->NewTaggedArray(5); JSHandle result = factory->CopySArray(array, 5, 0); ASSERT_EQ(result->GetLength(), 0); } HWTEST_F_L0(SharedObjectFactoryTest, NewSClassInfoExtractorTest001) { ObjectFactory *factory = instance->GetFactory(); JSHandle info = factory->NewSClassInfoExtractor(JSHandle::Cast(factory->NewFromASCII("method"))); ASSERT_EQ(info->GetConstructorMethod().GetRawData(), JSHandle::Cast(factory->NewFromASCII("method"))->GetRawData()); } } // namespace panda::test