Add tests for type parameter fixing

This commit is contained in:
Jason Freeman 2015-07-08 16:17:03 -07:00
parent f5ca456325
commit 263c54edd4
12 changed files with 410 additions and 0 deletions

View file

@ -0,0 +1,12 @@
//// [fixingTypeParametersRepeatedly1.ts]
declare function f<T>(x: T, y: (p: T) => T, z: (p: T) => T): T;
f("", x => null, x => x.toLowerCase());
// First overload of g should type check just like f
declare function g<T>(x: T, y: (p: T) => T, z: (p: T) => T): T;
declare function g();
g("", x => null, x => x.toLowerCase());
//// [fixingTypeParametersRepeatedly1.js]
f("", function (x) { return null; }, function (x) { return x.toLowerCase(); });
g("", function (x) { return null; }, function (x) { return x.toLowerCase(); });

View file

@ -0,0 +1,51 @@
=== tests/cases/compiler/fixingTypeParametersRepeatedly1.ts ===
declare function f<T>(x: T, y: (p: T) => T, z: (p: T) => T): T;
>f : Symbol(f, Decl(fixingTypeParametersRepeatedly1.ts, 0, 0))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 0, 19))
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly1.ts, 0, 22))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 0, 19))
>y : Symbol(y, Decl(fixingTypeParametersRepeatedly1.ts, 0, 27))
>p : Symbol(p, Decl(fixingTypeParametersRepeatedly1.ts, 0, 32))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 0, 19))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 0, 19))
>z : Symbol(z, Decl(fixingTypeParametersRepeatedly1.ts, 0, 43))
>p : Symbol(p, Decl(fixingTypeParametersRepeatedly1.ts, 0, 48))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 0, 19))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 0, 19))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 0, 19))
f("", x => null, x => x.toLowerCase());
>f : Symbol(f, Decl(fixingTypeParametersRepeatedly1.ts, 0, 0))
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly1.ts, 1, 5))
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly1.ts, 1, 16))
>x.toLowerCase : Symbol(String.toLowerCase, Decl(lib.d.ts, 399, 51))
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly1.ts, 1, 16))
>toLowerCase : Symbol(String.toLowerCase, Decl(lib.d.ts, 399, 51))
// First overload of g should type check just like f
declare function g<T>(x: T, y: (p: T) => T, z: (p: T) => T): T;
>g : Symbol(g, Decl(fixingTypeParametersRepeatedly1.ts, 1, 39), Decl(fixingTypeParametersRepeatedly1.ts, 4, 63))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 4, 19))
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly1.ts, 4, 22))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 4, 19))
>y : Symbol(y, Decl(fixingTypeParametersRepeatedly1.ts, 4, 27))
>p : Symbol(p, Decl(fixingTypeParametersRepeatedly1.ts, 4, 32))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 4, 19))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 4, 19))
>z : Symbol(z, Decl(fixingTypeParametersRepeatedly1.ts, 4, 43))
>p : Symbol(p, Decl(fixingTypeParametersRepeatedly1.ts, 4, 48))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 4, 19))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 4, 19))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly1.ts, 4, 19))
declare function g();
>g : Symbol(g, Decl(fixingTypeParametersRepeatedly1.ts, 1, 39), Decl(fixingTypeParametersRepeatedly1.ts, 4, 63))
g("", x => null, x => x.toLowerCase());
>g : Symbol(g, Decl(fixingTypeParametersRepeatedly1.ts, 1, 39), Decl(fixingTypeParametersRepeatedly1.ts, 4, 63))
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly1.ts, 6, 5))
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly1.ts, 6, 16))
>x.toLowerCase : Symbol(String.toLowerCase, Decl(lib.d.ts, 399, 51))
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly1.ts, 6, 16))
>toLowerCase : Symbol(String.toLowerCase, Decl(lib.d.ts, 399, 51))

View file

