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