1/* 2 * Copyright (c) 2024-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 C { 17 readonly a: boolean 18 constructor(a_: boolean = false) { 19 this.a = a_; 20 } 21} 22 23function foo1(x: C|null|undefined): string { 24 if (x == null || !x.a) { 25 return x != null ? "false1" : "null"; 26 } else { 27 return x.a ? "true2" : "false2"; 28 } 29} 30 31function foo2(x: C|null|undefined): string { 32 if (x != null && x.a) { 33 return "true"; 34 } else { 35 return x != null ? "false" : "null"; 36 } 37} 38 39function bar(x: C|null|undefined, y: boolean, z: boolean): string { 40 if ((x instanceof C && y) || (x instanceof C && z)) { 41 return (x.a ? "true1" : "false1") + y + z; 42 } else { 43 return (x != null ? (x.a ? "true2" : "false2") : "null") + y + z; 44 } 45} 46 47function main(): void { 48 assertEQ(foo1(null), "null") 49 assertEQ(foo2(null), "null") 50 assertEQ(bar(null, true, true), "nulltruetrue") 51 assertEQ(bar(null, true, false), "nulltruefalse") 52 assertEQ(bar(null, false, true), "nullfalsetrue") 53 assertEQ(bar(null, false, false), "nullfalsefalse") 54 55 assertEQ(foo1(undefined), "null") 56 assertEQ(foo2(undefined), "null") 57 assertEQ(bar(undefined, true, true), "nulltruetrue") 58 assertEQ(bar(undefined, true, false), "nulltruefalse") 59 assertEQ(bar(undefined, false, true), "nullfalsetrue") 60 assertEQ(bar(undefined, false, false), "nullfalsefalse") 61 62 let c = new C(); 63 assertEQ(foo1(c), "false1") 64 assertEQ(foo2(c), "false") 65 assertEQ(bar(c, true, true), "false1truetrue") 66 assertEQ(bar(c, true, false), "false1truefalse") 67 assertEQ(bar(c, false, true), "false1falsetrue") 68 assertEQ(bar(c, false, false), "false2falsefalse") 69 70 c = new C(true); 71 assertEQ(foo1(c), "true2") 72 assertEQ(foo2(c), "true") 73 assertEQ(bar(c, true, true), "true1truetrue") 74 assertEQ(bar(c, true, false), "true1truefalse") 75 assertEQ(bar(c, false, true), "true1falsetrue") 76 assertEQ(bar(c, false, false), "true2falsefalse") 77} 78