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  static static_name: char = c'A';
18  name: char = c'A';
19
20  final get_name_a(): char {
21    return this.name;
22  }
23
24  get_name(): char {
25    return this.name;
26  }
27
28  static get_static_name(): char {
29    return A.static_name;
30  }
31}
32
33class B extends A {
34  static static_name: char = c'B';
35  name: char = c'B';
36
37  static get_static_name(): char {
38    return B.static_name;
39  }
40
41  override get_name(): char {
42    return this.name;
43  }
44
45  super_name(): char {
46    return super.name;
47  }
48}
49
50final class C extends B {
51  static static_name: char = c'C';
52  name: char = c'C';
53
54  static get_static_name(): char {
55    return C.static_name;
56  }
57
58  override get_name(): char {
59    return this.name;
60  }
61
62  override super_name(): char {
63    return super.name;
64  }
65}
66
67function main() : void {
68  {
69    let a = new A();
70    assert A.static_name == c'A';
71    assert A.get_static_name() == c'A';
72    assert a.name == c'A';
73    assert a.get_name() == c'A';
74    assert a.get_name_a() == c'A';
75  }
76
77  {
78    let b = new B();
79    assert B.static_name == c'B';
80    assert B.get_static_name() == c'B';
81    assert b.name == c'B';
82    assert b.get_name() == c'B';
83    assert b.super_name() == c'A';
84    assert b.get_name_a() == c'A';
85  }
86
87  {
88    let b_as_a: A = new B();
89    assert b_as_a.name == c'B';
90    assert b_as_a.get_name() == c'B';
91    assert b_as_a.get_name_a() == c'A';
92  }
93
94  {
95    let c = new C();
96    assert C.static_name == c'C';
97    assert C.get_static_name() == c'C';
98    assert c.name == c'C';
99    assert c.get_name() == c'C';
100    assert c.super_name() == c'B';
101    assert c.get_name_a() == c'A';
102  }
103
104  {
105    let c_as_a: A = new C();
106    assert c_as_a.name == c'C';
107    assert c_as_a.get_name() == c'C';
108    assert c_as_a.get_name_a() == c'A';
109  }
110
111  {
112    let c_as_b: B = new C();
113    assert c_as_b.name == c'C';
114    assert c_as_b.get_name() == c'C';
115    assert c_as_b.super_name() == c'B';
116    assert c_as_b.get_name_a() == c'A';
117  }
118
119  {
120    let c = new C();
121    assert (c as A).static_name == c'A';
122    assert (c as A).get_static_name() == c'A';
123    assert (c as A).name == c'A';
124    assert (c as A).get_name() == c'C';
125    assert (c as A).get_name_a() == c'A';
126  }
127
128  {
129    assert (new C() as B).static_name == c'B';
130    assert (new C() as B).get_static_name() == c'B';
131    assert (new C() as B).name == c'B';
132    assert (new C() as B).get_name() ==c'C';
133    assert (new C() as B).super_name() == c'B';
134    assert (new C() as B).get_name_a() == c'A';
135  }
136}
137