14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License. 54514f5e3Sopenharmony_ci * You may obtain a copy of the License at 64514f5e3Sopenharmony_ci * 74514f5e3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84514f5e3Sopenharmony_ci * 94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and 134514f5e3Sopenharmony_ci * limitations under the License. 144514f5e3Sopenharmony_ci */ 154514f5e3Sopenharmony_ci 164514f5e3Sopenharmony_ci#include "ecmascript/builtins/builtins_promise.h" 174514f5e3Sopenharmony_ci 184514f5e3Sopenharmony_ci#include "ecmascript/builtins/builtins_array.h" 194514f5e3Sopenharmony_ci#include "ecmascript/ecma_string.h" 204514f5e3Sopenharmony_ci#include "ecmascript/ecma_vm.h" 214514f5e3Sopenharmony_ci#include "ecmascript/global_env.h" 224514f5e3Sopenharmony_ci#include "ecmascript/jobs/micro_job_queue.h" 234514f5e3Sopenharmony_ci#include "ecmascript/js_array.h" 244514f5e3Sopenharmony_ci#include "ecmascript/js_promise.h" 254514f5e3Sopenharmony_ci#include "ecmascript/js_tagged_value-inl.h" 264514f5e3Sopenharmony_ci#include "ecmascript/js_tagged_value.h" 274514f5e3Sopenharmony_ci#include "ecmascript/js_thread.h" 284514f5e3Sopenharmony_ci#include "ecmascript/object_factory.h" 294514f5e3Sopenharmony_ci#include "ecmascript/tests/test_helper.h" 304514f5e3Sopenharmony_ci 314514f5e3Sopenharmony_ciusing namespace panda::ecmascript; 324514f5e3Sopenharmony_ciusing namespace panda::ecmascript::builtins; 334514f5e3Sopenharmony_ci 344514f5e3Sopenharmony_cinamespace panda::test { 354514f5e3Sopenharmony_ciusing BuiltinsBase = panda::ecmascript::base::BuiltinsBase; 364514f5e3Sopenharmony_ciusing JSArray = panda::ecmascript::JSArray; 374514f5e3Sopenharmony_ci 384514f5e3Sopenharmony_ciclass BuiltinsPromiseTest : public BaseTestWithScope<false> { 394514f5e3Sopenharmony_ci}; 404514f5e3Sopenharmony_ci 414514f5e3Sopenharmony_ci// native function for race2 then_on_rejected() 424514f5e3Sopenharmony_ciJSTaggedValue TestPromiseRaceThenOnRejectd(EcmaRuntimeCallInfo *argv) 434514f5e3Sopenharmony_ci{ 444514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> result = BuiltinsBase::GetCallArg(argv, 0); 454514f5e3Sopenharmony_ci // 12345 : test case 464514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(result.GetTaggedValue(), JSTaggedValue(12345)), true); 474514f5e3Sopenharmony_ci return JSTaggedValue::Undefined(); 484514f5e3Sopenharmony_ci} 494514f5e3Sopenharmony_ci 504514f5e3Sopenharmony_ci// native function for all then_on_resolved() 514514f5e3Sopenharmony_ciJSTaggedValue TestPromiseAllThenOnResolved(EcmaRuntimeCallInfo *argv) 524514f5e3Sopenharmony_ci{ 534514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> array = BuiltinsBase::GetCallArg(argv, 0); 544514f5e3Sopenharmony_ci JSHandle<JSObject> objectArray = JSHandle<JSObject>::Cast(array); 554514f5e3Sopenharmony_ci [[maybe_unused]] PropertyDescriptor desc(argv->GetThread()); 564514f5e3Sopenharmony_ci [[maybe_unused]] bool result1 = JSObject::GetOwnProperty( 574514f5e3Sopenharmony_ci argv->GetThread(), objectArray, JSHandle<JSTaggedValue>(argv->GetThread(), JSTaggedValue(0)), desc); 584514f5e3Sopenharmony_ci EXPECT_TRUE(result1); 594514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> value1 = desc.GetValue(); 604514f5e3Sopenharmony_ci // 111 : test case 614514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(value1.GetTaggedValue(), JSTaggedValue(111)), true); 624514f5e3Sopenharmony_ci [[maybe_unused]] bool result2 = JSObject::GetOwnProperty( 634514f5e3Sopenharmony_ci argv->GetThread(), objectArray, JSHandle<JSTaggedValue>(argv->GetThread(), JSTaggedValue(1)), desc); 644514f5e3Sopenharmony_ci EXPECT_TRUE(result2); 654514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> value2 = desc.GetValue(); 664514f5e3Sopenharmony_ci // 222 : test case 674514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(value2.GetTaggedValue(), JSTaggedValue(222)), true); 684514f5e3Sopenharmony_ci return JSTaggedValue::Undefined(); 694514f5e3Sopenharmony_ci} 704514f5e3Sopenharmony_ci 714514f5e3Sopenharmony_ci// native function for catch catch_on_rejected() 724514f5e3Sopenharmony_ciJSTaggedValue TestPromiseCatch(EcmaRuntimeCallInfo *argv) 734514f5e3Sopenharmony_ci{ 744514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> result = BuiltinsBase::GetCallArg(argv, 0); 754514f5e3Sopenharmony_ci // 3 : test case 764514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(result.GetTaggedValue(), JSTaggedValue(3)), true); 774514f5e3Sopenharmony_ci return JSTaggedValue::Undefined(); 784514f5e3Sopenharmony_ci} 794514f5e3Sopenharmony_ci 804514f5e3Sopenharmony_ci// native function for then then_on_resolved() 814514f5e3Sopenharmony_ciJSTaggedValue TestPromiseThenOnResolved(EcmaRuntimeCallInfo *argv) 824514f5e3Sopenharmony_ci{ 834514f5e3Sopenharmony_ci auto factory = argv->GetThread()->GetEcmaVM()->GetFactory(); 844514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> result = BuiltinsBase::GetCallArg(argv, 0); 854514f5e3Sopenharmony_ci auto expect = factory->NewFromASCII("resolve"); 864514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(result.GetTaggedValue(), expect.GetTaggedValue()), true); 874514f5e3Sopenharmony_ci return JSTaggedValue::Undefined(); 884514f5e3Sopenharmony_ci} 894514f5e3Sopenharmony_ci 904514f5e3Sopenharmony_ci// native function for then then_on_rejected() 914514f5e3Sopenharmony_ciJSTaggedValue TestPromiseThenOnRejected(EcmaRuntimeCallInfo *argv) 924514f5e3Sopenharmony_ci{ 934514f5e3Sopenharmony_ci auto factory = argv->GetThread()->GetEcmaVM()->GetFactory(); 944514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> result = BuiltinsBase::GetCallArg(argv, 0); 954514f5e3Sopenharmony_ci auto expect = factory->NewFromASCII("reject"); 964514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(result.GetTaggedValue(), expect.GetTaggedValue()), true); 974514f5e3Sopenharmony_ci return JSTaggedValue::Undefined(); 984514f5e3Sopenharmony_ci} 994514f5e3Sopenharmony_ci 1004514f5e3Sopenharmony_cienum class AlgorithmType { 1014514f5e3Sopenharmony_ci REJECT, 1024514f5e3Sopenharmony_ci RESOLVE, 1034514f5e3Sopenharmony_ci RACE, 1044514f5e3Sopenharmony_ci ALL, 1054514f5e3Sopenharmony_ci}; 1064514f5e3Sopenharmony_ci 1074514f5e3Sopenharmony_ciJSTaggedValue PromiseAlgorithm(JSThread *thread, JSHandle<JSFunction>& promise, JSTaggedValue arg, 1084514f5e3Sopenharmony_ci AlgorithmType type) 1094514f5e3Sopenharmony_ci{ 1104514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*promise), 6); 1114514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetFunction(promise.GetTaggedValue()); 1124514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetThis(promise.GetTaggedValue()); 1134514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetCallArg(0, arg); 1144514f5e3Sopenharmony_ci 1154514f5e3Sopenharmony_ci auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo); 1164514f5e3Sopenharmony_ci JSTaggedValue result; 1174514f5e3Sopenharmony_ci switch (type) { 1184514f5e3Sopenharmony_ci case AlgorithmType::REJECT: 1194514f5e3Sopenharmony_ci result = BuiltinsPromise::Reject(ecmaRuntimeCallInfo); 1204514f5e3Sopenharmony_ci break; 1214514f5e3Sopenharmony_ci case AlgorithmType::RESOLVE: 1224514f5e3Sopenharmony_ci result = BuiltinsPromise::Resolve(ecmaRuntimeCallInfo); 1234514f5e3Sopenharmony_ci break; 1244514f5e3Sopenharmony_ci case AlgorithmType::RACE: 1254514f5e3Sopenharmony_ci result = BuiltinsPromise::Race(ecmaRuntimeCallInfo); 1264514f5e3Sopenharmony_ci break; 1274514f5e3Sopenharmony_ci case AlgorithmType::ALL: 1284514f5e3Sopenharmony_ci result = BuiltinsPromise::All(ecmaRuntimeCallInfo); 1294514f5e3Sopenharmony_ci break; 1304514f5e3Sopenharmony_ci default: 1314514f5e3Sopenharmony_ci break; 1324514f5e3Sopenharmony_ci } 1334514f5e3Sopenharmony_ci 1344514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 1354514f5e3Sopenharmony_ci return result; 1364514f5e3Sopenharmony_ci} 1374514f5e3Sopenharmony_ci 1384514f5e3Sopenharmony_ciJSTaggedValue ThanAlgorithm(JSThread *thread, JSHandle<JSPromise>& promise, JSTaggedValue arg1, 1394514f5e3Sopenharmony_ci JSTaggedValue arg2) 1404514f5e3Sopenharmony_ci{ 1414514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, promise.GetTaggedValue(), 8); 1424514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetFunction(promise.GetTaggedValue()); 1434514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetThis(promise.GetTaggedValue()); 1444514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetCallArg(0, arg1); 1454514f5e3Sopenharmony_ci ecmaRuntimeCallInfo->SetCallArg(1, arg2); 1464514f5e3Sopenharmony_ci auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo); 1474514f5e3Sopenharmony_ci auto result = BuiltinsPromise::Then(ecmaRuntimeCallInfo); 1484514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prev); 1494514f5e3Sopenharmony_ci return result; 1504514f5e3Sopenharmony_ci} 1514514f5e3Sopenharmony_ci/* 1524514f5e3Sopenharmony_ci * @tc.name: Reject1 1534514f5e3Sopenharmony_ci * @tc.desc: The reject method receives a number. 1544514f5e3Sopenharmony_ci * @tc.type: FUNC 1554514f5e3Sopenharmony_ci */ 1564514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsPromiseTest, Reject1) 1574514f5e3Sopenharmony_ci{ 1584514f5e3Sopenharmony_ci JSHandle<GlobalEnv> env = instance->GetGlobalEnv(); 1594514f5e3Sopenharmony_ci 1604514f5e3Sopenharmony_ci JSHandle<JSFunction> promise = JSHandle<JSFunction>::Cast(env->GetPromiseFunction()); 1614514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> paramMsg(thread, JSTaggedValue(3)); 1624514f5e3Sopenharmony_ci 1634514f5e3Sopenharmony_ci // /** 1644514f5e3Sopenharmony_ci // * @tc.steps: var p1 = Promise.reject(3). 1654514f5e3Sopenharmony_ci // */ 1664514f5e3Sopenharmony_ci 1674514f5e3Sopenharmony_ci auto result = PromiseAlgorithm(thread, promise, paramMsg.GetTaggedValue(), AlgorithmType::REJECT); 1684514f5e3Sopenharmony_ci JSHandle<JSPromise> rejectPromise(thread, result); 1694514f5e3Sopenharmony_ci EXPECT_EQ(rejectPromise->GetPromiseState(), PromiseState::REJECTED); 1704514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(rejectPromise->GetPromiseResult(), JSTaggedValue(3)), true); 1714514f5e3Sopenharmony_ci} 1724514f5e3Sopenharmony_ci 1734514f5e3Sopenharmony_ci/* 1744514f5e3Sopenharmony_ci * @tc.name: Reject2 1754514f5e3Sopenharmony_ci * @tc.desc: The reject method receives a promise object. 1764514f5e3Sopenharmony_ci * @tc.type: FUNC 1774514f5e3Sopenharmony_ci */ 1784514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsPromiseTest, Reject2) 1794514f5e3Sopenharmony_ci{ 1804514f5e3Sopenharmony_ci ObjectFactory *factory = instance->GetFactory(); 1814514f5e3Sopenharmony_ci JSHandle<GlobalEnv> env = instance->GetGlobalEnv(); 1824514f5e3Sopenharmony_ci 1834514f5e3Sopenharmony_ci // constructor promise1 1844514f5e3Sopenharmony_ci JSHandle<JSFunction> promise = JSHandle<JSFunction>::Cast(env->GetPromiseFunction()); 1854514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> paramMsg1 = 1864514f5e3Sopenharmony_ci JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("Promise reject")); 1874514f5e3Sopenharmony_ci 1884514f5e3Sopenharmony_ci /** 1894514f5e3Sopenharmony_ci * @tc.steps: step1. var p1 = Promise.reject("Promise reject") 1904514f5e3Sopenharmony_ci */ 1914514f5e3Sopenharmony_ci auto result = PromiseAlgorithm(thread, promise, paramMsg1.GetTaggedValue(), AlgorithmType::REJECT); 1924514f5e3Sopenharmony_ci JSHandle<JSPromise> promise1(thread, result); 1934514f5e3Sopenharmony_ci EXPECT_EQ(promise1->GetPromiseState(), PromiseState::REJECTED); 1944514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(promise1->GetPromiseResult(), paramMsg1.GetTaggedValue()), true); 1954514f5e3Sopenharmony_ci 1964514f5e3Sopenharmony_ci /** 1974514f5e3Sopenharmony_ci * @tc.steps: step2. var p2 = Promise.reject(p1) 1984514f5e3Sopenharmony_ci */ 1994514f5e3Sopenharmony_ci auto result1 = PromiseAlgorithm(thread, promise, promise1.GetTaggedValue(), AlgorithmType::REJECT); 2004514f5e3Sopenharmony_ci JSHandle<JSPromise> promise2(thread, result1); 2014514f5e3Sopenharmony_ci EXPECT_NE(*promise1, *promise2); 2024514f5e3Sopenharmony_ci EXPECT_EQ(promise2->GetPromiseState(), PromiseState::REJECTED); 2034514f5e3Sopenharmony_ci EXPECT_EQ( 2044514f5e3Sopenharmony_ci JSTaggedValue::SameValue(promise2->GetPromiseResult(), JSTaggedValue(promise1.GetTaggedValue().GetRawData())), 2054514f5e3Sopenharmony_ci true); 2064514f5e3Sopenharmony_ci} 2074514f5e3Sopenharmony_ci 2084514f5e3Sopenharmony_ci/* 2094514f5e3Sopenharmony_ci * @tc.name: Resolve1 2104514f5e3Sopenharmony_ci * @tc.desc: The resolve method receives a number. 2114514f5e3Sopenharmony_ci * @tc.type: FUNC 2124514f5e3Sopenharmony_ci */ 2134514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsPromiseTest, Resolve1) 2144514f5e3Sopenharmony_ci{ 2154514f5e3Sopenharmony_ci JSHandle<GlobalEnv> env = instance->GetGlobalEnv(); 2164514f5e3Sopenharmony_ci 2174514f5e3Sopenharmony_ci JSHandle<JSFunction> promise = JSHandle<JSFunction>::Cast(env->GetPromiseFunction()); 2184514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> paramMsg(thread, JSTaggedValue(5)); 2194514f5e3Sopenharmony_ci 2204514f5e3Sopenharmony_ci /** 2214514f5e3Sopenharmony_ci * @tc.steps: step1. var p1 = Promise.resolve(12345) 2224514f5e3Sopenharmony_ci */ 2234514f5e3Sopenharmony_ci auto result = PromiseAlgorithm(thread, promise, paramMsg.GetTaggedValue(), AlgorithmType::RESOLVE); 2244514f5e3Sopenharmony_ci JSHandle<JSPromise> rejectPromise(thread, result); 2254514f5e3Sopenharmony_ci EXPECT_EQ(rejectPromise->GetPromiseState(), PromiseState::FULFILLED); 2264514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(rejectPromise->GetPromiseResult(), JSTaggedValue(5)), true); 2274514f5e3Sopenharmony_ci} 2284514f5e3Sopenharmony_ci 2294514f5e3Sopenharmony_ci/* 2304514f5e3Sopenharmony_ci * @tc.name: Resolve2 2314514f5e3Sopenharmony_ci * @tc.desc: The resolve method receives a promise object. 2324514f5e3Sopenharmony_ci * @tc.type: FUNC 2334514f5e3Sopenharmony_ci */ 2344514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsPromiseTest, Resolve2) 2354514f5e3Sopenharmony_ci{ 2364514f5e3Sopenharmony_ci ObjectFactory *factory = instance->GetFactory(); 2374514f5e3Sopenharmony_ci JSHandle<GlobalEnv> env = instance->GetGlobalEnv(); 2384514f5e3Sopenharmony_ci 2394514f5e3Sopenharmony_ci // constructor promise1 2404514f5e3Sopenharmony_ci JSHandle<JSFunction> promise = JSHandle<JSFunction>::Cast(env->GetPromiseFunction()); 2414514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> paramMsg1 = 2424514f5e3Sopenharmony_ci JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("Promise reject")); 2434514f5e3Sopenharmony_ci 2444514f5e3Sopenharmony_ci /** 2454514f5e3Sopenharmony_ci * @tc.steps: step1. var p1 = Promise.reject("Promise reject") 2464514f5e3Sopenharmony_ci */ 2474514f5e3Sopenharmony_ci auto result = PromiseAlgorithm(thread, promise, paramMsg1.GetTaggedValue(), AlgorithmType::REJECT); 2484514f5e3Sopenharmony_ci JSHandle<JSPromise> promise1(thread, result); 2494514f5e3Sopenharmony_ci EXPECT_EQ(promise1->GetPromiseState(), PromiseState::REJECTED); 2504514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(promise1->GetPromiseResult(), paramMsg1.GetTaggedValue()), true); 2514514f5e3Sopenharmony_ci 2524514f5e3Sopenharmony_ci // promise1 Enter Reject() as a parameter. 2534514f5e3Sopenharmony_ci /** 2544514f5e3Sopenharmony_ci * @tc.steps: step2. var p2 = Promise.resolve(p1) 2554514f5e3Sopenharmony_ci */ 2564514f5e3Sopenharmony_ci auto result1 = PromiseAlgorithm(thread, promise, promise1.GetTaggedValue(), AlgorithmType::RESOLVE); 2574514f5e3Sopenharmony_ci JSHandle<JSPromise> promise2(thread, result1); 2584514f5e3Sopenharmony_ci EXPECT_EQ(*promise1, *promise2); 2594514f5e3Sopenharmony_ci EXPECT_EQ(promise2->GetPromiseState(), PromiseState::REJECTED); 2604514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(promise2->GetPromiseResult(), paramMsg1.GetTaggedValue()), true); 2614514f5e3Sopenharmony_ci} 2624514f5e3Sopenharmony_ci 2634514f5e3Sopenharmony_ci/* 2644514f5e3Sopenharmony_ci * @tc.name: Race1 2654514f5e3Sopenharmony_ci * @tc.desc: The race method receives an array. 2664514f5e3Sopenharmony_ci * @tc.type: FUNC 2674514f5e3Sopenharmony_ci */ 2684514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsPromiseTest, Race1) 2694514f5e3Sopenharmony_ci{ 2704514f5e3Sopenharmony_ci JSHandle<GlobalEnv> env = instance->GetGlobalEnv(); 2714514f5e3Sopenharmony_ci 2724514f5e3Sopenharmony_ci JSHandle<JSFunction> promise = JSHandle<JSFunction>::Cast(env->GetPromiseFunction()); 2734514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> paramMsg1(thread, JSTaggedValue(12345)); 2744514f5e3Sopenharmony_ci 2754514f5e3Sopenharmony_ci /** 2764514f5e3Sopenharmony_ci * @tc.steps: step1. var p1 = Promise.reject(12345) 2774514f5e3Sopenharmony_ci */ 2784514f5e3Sopenharmony_ci auto result1 = PromiseAlgorithm(thread, promise, paramMsg1.GetTaggedValue(), AlgorithmType::REJECT); 2794514f5e3Sopenharmony_ci JSHandle<JSPromise> rejectPromise(thread, result1); 2804514f5e3Sopenharmony_ci EXPECT_EQ(rejectPromise->GetPromiseState(), PromiseState::REJECTED); 2814514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(rejectPromise->GetPromiseResult(), JSTaggedValue(12345)), true); 2824514f5e3Sopenharmony_ci 2834514f5e3Sopenharmony_ci /** 2844514f5e3Sopenharmony_ci * @tc.steps: step2. var p2 = Promise.resolve(6789) 2854514f5e3Sopenharmony_ci */ 2864514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> paramMsg2(thread, JSTaggedValue(6789)); 2874514f5e3Sopenharmony_ci auto result2 = PromiseAlgorithm(thread, promise, paramMsg2.GetTaggedValue(), AlgorithmType::RESOLVE); 2884514f5e3Sopenharmony_ci JSHandle<JSPromise> resolvePromise(thread, result2); 2894514f5e3Sopenharmony_ci EXPECT_EQ(resolvePromise->GetPromiseState(), PromiseState::FULFILLED); 2904514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(resolvePromise->GetPromiseResult(), JSTaggedValue(6789)), true); 2914514f5e3Sopenharmony_ci /** 2924514f5e3Sopenharmony_ci * @tc.steps: step3. Construct an array with two elements p1 and p2. array = [p1. p2] 2934514f5e3Sopenharmony_ci */ 2944514f5e3Sopenharmony_ci JSHandle<JSObject> array(JSArray::ArrayCreate(thread, JSTaggedNumber(2))); 2954514f5e3Sopenharmony_ci PropertyDescriptor desc(thread, JSHandle<JSTaggedValue>::Cast(rejectPromise)); 2964514f5e3Sopenharmony_ci JSArray::DefineOwnProperty(thread, array, JSHandle<JSTaggedValue>(thread, JSTaggedValue(0)), desc); 2974514f5e3Sopenharmony_ci 2984514f5e3Sopenharmony_ci PropertyDescriptor desc1(thread, JSHandle<JSTaggedValue>::Cast(resolvePromise)); 2994514f5e3Sopenharmony_ci JSArray::DefineOwnProperty(thread, array, JSHandle<JSTaggedValue>(thread, JSTaggedValue(1)), desc1); 3004514f5e3Sopenharmony_ci 3014514f5e3Sopenharmony_ci /** 3024514f5e3Sopenharmony_ci * @tc.steps: step4. var p3 = Promise.race([p1,p2]); 3034514f5e3Sopenharmony_ci */ 3044514f5e3Sopenharmony_ci auto result4 = PromiseAlgorithm(thread, promise, array.GetTaggedValue(), AlgorithmType::RACE); 3054514f5e3Sopenharmony_ci JSHandle<JSPromise> racePromise(thread, result4); 3064514f5e3Sopenharmony_ci EXPECT_EQ(racePromise->GetPromiseState(), PromiseState::PENDING); 3074514f5e3Sopenharmony_ci EXPECT_EQ(racePromise->GetPromiseResult().IsUndefined(), true); 3084514f5e3Sopenharmony_ci} 3094514f5e3Sopenharmony_ci 3104514f5e3Sopenharmony_ci/* 3114514f5e3Sopenharmony_ci * @tc.name: Race2 3124514f5e3Sopenharmony_ci * @tc.desc: The Race method receives an array, uses the Then method to save the task in the task queue, and outputs 3134514f5e3Sopenharmony_ci * the execution result of the queue. 3144514f5e3Sopenharmony_ci * @tc.type: FUNC 3154514f5e3Sopenharmony_ci */ 3164514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsPromiseTest, Race2) 3174514f5e3Sopenharmony_ci{ 3184514f5e3Sopenharmony_ci ObjectFactory *factory = instance->GetFactory(); 3194514f5e3Sopenharmony_ci JSHandle<GlobalEnv> env = instance->GetGlobalEnv(); 3204514f5e3Sopenharmony_ci 3214514f5e3Sopenharmony_ci JSHandle<JSFunction> promise = JSHandle<JSFunction>::Cast(env->GetPromiseFunction()); 3224514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> paramMsg1(thread, JSTaggedValue(12345)); 3234514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> paramMsg2(thread, JSTaggedValue(6789)); 3244514f5e3Sopenharmony_ci 3254514f5e3Sopenharmony_ci /** 3264514f5e3Sopenharmony_ci * @tc.steps: step1. var p1 = Promise.reject(12345) 3274514f5e3Sopenharmony_ci */ 3284514f5e3Sopenharmony_ci auto result1 = PromiseAlgorithm(thread, promise, paramMsg1.GetTaggedValue(), AlgorithmType::REJECT); 3294514f5e3Sopenharmony_ci JSHandle<JSPromise> rejectPromise(thread, result1); 3304514f5e3Sopenharmony_ci EXPECT_EQ(rejectPromise->GetPromiseState(), PromiseState::REJECTED); 3314514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(rejectPromise->GetPromiseResult(), JSTaggedValue(12345)), true); 3324514f5e3Sopenharmony_ci 3334514f5e3Sopenharmony_ci /** 3344514f5e3Sopenharmony_ci * @tc.steps: step2. var p2 = Promise.resolve(6789) 3354514f5e3Sopenharmony_ci */ 3364514f5e3Sopenharmony_ci auto result2 = PromiseAlgorithm(thread, promise, paramMsg2.GetTaggedValue(), AlgorithmType::RESOLVE); 3374514f5e3Sopenharmony_ci JSHandle<JSPromise> resolvePromise(thread, result2); 3384514f5e3Sopenharmony_ci EXPECT_EQ(resolvePromise->GetPromiseState(), PromiseState::FULFILLED); 3394514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(resolvePromise->GetPromiseResult(), JSTaggedValue(6789)), true); 3404514f5e3Sopenharmony_ci 3414514f5e3Sopenharmony_ci /** 3424514f5e3Sopenharmony_ci * @tc.steps: step3. Construct an array with two elements p1 and p2. array = [p1. p2] 3434514f5e3Sopenharmony_ci */ 3444514f5e3Sopenharmony_ci JSHandle<JSObject> array(JSArray::ArrayCreate(thread, JSTaggedNumber(2))); 3454514f5e3Sopenharmony_ci PropertyDescriptor desc(thread, JSHandle<JSTaggedValue>::Cast(rejectPromise)); 3464514f5e3Sopenharmony_ci JSArray::DefineOwnProperty(thread, array, JSHandle<JSTaggedValue>(thread, JSTaggedValue(0)), desc); 3474514f5e3Sopenharmony_ci 3484514f5e3Sopenharmony_ci PropertyDescriptor desc1(thread, JSHandle<JSTaggedValue>::Cast(resolvePromise)); 3494514f5e3Sopenharmony_ci JSArray::DefineOwnProperty(thread, array, JSHandle<JSTaggedValue>(thread, JSTaggedValue(1)), desc1); 3504514f5e3Sopenharmony_ci 3514514f5e3Sopenharmony_ci /** 3524514f5e3Sopenharmony_ci * @tc.steps: step4. var p3 = Promise.race([p1,p2]); 3534514f5e3Sopenharmony_ci */ 3544514f5e3Sopenharmony_ci auto result3 = PromiseAlgorithm(thread, promise, array.GetTaggedValue(), AlgorithmType::RACE); 3554514f5e3Sopenharmony_ci JSHandle<JSPromise> racePromise(thread, result3); 3564514f5e3Sopenharmony_ci EXPECT_EQ(racePromise->GetPromiseState(), PromiseState::PENDING); 3574514f5e3Sopenharmony_ci EXPECT_EQ(racePromise->GetPromiseResult().IsUndefined(), true); 3584514f5e3Sopenharmony_ci 3594514f5e3Sopenharmony_ci /** 3604514f5e3Sopenharmony_ci * @tc.steps: step5. p3.then((resolve)=>{print(resolve)}, (reject)=>{print(reject)}) 3614514f5e3Sopenharmony_ci */ 3624514f5e3Sopenharmony_ci JSHandle<JSFunction> raceThenOnRejected = 3634514f5e3Sopenharmony_ci factory->NewJSFunction(env, reinterpret_cast<void *>(TestPromiseRaceThenOnRejectd)); 3644514f5e3Sopenharmony_ci auto thenResult = ThanAlgorithm(thread, racePromise, JSTaggedValue::Undefined(), 3654514f5e3Sopenharmony_ci raceThenOnRejected.GetTaggedValue()); 3664514f5e3Sopenharmony_ci JSHandle<JSPromise> thenPromise(thread, thenResult); 3674514f5e3Sopenharmony_ci 3684514f5e3Sopenharmony_ci EXPECT_EQ(thenPromise->GetPromiseState(), PromiseState::PENDING); 3694514f5e3Sopenharmony_ci EXPECT_TRUE(thenPromise->GetPromiseResult().IsUndefined()); 3704514f5e3Sopenharmony_ci 3714514f5e3Sopenharmony_ci /** 3724514f5e3Sopenharmony_ci * @tc.steps: step6. execute promise queue 3734514f5e3Sopenharmony_ci */ 3744514f5e3Sopenharmony_ci auto microJobQueue = instance->GetJSThread()->GetCurrentEcmaContext()->GetMicroJobQueue(); 3754514f5e3Sopenharmony_ci if (!thread->HasPendingException()) { 3764514f5e3Sopenharmony_ci job::MicroJobQueue::ExecutePendingJob(thread, microJobQueue); 3774514f5e3Sopenharmony_ci } 3784514f5e3Sopenharmony_ci} 3794514f5e3Sopenharmony_ci 3804514f5e3Sopenharmony_ci/* 3814514f5e3Sopenharmony_ci * @tc.name: All 3824514f5e3Sopenharmony_ci * @tc.desc: The All method receives an array, uses the Then method to save the task in the task queue, and outputs the 3834514f5e3Sopenharmony_ci * execution result of the queue. 3844514f5e3Sopenharmony_ci * @tc.type: FUNC 3854514f5e3Sopenharmony_ci */ 3864514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsPromiseTest, All) 3874514f5e3Sopenharmony_ci{ 3884514f5e3Sopenharmony_ci ObjectFactory *factory = instance->GetFactory(); 3894514f5e3Sopenharmony_ci JSHandle<GlobalEnv> env = instance->GetGlobalEnv(); 3904514f5e3Sopenharmony_ci 3914514f5e3Sopenharmony_ci JSHandle<JSFunction> promise = JSHandle<JSFunction>::Cast(env->GetPromiseFunction()); 3924514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> paramMsg1(thread, JSTaggedValue(111)); 3934514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> paramMsg2(thread, JSTaggedValue(222)); 3944514f5e3Sopenharmony_ci 3954514f5e3Sopenharmony_ci /** 3964514f5e3Sopenharmony_ci * @tc.steps: step1. var p1 = Promise.resolve(111) 3974514f5e3Sopenharmony_ci */ 3984514f5e3Sopenharmony_ci auto result1 = PromiseAlgorithm(thread, promise, paramMsg1.GetTaggedValue(), AlgorithmType::RESOLVE); 3994514f5e3Sopenharmony_ci JSHandle<JSPromise> resolvePromise1(thread, result1); 4004514f5e3Sopenharmony_ci EXPECT_EQ(resolvePromise1->GetPromiseState(), PromiseState::FULFILLED); 4014514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(resolvePromise1->GetPromiseResult(), JSTaggedValue(111)), true); 4024514f5e3Sopenharmony_ci 4034514f5e3Sopenharmony_ci /** 4044514f5e3Sopenharmony_ci * @tc.steps: step2. var p2 = Promise.resolve(222) 4054514f5e3Sopenharmony_ci */ 4064514f5e3Sopenharmony_ci auto result2 = PromiseAlgorithm(thread, promise, paramMsg2.GetTaggedValue(), AlgorithmType::RESOLVE); 4074514f5e3Sopenharmony_ci JSHandle<JSPromise> resolvePromise2(thread, result2); 4084514f5e3Sopenharmony_ci EXPECT_EQ(resolvePromise2->GetPromiseState(), PromiseState::FULFILLED); 4094514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(resolvePromise2->GetPromiseResult(), JSTaggedValue(222)), true); 4104514f5e3Sopenharmony_ci 4114514f5e3Sopenharmony_ci /** 4124514f5e3Sopenharmony_ci * @tc.steps: step3. Construct an array with two elements p1 and p2. array = [p1. p2] 4134514f5e3Sopenharmony_ci */ 4144514f5e3Sopenharmony_ci JSHandle<JSObject> array(JSArray::ArrayCreate(thread, JSTaggedNumber(2))); 4154514f5e3Sopenharmony_ci PropertyDescriptor desc(thread, JSHandle<JSTaggedValue>::Cast(resolvePromise1)); 4164514f5e3Sopenharmony_ci JSArray::DefineOwnProperty(thread, array, JSHandle<JSTaggedValue>(thread, JSTaggedValue(0)), desc); 4174514f5e3Sopenharmony_ci 4184514f5e3Sopenharmony_ci PropertyDescriptor desc1(thread, JSHandle<JSTaggedValue>::Cast(resolvePromise2)); 4194514f5e3Sopenharmony_ci JSArray::DefineOwnProperty(thread, array, JSHandle<JSTaggedValue>(thread, JSTaggedValue(1)), desc1); 4204514f5e3Sopenharmony_ci 4214514f5e3Sopenharmony_ci /** 4224514f5e3Sopenharmony_ci * @tc.steps: step4. var p3 = Promise.all([p1,p2]); 4234514f5e3Sopenharmony_ci */ 4244514f5e3Sopenharmony_ci auto result4 = PromiseAlgorithm(thread, promise, array.GetTaggedValue(), AlgorithmType::ALL); 4254514f5e3Sopenharmony_ci JSHandle<JSPromise> allPromise(thread, result4); 4264514f5e3Sopenharmony_ci EXPECT_EQ(allPromise->GetPromiseState(), PromiseState::PENDING); 4274514f5e3Sopenharmony_ci EXPECT_EQ(allPromise->GetPromiseResult().IsUndefined(), true); 4284514f5e3Sopenharmony_ci 4294514f5e3Sopenharmony_ci /** 4304514f5e3Sopenharmony_ci * @tc.steps: step5. p3.then((resolve)=>{print(resolve)}, (reject)=>{print(reject)}); 4314514f5e3Sopenharmony_ci */ 4324514f5e3Sopenharmony_ci JSHandle<JSFunction> nativeFuncRaceThenOnResolved = 4334514f5e3Sopenharmony_ci factory->NewJSFunction(env, reinterpret_cast<void *>(TestPromiseAllThenOnResolved)); 4344514f5e3Sopenharmony_ci auto thenResult = ThanAlgorithm(thread, allPromise, nativeFuncRaceThenOnResolved.GetTaggedValue(), 4354514f5e3Sopenharmony_ci nativeFuncRaceThenOnResolved.GetTaggedValue()); 4364514f5e3Sopenharmony_ci JSHandle<JSPromise> thenPromise(thread, thenResult); 4374514f5e3Sopenharmony_ci 4384514f5e3Sopenharmony_ci EXPECT_EQ(thenPromise->GetPromiseState(), PromiseState::PENDING); 4394514f5e3Sopenharmony_ci EXPECT_TRUE(thenPromise->GetPromiseResult().IsUndefined()); 4404514f5e3Sopenharmony_ci 4414514f5e3Sopenharmony_ci /** 4424514f5e3Sopenharmony_ci * @tc.steps: step6. execute promise queue 4434514f5e3Sopenharmony_ci */ 4444514f5e3Sopenharmony_ci auto microJobQueue = instance->GetJSThread()->GetCurrentEcmaContext()->GetMicroJobQueue(); 4454514f5e3Sopenharmony_ci if (!thread->HasPendingException()) { 4464514f5e3Sopenharmony_ci job::MicroJobQueue::ExecutePendingJob(thread, microJobQueue); 4474514f5e3Sopenharmony_ci } 4484514f5e3Sopenharmony_ci} 4494514f5e3Sopenharmony_ci 4504514f5e3Sopenharmony_ci/* 4514514f5e3Sopenharmony_ci * @tc.name: Catch 4524514f5e3Sopenharmony_ci * @tc.desc: test Catch() method 4534514f5e3Sopenharmony_ci * @tc.type: FUNC 4544514f5e3Sopenharmony_ci */ 4554514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsPromiseTest, Catch) 4564514f5e3Sopenharmony_ci{ 4574514f5e3Sopenharmony_ci auto env = instance->GetGlobalEnv(); 4584514f5e3Sopenharmony_ci auto factory = instance->GetFactory(); 4594514f5e3Sopenharmony_ci 4604514f5e3Sopenharmony_ci JSHandle<JSFunction> promise = JSHandle<JSFunction>::Cast(env->GetPromiseFunction()); 4614514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> paramMsg1(thread, JSTaggedValue(3)); 4624514f5e3Sopenharmony_ci 4634514f5e3Sopenharmony_ci /** 4644514f5e3Sopenharmony_ci * @tc.steps: step1. var p1 = Promise.reject(3) 4654514f5e3Sopenharmony_ci */ 4664514f5e3Sopenharmony_ci auto result = PromiseAlgorithm(thread, promise, paramMsg1.GetTaggedValue(), AlgorithmType::REJECT); 4674514f5e3Sopenharmony_ci JSHandle<JSPromise> rejectPromise(thread, result); 4684514f5e3Sopenharmony_ci EXPECT_EQ(rejectPromise->GetPromiseState(), PromiseState::REJECTED); 4694514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(rejectPromise->GetPromiseResult(), JSTaggedValue(3)), true); 4704514f5e3Sopenharmony_ci 4714514f5e3Sopenharmony_ci /** 4724514f5e3Sopenharmony_ci * @tc.steps: step2. p1 invokes catch() 4734514f5e3Sopenharmony_ci */ 4744514f5e3Sopenharmony_ci JSHandle<JSFunction> testPromiseCatch = factory->NewJSFunction(env, reinterpret_cast<void *>(TestPromiseCatch)); 4754514f5e3Sopenharmony_ci auto ecmaRuntimeCallInfo2 = TestHelper::CreateEcmaRuntimeCallInfo(thread, rejectPromise.GetTaggedValue(), 6); 4764514f5e3Sopenharmony_ci ecmaRuntimeCallInfo2->SetFunction(rejectPromise.GetTaggedValue()); 4774514f5e3Sopenharmony_ci ecmaRuntimeCallInfo2->SetThis(rejectPromise.GetTaggedValue()); 4784514f5e3Sopenharmony_ci ecmaRuntimeCallInfo2->SetCallArg(0, testPromiseCatch.GetTaggedValue()); 4794514f5e3Sopenharmony_ci 4804514f5e3Sopenharmony_ci [[maybe_unused]] auto prevCatch = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2); 4814514f5e3Sopenharmony_ci JSTaggedValue catchResult = BuiltinsPromise::Catch(ecmaRuntimeCallInfo2); 4824514f5e3Sopenharmony_ci JSHandle<JSPromise> catchPromise(thread, catchResult); 4834514f5e3Sopenharmony_ci 4844514f5e3Sopenharmony_ci EXPECT_EQ(catchPromise->GetPromiseState(), PromiseState::PENDING); 4854514f5e3Sopenharmony_ci EXPECT_EQ(catchPromise->GetPromiseResult().IsUndefined(), true); 4864514f5e3Sopenharmony_ci TestHelper::TearDownFrame(thread, prevCatch); 4874514f5e3Sopenharmony_ci 4884514f5e3Sopenharmony_ci /** 4894514f5e3Sopenharmony_ci * @tc.steps: step3. execute promise queue 4904514f5e3Sopenharmony_ci */ 4914514f5e3Sopenharmony_ci auto microJobQueue = instance->GetJSThread()->GetCurrentEcmaContext()->GetMicroJobQueue(); 4924514f5e3Sopenharmony_ci if (!thread->HasPendingException()) { 4934514f5e3Sopenharmony_ci job::MicroJobQueue::ExecutePendingJob(thread, microJobQueue); 4944514f5e3Sopenharmony_ci } 4954514f5e3Sopenharmony_ci} 4964514f5e3Sopenharmony_ci 4974514f5e3Sopenharmony_ci/* 4984514f5e3Sopenharmony_ci * @tc.name: ThenResolve 4994514f5e3Sopenharmony_ci * @tc.desc: Testing the Then() function with the Resolve() function 5004514f5e3Sopenharmony_ci * @tc.type: FUNC 5014514f5e3Sopenharmony_ci */ 5024514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsPromiseTest, ThenResolve) 5034514f5e3Sopenharmony_ci{ 5044514f5e3Sopenharmony_ci auto env = instance->GetGlobalEnv(); 5054514f5e3Sopenharmony_ci auto factory = instance->GetFactory(); 5064514f5e3Sopenharmony_ci 5074514f5e3Sopenharmony_ci JSHandle<JSFunction> promise = JSHandle<JSFunction>::Cast(env->GetPromiseFunction()); 5084514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> paramMsg = JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("resolve")); 5094514f5e3Sopenharmony_ci 5104514f5e3Sopenharmony_ci /** 5114514f5e3Sopenharmony_ci * @tc.steps: step1. var p1 = Promise.resolve("resolve") 5124514f5e3Sopenharmony_ci */ 5134514f5e3Sopenharmony_ci auto result = PromiseAlgorithm(thread, promise, paramMsg.GetTaggedValue(), AlgorithmType::RESOLVE); 5144514f5e3Sopenharmony_ci JSHandle<JSPromise> resolvePromise(thread, result); 5154514f5e3Sopenharmony_ci EXPECT_EQ(resolvePromise->GetPromiseState(), PromiseState::FULFILLED); 5164514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(resolvePromise->GetPromiseResult(), paramMsg.GetTaggedValue()), true); 5174514f5e3Sopenharmony_ci 5184514f5e3Sopenharmony_ci /** 5194514f5e3Sopenharmony_ci * @tc.steps: step2. p1 invokes then() 5204514f5e3Sopenharmony_ci */ 5214514f5e3Sopenharmony_ci JSHandle<JSFunction> testPromiseThenOnResolved = 5224514f5e3Sopenharmony_ci factory->NewJSFunction(env, reinterpret_cast<void *>(TestPromiseThenOnResolved)); 5234514f5e3Sopenharmony_ci auto thenResult = ThanAlgorithm(thread, resolvePromise, testPromiseThenOnResolved.GetTaggedValue(), 5244514f5e3Sopenharmony_ci JSTaggedValue::Undefined()); 5254514f5e3Sopenharmony_ci JSHandle<JSPromise> thenPromise(thread, thenResult); 5264514f5e3Sopenharmony_ci 5274514f5e3Sopenharmony_ci EXPECT_EQ(thenPromise->GetPromiseState(), PromiseState::PENDING); 5284514f5e3Sopenharmony_ci EXPECT_EQ(thenPromise->GetPromiseResult().IsUndefined(), true); 5294514f5e3Sopenharmony_ci 5304514f5e3Sopenharmony_ci /** 5314514f5e3Sopenharmony_ci * @tc.steps: step3. execute promise queue 5324514f5e3Sopenharmony_ci */ 5334514f5e3Sopenharmony_ci auto microJobQueue = instance->GetJSThread()->GetCurrentEcmaContext()->GetMicroJobQueue(); 5344514f5e3Sopenharmony_ci if (!thread->HasPendingException()) { 5354514f5e3Sopenharmony_ci job::MicroJobQueue::ExecutePendingJob(thread, microJobQueue); 5364514f5e3Sopenharmony_ci } 5374514f5e3Sopenharmony_ci} 5384514f5e3Sopenharmony_ci 5394514f5e3Sopenharmony_ci/* 5404514f5e3Sopenharmony_ci * @tc.name: ThenReject 5414514f5e3Sopenharmony_ci * @tc.desc: Testing the Then() function with the Reject() function 5424514f5e3Sopenharmony_ci * @tc.type: FUNC 5434514f5e3Sopenharmony_ci */ 5444514f5e3Sopenharmony_ciHWTEST_F_L0(BuiltinsPromiseTest, ThenReject) 5454514f5e3Sopenharmony_ci{ 5464514f5e3Sopenharmony_ci auto env = instance->GetGlobalEnv(); 5474514f5e3Sopenharmony_ci auto factory = instance->GetFactory(); 5484514f5e3Sopenharmony_ci 5494514f5e3Sopenharmony_ci JSHandle<JSFunction> promise = JSHandle<JSFunction>::Cast(env->GetPromiseFunction()); 5504514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> paramMsg = JSHandle<JSTaggedValue>::Cast(factory->NewFromASCII("reject")); 5514514f5e3Sopenharmony_ci 5524514f5e3Sopenharmony_ci /** 5534514f5e3Sopenharmony_ci * @tc.steps: step1. var p1 = Promise.Reject(5) 5544514f5e3Sopenharmony_ci */ 5554514f5e3Sopenharmony_ci auto result = PromiseAlgorithm(thread, promise, paramMsg.GetTaggedValue(), AlgorithmType::REJECT); 5564514f5e3Sopenharmony_ci JSHandle<JSPromise> rejectPromise(thread, result); 5574514f5e3Sopenharmony_ci EXPECT_EQ(rejectPromise->GetPromiseState(), PromiseState::REJECTED); 5584514f5e3Sopenharmony_ci EXPECT_EQ(JSTaggedValue::SameValue(rejectPromise->GetPromiseResult(), paramMsg.GetTaggedValue()), true); 5594514f5e3Sopenharmony_ci 5604514f5e3Sopenharmony_ci /** 5614514f5e3Sopenharmony_ci * @tc.steps: step1. p1 invokes then() 5624514f5e3Sopenharmony_ci */ 5634514f5e3Sopenharmony_ci JSHandle<JSFunction> testPromiseThenOnRejected = 5644514f5e3Sopenharmony_ci factory->NewJSFunction(env, reinterpret_cast<void *>(TestPromiseThenOnRejected)); 5654514f5e3Sopenharmony_ci auto thenResult = ThanAlgorithm(thread, rejectPromise, testPromiseThenOnRejected.GetTaggedValue(), 5664514f5e3Sopenharmony_ci testPromiseThenOnRejected.GetTaggedValue()); 5674514f5e3Sopenharmony_ci JSHandle<JSPromise> thenPromise(thread, thenResult); 5684514f5e3Sopenharmony_ci EXPECT_EQ(thenPromise->GetPromiseState(), PromiseState::PENDING); 5694514f5e3Sopenharmony_ci EXPECT_EQ(thenPromise->GetPromiseResult().IsUndefined(), true); 5704514f5e3Sopenharmony_ci /** 5714514f5e3Sopenharmony_ci * @tc.steps: step3. execute promise queue 5724514f5e3Sopenharmony_ci */ 5734514f5e3Sopenharmony_ci auto microJobQueue = instance->GetJSThread()->GetCurrentEcmaContext()->GetMicroJobQueue(); 5744514f5e3Sopenharmony_ci if (!thread->HasPendingException()) { 5754514f5e3Sopenharmony_ci job::MicroJobQueue::ExecutePendingJob(thread, microJobQueue); 5764514f5e3Sopenharmony_ci } 5774514f5e3Sopenharmony_ci} 5784514f5e3Sopenharmony_ci} // namespace panda::test 579