13af6ab5fSopenharmony_ci/**
23af6ab5fSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License.
53af6ab5fSopenharmony_ci * You may obtain a copy of the License at
63af6ab5fSopenharmony_ci *
73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
83af6ab5fSopenharmony_ci *
93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and
133af6ab5fSopenharmony_ci * limitations under the License.
143af6ab5fSopenharmony_ci */
153af6ab5fSopenharmony_ci
163af6ab5fSopenharmony_ci#include <gtest/gtest.h>
173af6ab5fSopenharmony_ci
183af6ab5fSopenharmony_ci#include "assembler/assembly-program.h"
193af6ab5fSopenharmony_ci#include "es2panda.h"
203af6ab5fSopenharmony_ci#include "generated/signatures.h"
213af6ab5fSopenharmony_ci#include "libpandabase/mem/mem.h"
223af6ab5fSopenharmony_ci#include "macros.h"
233af6ab5fSopenharmony_ci#include "mem/pool_manager.h"
243af6ab5fSopenharmony_ci#include "util/options.h"
253af6ab5fSopenharmony_ci
263af6ab5fSopenharmony_cinamespace ark::es2panda::compiler::test {
273af6ab5fSopenharmony_ci
283af6ab5fSopenharmony_ciclass RestParameterTest : public testing::Test {
293af6ab5fSopenharmony_cipublic:
303af6ab5fSopenharmony_ci    RestParameterTest()
313af6ab5fSopenharmony_ci    {
323af6ab5fSopenharmony_ci        const auto compilerSize = 268435456;
333af6ab5fSopenharmony_ci
343af6ab5fSopenharmony_ci        mem::MemConfig::Initialize(0, 0, compilerSize, 0, 0, 0);
353af6ab5fSopenharmony_ci        PoolManager::Initialize(PoolType::MMAP);
363af6ab5fSopenharmony_ci    }
373af6ab5fSopenharmony_ci    ~RestParameterTest() override
383af6ab5fSopenharmony_ci    {
393af6ab5fSopenharmony_ci        PoolManager::Finalize();
403af6ab5fSopenharmony_ci        mem::MemConfig::Finalize();
413af6ab5fSopenharmony_ci    }
423af6ab5fSopenharmony_ci
433af6ab5fSopenharmony_ci    void SetCurrentProgram(std::string_view src)
443af6ab5fSopenharmony_ci    {
453af6ab5fSopenharmony_ci        int argc = 1;
463af6ab5fSopenharmony_ci        const char *argv = "../../../../bin/es2panda";  // NOLINT(modernize-avoid-c-arrays)
473af6ab5fSopenharmony_ci        static constexpr std::string_view FILE_NAME = "dummy.sts";
483af6ab5fSopenharmony_ci
493af6ab5fSopenharmony_ci        program_ = GetProgram(argc, &argv, FILE_NAME, src);
503af6ab5fSopenharmony_ci        ASSERT_NE(program_.get(), nullptr);
513af6ab5fSopenharmony_ci    }
523af6ab5fSopenharmony_ci
533af6ab5fSopenharmony_ci    void CheckRestParameterFlag(std::string_view functionName)
543af6ab5fSopenharmony_ci    {
553af6ab5fSopenharmony_ci        pandasm::Function *fn = GetFunction(functionName);
563af6ab5fSopenharmony_ci        ASSERT_TRUE(fn != nullptr) << "Function '" << functionName << "' not found";
573af6ab5fSopenharmony_ci        ASSERT_TRUE(HasRestParameterFlag(fn)) << "Function '" << fn->name << "' doesn't have ACC_VARARGS flag";
583af6ab5fSopenharmony_ci    }
593af6ab5fSopenharmony_ci
603af6ab5fSopenharmony_ci    void CheckNoRestParameterFlag(std::string_view functionName)
613af6ab5fSopenharmony_ci    {
623af6ab5fSopenharmony_ci        pandasm::Function *fn = GetFunction(functionName);
633af6ab5fSopenharmony_ci        ASSERT_TRUE(fn != nullptr) << "Function '" << functionName << "' not found";
643af6ab5fSopenharmony_ci        ASSERT_FALSE(HasRestParameterFlag(fn)) << "Function '" << fn->name << "' has ACC_VARARGS flag";
653af6ab5fSopenharmony_ci    }
663af6ab5fSopenharmony_ci
673af6ab5fSopenharmony_ciprivate:
683af6ab5fSopenharmony_ci    bool HasRestParameterFlag(pandasm::Function *fn)
693af6ab5fSopenharmony_ci    {
703af6ab5fSopenharmony_ci        return (fn->metadata->GetAccessFlags() & ACC_VARARGS) != 0;
713af6ab5fSopenharmony_ci    }
723af6ab5fSopenharmony_ci
733af6ab5fSopenharmony_ci    NO_COPY_SEMANTIC(RestParameterTest);
743af6ab5fSopenharmony_ci    NO_MOVE_SEMANTIC(RestParameterTest);
753af6ab5fSopenharmony_ci
763af6ab5fSopenharmony_ci    static std::unique_ptr<pandasm::Program> GetProgram(int argc, const char **argv, std::string_view fileName,
773af6ab5fSopenharmony_ci                                                        std::string_view src)
783af6ab5fSopenharmony_ci    {
793af6ab5fSopenharmony_ci        auto options = std::make_unique<es2panda::util::Options>();
803af6ab5fSopenharmony_ci        if (!options->Parse(argc, argv)) {
813af6ab5fSopenharmony_ci            std::cerr << options->ErrorMsg() << std::endl;
823af6ab5fSopenharmony_ci            return nullptr;
833af6ab5fSopenharmony_ci        }
843af6ab5fSopenharmony_ci
853af6ab5fSopenharmony_ci        Logger::ComponentMask mask {};
863af6ab5fSopenharmony_ci        mask.set(Logger::Component::ES2PANDA);
873af6ab5fSopenharmony_ci        Logger::InitializeStdLogging(Logger::LevelFromString(options->LogLevel()), mask);
883af6ab5fSopenharmony_ci
893af6ab5fSopenharmony_ci        es2panda::Compiler compiler(options->Extension(), options->ThreadCount());
903af6ab5fSopenharmony_ci        es2panda::SourceFile input(fileName, src, options->ParseModule());
913af6ab5fSopenharmony_ci
923af6ab5fSopenharmony_ci        return std::unique_ptr<pandasm::Program>(compiler.Compile(input, *options));
933af6ab5fSopenharmony_ci    }
943af6ab5fSopenharmony_ci
953af6ab5fSopenharmony_ci    pandasm::Function *GetFunction(std::string_view functionName)
963af6ab5fSopenharmony_ci    {
973af6ab5fSopenharmony_ci        auto it = program_->functionTable.find(functionName.data());
983af6ab5fSopenharmony_ci        if (it == program_->functionTable.end()) {
993af6ab5fSopenharmony_ci            return nullptr;
1003af6ab5fSopenharmony_ci        }
1013af6ab5fSopenharmony_ci        return &it->second;
1023af6ab5fSopenharmony_ci    }
1033af6ab5fSopenharmony_ci
1043af6ab5fSopenharmony_ciprivate:
1053af6ab5fSopenharmony_ci    std::unique_ptr<pandasm::Program> program_ {};
1063af6ab5fSopenharmony_ci};
1073af6ab5fSopenharmony_ci
1083af6ab5fSopenharmony_ci// === Function ===
1093af6ab5fSopenharmony_ciTEST_F(RestParameterTest, function_without_rest_parameters_0)
1103af6ab5fSopenharmony_ci{
1113af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
1123af6ab5fSopenharmony_ci        function fn(): void {
1133af6ab5fSopenharmony_ci        }
1143af6ab5fSopenharmony_ci    )");
1153af6ab5fSopenharmony_ci    CheckNoRestParameterFlag("ETSGLOBAL.fn:void;");
1163af6ab5fSopenharmony_ci}
1173af6ab5fSopenharmony_ci
1183af6ab5fSopenharmony_ciTEST_F(RestParameterTest, function_without_rest_parameters_1)
1193af6ab5fSopenharmony_ci{
1203af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
1213af6ab5fSopenharmony_ci        function fn(args: int[]): void {
1223af6ab5fSopenharmony_ci        }
1233af6ab5fSopenharmony_ci    )");
1243af6ab5fSopenharmony_ci    CheckNoRestParameterFlag("ETSGLOBAL.fn:i32[];void;");
1253af6ab5fSopenharmony_ci}
1263af6ab5fSopenharmony_ci
1273af6ab5fSopenharmony_ciTEST_F(RestParameterTest, function_without_rest_parameters_2)
1283af6ab5fSopenharmony_ci{
1293af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
1303af6ab5fSopenharmony_ci        function fn(arg0: int, args: String[]): void {
1313af6ab5fSopenharmony_ci        }
1323af6ab5fSopenharmony_ci    )");
1333af6ab5fSopenharmony_ci    CheckNoRestParameterFlag("ETSGLOBAL.fn:i32;std.core.String[];void;");
1343af6ab5fSopenharmony_ci}
1353af6ab5fSopenharmony_ci
1363af6ab5fSopenharmony_ciTEST_F(RestParameterTest, function_with_rest_parameter_0)
1373af6ab5fSopenharmony_ci{
1383af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
1393af6ab5fSopenharmony_ci        function fn(...args: String[]): void {
1403af6ab5fSopenharmony_ci        }
1413af6ab5fSopenharmony_ci    )");
1423af6ab5fSopenharmony_ci    CheckRestParameterFlag("ETSGLOBAL.fn:std.core.String[];void;");
1433af6ab5fSopenharmony_ci}
1443af6ab5fSopenharmony_ci
1453af6ab5fSopenharmony_ciTEST_F(RestParameterTest, function_with_rest_parameter_1)
1463af6ab5fSopenharmony_ci{
1473af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
1483af6ab5fSopenharmony_ci        function fn(o: Object, ...args: int[]): void {
1493af6ab5fSopenharmony_ci        }
1503af6ab5fSopenharmony_ci    )");
1513af6ab5fSopenharmony_ci    CheckRestParameterFlag("ETSGLOBAL.fn:std.core.Object;i32[];void;");
1523af6ab5fSopenharmony_ci}
1533af6ab5fSopenharmony_ci
1543af6ab5fSopenharmony_ci// === Method of class ===
1553af6ab5fSopenharmony_ciTEST_F(RestParameterTest, class_method_without_rest_parameters_0)
1563af6ab5fSopenharmony_ci{
1573af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
1583af6ab5fSopenharmony_ci        class A {
1593af6ab5fSopenharmony_ci            fn() {};
1603af6ab5fSopenharmony_ci        }
1613af6ab5fSopenharmony_ci    )");
1623af6ab5fSopenharmony_ci    CheckNoRestParameterFlag("A.fn:void;");
1633af6ab5fSopenharmony_ci}
1643af6ab5fSopenharmony_ci
1653af6ab5fSopenharmony_ciTEST_F(RestParameterTest, class_method_without_rest_parameters_1)
1663af6ab5fSopenharmony_ci{
1673af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
1683af6ab5fSopenharmony_ci        class A {
1693af6ab5fSopenharmony_ci            fn(arg0: int) {};
1703af6ab5fSopenharmony_ci        }
1713af6ab5fSopenharmony_ci    )");
1723af6ab5fSopenharmony_ci    CheckNoRestParameterFlag("A.fn:i32;void;");
1733af6ab5fSopenharmony_ci}
1743af6ab5fSopenharmony_ci
1753af6ab5fSopenharmony_ciTEST_F(RestParameterTest, class_method_with_rest_parameters_0)
1763af6ab5fSopenharmony_ci{
1773af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
1783af6ab5fSopenharmony_ci        class A {
1793af6ab5fSopenharmony_ci            fn(...args: int[]) {};
1803af6ab5fSopenharmony_ci        }
1813af6ab5fSopenharmony_ci    )");
1823af6ab5fSopenharmony_ci    CheckRestParameterFlag("A.fn:i32[];void;");
1833af6ab5fSopenharmony_ci}
1843af6ab5fSopenharmony_ci
1853af6ab5fSopenharmony_ci// === Static method of class ===
1863af6ab5fSopenharmony_ciTEST_F(RestParameterTest, static_class_method_without_rest_parameters_0)
1873af6ab5fSopenharmony_ci{
1883af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
1893af6ab5fSopenharmony_ci        class A {
1903af6ab5fSopenharmony_ci            static fn() {};
1913af6ab5fSopenharmony_ci        }
1923af6ab5fSopenharmony_ci    )");
1933af6ab5fSopenharmony_ci    CheckNoRestParameterFlag("A.fn:void;");
1943af6ab5fSopenharmony_ci}
1953af6ab5fSopenharmony_ci
1963af6ab5fSopenharmony_ciTEST_F(RestParameterTest, static_class_method_without_rest_parameters_1)
1973af6ab5fSopenharmony_ci{
1983af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
1993af6ab5fSopenharmony_ci        class A {
2003af6ab5fSopenharmony_ci            static fn(arg0: int) {};
2013af6ab5fSopenharmony_ci        }
2023af6ab5fSopenharmony_ci    )");
2033af6ab5fSopenharmony_ci    CheckNoRestParameterFlag("A.fn:i32;void;");
2043af6ab5fSopenharmony_ci}
2053af6ab5fSopenharmony_ci
2063af6ab5fSopenharmony_ciTEST_F(RestParameterTest, static_class_method_with_rest_parameters_0)
2073af6ab5fSopenharmony_ci{
2083af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
2093af6ab5fSopenharmony_ci        class A {
2103af6ab5fSopenharmony_ci            static fn(...args: int[]) {};
2113af6ab5fSopenharmony_ci        }
2123af6ab5fSopenharmony_ci    )");
2133af6ab5fSopenharmony_ci    CheckRestParameterFlag("A.fn:i32[];void;");
2143af6ab5fSopenharmony_ci}
2153af6ab5fSopenharmony_ci
2163af6ab5fSopenharmony_ciTEST_F(RestParameterTest, static_class_method_with_rest_parameters_1)
2173af6ab5fSopenharmony_ci{
2183af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
2193af6ab5fSopenharmony_ci        class A {
2203af6ab5fSopenharmony_ci            static fn(a: String[], ...args: int[]) {};
2213af6ab5fSopenharmony_ci        }
2223af6ab5fSopenharmony_ci    )");
2233af6ab5fSopenharmony_ci    CheckRestParameterFlag("A.fn:std.core.String[];i32[];void;");
2243af6ab5fSopenharmony_ci}
2253af6ab5fSopenharmony_ci
2263af6ab5fSopenharmony_ci// === Constructor of class ===
2273af6ab5fSopenharmony_ciTEST_F(RestParameterTest, class_constructor_without_rest_parameters_0)
2283af6ab5fSopenharmony_ci{
2293af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
2303af6ab5fSopenharmony_ci        class A {
2313af6ab5fSopenharmony_ci            constructor() {};
2323af6ab5fSopenharmony_ci        }
2333af6ab5fSopenharmony_ci    )");
2343af6ab5fSopenharmony_ci    CheckNoRestParameterFlag("A.<ctor>:void;");
2353af6ab5fSopenharmony_ci}
2363af6ab5fSopenharmony_ci
2373af6ab5fSopenharmony_ciTEST_F(RestParameterTest, class_constructor_without_rest_parameters_1)
2383af6ab5fSopenharmony_ci{
2393af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
2403af6ab5fSopenharmony_ci        class A {
2413af6ab5fSopenharmony_ci            constructor(args: String[]) {};
2423af6ab5fSopenharmony_ci        }
2433af6ab5fSopenharmony_ci    )");
2443af6ab5fSopenharmony_ci    CheckNoRestParameterFlag("A.<ctor>:std.core.String[];void;");
2453af6ab5fSopenharmony_ci}
2463af6ab5fSopenharmony_ci
2473af6ab5fSopenharmony_ciTEST_F(RestParameterTest, class_constructor_with_rest_parameters_0)
2483af6ab5fSopenharmony_ci{
2493af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
2503af6ab5fSopenharmony_ci        class A {
2513af6ab5fSopenharmony_ci            constructor(...args: int[]) {};
2523af6ab5fSopenharmony_ci        }
2533af6ab5fSopenharmony_ci    )");
2543af6ab5fSopenharmony_ci    CheckRestParameterFlag("A.<ctor>:i32[];void;");
2553af6ab5fSopenharmony_ci}
2563af6ab5fSopenharmony_ci
2573af6ab5fSopenharmony_ciTEST_F(RestParameterTest, class_constructor_with_rest_parameters_1)
2583af6ab5fSopenharmony_ci{
2593af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
2603af6ab5fSopenharmony_ci        class A {
2613af6ab5fSopenharmony_ci            constructor(v0: long, ...args: String[]) {};
2623af6ab5fSopenharmony_ci        }
2633af6ab5fSopenharmony_ci    )");
2643af6ab5fSopenharmony_ci    CheckRestParameterFlag("A.<ctor>:i64;std.core.String[];void;");
2653af6ab5fSopenharmony_ci}
2663af6ab5fSopenharmony_ci
2673af6ab5fSopenharmony_ci// === Method of interface ===
2683af6ab5fSopenharmony_ciTEST_F(RestParameterTest, interface_without_rest_parameters_0)
2693af6ab5fSopenharmony_ci{
2703af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
2713af6ab5fSopenharmony_ci        interface A {
2723af6ab5fSopenharmony_ci            fn() {};
2733af6ab5fSopenharmony_ci        }
2743af6ab5fSopenharmony_ci    )");
2753af6ab5fSopenharmony_ci    CheckNoRestParameterFlag("A.fn:void;");
2763af6ab5fSopenharmony_ci}
2773af6ab5fSopenharmony_ci
2783af6ab5fSopenharmony_ciTEST_F(RestParameterTest, interface_without_rest_parameters_1)
2793af6ab5fSopenharmony_ci{
2803af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
2813af6ab5fSopenharmony_ci        interface A {
2823af6ab5fSopenharmony_ci            fn(args: String[]) {};
2833af6ab5fSopenharmony_ci        }
2843af6ab5fSopenharmony_ci    )");
2853af6ab5fSopenharmony_ci    CheckNoRestParameterFlag("A.fn:std.core.String[];void;");
2863af6ab5fSopenharmony_ci}
2873af6ab5fSopenharmony_ci
2883af6ab5fSopenharmony_ciTEST_F(RestParameterTest, interface_with_rest_parameters_0)
2893af6ab5fSopenharmony_ci{
2903af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
2913af6ab5fSopenharmony_ci        interface A {
2923af6ab5fSopenharmony_ci            fn(...args: Object[]) {};
2933af6ab5fSopenharmony_ci        }
2943af6ab5fSopenharmony_ci    )");
2953af6ab5fSopenharmony_ci    CheckRestParameterFlag("A.fn:std.core.Object[];void;");
2963af6ab5fSopenharmony_ci}
2973af6ab5fSopenharmony_ci
2983af6ab5fSopenharmony_ciTEST_F(RestParameterTest, interface_with_rest_parameters_1)
2993af6ab5fSopenharmony_ci{
3003af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
3013af6ab5fSopenharmony_ci        interface A {
3023af6ab5fSopenharmony_ci            fn(o: Object, ...args: String[]) {};
3033af6ab5fSopenharmony_ci        }
3043af6ab5fSopenharmony_ci    )");
3053af6ab5fSopenharmony_ci    CheckRestParameterFlag("A.fn:std.core.Object;std.core.String[];void;");
3063af6ab5fSopenharmony_ci}
3073af6ab5fSopenharmony_ci
3083af6ab5fSopenharmony_ci// === Lambda method ===
3093af6ab5fSopenharmony_ciTEST_F(RestParameterTest, lambda_without_rest_parameters_0)
3103af6ab5fSopenharmony_ci{
3113af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
3123af6ab5fSopenharmony_ci        let fn: ()=>int = (): int => {
3133af6ab5fSopenharmony_ci            return 1;
3143af6ab5fSopenharmony_ci        }
3153af6ab5fSopenharmony_ci    )");
3163af6ab5fSopenharmony_ci    CheckNoRestParameterFlag("LambdaObject-ETSGLOBAL$lambda$invoke$0.invoke:i32;");
3173af6ab5fSopenharmony_ci}
3183af6ab5fSopenharmony_ci
3193af6ab5fSopenharmony_ciTEST_F(RestParameterTest, lambda_without_rest_parameters_1)
3203af6ab5fSopenharmony_ci{
3213af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
3223af6ab5fSopenharmony_ci        let fn: (args: long[])=>int = (args: long[]): int => {
3233af6ab5fSopenharmony_ci            return 1;
3243af6ab5fSopenharmony_ci        }
3253af6ab5fSopenharmony_ci    )");
3263af6ab5fSopenharmony_ci    CheckNoRestParameterFlag("LambdaObject-ETSGLOBAL$lambda$invoke$0.invoke:i64[];i32;");
3273af6ab5fSopenharmony_ci}
3283af6ab5fSopenharmony_ci
3293af6ab5fSopenharmony_ci// === Abstract method of abstract class ===
3303af6ab5fSopenharmony_ciTEST_F(RestParameterTest, abstract_function_without_rest_parameter_0)
3313af6ab5fSopenharmony_ci{
3323af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
3333af6ab5fSopenharmony_ci        abstract class A {
3343af6ab5fSopenharmony_ci            abstract fn(): void
3353af6ab5fSopenharmony_ci        }
3363af6ab5fSopenharmony_ci    )");
3373af6ab5fSopenharmony_ci    CheckNoRestParameterFlag("A.fn:void;");
3383af6ab5fSopenharmony_ci}
3393af6ab5fSopenharmony_ci
3403af6ab5fSopenharmony_ciTEST_F(RestParameterTest, abstract_function_without_rest_parameter_1)
3413af6ab5fSopenharmony_ci{
3423af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
3433af6ab5fSopenharmony_ci        abstract class A {
3443af6ab5fSopenharmony_ci            abstract fn(args: String[]): void
3453af6ab5fSopenharmony_ci        }
3463af6ab5fSopenharmony_ci    )");
3473af6ab5fSopenharmony_ci    CheckNoRestParameterFlag("A.fn:std.core.String[];void;");
3483af6ab5fSopenharmony_ci}
3493af6ab5fSopenharmony_ci
3503af6ab5fSopenharmony_ciTEST_F(RestParameterTest, abstract_function_with_rest_parameter_0)
3513af6ab5fSopenharmony_ci{
3523af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
3533af6ab5fSopenharmony_ci        abstract class A {
3543af6ab5fSopenharmony_ci            abstract fn(...args: String[]): void
3553af6ab5fSopenharmony_ci        }
3563af6ab5fSopenharmony_ci    )");
3573af6ab5fSopenharmony_ci    CheckRestParameterFlag("A.fn:std.core.String[];void;");
3583af6ab5fSopenharmony_ci}
3593af6ab5fSopenharmony_ci
3603af6ab5fSopenharmony_ciTEST_F(RestParameterTest, abstract_function_with_rest_parameter_1)
3613af6ab5fSopenharmony_ci{
3623af6ab5fSopenharmony_ci    SetCurrentProgram(R"(
3633af6ab5fSopenharmony_ci        abstract class A {
3643af6ab5fSopenharmony_ci            abstract fn(v: int, ...args: String[]): void
3653af6ab5fSopenharmony_ci        }
3663af6ab5fSopenharmony_ci    )");
3673af6ab5fSopenharmony_ci    CheckRestParameterFlag("A.fn:i32;std.core.String[];void;");
3683af6ab5fSopenharmony_ci}
3693af6ab5fSopenharmony_ci
3703af6ab5fSopenharmony_ci// === External methods ===
3713af6ab5fSopenharmony_ciTEST_F(RestParameterTest, external_function_with_rest_parameter_0)
3723af6ab5fSopenharmony_ci{
3733af6ab5fSopenharmony_ci    SetCurrentProgram("");
3743af6ab5fSopenharmony_ci    CheckRestParameterFlag("std.core.LambdaValue.invoke:std.core.Object[];std.core.Object;");
3753af6ab5fSopenharmony_ci}
3763af6ab5fSopenharmony_ci
3773af6ab5fSopenharmony_ciTEST_F(RestParameterTest, external_function_with_rest_parameter_1)
3783af6ab5fSopenharmony_ci{
3793af6ab5fSopenharmony_ci    SetCurrentProgram("");
3803af6ab5fSopenharmony_ci    CheckRestParameterFlag("escompat.Math.max:f64[];f64;");
3813af6ab5fSopenharmony_ci}
3823af6ab5fSopenharmony_ci
3833af6ab5fSopenharmony_ci}  // namespace ark::es2panda::compiler::test
384