1/* 2 * Copyright (c) 2023-2024 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 assert B_.name() == c'B'; 45 assert B_.b() == c'B'; 46 47 let B_A = B_ as A; 48 assert B_A.name() == c'B'; 49 assert B_A.a() == c'A'; 50 51 let A_B = B_A as B; 52 assert B_.name() == c'B'; 53 assert B_.b() == c'B'; 54} 55 56function array_test(): void { 57 let Bs: B[] = [new B(), new B(), new B()]; 58 59 let B_As: A[] = Bs as A[]; 60 for (let i: int = 0; i < B_As.length; i++) { 61 assert B_As[i].name() == c'B'; 62 assert B_As[i].a() == c'A'; 63 } 64 65 let Object_: Object = B_As as Object; 66 67 let Object_Bs: B[] = Object_ as B[]; 68 for (let i: int = 0; i < Object_Bs.length; i++) { 69 assert Object_Bs[i].name() == c'B'; 70 assert Object_Bs[i].b() == c'B'; 71 } 72} 73 74function multi_array_test(): void { 75 let Bs: B[][] = [[new B()], [new B()], [new B()]]; 76 77 let B_As: A[][] = Bs as 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 assert B_As[i][j].name() == c'B'; 81 assert B_As[i][j].a() == c'A'; 82 } 83 } 84 85 let Object_: Object = B_As as Object; 86 87 let Object_Bs: B[][] = Object_ as 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 assert Object_Bs[i][j].name() == c'B'; 91 assert 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 assert Int_ instanceof Int; 100 assert Int_.intValue() == 42; 101 assert 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