1/* 2* Copyright (c) Microsoft Corporation. All rights reserved. 3* Copyright (c) 2023 Huawei Device Co., Ltd. 4* Licensed under the Apache License, Version 2.0 (the "License"); 5* you may not use this file except in compliance with the License. 6* You may obtain a copy of the License at 7* 8* http://www.apache.org/licenses/LICENSE-2.0 9* 10* Unless required by applicable law or agreed to in writing, software 11* distributed under the License is distributed on an "AS IS" BASIS, 12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13* See the License for the specific language governing permissions and 14* limitations under the License. 15* 16* This file has been modified by Huawei to verify type inference by adding verification statements. 17*/ 18 19// === tests/cases/conformance/types/intersection/intersectionOfUnionOfUnitTypes.ts === 20declare function AssertType(value:any, type:string):void; 21// @strict 22 23const enum E { A, B, C, D, E, F } 24 25let x0: ('a' | 'b' | 'c') & ('a' | 'b' | 'c'); // 'a' | 'b' | 'c' 26AssertType(x0, "union"); 27 28let x1: ('a' | 'b' | 'c') & ('b' | 'c' | 'd'); // 'b' | 'c' 29AssertType(x1, "union"); 30 31let x2: ('a' | 'b' | 'c') & ('c' | 'd' | 'e'); // 'c' 32AssertType(x2, "string"); 33 34let x3: ('a' | 'b' | 'c') & ('d' | 'e' | 'f'); // never 35AssertType(x3, "never"); 36 37let x4: ('a' | 'b' | 'c') & ('b' | 'c' | 'd') & ('c' | 'd' | 'e'); // 'c' 38AssertType(x4, "string"); 39 40let x5: ('a' | 'b' | 'c') & ('b' | 'c' | 'd') & ('c' | 'd' | 'e') & ('d' | 'e' | 'f'); // never 41AssertType(x5, "never"); 42 43let y0: (0 | 1 | 2) & (0 | 1 | 2); // 0 | 1 | 2 44AssertType(y0, "union"); 45 46let y1: (0 | 1 | 2) & (1 | 2 | 3); // 1 | 2 47AssertType(y1, "union"); 48 49let y2: (0 | 1 | 2) & (2 | 3 | 4); // 2 50AssertType(y2, "int"); 51 52let y3: (0 | 1 | 2) & (3 | 4 | 5); // never 53AssertType(y3, "never"); 54 55let y4: (0 | 1 | 2) & (1 | 2 | 3) & (2 | 3 | 4); // 2 56AssertType(y4, "int"); 57 58let y5: (0 | 1 | 2) & (1 | 2 | 3) & (2 | 3 | 4) & (3 | 4 | 5); // never 59AssertType(y5, "never"); 60 61let z0: (E.A | E.B | E.C) & (E.A | E.B | E.C); // E.A | E.B | E.C 62AssertType(z0, "union"); 63AssertType(E, "any"); 64AssertType(E, "any"); 65AssertType(E, "any"); 66AssertType(E, "any"); 67AssertType(E, "any"); 68AssertType(E, "any"); 69 70let z1: (E.A | E.B | E.C) & (E.B | E.C | E.D); // E.B | E.C 71AssertType(z1, "union"); 72AssertType(E, "any"); 73AssertType(E, "any"); 74AssertType(E, "any"); 75AssertType(E, "any"); 76AssertType(E, "any"); 77AssertType(E, "any"); 78 79let z2: (E.A | E.B | E.C) & (E.C | E.D | E.E); // E.C 80AssertType(z2, "E.C"); 81AssertType(E, "any"); 82AssertType(E, "any"); 83AssertType(E, "any"); 84AssertType(E, "any"); 85AssertType(E, "any"); 86AssertType(E, "any"); 87 88let z3: (E.A | E.B | E.C) & (E.D | E.E | E.F); // never 89AssertType(z3, "never"); 90AssertType(E, "any"); 91AssertType(E, "any"); 92AssertType(E, "any"); 93AssertType(E, "any"); 94AssertType(E, "any"); 95AssertType(E, "any"); 96 97let z4: (E.A | E.B | E.C) & (E.B | E.C | E.D) & (E.C | E.D | E.E); // E.C 98AssertType(z4, "E.C"); 99AssertType(E, "any"); 100AssertType(E, "any"); 101AssertType(E, "any"); 102AssertType(E, "any"); 103AssertType(E, "any"); 104AssertType(E, "any"); 105AssertType(E, "any"); 106AssertType(E, "any"); 107AssertType(E, "any"); 108 109let z5: (E.A | E.B | E.C) & (E.B | E.C | E.D) & (E.C | E.D | E.E) & (E.D | E.E | E.F); // never 110AssertType(z5, "never"); 111AssertType(E, "any"); 112AssertType(E, "any"); 113AssertType(E, "any"); 114AssertType(E, "any"); 115AssertType(E, "any"); 116AssertType(E, "any"); 117AssertType(E, "any"); 118AssertType(E, "any"); 119AssertType(E, "any"); 120AssertType(E, "any"); 121AssertType(E, "any"); 122AssertType(E, "any"); 123 124 125