@ -0,0 +1,63 @@
=== tests/cases/compiler/fixingTypeParametersRepeatedly1.ts ===
declare function f<T>(x: T, y: (p: T) => T, z: (p: T) => T): T;
>f : <T>(x: T, y: (p: T) => T, z: (p: T) => T) => T
>T : T
>x : T
>T : T
>y : (p: T) => T
>p : T
>T : T
>T : T
>z : (p: T) => T
>p : T
>T : T
>T : T
>T : T
f("", x => null, x => x.toLowerCase());
>f("", x => null, x => x.toLowerCase()) : string
>f : <T>(x: T, y: (p: T) => T, z: (p: T) => T) => T
>"" : string
>x => null : (x: string) => any
>x : string
>null : null
>x => x.toLowerCase() : (x: string) => string
>x : string
>x.toLowerCase() : string
>x.toLowerCase : () => string
>x : string
>toLowerCase : () => string
// First overload of g should type check just like f
declare function g<T>(x: T, y: (p: T) => T, z: (p: T) => T): T;
>g : { <T>(x: T, y: (p: T) => T, z: (p: T) => T): T; (): any; }
>T : T
>x : T
>T : T
>y : (p: T) => T
>p : T
>T : T
>T : T
>z : (p: T) => T
>p : T
>T : T
>T : T
>T : T
declare function g();
>g : { <T>(x: T, y: (p: T) => T, z: (p: T) => T): T; (): any; }
g("", x => null, x => x.toLowerCase());
>g("", x => null, x => x.toLowerCase()) : string
>g : { <T>(x: T, y: (p: T) => T, z: (p: T) => T): T; (): any; }
>"" : string
>x => null : (x: string) => any
>x : string
>null : null
>x => x.toLowerCase() : (x: string) => string
>x : string
>x.toLowerCase() : string
>x.toLowerCase : () => string
>x : string
>toLowerCase : () => string

View file

@ -0,0 +1,32 @@
tests/cases/compiler/fixingTypeParametersRepeatedly2.ts(11,27): error TS2345: Argument of type '(d: Derived) => Base' is not assignable to parameter of type '(p: Derived) => Derived'.
Type 'Base' is not assignable to type 'Derived'.
Property 'toBase' is missing in type 'Base'.
tests/cases/compiler/fixingTypeParametersRepeatedly2.ts(17,27): error TS2345: Argument of type '(d: Derived) => Base' is not assignable to parameter of type '(p: Derived) => Derived'.
Type 'Base' is not assignable to type 'Derived'.
==== tests/cases/compiler/fixingTypeParametersRepeatedly2.ts (2 errors) ====
interface Base {
baseProp;
}
interface Derived extends Base {
toBase(): Base;
}
var derived: Derived;
declare function foo<T>(x: T, func: (p: T) => T): T;
var result = foo(derived, d => d.toBase());
~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '(d: Derived) => Base' is not assignable to parameter of type '(p: Derived) => Derived'.
!!! error TS2345: Type 'Base' is not assignable to type 'Derived'.
!!! error TS2345: Property 'toBase' is missing in type 'Base'.
// bar should type check just like foo.
// The same error should be observed in both cases.
declare function bar<T>(x: T, func: (p: T) => T): T;
declare function bar<T>(x: T, func: (p: T) => T): T;
var result = bar(derived, d => d.toBase());
~~~~~~~~~~~~~~~
!!! error TS2345: Argument of type '(d: Derived) => Base' is not assignable to parameter of type '(p: Derived) => Derived'.
!!! error TS2345: Type 'Base' is not assignable to type 'Derived'.

View file

@ -0,0 +1,23 @@
//// [fixingTypeParametersRepeatedly2.ts]
interface Base {
baseProp;
}
interface Derived extends Base {
toBase(): Base;
}
var derived: Derived;
declare function foo<T>(x: T, func: (p: T) => T): T;
var result = foo(derived, d => d.toBase());
// bar should type check just like foo.
// The same error should be observed in both cases.
declare function bar<T>(x: T, func: (p: T) => T): T;
declare function bar<T>(x: T, func: (p: T) => T): T;
var result = bar(derived, d => d.toBase());
//// [fixingTypeParametersRepeatedly2.js]
var derived;
var result = foo(derived, function (d) { return d.toBase(); });
var result = bar(derived, function (d) { return d.toBase(); });

View file

@ -0,0 +1,23 @@
//// [fixingTypeParametersRepeatedly3.ts]
interface Base {
baseProp;
}
interface Derived extends Base {
toBase?(): Base;
}
var derived: Derived;
declare function foo<T>(x: T, func: (p: T) => T): T;
var result = foo(derived, d => d.toBase());
// bar should type check just like foo.
// result2 should have the same type as result
declare function bar<T>(x: T, func: (p: T) => T): T;
declare function bar<T>(x: T, func: (p: T) => T): T;
var result2 = bar(derived, d => d.toBase());
//// [fixingTypeParametersRepeatedly3.js]
var derived;
var result = foo(derived, function (d) { return d.toBase(); });
var result2 = bar(derived, function (d) { return d.toBase(); });

