14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2024 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_cideclare function print(str:any):string;
174514f5e3Sopenharmony_ci
184514f5e3Sopenharmony_cifunction assert_true(condition: boolean): void
194514f5e3Sopenharmony_ci{
204514f5e3Sopenharmony_ci    if (!condition) {
214514f5e3Sopenharmony_ci        print("assert fail");
224514f5e3Sopenharmony_ci    }
234514f5e3Sopenharmony_ci}
244514f5e3Sopenharmony_ci
254514f5e3Sopenharmony_cifunction run(cb: () => void) {
264514f5e3Sopenharmony_ci    let cnt: number = 20;
274514f5e3Sopenharmony_ci    for (let i = 0; i < cnt; ++i) {
284514f5e3Sopenharmony_ci        cb();
294514f5e3Sopenharmony_ci    }
304514f5e3Sopenharmony_ci}
314514f5e3Sopenharmony_ci
324514f5e3Sopenharmony_ciclass Base {
334514f5e3Sopenharmony_ci    name: string;
344514f5e3Sopenharmony_ci    value: number;
354514f5e3Sopenharmony_ci    constructor(name: string, value: number) {
364514f5e3Sopenharmony_ci        this.name = name;
374514f5e3Sopenharmony_ci        this.value = value;
384514f5e3Sopenharmony_ci    }
394514f5e3Sopenharmony_ci}
404514f5e3Sopenharmony_ci
414514f5e3Sopenharmony_ciclass Child extends Base {}
424514f5e3Sopenharmony_ci
434514f5e3Sopenharmony_cifunction testChild0Arg() {
444514f5e3Sopenharmony_ci    let c = new Child();
454514f5e3Sopenharmony_ci    assert_true(c.name === undefined);
464514f5e3Sopenharmony_ci    assert_true(c.value === undefined);
474514f5e3Sopenharmony_ci}
484514f5e3Sopenharmony_ci
494514f5e3Sopenharmony_cifunction testChild1Arg() {
504514f5e3Sopenharmony_ci    let c = new Child("one");
514514f5e3Sopenharmony_ci    assert_true(c.name === "one");
524514f5e3Sopenharmony_ci    assert_true(c.value === undefined);
534514f5e3Sopenharmony_ci}
544514f5e3Sopenharmony_ci
554514f5e3Sopenharmony_cifunction testChild2Arg() {
564514f5e3Sopenharmony_ci    let c = new Child("two", 2);
574514f5e3Sopenharmony_ci    assert_true(c.name === "two");
584514f5e3Sopenharmony_ci    assert_true(c.value === 2);
594514f5e3Sopenharmony_ci}
604514f5e3Sopenharmony_ci
614514f5e3Sopenharmony_cifunction testChild3Arg() {
624514f5e3Sopenharmony_ci    let c = new Child("three", 3, "extra");
634514f5e3Sopenharmony_ci    assert_true(c.name === "three");
644514f5e3Sopenharmony_ci    assert_true(c.value === 3);
654514f5e3Sopenharmony_ci}
664514f5e3Sopenharmony_ci
674514f5e3Sopenharmony_ciclass GrandChild extends Child {}
684514f5e3Sopenharmony_ci
694514f5e3Sopenharmony_cifunction testGrandChild0Arg() {
704514f5e3Sopenharmony_ci    let c = new GrandChild();
714514f5e3Sopenharmony_ci    assert_true(c.name === undefined);
724514f5e3Sopenharmony_ci    assert_true(c.value === undefined);
734514f5e3Sopenharmony_ci}
744514f5e3Sopenharmony_ci
754514f5e3Sopenharmony_cifunction testGrandChild1Arg() {
764514f5e3Sopenharmony_ci    let c = new GrandChild("one");
774514f5e3Sopenharmony_ci    assert_true(c.name === "one");
784514f5e3Sopenharmony_ci    assert_true(c.value === undefined);
794514f5e3Sopenharmony_ci}
804514f5e3Sopenharmony_ci
814514f5e3Sopenharmony_cifunction testGrandChild2Arg() {
824514f5e3Sopenharmony_ci    let c = new GrandChild("two", 2);
834514f5e3Sopenharmony_ci    assert_true(c.name === "two");
844514f5e3Sopenharmony_ci    assert_true(c.value === 2);
854514f5e3Sopenharmony_ci}
864514f5e3Sopenharmony_ci
874514f5e3Sopenharmony_cifunction testGrandChild3Arg() {
884514f5e3Sopenharmony_ci    let c = new GrandChild("three", 3, "extra");
894514f5e3Sopenharmony_ci    assert_true(c.name === "three");
904514f5e3Sopenharmony_ci    assert_true(c.value === 3);
914514f5e3Sopenharmony_ci}
924514f5e3Sopenharmony_ci
934514f5e3Sopenharmony_ciclass BaseRestArgs {
944514f5e3Sopenharmony_ci    args: Object[] = [];
954514f5e3Sopenharmony_ci    constructor(...args) {
964514f5e3Sopenharmony_ci        for (const arg of args) {
974514f5e3Sopenharmony_ci            this.args.push(arg);
984514f5e3Sopenharmony_ci        }
994514f5e3Sopenharmony_ci    }
1004514f5e3Sopenharmony_ci}
1014514f5e3Sopenharmony_ci
1024514f5e3Sopenharmony_ciclass ChildRestArgs extends BaseRestArgs {}
1034514f5e3Sopenharmony_ci
1044514f5e3Sopenharmony_cifunction testChildRestArgs0Arg() {
1054514f5e3Sopenharmony_ci    let c = new ChildRestArgs();
1064514f5e3Sopenharmony_ci    assert_true(c.args.length === 0);
1074514f5e3Sopenharmony_ci}
1084514f5e3Sopenharmony_ci
1094514f5e3Sopenharmony_cifunction testChildRestArgs1Arg() {
1104514f5e3Sopenharmony_ci    let c = new ChildRestArgs("one");
1114514f5e3Sopenharmony_ci    assert_true(c.args.length === 1);
1124514f5e3Sopenharmony_ci    assert_true(c.args[0] === "one");
1134514f5e3Sopenharmony_ci}
1144514f5e3Sopenharmony_ci
1154514f5e3Sopenharmony_cifunction testChildRestArgs2Arg() {
1164514f5e3Sopenharmony_ci    let c = new ChildRestArgs("two", 2);
1174514f5e3Sopenharmony_ci    assert_true(c.args.length === 2);
1184514f5e3Sopenharmony_ci    assert_true(c.args[0] === "two");
1194514f5e3Sopenharmony_ci    assert_true(c.args[1] === 2);
1204514f5e3Sopenharmony_ci}
1214514f5e3Sopenharmony_ci
1224514f5e3Sopenharmony_cifunction testChildRestArgs3Arg() {
1234514f5e3Sopenharmony_ci    let c = new ChildRestArgs("three", 3, "extra");
1244514f5e3Sopenharmony_ci    assert_true(c.args.length === 3);
1254514f5e3Sopenharmony_ci    assert_true(c.args[0] === "three");
1264514f5e3Sopenharmony_ci    assert_true(c.args[1] === 3);
1274514f5e3Sopenharmony_ci    assert_true(c.args[2] === "extra");
1284514f5e3Sopenharmony_ci}
1294514f5e3Sopenharmony_ci
1304514f5e3Sopenharmony_ciclass GrandChildRestArgs extends ChildRestArgs {}
1314514f5e3Sopenharmony_ci
1324514f5e3Sopenharmony_cifunction testGrandChildRestArgs0Arg() {
1334514f5e3Sopenharmony_ci    let c = new GrandChildRestArgs();
1344514f5e3Sopenharmony_ci    assert_true(c.args.length === 0);
1354514f5e3Sopenharmony_ci}
1364514f5e3Sopenharmony_ci
1374514f5e3Sopenharmony_cifunction testGrandChildRestArgs1Arg() {
1384514f5e3Sopenharmony_ci    let c = new GrandChildRestArgs("one");
1394514f5e3Sopenharmony_ci    assert_true(c.args.length === 1);
1404514f5e3Sopenharmony_ci    assert_true(c.args[0] === "one");
1414514f5e3Sopenharmony_ci}
1424514f5e3Sopenharmony_ci
1434514f5e3Sopenharmony_cifunction testGrandChildRestArgs2Arg() {
1444514f5e3Sopenharmony_ci    let c = new GrandChildRestArgs("two", 2);
1454514f5e3Sopenharmony_ci    assert_true(c.args.length === 2);
1464514f5e3Sopenharmony_ci    assert_true(c.args[0] === "two");
1474514f5e3Sopenharmony_ci    assert_true(c.args[1] === 2);
1484514f5e3Sopenharmony_ci}
1494514f5e3Sopenharmony_ci
1504514f5e3Sopenharmony_cifunction testGrandChildRestArgs3Arg() {
1514514f5e3Sopenharmony_ci    let c = new GrandChildRestArgs("three", 3, "extra");
1524514f5e3Sopenharmony_ci    assert_true(c.args.length === 3);
1534514f5e3Sopenharmony_ci    assert_true(c.args[0] === "three");
1544514f5e3Sopenharmony_ci    assert_true(c.args[1] === 3);
1554514f5e3Sopenharmony_ci    assert_true(c.args[2] === "extra");
1564514f5e3Sopenharmony_ci}
1574514f5e3Sopenharmony_ci
1584514f5e3Sopenharmony_ciclass BaseArguments {
1594514f5e3Sopenharmony_ci    args: Object[] = [];
1604514f5e3Sopenharmony_ci    constructor() {
1614514f5e3Sopenharmony_ci        for (const arg of arguments) {
1624514f5e3Sopenharmony_ci            this.args.push(arg);
1634514f5e3Sopenharmony_ci        }
1644514f5e3Sopenharmony_ci    }
1654514f5e3Sopenharmony_ci}
1664514f5e3Sopenharmony_ci
1674514f5e3Sopenharmony_ciclass ChildArguments extends BaseArguments {}
1684514f5e3Sopenharmony_ci
1694514f5e3Sopenharmony_cifunction testChildArguments0Arg() {
1704514f5e3Sopenharmony_ci    let c = new ChildArguments();
1714514f5e3Sopenharmony_ci    assert_true(c.args.length === 0);
1724514f5e3Sopenharmony_ci}
1734514f5e3Sopenharmony_ci
1744514f5e3Sopenharmony_cifunction testChildArguments1Arg() {
1754514f5e3Sopenharmony_ci    let c = new ChildArguments("one");
1764514f5e3Sopenharmony_ci    assert_true(c.args.length === 1);
1774514f5e3Sopenharmony_ci    assert_true(c.args[0] === "one");
1784514f5e3Sopenharmony_ci}
1794514f5e3Sopenharmony_ci
1804514f5e3Sopenharmony_cifunction testChildArguments2Arg() {
1814514f5e3Sopenharmony_ci    let c = new ChildArguments("two", 2);
1824514f5e3Sopenharmony_ci    assert_true(c.args.length === 2);
1834514f5e3Sopenharmony_ci    assert_true(c.args[0] === "two");
1844514f5e3Sopenharmony_ci    assert_true(c.args[1] === 2);
1854514f5e3Sopenharmony_ci}
1864514f5e3Sopenharmony_ci
1874514f5e3Sopenharmony_cifunction testChildArguments3Arg() {
1884514f5e3Sopenharmony_ci    let c = new ChildArguments("three", 3, "extra");
1894514f5e3Sopenharmony_ci    assert_true(c.args.length === 3);
1904514f5e3Sopenharmony_ci    assert_true(c.args[0] === "three");
1914514f5e3Sopenharmony_ci    assert_true(c.args[1] === 3);
1924514f5e3Sopenharmony_ci    assert_true(c.args[2] === "extra");
1934514f5e3Sopenharmony_ci}
1944514f5e3Sopenharmony_ci
1954514f5e3Sopenharmony_ciclass GrandChildArguments extends ChildArguments {
1964514f5e3Sopenharmony_ci}
1974514f5e3Sopenharmony_ci
1984514f5e3Sopenharmony_cifunction testGrandChildArguments0Arg() {
1994514f5e3Sopenharmony_ci    let c = new GrandChildArguments();
2004514f5e3Sopenharmony_ci    assert_true(c.args.length === 0);
2014514f5e3Sopenharmony_ci}
2024514f5e3Sopenharmony_ci
2034514f5e3Sopenharmony_cifunction testGrandChildArguments1Arg() {
2044514f5e3Sopenharmony_ci    let c = new GrandChildArguments("one");
2054514f5e3Sopenharmony_ci    assert_true(c.args.length === 1);
2064514f5e3Sopenharmony_ci    assert_true(c.args[0] === "one");
2074514f5e3Sopenharmony_ci}
2084514f5e3Sopenharmony_ci
2094514f5e3Sopenharmony_cifunction testGrandChildArguments2Arg() {
2104514f5e3Sopenharmony_ci    let c = new GrandChildArguments("two", 2);
2114514f5e3Sopenharmony_ci    assert_true(c.args.length === 2);
2124514f5e3Sopenharmony_ci    assert_true(c.args[0] === "two");
2134514f5e3Sopenharmony_ci    assert_true(c.args[1] === 2);
2144514f5e3Sopenharmony_ci}
2154514f5e3Sopenharmony_ci
2164514f5e3Sopenharmony_cifunction testGrandChildArguments3Arg() {
2174514f5e3Sopenharmony_ci    let c = new GrandChildArguments("three", 3, "extra");
2184514f5e3Sopenharmony_ci    assert_true(c.args.length === 3);
2194514f5e3Sopenharmony_ci    assert_true(c.args[0] === "three");
2204514f5e3Sopenharmony_ci    assert_true(c.args[1] === 3);
2214514f5e3Sopenharmony_ci    assert_true(c.args[2] === "extra");
2224514f5e3Sopenharmony_ci}
2234514f5e3Sopenharmony_ci
2244514f5e3Sopenharmony_ciclass BaseCornerCase {
2254514f5e3Sopenharmony_ci    name: string = ""
2264514f5e3Sopenharmony_ci    value: number = 0;
2274514f5e3Sopenharmony_ci}
2284514f5e3Sopenharmony_ci
2294514f5e3Sopenharmony_ciclass ChildUndefined extends BaseCornerCase {}
2304514f5e3Sopenharmony_ciclass ChildNull extends BaseCornerCase {}
2314514f5e3Sopenharmony_ciclass ChildObj extends BaseCornerCase {}
2324514f5e3Sopenharmony_ciclass ChildNumber extends BaseCornerCase {}
2334514f5e3Sopenharmony_ciclass ChildString extends BaseCornerCase {}
2344514f5e3Sopenharmony_ciclass ChildArrow extends BaseCornerCase {}
2354514f5e3Sopenharmony_ciclass ChildFunction extends BaseCornerCase {}
2364514f5e3Sopenharmony_ci
2374514f5e3Sopenharmony_cifunction runChildCornerCase(ctor: Function, replacement: any) {
2384514f5e3Sopenharmony_ci    let cnt = 20;
2394514f5e3Sopenharmony_ci    for (let i = 0; i < cnt; ++i) {
2404514f5e3Sopenharmony_ci        if (i == cnt - 1) {
2414514f5e3Sopenharmony_ci            ctor.__proto__ = replacement;  // at the last iteration, change super ctor
2424514f5e3Sopenharmony_ci        }
2434514f5e3Sopenharmony_ci        try {
2444514f5e3Sopenharmony_ci            new ctor();
2454514f5e3Sopenharmony_ci        } catch (e) {
2464514f5e3Sopenharmony_ci            print(ctor.name);
2474514f5e3Sopenharmony_ci            print(e);
2484514f5e3Sopenharmony_ci        }
2494514f5e3Sopenharmony_ci    }
2504514f5e3Sopenharmony_ci    assert_true(ArkTools.isAOTCompiled(ctor));
2514514f5e3Sopenharmony_ci}
2524514f5e3Sopenharmony_ci
2534514f5e3Sopenharmony_cifunction testChildCornerCases() {
2544514f5e3Sopenharmony_ci    runChildCornerCase(ChildUndefined, undefined);      // normal
2554514f5e3Sopenharmony_ci    runChildCornerCase(ChildNull, null);                // error: super is not ctor
2564514f5e3Sopenharmony_ci    runChildCornerCase(ChildObj, {xxx: "yyy"});         // error: super is not ctor
2574514f5e3Sopenharmony_ci    runChildCornerCase(ChildNumber, 111);               // normal
2584514f5e3Sopenharmony_ci    runChildCornerCase(ChildString, "hello");           // normal
2594514f5e3Sopenharmony_ci    runChildCornerCase(ChildArrow, () => {});           // error: super is not ctor
2604514f5e3Sopenharmony_ci    runChildCornerCase(ChildFunction, function () {});  // normal
2614514f5e3Sopenharmony_ci    assert_true(ArkTools.isAOTCompiled(BaseCornerCase));
2624514f5e3Sopenharmony_ci}
2634514f5e3Sopenharmony_ci
2644514f5e3Sopenharmony_ci
2654514f5e3Sopenharmony_cirun(testChild0Arg);
2664514f5e3Sopenharmony_cirun(testChild1Arg);
2674514f5e3Sopenharmony_cirun(testChild2Arg);
2684514f5e3Sopenharmony_cirun(testChild3Arg);
2694514f5e3Sopenharmony_cirun(testGrandChild0Arg);
2704514f5e3Sopenharmony_cirun(testGrandChild1Arg);
2714514f5e3Sopenharmony_cirun(testGrandChild2Arg);
2724514f5e3Sopenharmony_cirun(testGrandChild3Arg);
2734514f5e3Sopenharmony_ciassert_true(ArkTools.isAOTCompiled(Base));
2744514f5e3Sopenharmony_ciassert_true(ArkTools.isAOTCompiled(Child));
2754514f5e3Sopenharmony_ciassert_true(ArkTools.isAOTCompiled(GrandChild));
2764514f5e3Sopenharmony_ci
2774514f5e3Sopenharmony_cirun(testChildRestArgs0Arg);
2784514f5e3Sopenharmony_cirun(testChildRestArgs1Arg);
2794514f5e3Sopenharmony_cirun(testChildRestArgs2Arg);
2804514f5e3Sopenharmony_cirun(testChildRestArgs3Arg);
2814514f5e3Sopenharmony_cirun(testGrandChildRestArgs0Arg);
2824514f5e3Sopenharmony_cirun(testGrandChildRestArgs1Arg);
2834514f5e3Sopenharmony_cirun(testGrandChildRestArgs2Arg);
2844514f5e3Sopenharmony_cirun(testGrandChildRestArgs3Arg);
2854514f5e3Sopenharmony_ciassert_true(ArkTools.isAOTCompiled(BaseRestArgs));
2864514f5e3Sopenharmony_ciassert_true(ArkTools.isAOTCompiled(ChildRestArgs));
2874514f5e3Sopenharmony_ciassert_true(ArkTools.isAOTCompiled(GrandChildRestArgs));
2884514f5e3Sopenharmony_ci
2894514f5e3Sopenharmony_cirun(testChildArguments0Arg);
2904514f5e3Sopenharmony_cirun(testChildArguments1Arg);
2914514f5e3Sopenharmony_cirun(testChildArguments2Arg);
2924514f5e3Sopenharmony_cirun(testChildArguments3Arg);
2934514f5e3Sopenharmony_cirun(testGrandChildArguments0Arg);
2944514f5e3Sopenharmony_cirun(testGrandChildArguments1Arg);
2954514f5e3Sopenharmony_cirun(testGrandChildArguments2Arg);
2964514f5e3Sopenharmony_cirun(testGrandChildArguments3Arg);
2974514f5e3Sopenharmony_ciassert_true(ArkTools.isAOTCompiled(BaseArguments));
2984514f5e3Sopenharmony_ciassert_true(ArkTools.isAOTCompiled(ChildArguments));
2994514f5e3Sopenharmony_ciassert_true(ArkTools.isAOTCompiled(GrandChildArguments));
3004514f5e3Sopenharmony_ci
3014514f5e3Sopenharmony_citestChildCornerCases();
3024514f5e3Sopenharmony_ci
3034514f5e3Sopenharmony_ciprint("success");
304