From 50f84b12a2ad5fef8294410c2cdfcce35b49a577 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sat, 8 Apr 2017 14:19:25 -0700 Subject: [PATCH] Add tests --- .../reference/covariantCallbacks.errors.txt | 105 ++++++++++++++++++ .../baselines/reference/covariantCallbacks.js | 82 ++++++++++++++ .../covariantCallbacks.ts | 59 ++++++++++ 3 files changed, 246 insertions(+) create mode 100644 tests/baselines/reference/covariantCallbacks.errors.txt create mode 100644 tests/baselines/reference/covariantCallbacks.js create mode 100644 tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts diff --git a/tests/baselines/reference/covariantCallbacks.errors.txt b/tests/baselines/reference/covariantCallbacks.errors.txt new file mode 100644 index 00000000000..3a1ea25b96e --- /dev/null +++ b/tests/baselines/reference/covariantCallbacks.errors.txt @@ -0,0 +1,105 @@ +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts(12,5): error TS2322: Type 'P' is not assignable to type 'P'. + Type 'A' is not assignable to type 'B'. + Property 'b' is missing in type 'A'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts(17,5): error TS2322: Type 'Promise' is not assignable to type 'Promise'. + Type 'A' is not assignable to type 'B'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts(30,5): error TS2322: Type 'AList1' is not assignable to type 'BList1'. + Types of property 'forEach' are incompatible. + Type '(cb: (item: A) => void) => void' is not assignable to type '(cb: (item: B) => void) => void'. + Types of parameters 'cb' and 'cb' are incompatible. + Types of parameters 'item' and 'item' are incompatible. + Type 'A' is not assignable to type 'B'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts(43,5): error TS2322: Type 'AList2' is not assignable to type 'BList2'. + Types of property 'forEach' are incompatible. + Type '(cb: (item: A) => boolean) => void' is not assignable to type '(cb: (item: A) => void) => void'. + Types of parameters 'cb' and 'cb' are incompatible. + Type 'void' is not assignable to type 'boolean'. +tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts(56,5): error TS2322: Type 'AList3' is not assignable to type 'BList3'. + Types of property 'forEach' are incompatible. + Type '(cb: (item: A) => void) => void' is not assignable to type '(cb: (item: A, context: any) => void) => void'. + Types of parameters 'cb' and 'cb' are incompatible. + + +==== tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts (5 errors) ==== + // Test that callback parameters are related covariantly + + interface P { + then(cb: (value: T) => void): void; + }; + + interface A { a: string } + interface B extends A { b: string } + + function f1(a: P, b: P) { + a = b; + b = a; // Error + ~ +!!! error TS2322: Type 'P' is not assignable to type 'P'. +!!! error TS2322: Type 'A' is not assignable to type 'B'. +!!! error TS2322: Property 'b' is missing in type 'A'. + } + + function f2(a: Promise, b: Promise) { + a = b; + b = a; // Error + ~ +!!! error TS2322: Type 'Promise' is not assignable to type 'Promise'. +!!! error TS2322: Type 'A' is not assignable to type 'B'. + } + + interface AList1 { + forEach(cb: (item: A) => void): void; + } + + interface BList1 { + forEach(cb: (item: B) => void): void; + } + + function f11(a: AList1, b: BList1) { + a = b; + b = a; // Error + ~ +!!! error TS2322: Type 'AList1' is not assignable to type 'BList1'. +!!! error TS2322: Types of property 'forEach' are incompatible. +!!! error TS2322: Type '(cb: (item: A) => void) => void' is not assignable to type '(cb: (item: B) => void) => void'. +!!! error TS2322: Types of parameters 'cb' and 'cb' are incompatible. +!!! error TS2322: Types of parameters 'item' and 'item' are incompatible. +!!! error TS2322: Type 'A' is not assignable to type 'B'. + } + + interface AList2 { + forEach(cb: (item: A) => boolean): void; + } + + interface BList2 { + forEach(cb: (item: A) => void): void; + } + + function f12(a: AList2, b: BList2) { + a = b; + b = a; // Error + ~ +!!! error TS2322: Type 'AList2' is not assignable to type 'BList2'. +!!! error TS2322: Types of property 'forEach' are incompatible. +!!! error TS2322: Type '(cb: (item: A) => boolean) => void' is not assignable to type '(cb: (item: A) => void) => void'. +!!! error TS2322: Types of parameters 'cb' and 'cb' are incompatible. +!!! error TS2322: Type 'void' is not assignable to type 'boolean'. + } + + interface AList3 { + forEach(cb: (item: A) => void): void; + } + + interface BList3 { + forEach(cb: (item: A, context: any) => void): void; + } + + function f13(a: AList3, b: BList3) { + a = b; + b = a; // Error + ~ +!!! error TS2322: Type 'AList3' is not assignable to type 'BList3'. +!!! error TS2322: Types of property 'forEach' are incompatible. +!!! error TS2322: Type '(cb: (item: A) => void) => void' is not assignable to type '(cb: (item: A, context: any) => void) => void'. +!!! error TS2322: Types of parameters 'cb' and 'cb' are incompatible. + } \ No newline at end of file diff --git a/tests/baselines/reference/covariantCallbacks.js b/tests/baselines/reference/covariantCallbacks.js new file mode 100644 index 00000000000..fb2ecfbc3c1 --- /dev/null +++ b/tests/baselines/reference/covariantCallbacks.js @@ -0,0 +1,82 @@ +//// [covariantCallbacks.ts] +// Test that callback parameters are related covariantly + +interface P { + then(cb: (value: T) => void): void; +}; + +interface A { a: string } +interface B extends A { b: string } + +function f1(a: P, b: P) { + a = b; + b = a; // Error +} + +function f2(a: Promise, b: Promise) { + a = b; + b = a; // Error +} + +interface AList1 { + forEach(cb: (item: A) => void): void; +} + +interface BList1 { + forEach(cb: (item: B) => void): void; +} + +function f11(a: AList1, b: BList1) { + a = b; + b = a; // Error +} + +interface AList2 { + forEach(cb: (item: A) => boolean): void; +} + +interface BList2 { + forEach(cb: (item: A) => void): void; +} + +function f12(a: AList2, b: BList2) { + a = b; + b = a; // Error +} + +interface AList3 { + forEach(cb: (item: A) => void): void; +} + +interface BList3 { + forEach(cb: (item: A, context: any) => void): void; +} + +function f13(a: AList3, b: BList3) { + a = b; + b = a; // Error +} + +//// [covariantCallbacks.js] +// Test that callback parameters are related covariantly +; +function f1(a, b) { + a = b; + b = a; // Error +} +function f2(a, b) { + a = b; + b = a; // Error +} +function f11(a, b) { + a = b; + b = a; // Error +} +function f12(a, b) { + a = b; + b = a; // Error +} +function f13(a, b) { + a = b; + b = a; // Error +} diff --git a/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts new file mode 100644 index 00000000000..c46f396f414 --- /dev/null +++ b/tests/cases/conformance/types/typeRelationships/assignmentCompatibility/covariantCallbacks.ts @@ -0,0 +1,59 @@ +// @target: es2015 + +// Test that callback parameters are related covariantly + +interface P { + then(cb: (value: T) => void): void; +}; + +interface A { a: string } +interface B extends A { b: string } + +function f1(a: P, b: P) { + a = b; + b = a; // Error +} + +function f2(a: Promise, b: Promise) { + a = b; + b = a; // Error +} + +interface AList1 { + forEach(cb: (item: A) => void): void; +} + +interface BList1 { + forEach(cb: (item: B) => void): void; +} + +function f11(a: AList1, b: BList1) { + a = b; + b = a; // Error +} + +interface AList2 { + forEach(cb: (item: A) => boolean): void; +} + +interface BList2 { + forEach(cb: (item: A) => void): void; +} + +function f12(a: AList2, b: BList2) { + a = b; + b = a; // Error +} + +interface AList3 { + forEach(cb: (item: A) => void): void; +} + +interface BList3 { + forEach(cb: (item: A, context: any) => void): void; +} + +function f13(a: AList3, b: BList3) { + a = b; + b = a; // Error +} \ No newline at end of file