View file

@ -0,0 +1,73 @@
=== tests/cases/compiler/fixingTypeParametersRepeatedly3.ts ===
interface Base {
>Base : Symbol(Base, Decl(fixingTypeParametersRepeatedly3.ts, 0, 0))
baseProp;
>baseProp : Symbol(baseProp, Decl(fixingTypeParametersRepeatedly3.ts, 0, 16))
}
interface Derived extends Base {
>Derived : Symbol(Derived, Decl(fixingTypeParametersRepeatedly3.ts, 2, 1))
>Base : Symbol(Base, Decl(fixingTypeParametersRepeatedly3.ts, 0, 0))
toBase?(): Base;
>toBase : Symbol(toBase, Decl(fixingTypeParametersRepeatedly3.ts, 3, 32))
>Base : Symbol(Base, Decl(fixingTypeParametersRepeatedly3.ts, 0, 0))
}
var derived: Derived;
>derived : Symbol(derived, Decl(fixingTypeParametersRepeatedly3.ts, 7, 3))
>Derived : Symbol(Derived, Decl(fixingTypeParametersRepeatedly3.ts, 2, 1))
declare function foo<T>(x: T, func: (p: T) => T): T;
>foo : Symbol(foo, Decl(fixingTypeParametersRepeatedly3.ts, 7, 21))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 9, 21))
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly3.ts, 9, 24))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 9, 21))
>func : Symbol(func, Decl(fixingTypeParametersRepeatedly3.ts, 9, 29))
>p : Symbol(p, Decl(fixingTypeParametersRepeatedly3.ts, 9, 37))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 9, 21))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 9, 21))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 9, 21))
var result = foo(derived, d => d.toBase());
>result : Symbol(result, Decl(fixingTypeParametersRepeatedly3.ts, 10, 3))
>foo : Symbol(foo, Decl(fixingTypeParametersRepeatedly3.ts, 7, 21))
>derived : Symbol(derived, Decl(fixingTypeParametersRepeatedly3.ts, 7, 3))
>d : Symbol(d, Decl(fixingTypeParametersRepeatedly3.ts, 10, 25))
>d.toBase : Symbol(Derived.toBase, Decl(fixingTypeParametersRepeatedly3.ts, 3, 32))
>d : Symbol(d, Decl(fixingTypeParametersRepeatedly3.ts, 10, 25))
>toBase : Symbol(Derived.toBase, Decl(fixingTypeParametersRepeatedly3.ts, 3, 32))
// bar should type check just like foo.
// result2 should have the same type as result
declare function bar<T>(x: T, func: (p: T) => T): T;
>bar : Symbol(bar, Decl(fixingTypeParametersRepeatedly3.ts, 10, 43), Decl(fixingTypeParametersRepeatedly3.ts, 14, 52))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 14, 21))
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly3.ts, 14, 24))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 14, 21))
>func : Symbol(func, Decl(fixingTypeParametersRepeatedly3.ts, 14, 29))
>p : Symbol(p, Decl(fixingTypeParametersRepeatedly3.ts, 14, 37))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 14, 21))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 14, 21))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 14, 21))
declare function bar<T>(x: T, func: (p: T) => T): T;
>bar : Symbol(bar, Decl(fixingTypeParametersRepeatedly3.ts, 10, 43), Decl(fixingTypeParametersRepeatedly3.ts, 14, 52))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 15, 21))
>x : Symbol(x, Decl(fixingTypeParametersRepeatedly3.ts, 15, 24))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 15, 21))
>func : Symbol(func, Decl(fixingTypeParametersRepeatedly3.ts, 15, 29))
>p : Symbol(p, Decl(fixingTypeParametersRepeatedly3.ts, 15, 37))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 15, 21))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 15, 21))
>T : Symbol(T, Decl(fixingTypeParametersRepeatedly3.ts, 15, 21))
var result2 = bar(derived, d => d.toBase());
>result2 : Symbol(result2, Decl(fixingTypeParametersRepeatedly3.ts, 16, 3))
>bar : Symbol(bar, Decl(fixingTypeParametersRepeatedly3.ts, 10, 43), Decl(fixingTypeParametersRepeatedly3.ts, 14, 52))
>derived : Symbol(derived, Decl(fixingTypeParametersRepeatedly3.ts, 7, 3))
>d : Symbol(d, Decl(fixingTypeParametersRepeatedly3.ts, 16, 26))
>d.toBase : Symbol(Derived.toBase, Decl(fixingTypeParametersRepeatedly3.ts, 3, 32))
>d : Symbol(d, Decl(fixingTypeParametersRepeatedly3.ts, 16, 26))
>toBase : Symbol(Derived.toBase, Decl(fixingTypeParametersRepeatedly3.ts, 3, 32))

