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