1/* 2 * Copyright (c) 2023-2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16class A { 17 protected name_: char; 18 19 public constructor() { 20 this.name_ = c'A'; 21 } 22 23 public name(): char { 24 return this.name_; 25 } 26 27 public a(): char { 28 return c'A'; 29 } 30} 31 32final class B extends A { 33 public constructor() { 34 this.name_ = c'B'; 35 } 36 37 public b(): char { 38 return c'B'; 39 } 40} 41 42function reference_reference_test(): void { 43 let B_ = new B(); 44 assertEQ(B_.name(), c'B') 45 assertEQ(B_.b(), c'B') 46 47 let B_A = B_ as A; 48 assertEQ(B_A.name(), c'B') 49 assertEQ(B_A.a(), c'A') 50 51 let A_B = B_A as B; 52 assertEQ(B_.name(), c'B') 53 assertEQ(B_.b(), c'B') 54} 55 56function array_test(): void { 57 let Bs: FixedArray<B> = [new B(), new B(), new B()]; 58 59 let B_As: FixedArray<A> = Bs as FixedArray<A>; 60 for (let i: int = 0; i < B_As.length; i++) { 61 assertEQ(B_As[i].name(), c'B') 62 assertEQ(B_As[i].a(), c'A') 63 } 64 65 let Object_: Object = B_As as Object; 66 67 let Object_Bs: FixedArray<B> = Object_ as FixedArray<B>; 68 for (let i: int = 0; i < Object_Bs.length; i++) { 69 assertEQ(Object_Bs[i].name(), c'B') 70 assertEQ(Object_Bs[i].b(), c'B') 71 } 72} 73 74function multi_array_test(): void { 75 let Bs: FixedArray<FixedArray<B>> = [[new B()], [new B()], [new B()]]; 76 77 let B_As: FixedArray<FixedArray<A>> = Bs as FixedArray<FixedArray<A>>; 78 for (let i: int = 0; i < B_As.length; i++) { 79 for (let j: int = 0; j < B_As[i].length; j++) { 80 assertEQ(B_As[i][j].name(), c'B') 81 assertEQ(B_As[i][j].a(), c'A') 82 } 83 } 84 85 let Object_: Object = B_As as Object; 86 87 let Object_Bs: FixedArray<FixedArray<B>> = Object_ as FixedArray<FixedArray<B>>; 88 for (let i: int = 0; i < Object_Bs.length; i++) { 89 for (let j: int = 0; j < Object_Bs[i].length; j++) { 90 assertEQ(Object_Bs[i][j].name(), c'B') 91 assertEQ(Object_Bs[i][j].b(), c'B') 92 } 93 } 94} 95 96function primitive_reference_test(): void { 97 let int_: int = 42; 98 let Int_ = int_ as Int; 99 assertTrue(Int_ instanceof Int) 100 assertEQ(Int_.toInt(), 42) 101 assertEQ(Int_.add(1) as int, 43) 102} 103 104function main(): void { 105 reference_reference_test(); 106 array_test(); 107 multi_array_test(); 108 primitive_reference_test(); 109} 110