View file

@ -0,0 +1,79 @@
=== tests/cases/compiler/fixingTypeParametersRepeatedly3.ts ===
interface Base {
>Base : Base
baseProp;
>baseProp : any
}
interface Derived extends Base {
>Derived : Derived
>Base : Base
toBase?(): Base;
>toBase : () => Base
>Base : Base
}
var derived: Derived;
>derived : Derived
>Derived : Derived
declare function foo<T>(x: T, func: (p: T) => T): T;
>foo : <T>(x: T, func: (p: T) => T) => T
>T : T
>x : T
>T : T
>func : (p: T) => T
>p : T
>T : T
>T : T
>T : T
var result = foo(derived, d => d.toBase());
>result : Derived
>foo(derived, d => d.toBase()) : Derived
>foo : <T>(x: T, func: (p: T) => T) => T
>derived : Derived
>d => d.toBase() : (d: Derived) => Base
>d : Derived
>d.toBase() : Base
>d.toBase : () => Base
>d : Derived
>toBase : () => Base
// bar should type check just like foo.
// result2 should have the same type as result
declare function bar<T>(x: T, func: (p: T) => T): T;
>bar : { <T>(x: T, func: (p: T) => T): T; <T>(x: T, func: (p: T) => T): T; }
>T : T
>x : T
>T : T
>func : (p: T) => T
>p : T
>T : T
>T : T
>T : T
declare function bar<T>(x: T, func: (p: T) => T): T;
>bar : { <T>(x: T, func: (p: T) => T): T; <T>(x: T, func: (p: T) => T): T; }
>T : T
>x : T
>T : T
>func : (p: T) => T
>p : T
>T : T
>T : T
>T : T
var result2 = bar(derived, d => d.toBase());
>result2 : Derived
>bar(derived, d => d.toBase()) : Derived
>bar : { <T>(x: T, func: (p: T) => T): T; <T>(x: T, func: (p: T) => T): T; }
>derived : Derived
>d => d.toBase() : (d: Derived) => Base
>d : Derived
>d.toBase() : Base
>d.toBase : () => Base
>d : Derived
>toBase : () => Base

View file

@ -0,0 +1,7 @@
declare function f<T>(x: T, y: (p: T) => T, z: (p: T) => T): T;
f("", x => null, x => x.toLowerCase());
// First overload of g should type check just like f
declare function g<T>(x: T, y: (p: T) => T, z: (p: T) => T): T;
declare function g();
g("", x => null, x => x.toLowerCase());

View file

@ -0,0 +1,17 @@
interface Base {
baseProp;
}
interface Derived extends Base {
toBase(): Base;
}
var derived: Derived;
declare function foo<T>(x: T, func: (p: T) => T): T;
var result = foo(derived, d => d.toBase());
// bar should type check just like foo.
// The same error should be observed in both cases.
declare function bar<T>(x: T, func: (p: T) => T): T;
declare function bar<T>(x: T, func: (p: T) => T): T;
var result = bar(derived, d => d.toBase());

View file

@ -0,0 +1,17 @@
interface Base {
baseProp;
}
interface Derived extends Base {
toBase?(): Base;
}
var derived: Derived;
declare function foo<T>(x: T, func: (p: T) => T): T;
var result = foo(derived, d => d.toBase());
// bar should type check just like foo.
// result2 should have the same type as result
declare function bar<T>(x: T, func: (p: T) => T): T;
declare function bar<T>(x: T, func: (p: T) => T): T;
var result2 = bar(derived, d => d.toBase());

View file

@ -0,0 +1,13 @@
/// <reference path='fourslash.ts'/>
////declare function f<T>(x: T, y: (p: T) => T, z: (p: T) => T): T;
////var /*1*/result = /*2*/f(0, /*3*/x => null, /*4*/x => x.blahblah);
goTo.marker('1');
verify.quickInfoIs('var result: number');
goTo.marker('2');
verify.quickInfoIs('function f<number>(x: number, y: (p: number) => number, z: (p: number) => number): number');
goTo.marker('3');
verify.quickInfoIs('(parameter) x: number');
goTo.marker('4');
verify.quickInfoIs('(parameter) x: number');