From 0b5284d77ea1f715d10b1d4e5196e9efe39351d0 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Wed, 5 Apr 2017 11:22:21 -0700 Subject: [PATCH] Add tests --- .../reference/intersectionsAndEmptyObjects.js | 45 +++++++++ .../intersectionsAndEmptyObjects.symbols | 94 +++++++++++++++++++ .../intersectionsAndEmptyObjects.types | 94 +++++++++++++++++++ .../intersectionsAndEmptyObjects.ts | 25 +++++ 4 files changed, 258 insertions(+) create mode 100644 tests/baselines/reference/intersectionsAndEmptyObjects.js create mode 100644 tests/baselines/reference/intersectionsAndEmptyObjects.symbols create mode 100644 tests/baselines/reference/intersectionsAndEmptyObjects.types create mode 100644 tests/cases/conformance/types/intersection/intersectionsAndEmptyObjects.ts diff --git a/tests/baselines/reference/intersectionsAndEmptyObjects.js b/tests/baselines/reference/intersectionsAndEmptyObjects.js new file mode 100644 index 00000000000..1ac9606c3a9 --- /dev/null +++ b/tests/baselines/reference/intersectionsAndEmptyObjects.js @@ -0,0 +1,45 @@ +//// [intersectionsAndEmptyObjects.ts] +// Empty object type literals are removed from intersections types +// that contain other object types + +type A = { a: number }; +type B = { b: string }; +type C = {}; + +let x01: A & B; +let x02: A & C; +let x03: B & C; +let x04: A & B & C; +let x05: string & C; +let x06: C & string; +let x07: C; +let x08: C & {}; +let x09: {} & A & {} & B & {} & C & {}; + +interface D {} +interface E {} + +let x10: A & D; +let x11: C & D; +let x12: A & B & C & D; +let x13: D & E; +let x14: A & B & C & D & E; + + +//// [intersectionsAndEmptyObjects.js] +// Empty object type literals are removed from intersections types +// that contain other object types +var x01; +var x02; +var x03; +var x04; +var x05; +var x06; +var x07; +var x08; +var x09; +var x10; +var x11; +var x12; +var x13; +var x14; diff --git a/tests/baselines/reference/intersectionsAndEmptyObjects.symbols b/tests/baselines/reference/intersectionsAndEmptyObjects.symbols new file mode 100644 index 00000000000..14189a1c10b --- /dev/null +++ b/tests/baselines/reference/intersectionsAndEmptyObjects.symbols @@ -0,0 +1,94 @@ +=== tests/cases/conformance/types/intersection/intersectionsAndEmptyObjects.ts === +// Empty object type literals are removed from intersections types +// that contain other object types + +type A = { a: number }; +>A : Symbol(A, Decl(intersectionsAndEmptyObjects.ts, 0, 0)) +>a : Symbol(a, Decl(intersectionsAndEmptyObjects.ts, 3, 10)) + +type B = { b: string }; +>B : Symbol(B, Decl(intersectionsAndEmptyObjects.ts, 3, 23)) +>b : Symbol(b, Decl(intersectionsAndEmptyObjects.ts, 4, 10)) + +type C = {}; +>C : Symbol(C, Decl(intersectionsAndEmptyObjects.ts, 4, 23)) + +let x01: A & B; +>x01 : Symbol(x01, Decl(intersectionsAndEmptyObjects.ts, 7, 3)) +>A : Symbol(A, Decl(intersectionsAndEmptyObjects.ts, 0, 0)) +>B : Symbol(B, Decl(intersectionsAndEmptyObjects.ts, 3, 23)) + +let x02: A & C; +>x02 : Symbol(x02, Decl(intersectionsAndEmptyObjects.ts, 8, 3)) +>A : Symbol(A, Decl(intersectionsAndEmptyObjects.ts, 0, 0)) +>C : Symbol(C, Decl(intersectionsAndEmptyObjects.ts, 4, 23)) + +let x03: B & C; +>x03 : Symbol(x03, Decl(intersectionsAndEmptyObjects.ts, 9, 3)) +>B : Symbol(B, Decl(intersectionsAndEmptyObjects.ts, 3, 23)) +>C : Symbol(C, Decl(intersectionsAndEmptyObjects.ts, 4, 23)) + +let x04: A & B & C; +>x04 : Symbol(x04, Decl(intersectionsAndEmptyObjects.ts, 10, 3)) +>A : Symbol(A, Decl(intersectionsAndEmptyObjects.ts, 0, 0)) +>B : Symbol(B, Decl(intersectionsAndEmptyObjects.ts, 3, 23)) +>C : Symbol(C, Decl(intersectionsAndEmptyObjects.ts, 4, 23)) + +let x05: string & C; +>x05 : Symbol(x05, Decl(intersectionsAndEmptyObjects.ts, 11, 3)) +>C : Symbol(C, Decl(intersectionsAndEmptyObjects.ts, 4, 23)) + +let x06: C & string; +>x06 : Symbol(x06, Decl(intersectionsAndEmptyObjects.ts, 12, 3)) +>C : Symbol(C, Decl(intersectionsAndEmptyObjects.ts, 4, 23)) + +let x07: C; +>x07 : Symbol(x07, Decl(intersectionsAndEmptyObjects.ts, 13, 3)) +>C : Symbol(C, Decl(intersectionsAndEmptyObjects.ts, 4, 23)) + +let x08: C & {}; +>x08 : Symbol(x08, Decl(intersectionsAndEmptyObjects.ts, 14, 3)) +>C : Symbol(C, Decl(intersectionsAndEmptyObjects.ts, 4, 23)) + +let x09: {} & A & {} & B & {} & C & {}; +>x09 : Symbol(x09, Decl(intersectionsAndEmptyObjects.ts, 15, 3)) +>A : Symbol(A, Decl(intersectionsAndEmptyObjects.ts, 0, 0)) +>B : Symbol(B, Decl(intersectionsAndEmptyObjects.ts, 3, 23)) +>C : Symbol(C, Decl(intersectionsAndEmptyObjects.ts, 4, 23)) + +interface D {} +>D : Symbol(D, Decl(intersectionsAndEmptyObjects.ts, 15, 39)) + +interface E {} +>E : Symbol(E, Decl(intersectionsAndEmptyObjects.ts, 17, 14)) + +let x10: A & D; +>x10 : Symbol(x10, Decl(intersectionsAndEmptyObjects.ts, 20, 3)) +>A : Symbol(A, Decl(intersectionsAndEmptyObjects.ts, 0, 0)) +>D : Symbol(D, Decl(intersectionsAndEmptyObjects.ts, 15, 39)) + +let x11: C & D; +>x11 : Symbol(x11, Decl(intersectionsAndEmptyObjects.ts, 21, 3)) +>C : Symbol(C, Decl(intersectionsAndEmptyObjects.ts, 4, 23)) +>D : Symbol(D, Decl(intersectionsAndEmptyObjects.ts, 15, 39)) + +let x12: A & B & C & D; +>x12 : Symbol(x12, Decl(intersectionsAndEmptyObjects.ts, 22, 3)) +>A : Symbol(A, Decl(intersectionsAndEmptyObjects.ts, 0, 0)) +>B : Symbol(B, Decl(intersectionsAndEmptyObjects.ts, 3, 23)) +>C : Symbol(C, Decl(intersectionsAndEmptyObjects.ts, 4, 23)) +>D : Symbol(D, Decl(intersectionsAndEmptyObjects.ts, 15, 39)) + +let x13: D & E; +>x13 : Symbol(x13, Decl(intersectionsAndEmptyObjects.ts, 23, 3)) +>D : Symbol(D, Decl(intersectionsAndEmptyObjects.ts, 15, 39)) +>E : Symbol(E, Decl(intersectionsAndEmptyObjects.ts, 17, 14)) + +let x14: A & B & C & D & E; +>x14 : Symbol(x14, Decl(intersectionsAndEmptyObjects.ts, 24, 3)) +>A : Symbol(A, Decl(intersectionsAndEmptyObjects.ts, 0, 0)) +>B : Symbol(B, Decl(intersectionsAndEmptyObjects.ts, 3, 23)) +>C : Symbol(C, Decl(intersectionsAndEmptyObjects.ts, 4, 23)) +>D : Symbol(D, Decl(intersectionsAndEmptyObjects.ts, 15, 39)) +>E : Symbol(E, Decl(intersectionsAndEmptyObjects.ts, 17, 14)) + diff --git a/tests/baselines/reference/intersectionsAndEmptyObjects.types b/tests/baselines/reference/intersectionsAndEmptyObjects.types new file mode 100644 index 00000000000..b3db1764e3c --- /dev/null +++ b/tests/baselines/reference/intersectionsAndEmptyObjects.types @@ -0,0 +1,94 @@ +=== tests/cases/conformance/types/intersection/intersectionsAndEmptyObjects.ts === +// Empty object type literals are removed from intersections types +// that contain other object types + +type A = { a: number }; +>A : A +>a : number + +type B = { b: string }; +>B : B +>b : string + +type C = {}; +>C : C + +let x01: A & B; +>x01 : A & B +>A : A +>B : B + +let x02: A & C; +>x02 : A +>A : A +>C : C + +let x03: B & C; +>x03 : B +>B : B +>C : C + +let x04: A & B & C; +>x04 : A & B +>A : A +>B : B +>C : C + +let x05: string & C; +>x05 : string & {} +>C : C + +let x06: C & string; +>x06 : string & {} +>C : C + +let x07: C; +>x07 : C +>C : C + +let x08: C & {}; +>x08 : {} +>C : C + +let x09: {} & A & {} & B & {} & C & {}; +>x09 : A & B +>A : A +>B : B +>C : C + +interface D {} +>D : D + +interface E {} +>E : E + +let x10: A & D; +>x10 : A & D +>A : A +>D : D + +let x11: C & D; +>x11 : D +>C : C +>D : D + +let x12: A & B & C & D; +>x12 : A & B & D +>A : A +>B : B +>C : C +>D : D + +let x13: D & E; +>x13 : D & E +>D : D +>E : E + +let x14: A & B & C & D & E; +>x14 : A & B & D & E +>A : A +>B : B +>C : C +>D : D +>E : E + diff --git a/tests/cases/conformance/types/intersection/intersectionsAndEmptyObjects.ts b/tests/cases/conformance/types/intersection/intersectionsAndEmptyObjects.ts new file mode 100644 index 00000000000..86ff93281c0 --- /dev/null +++ b/tests/cases/conformance/types/intersection/intersectionsAndEmptyObjects.ts @@ -0,0 +1,25 @@ +// Empty object type literals are removed from intersections types +// that contain other object types + +type A = { a: number }; +type B = { b: string }; +type C = {}; + +let x01: A & B; +let x02: A & C; +let x03: B & C; +let x04: A & B & C; +let x05: string & C; +let x06: C & string; +let x07: C; +let x08: C & {}; +let x09: {} & A & {} & B & {} & C & {}; + +interface D {} +interface E {} + +let x10: A & D; +let x11: C & D; +let x12: A & B & C & D; +let x13: D & E; +let x14: A & B & C & D & E;