1/* 2 * Copyright (c) 2021-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 num: int = 41; 18} 19 20class B { 21 num: int = 42; 22} 23 24class C { 25 num: int = 43; 26 constructor(num: int) { 27 this.num = num; 28 } 29 num_to_return() : int { 30 return this.num; 31 } 32} 33 34function foo(x : A | B | C) { 35 if (x instanceof C) { 36 let xx = x as C; 37 assert xx.num_to_return() == 777: "Error! The num field of class `C` must be 777"; 38 } 39 if (x instanceof A) { 40 assert false: "Error! x is instaceof C but not A"; 41 } 42 assert x.num == 777: "Error! The num field of union must be 777"; 43 let a: int = x.num + 3; 44 assert a == 780: "Error! Variable 'a' must be 780"; 45 x.num += 223; 46 assert x.num == 1000: "Error! The num field of union must be 1000"; 47} 48 49function main() { 50 let x : A | B | C; 51 x = new C(777); 52 foo(x); 53 assert x.num == 1000: "Error! The num field of union must be 1000"; 54 if (x instanceof C) { 55 let xx = x as C; 56 assert xx.num_to_return() == 1000: "Error! The num field of class `C` must be 1000"; 57 } 58 if (x instanceof B) { 59 assert false: "Error! x is instaceof C but not B"; 60 } 61 x = new A(); 62 assert x.num == 41: "Error! The num field of union must be 41"; 63 x = new B(); 64 assert x.num == 42: "Error! The num field of union must be 42"; 65} 66 67