From 78f4cbe53c8696d6f8b23424fcfd666c7d71ba01 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Wed, 13 Sep 2017 06:37:59 -0700 Subject: [PATCH] Add tests --- .../intersectionOfUnionOfUnitTypes.js | 47 ++++++ .../intersectionOfUnionOfUnitTypes.symbols | 156 ++++++++++++++++++ .../intersectionOfUnionOfUnitTypes.types | 156 ++++++++++++++++++ .../intersectionOfUnionOfUnitTypes.ts | 24 +++ 4 files changed, 383 insertions(+) create mode 100644 tests/baselines/reference/intersectionOfUnionOfUnitTypes.js create mode 100644 tests/baselines/reference/intersectionOfUnionOfUnitTypes.symbols create mode 100644 tests/baselines/reference/intersectionOfUnionOfUnitTypes.types create mode 100644 tests/cases/conformance/types/intersection/intersectionOfUnionOfUnitTypes.ts diff --git a/tests/baselines/reference/intersectionOfUnionOfUnitTypes.js b/tests/baselines/reference/intersectionOfUnionOfUnitTypes.js new file mode 100644 index 00000000000..09a2ab974f4 --- /dev/null +++ b/tests/baselines/reference/intersectionOfUnionOfUnitTypes.js @@ -0,0 +1,47 @@ +//// [intersectionOfUnionOfUnitTypes.ts] +// @strict + +const enum E { A, B, C, D, E, F } + +let x0: ('a' | 'b' | 'c') & ('a' | 'b' | 'c'); // 'a' | 'b' | 'c' +let x1: ('a' | 'b' | 'c') & ('b' | 'c' | 'd'); // 'b' | 'c' +let x2: ('a' | 'b' | 'c') & ('c' | 'd' | 'e'); // 'c' +let x3: ('a' | 'b' | 'c') & ('d' | 'e' | 'f'); // never +let x4: ('a' | 'b' | 'c') & ('b' | 'c' | 'd') & ('c' | 'd' | 'e'); // 'c' +let x5: ('a' | 'b' | 'c') & ('b' | 'c' | 'd') & ('c' | 'd' | 'e') & ('d' | 'e' | 'f'); // never + +let y0: (0 | 1 | 2) & (0 | 1 | 2); // 0 | 1 | 2 +let y1: (0 | 1 | 2) & (1 | 2 | 3); // 1 | 2 +let y2: (0 | 1 | 2) & (2 | 3 | 4); // 2 +let y3: (0 | 1 | 2) & (3 | 4 | 5); // never +let y4: (0 | 1 | 2) & (1 | 2 | 3) & (2 | 3 | 4); // 2 +let y5: (0 | 1 | 2) & (1 | 2 | 3) & (2 | 3 | 4) & (3 | 4 | 5); // never + +let z0: (E.A | E.B | E.C) & (E.A | E.B | E.C); // E.A | E.B | E.C +let z1: (E.A | E.B | E.C) & (E.B | E.C | E.D); // E.B | E.C +let z2: (E.A | E.B | E.C) & (E.C | E.D | E.E); // E.C +let z3: (E.A | E.B | E.C) & (E.D | E.E | E.F); // never +let z4: (E.A | E.B | E.C) & (E.B | E.C | E.D) & (E.C | E.D | E.E); // E.C +let 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 + + +//// [intersectionOfUnionOfUnitTypes.js] +// @strict +var x0; // 'a' | 'b' | 'c' +var x1; // 'b' | 'c' +var x2; // 'c' +var x3; // never +var x4; // 'c' +var x5; // never +var y0; // 0 | 1 | 2 +var y1; // 1 | 2 +var y2; // 2 +var y3; // never +var y4; // 2 +var y5; // never +var z0; // E.A | E.B | E.C +var z1; // E.B | E.C +var z2; // E.C +var z3; // never +var z4; // E.C +var z5; // never diff --git a/tests/baselines/reference/intersectionOfUnionOfUnitTypes.symbols b/tests/baselines/reference/intersectionOfUnionOfUnitTypes.symbols new file mode 100644 index 00000000000..6f5f70bd290 --- /dev/null +++ b/tests/baselines/reference/intersectionOfUnionOfUnitTypes.symbols @@ -0,0 +1,156 @@ +=== tests/cases/conformance/types/intersection/intersectionOfUnionOfUnitTypes.ts === +// @strict + +const enum E { A, B, C, D, E, F } +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>A : Symbol(E.A, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 14)) +>B : Symbol(E.B, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 17)) +>C : Symbol(E.C, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 20)) +>D : Symbol(E.D, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 23)) +>E : Symbol(E.E, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 26)) +>F : Symbol(E.F, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 29)) + +let x0: ('a' | 'b' | 'c') & ('a' | 'b' | 'c'); // 'a' | 'b' | 'c' +>x0 : Symbol(x0, Decl(intersectionOfUnionOfUnitTypes.ts, 4, 3)) + +let x1: ('a' | 'b' | 'c') & ('b' | 'c' | 'd'); // 'b' | 'c' +>x1 : Symbol(x1, Decl(intersectionOfUnionOfUnitTypes.ts, 5, 3)) + +let x2: ('a' | 'b' | 'c') & ('c' | 'd' | 'e'); // 'c' +>x2 : Symbol(x2, Decl(intersectionOfUnionOfUnitTypes.ts, 6, 3)) + +let x3: ('a' | 'b' | 'c') & ('d' | 'e' | 'f'); // never +>x3 : Symbol(x3, Decl(intersectionOfUnionOfUnitTypes.ts, 7, 3)) + +let x4: ('a' | 'b' | 'c') & ('b' | 'c' | 'd') & ('c' | 'd' | 'e'); // 'c' +>x4 : Symbol(x4, Decl(intersectionOfUnionOfUnitTypes.ts, 8, 3)) + +let x5: ('a' | 'b' | 'c') & ('b' | 'c' | 'd') & ('c' | 'd' | 'e') & ('d' | 'e' | 'f'); // never +>x5 : Symbol(x5, Decl(intersectionOfUnionOfUnitTypes.ts, 9, 3)) + +let y0: (0 | 1 | 2) & (0 | 1 | 2); // 0 | 1 | 2 +>y0 : Symbol(y0, Decl(intersectionOfUnionOfUnitTypes.ts, 11, 3)) + +let y1: (0 | 1 | 2) & (1 | 2 | 3); // 1 | 2 +>y1 : Symbol(y1, Decl(intersectionOfUnionOfUnitTypes.ts, 12, 3)) + +let y2: (0 | 1 | 2) & (2 | 3 | 4); // 2 +>y2 : Symbol(y2, Decl(intersectionOfUnionOfUnitTypes.ts, 13, 3)) + +let y3: (0 | 1 | 2) & (3 | 4 | 5); // never +>y3 : Symbol(y3, Decl(intersectionOfUnionOfUnitTypes.ts, 14, 3)) + +let y4: (0 | 1 | 2) & (1 | 2 | 3) & (2 | 3 | 4); // 2 +>y4 : Symbol(y4, Decl(intersectionOfUnionOfUnitTypes.ts, 15, 3)) + +let y5: (0 | 1 | 2) & (1 | 2 | 3) & (2 | 3 | 4) & (3 | 4 | 5); // never +>y5 : Symbol(y5, Decl(intersectionOfUnionOfUnitTypes.ts, 16, 3)) + +let z0: (E.A | E.B | E.C) & (E.A | E.B | E.C); // E.A | E.B | E.C +>z0 : Symbol(z0, Decl(intersectionOfUnionOfUnitTypes.ts, 18, 3)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>A : Symbol(E.A, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 14)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>B : Symbol(E.B, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 17)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>C : Symbol(E.C, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 20)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>A : Symbol(E.A, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 14)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>B : Symbol(E.B, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 17)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>C : Symbol(E.C, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 20)) + +let z1: (E.A | E.B | E.C) & (E.B | E.C | E.D); // E.B | E.C +>z1 : Symbol(z1, Decl(intersectionOfUnionOfUnitTypes.ts, 19, 3)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>A : Symbol(E.A, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 14)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>B : Symbol(E.B, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 17)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>C : Symbol(E.C, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 20)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>B : Symbol(E.B, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 17)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>C : Symbol(E.C, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 20)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>D : Symbol(E.D, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 23)) + +let z2: (E.A | E.B | E.C) & (E.C | E.D | E.E); // E.C +>z2 : Symbol(z2, Decl(intersectionOfUnionOfUnitTypes.ts, 20, 3)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>A : Symbol(E.A, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 14)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>B : Symbol(E.B, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 17)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>C : Symbol(E.C, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 20)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>C : Symbol(E.C, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 20)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>D : Symbol(E.D, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 23)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>E : Symbol(E.E, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 26)) + +let z3: (E.A | E.B | E.C) & (E.D | E.E | E.F); // never +>z3 : Symbol(z3, Decl(intersectionOfUnionOfUnitTypes.ts, 21, 3)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>A : Symbol(E.A, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 14)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>B : Symbol(E.B, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 17)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>C : Symbol(E.C, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 20)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>D : Symbol(E.D, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 23)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>E : Symbol(E.E, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 26)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>F : Symbol(E.F, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 29)) + +let z4: (E.A | E.B | E.C) & (E.B | E.C | E.D) & (E.C | E.D | E.E); // E.C +>z4 : Symbol(z4, Decl(intersectionOfUnionOfUnitTypes.ts, 22, 3)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>A : Symbol(E.A, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 14)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>B : Symbol(E.B, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 17)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>C : Symbol(E.C, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 20)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>B : Symbol(E.B, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 17)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>C : Symbol(E.C, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 20)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>D : Symbol(E.D, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 23)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>C : Symbol(E.C, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 20)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>D : Symbol(E.D, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 23)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>E : Symbol(E.E, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 26)) + +let 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 +>z5 : Symbol(z5, Decl(intersectionOfUnionOfUnitTypes.ts, 23, 3)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>A : Symbol(E.A, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 14)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>B : Symbol(E.B, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 17)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>C : Symbol(E.C, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 20)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>B : Symbol(E.B, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 17)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>C : Symbol(E.C, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 20)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>D : Symbol(E.D, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 23)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>C : Symbol(E.C, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 20)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>D : Symbol(E.D, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 23)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>E : Symbol(E.E, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 26)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>D : Symbol(E.D, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 23)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>E : Symbol(E.E, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 26)) +>E : Symbol(E, Decl(intersectionOfUnionOfUnitTypes.ts, 0, 0)) +>F : Symbol(E.F, Decl(intersectionOfUnionOfUnitTypes.ts, 2, 29)) + diff --git a/tests/baselines/reference/intersectionOfUnionOfUnitTypes.types b/tests/baselines/reference/intersectionOfUnionOfUnitTypes.types new file mode 100644 index 00000000000..aa7fa0074ed --- /dev/null +++ b/tests/baselines/reference/intersectionOfUnionOfUnitTypes.types @@ -0,0 +1,156 @@ +=== tests/cases/conformance/types/intersection/intersectionOfUnionOfUnitTypes.ts === +// @strict + +const enum E { A, B, C, D, E, F } +>E : E +>A : E.A +>B : E.B +>C : E.C +>D : E.D +>E : E.E +>F : E.F + +let x0: ('a' | 'b' | 'c') & ('a' | 'b' | 'c'); // 'a' | 'b' | 'c' +>x0 : "a" | "b" | "c" + +let x1: ('a' | 'b' | 'c') & ('b' | 'c' | 'd'); // 'b' | 'c' +>x1 : "b" | "c" + +let x2: ('a' | 'b' | 'c') & ('c' | 'd' | 'e'); // 'c' +>x2 : "c" + +let x3: ('a' | 'b' | 'c') & ('d' | 'e' | 'f'); // never +>x3 : never + +let x4: ('a' | 'b' | 'c') & ('b' | 'c' | 'd') & ('c' | 'd' | 'e'); // 'c' +>x4 : "c" + +let x5: ('a' | 'b' | 'c') & ('b' | 'c' | 'd') & ('c' | 'd' | 'e') & ('d' | 'e' | 'f'); // never +>x5 : never + +let y0: (0 | 1 | 2) & (0 | 1 | 2); // 0 | 1 | 2 +>y0 : 0 | 1 | 2 + +let y1: (0 | 1 | 2) & (1 | 2 | 3); // 1 | 2 +>y1 : 1 | 2 + +let y2: (0 | 1 | 2) & (2 | 3 | 4); // 2 +>y2 : 2 + +let y3: (0 | 1 | 2) & (3 | 4 | 5); // never +>y3 : never + +let y4: (0 | 1 | 2) & (1 | 2 | 3) & (2 | 3 | 4); // 2 +>y4 : 2 + +let y5: (0 | 1 | 2) & (1 | 2 | 3) & (2 | 3 | 4) & (3 | 4 | 5); // never +>y5 : never + +let z0: (E.A | E.B | E.C) & (E.A | E.B | E.C); // E.A | E.B | E.C +>z0 : E.A | E.B | E.C +>E : any +>A : E.A +>E : any +>B : E.B +>E : any +>C : E.C +>E : any +>A : E.A +>E : any +>B : E.B +>E : any +>C : E.C + +let z1: (E.A | E.B | E.C) & (E.B | E.C | E.D); // E.B | E.C +>z1 : E.B | E.C +>E : any +>A : E.A +>E : any +>B : E.B +>E : any +>C : E.C +>E : any +>B : E.B +>E : any +>C : E.C +>E : any +>D : E.D + +let z2: (E.A | E.B | E.C) & (E.C | E.D | E.E); // E.C +>z2 : E.C +>E : any +>A : E.A +>E : any +>B : E.B +>E : any +>C : E.C +>E : any +>C : E.C +>E : any +>D : E.D +>E : any +>E : E.E + +let z3: (E.A | E.B | E.C) & (E.D | E.E | E.F); // never +>z3 : never +>E : any +>A : E.A +>E : any +>B : E.B +>E : any +>C : E.C +>E : any +>D : E.D +>E : any +>E : E.E +>E : any +>F : E.F + +let z4: (E.A | E.B | E.C) & (E.B | E.C | E.D) & (E.C | E.D | E.E); // E.C +>z4 : E.C +>E : any +>A : E.A +>E : any +>B : E.B +>E : any +>C : E.C +>E : any +>B : E.B +>E : any +>C : E.C +>E : any +>D : E.D +>E : any +>C : E.C +>E : any +>D : E.D +>E : any +>E : E.E + +let 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 +>z5 : never +>E : any +>A : E.A +>E : any +>B : E.B +>E : any +>C : E.C +>E : any +>B : E.B +>E : any +>C : E.C +>E : any +>D : E.D +>E : any +>C : E.C +>E : any +>D : E.D +>E : any +>E : E.E +>E : any +>D : E.D +>E : any +>E : E.E +>E : any +>F : E.F + diff --git a/tests/cases/conformance/types/intersection/intersectionOfUnionOfUnitTypes.ts b/tests/cases/conformance/types/intersection/intersectionOfUnionOfUnitTypes.ts new file mode 100644 index 00000000000..28492b1d94b --- /dev/null +++ b/tests/cases/conformance/types/intersection/intersectionOfUnionOfUnitTypes.ts @@ -0,0 +1,24 @@ +// @strict + +const enum E { A, B, C, D, E, F } + +let x0: ('a' | 'b' | 'c') & ('a' | 'b' | 'c'); // 'a' | 'b' | 'c' +let x1: ('a' | 'b' | 'c') & ('b' | 'c' | 'd'); // 'b' | 'c' +let x2: ('a' | 'b' | 'c') & ('c' | 'd' | 'e'); // 'c' +let x3: ('a' | 'b' | 'c') & ('d' | 'e' | 'f'); // never +let x4: ('a' | 'b' | 'c') & ('b' | 'c' | 'd') & ('c' | 'd' | 'e'); // 'c' +let x5: ('a' | 'b' | 'c') & ('b' | 'c' | 'd') & ('c' | 'd' | 'e') & ('d' | 'e' | 'f'); // never + +let y0: (0 | 1 | 2) & (0 | 1 | 2); // 0 | 1 | 2 +let y1: (0 | 1 | 2) & (1 | 2 | 3); // 1 | 2 +let y2: (0 | 1 | 2) & (2 | 3 | 4); // 2 +let y3: (0 | 1 | 2) & (3 | 4 | 5); // never +let y4: (0 | 1 | 2) & (1 | 2 | 3) & (2 | 3 | 4); // 2 +let y5: (0 | 1 | 2) & (1 | 2 | 3) & (2 | 3 | 4) & (3 | 4 | 5); // never + +let z0: (E.A | E.B | E.C) & (E.A | E.B | E.C); // E.A | E.B | E.C +let z1: (E.A | E.B | E.C) & (E.B | E.C | E.D); // E.B | E.C +let z2: (E.A | E.B | E.C) & (E.C | E.D | E.E); // E.C +let z3: (E.A | E.B | E.C) & (E.D | E.E | E.F); // never +let z4: (E.A | E.B | E.C) & (E.B | E.C | E.D) & (E.C | E.D | E.E); // E.C +let 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