14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2023 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_ciclass P {
174514f5e3Sopenharmony_ci    constructor() {
184514f5e3Sopenharmony_ci        this.a = 1;
194514f5e3Sopenharmony_ci    }
204514f5e3Sopenharmony_ci}
214514f5e3Sopenharmony_ci// test normal object
224514f5e3Sopenharmony_cilet proto = new P();
234514f5e3Sopenharmony_cilet protoT = new P();
244514f5e3Sopenharmony_ci
254514f5e3Sopenharmony_ci// use to store results
264514f5e3Sopenharmony_cilet conditionArray = [];
274514f5e3Sopenharmony_ciconditionArray.push(!(proto === protoT))
284514f5e3Sopenharmony_ci// share hclass
294514f5e3Sopenharmony_ciconditionArray.push(ArkTools.compareHClass(proto, protoT));
304514f5e3Sopenharmony_ciconditionArray.push(!ArkTools.isPrototype(proto));
314514f5e3Sopenharmony_ciconditionArray.push(!ArkTools.isPrototype(protoT));
324514f5e3Sopenharmony_ci
334514f5e3Sopenharmony_ciprint("start test!!!")
344514f5e3Sopenharmony_cilet obj1 = {"b": "2b"};
354514f5e3Sopenharmony_cilet obj2 = {"c": "3c"};
364514f5e3Sopenharmony_cilet obj3 = {"d": "4d"};
374514f5e3Sopenharmony_ci
384514f5e3Sopenharmony_cilet obj11 = {"bb": "2bb"};
394514f5e3Sopenharmony_cilet obj22 = {"cc": "3cc"};
404514f5e3Sopenharmony_cilet obj33 = {"dd": "4dd"};
414514f5e3Sopenharmony_ci
424514f5e3Sopenharmony_ciObject.setPrototypeOf(obj1, proto);
434514f5e3Sopenharmony_ciObject.setPrototypeOf(obj2, proto);
444514f5e3Sopenharmony_ciObject.setPrototypeOf(obj3, proto);
454514f5e3Sopenharmony_ci
464514f5e3Sopenharmony_ciconditionArray.push(ArkTools.isPrototype(proto));
474514f5e3Sopenharmony_ciconditionArray.push(!ArkTools.isPrototype(protoT));
484514f5e3Sopenharmony_ciconditionArray.push(!ArkTools.compareHClass(proto, protoT));
494514f5e3Sopenharmony_ci
504514f5e3Sopenharmony_ci// set proto of obj11, obj22, obj33
514514f5e3Sopenharmony_ci// obj11 --> proto --> obj1 --> proto --> proto object
524514f5e3Sopenharmony_ci// obj22 --> proto --> obj1 --> proto --> proto object
534514f5e3Sopenharmony_ci// obj33 --> proto --> obj2 --> proto --> proto object
544514f5e3Sopenharmony_ciobj11.__proto__ = obj1;
554514f5e3Sopenharmony_ciobj22.__proto__ = obj1;
564514f5e3Sopenharmony_ciobj33.__proto__ = obj2;
574514f5e3Sopenharmony_ci
584514f5e3Sopenharmony_cifunction test() {
594514f5e3Sopenharmony_ci    for (let i = 0; i <= 50; i++) {
604514f5e3Sopenharmony_ci        obj11["a"];
614514f5e3Sopenharmony_ci    }
624514f5e3Sopenharmony_ci}
634514f5e3Sopenharmony_citest();
644514f5e3Sopenharmony_ciprotoT["x"] = "2000x";
654514f5e3Sopenharmony_ciobj1["www"] = "100www";
664514f5e3Sopenharmony_ci
674514f5e3Sopenharmony_ci// test proxy
684514f5e3Sopenharmony_cilet protoP1 = new P();
694514f5e3Sopenharmony_cilet protoP2 = new P();
704514f5e3Sopenharmony_ciprotoP1.a = "xxx";
714514f5e3Sopenharmony_ci
724514f5e3Sopenharmony_cilet proxyOfProto = new Proxy(protoP1, {});
734514f5e3Sopenharmony_ciconditionArray.push(!(protoP1 === protoP2))
744514f5e3Sopenharmony_ciconditionArray.push(ArkTools.compareHClass(protoP1, protoP2));
754514f5e3Sopenharmony_ciconditionArray.push(!ArkTools.isPrototype(protoP1));
764514f5e3Sopenharmony_ciconditionArray.push(!ArkTools.isPrototype(protoP2));
774514f5e3Sopenharmony_ci
784514f5e3Sopenharmony_ci// change proto of obj1
794514f5e3Sopenharmony_ci// obj11 --> proto --> obj1 --> proto --> protoP1
804514f5e3Sopenharmony_ci// obj22 --> proto --> obj1 --> proto --> protoP1
814514f5e3Sopenharmony_ciObject.setPrototypeOf(obj1, proxyOfProto);
824514f5e3Sopenharmony_ciObject.setPrototypeOf(obj1, proxyOfProto);
834514f5e3Sopenharmony_ciconditionArray.push(ArkTools.compareHClass(protoP1, protoP2));
844514f5e3Sopenharmony_ci// change proto of obj2
854514f5e3Sopenharmony_ci// obj33 --> proto --> obj2 --> proto --> protoP2
864514f5e3Sopenharmony_ciObject.setPrototypeOf(obj2, protoP2);
874514f5e3Sopenharmony_ciObject.setPrototypeOf(obj3, proxyOfProto);
884514f5e3Sopenharmony_ci
894514f5e3Sopenharmony_ciconditionArray.push(!ArkTools.compareHClass(protoP1, protoP2));
904514f5e3Sopenharmony_ciconditionArray.push(!ArkTools.isPrototype(protoP1));
914514f5e3Sopenharmony_ciconditionArray.push(ArkTools.isPrototype(protoP2));
924514f5e3Sopenharmony_ciconditionArray.push(!ArkTools.isPrototype(proxyOfProto));
934514f5e3Sopenharmony_ci
944514f5e3Sopenharmony_citest();
954514f5e3Sopenharmony_ciobj1["zzz"] = "100zzz";
964514f5e3Sopenharmony_ci
974514f5e3Sopenharmony_ci// check proto
984514f5e3Sopenharmony_ciconditionArray.push(obj11.a === "xxx")
994514f5e3Sopenharmony_ciconditionArray.push(obj22.a === "xxx")
1004514f5e3Sopenharmony_ciconditionArray.push(obj11.b === "2b")
1014514f5e3Sopenharmony_ciconditionArray.push(obj33.a === 1)
1024514f5e3Sopenharmony_ciconditionArray.push(obj33.c === "3c")
1034514f5e3Sopenharmony_ciconditionArray.push(obj11.zzz === "100zzz")
1044514f5e3Sopenharmony_ciconditionArray.push(obj33.zzz === undefined)
1054514f5e3Sopenharmony_ci
1064514f5e3Sopenharmony_cilet str = "";
1074514f5e3Sopenharmony_ci// check results
1084514f5e3Sopenharmony_cifor (let i of conditionArray) {
1094514f5e3Sopenharmony_ci    if (!i) {
1104514f5e3Sopenharmony_ci        str = "Test mutli proto ic fail!!!";
1114514f5e3Sopenharmony_ci        break;
1124514f5e3Sopenharmony_ci    }
1134514f5e3Sopenharmony_ci}
1144514f5e3Sopenharmony_ciif (str == "") {
1154514f5e3Sopenharmony_ci    str = "Test mutli proto ic success!!!";
1164514f5e3Sopenharmony_ci}
1174514f5e3Sopenharmony_ciprint(str);
118