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