| OLD | NEW | 
|---|
| 1 /// <reference path="../typings/mocha/mocha.d.ts"/> | 1 /// <reference path="../typings/mocha/mocha.d.ts"/> | 
| 2 import {expectTranslate} from './test_support'; | 2 import {expectTranslate} from './test_support'; | 
| 3 | 3 | 
| 4 // TODO(jacobr): merge these tests back in with the other tests. These tests are | 4 // TODO(jacobr): merge these tests back in with the other tests. These tests are | 
| 5 // only separate because we expected at one point to integrate with TS2Dart | 5 // only separate because we expected at one point to integrate with TS2Dart | 
| 6 // instead of refactoring TS2Dart to only output facades. | 6 // instead of refactoring TS2Dart to only output facades. | 
| 7 describe('variables', () => { | 7 describe('variables', () => { | 
| 8   it('should print variable declaration', () => { | 8   it('should print variable declaration', () => { | 
| 9     expectTranslate('var a:number;').to.equal(`@JS() | 9     expectTranslate('var a:number;').to.equal(`@JS() | 
| 10 external num get a; | 10 external num get a; | 
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 272       expectTranslate('class X<T> { Z(): X<T> {} }').to.equal(`@JS() | 272       expectTranslate('class X<T> { Z(): X<T> {} }').to.equal(`@JS() | 
| 273 class X<T> { | 273 class X<T> { | 
| 274   // @Ignore | 274   // @Ignore | 
| 275   X.fakeConstructor$(); | 275   X.fakeConstructor$(); | 
| 276   external X<T> Z(); | 276   external X<T> Z(); | 
| 277 }`); | 277 }`); | 
| 278     }); | 278     }); | 
| 279     it('merge overrides', () => { | 279     it('merge overrides', () => { | 
| 280       expectTranslate(` | 280       expectTranslate(` | 
| 281 class X { | 281 class X { | 
| 282   createElement(tagName: "img"): HTMLImageElement; | 282   createElement<T>(tagName: "img"): T; | 
| 283   createElement(tagName: "video"): HTMLVideoElement; | 283   createElement<T>(tagName: "video"): T; | 
| 284   createElement(tagName: string): HTMLElement; | 284   createElement<T>(tagName: string): T; | 
|  | 285 }`).to.equal(`@JS() | 
|  | 286 class X { | 
|  | 287   // @Ignore | 
|  | 288   X.fakeConstructor$(); | 
|  | 289   /*external T createElement<T>('img' tagName);*/ | 
|  | 290   /*external T createElement<T>('video' tagName);*/ | 
|  | 291   /*external T createElement<T>(String tagName);*/ | 
|  | 292   external dynamic/*=T*/ createElement/*<T>*/( | 
|  | 293       String /*'img'|'video'|String*/ tagName); | 
|  | 294 }`); | 
|  | 295 | 
|  | 296       expectTranslate(` | 
|  | 297 class X { | 
|  | 298   createElement<T>(tagName: "img"): T; | 
|  | 299   createElement<T>(tagName: "video"): T; | 
|  | 300   createElement<V>(tagName: string): V; | 
|  | 301 }`).to.equal(`@JS() | 
|  | 302 class X { | 
|  | 303   // @Ignore | 
|  | 304   X.fakeConstructor$(); | 
|  | 305   /*external T createElement<T>('img' tagName);*/ | 
|  | 306   /*external T createElement<T>('video' tagName);*/ | 
|  | 307   /*external V createElement<V>(String tagName);*/ | 
|  | 308   external dynamic /*T|V*/ createElement/*<T, V>*/( | 
|  | 309       String /*'img'|'video'|String*/ tagName); | 
|  | 310 }`); | 
|  | 311 | 
|  | 312       expectTranslate(` | 
|  | 313 class X { | 
|  | 314   createElement<T extends HTMLImageElement>(tagName: "img"): T; | 
|  | 315   createElement<T extends HTMLVideoElement>(tagName: "video"): T; | 
|  | 316   createElement<T extends Element>(tagName: string): T; | 
| 285 }`).to.equal(`import "dart:html"; | 317 }`).to.equal(`import "dart:html"; | 
| 286 | 318 | 
| 287 @JS() | 319 @JS() | 
| 288 class X { | 320 class X { | 
| 289   // @Ignore | 321   // @Ignore | 
| 290   X.fakeConstructor$(); | 322   X.fakeConstructor$(); | 
| 291   /*external ImageElement createElement("img" tagName);*/ | 323   /*external T createElement<T extends ImageElement>('img' tagName);*/ | 
| 292   /*external VideoElement createElement("video" tagName);*/ | 324   /*external T createElement<T extends VideoElement>('video' tagName);*/ | 
| 293   /*external HtmlElement createElement(String tagName);*/ | 325   /*external T createElement<T extends Element>(String tagName);*/ | 
| 294   external dynamic /*ImageElement|VideoElement|HtmlElement*/ createElement( | 326   external dynamic/*=T*/ createElement/*<T>*/( | 
| 295       String tagName); | 327       String /*'img'|'video'|String*/ tagName); | 
| 296 }`); | 328 }`); | 
|  | 329 | 
|  | 330       expectTranslate(`export interface ScaleLinear<O> { | 
|  | 331     (value: number): Output; | 
|  | 332     domain(): Array<O>; | 
|  | 333 } | 
|  | 334 | 
|  | 335 export function scaleLinear(): ScaleLinear<number>; | 
|  | 336 export function scaleLinear<O>(): ScaleLinear<O>;`) | 
|  | 337           .to.equal(`@anonymous | 
|  | 338 @JS() | 
|  | 339 abstract class ScaleLinear<O> { | 
|  | 340   external Output call(num value); | 
|  | 341   external List<O> domain(); | 
|  | 342 } | 
|  | 343 | 
|  | 344 /*external ScaleLinear<num> scaleLinear();*/ | 
|  | 345 /*external ScaleLinear<O> scaleLinear<O>();*/ | 
|  | 346 @JS() | 
|  | 347 external ScaleLinear /*ScaleLinear<num>|ScaleLinear<O>*/ scaleLinear/*<O>*/();`)
     ; | 
|  | 348 | 
| 297       expectTranslate(` | 349       expectTranslate(` | 
| 298 class X { | 350 class X { | 
| 299   F(a:string):num; | 351   F(a:string):num; | 
| 300   F(a:string, b: string|num):string; | 352   F(a:string, b: string|num):string; | 
| 301   F(a2:string, b: string, c: num):string; | 353   F(a2:string, b: string, c: num):string; | 
| 302 }`).to.equal(`@JS() | 354 }`).to.equal(`@JS() | 
| 303 class X { | 355 class X { | 
| 304   // @Ignore | 356   // @Ignore | 
| 305   X.fakeConstructor$(); | 357   X.fakeConstructor$(); | 
| 306   /*external num F(String a);*/ | 358   /*external num F(String a);*/ | 
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 350       expectTranslate(` | 402       expectTranslate(` | 
| 351 interface SampleAudioNode { | 403 interface SampleAudioNode { | 
| 352   addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boo
     lean): void; | 404   addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boo
     lean): void; | 
| 353   addEventListener(type: string, listener: EventListenerOrEventListenerObject, u
     seCapture?: boolean): void; | 405   addEventListener(type: string, listener: EventListenerOrEventListenerObject, u
     seCapture?: boolean): void; | 
| 354 }`).to.equal(`import "dart:html"; | 406 }`).to.equal(`import "dart:html"; | 
| 355 import "package:func/func.dart"; | 407 import "package:func/func.dart"; | 
| 356 | 408 | 
| 357 @anonymous | 409 @anonymous | 
| 358 @JS() | 410 @JS() | 
| 359 abstract class SampleAudioNode { | 411 abstract class SampleAudioNode { | 
| 360   /*external void addEventListener("ended" type, dynamic listener(Event ev), [bo
     ol useCapture]);*/ | 412   /*external void addEventListener('ended' type, dynamic listener(Event ev), [bo
     ol useCapture]);*/ | 
| 361   /*external void addEventListener(String type, EventListener|EventListenerObjec
     t listener, [bool useCapture]);*/ | 413   /*external void addEventListener(String type, EventListener|EventListenerObjec
     t listener, [bool useCapture]);*/ | 
| 362   external void addEventListener(String type, | 414   external void addEventListener(String /*'ended'|String*/ type, | 
| 363       dynamic /*Func1<Event, dynamic>|EventListener|EventListenerObject*/ listen
     er, | 415       dynamic /*Func1<Event, dynamic>|EventListener|EventListenerObject*/ listen
     er, | 
| 364       [bool useCapture]); | 416       [bool useCapture]); | 
| 365 }`); | 417 }`); | 
| 366 | 418 | 
| 367       expectTranslate(` | 419       expectTranslate(` | 
| 368 interface ListenObject { | 420 interface ListenObject { | 
| 369     someDummyMethod(evt: string): void; | 421     someDummyMethod(evt: string): void; | 
| 370 } | 422 } | 
| 371 | 423 | 
| 372 interface ExampleListener { | 424 interface ExampleListener { | 
| 373     (evt: string): void; | 425     (evt: string): void; | 
| 374 } | 426 } | 
| 375 | 427 | 
| 376 interface DummySample { | 428 interface DummySample { | 
| 377   addEventListener(type: "ended", listener: ListenObject): void; | 429   addEventListener(type: 'ended', listener: ListenObject): void; | 
| 378   addEventListener(type: string, listener: ExampleListener): void; | 430   addEventListener(type: string, listener: ExampleListener): void; | 
| 379 }`).to.equal(`@anonymous | 431 }`).to.equal(`@anonymous | 
| 380 @JS() | 432 @JS() | 
| 381 abstract class ListenObject { | 433 abstract class ListenObject { | 
| 382   external void someDummyMethod(String evt); | 434   external void someDummyMethod(String evt); | 
| 383 } | 435 } | 
| 384 | 436 | 
| 385 typedef void ExampleListener(String evt); | 437 typedef void ExampleListener(String evt); | 
| 386 | 438 | 
| 387 @anonymous | 439 @anonymous | 
| 388 @JS() | 440 @JS() | 
| 389 abstract class DummySample { | 441 abstract class DummySample { | 
| 390   /*external void addEventListener("ended" type, ListenObject listener);*/ | 442   /*external void addEventListener('ended' type, ListenObject listener);*/ | 
| 391   /*external void addEventListener(String type, ExampleListener listener);*/ | 443   /*external void addEventListener(String type, ExampleListener listener);*/ | 
| 392   external void addEventListener( | 444   external void addEventListener(String /*'ended'|String*/ type, | 
| 393       String type, dynamic /*ListenObject|ExampleListener*/ listener); | 445       dynamic /*ListenObject|ExampleListener*/ listener); | 
| 394 }`); | 446 }`); | 
| 395 | 447 | 
| 396       expectTranslate(` | 448       expectTranslate(` | 
| 397 interface ListenAny { | 449 interface ListenAny { | 
| 398     (evt: any): void; | 450     (evt: any): void; | 
| 399 } | 451 } | 
| 400 | 452 | 
| 401 interface ExampleListener { | 453 interface ExampleListener { | 
| 402     (evt: string): void; | 454     (evt: string): void; | 
| 403 } | 455 } | 
| 404 | 456 | 
| 405 interface DummySample { | 457 interface DummySample { | 
| 406   addEventListener(type: "ended", listener: ListenAny): void; | 458   addEventListener(type: 'ended', listener: ListenAny): void; | 
| 407   addEventListener(type: string, listener: ExampleListener): void; | 459   addEventListener(type: string, listener: ExampleListener): void; | 
| 408 }`).to.equal(`typedef void ListenAny(dynamic evt); | 460 }`).to.equal(`typedef void ListenAny(dynamic evt); | 
| 409 typedef void ExampleListener(String evt); | 461 typedef void ExampleListener(String evt); | 
| 410 | 462 | 
| 411 @anonymous | 463 @anonymous | 
| 412 @JS() | 464 @JS() | 
| 413 abstract class DummySample { | 465 abstract class DummySample { | 
| 414   /*external void addEventListener("ended" type, ListenAny listener);*/ | 466   /*external void addEventListener('ended' type, ListenAny listener);*/ | 
| 415   /*external void addEventListener(String type, ExampleListener listener);*/ | 467   /*external void addEventListener(String type, ExampleListener listener);*/ | 
| 416   external void addEventListener( | 468   external void addEventListener(String /*'ended'|String*/ type, | 
| 417       String type, Function /*ListenAny|ExampleListener*/ listener); | 469       Function /*ListenAny|ExampleListener*/ listener); | 
| 418 }`); | 470 }`); | 
| 419 | 471 | 
| 420     }); | 472     }); | 
| 421     it('dot dot dot', () => { | 473     it('dot dot dot', () => { | 
| 422       expectTranslate(` | 474       expectTranslate(` | 
| 423 function buildName(firstName: string, ...restOfName: string[]): string; | 475 function buildName(firstName: string, ...restOfName: string[]): string; | 
| 424 `).to.equal(`@JS() | 476 `).to.equal(`@JS() | 
| 425 external String buildName(String firstName, | 477 external String buildName(String firstName, | 
| 426     [String restOfName1, | 478     [String restOfName1, | 
| 427     String restOfName2, | 479     String restOfName2, | 
| 428     String restOfName3, | 480     String restOfName3, | 
| 429     String restOfName4, | 481     String restOfName4, | 
| 430     String restOfName5]);`); | 482     String restOfName5]);`); | 
| 431       expectTranslate(` | 483       expectTranslate(` | 
| 432 function log(...args);`) | 484 function log(...args);`) | 
| 433           .to.equal(`@JS() | 485           .to.equal(`@JS() | 
| 434 external log([args1, args2, args3, args4, args5]);`); | 486 external log([args1, args2, args3, args4, args5]);`); | 
| 435     }); | 487     }); | 
| 436     it('interface constructors', () => { | 488     it('interface constructors', () => { | 
| 437       expectTranslate(` | 489       expectTranslate(` | 
| 438 interface C { | 490 interface C { | 
| 439   oncached: (ev: Event) => any; | 491   oncached: (ev: Event) => any; | 
| 440 } | 492 } | 
| 441 declare var C: {new(): C; CHECKING: number; }`) | 493 declare var C: {new(): C; CHECKING: number; }`) | 
| 442           .to.equal(`import "package:func/func.dart"; | 494           .to.equal(`import "package:func/func.dart"; | 
| 443 import "dart:html"; | 495 import "dart:html"; | 
| 444 | 496 | 
| 445 @JS() | 497 @JS("C") | 
| 446 abstract class C { | 498 abstract class C { | 
| 447   external Func1<Event, dynamic> get oncached; | 499   external Func1<Event, dynamic> get oncached; | 
| 448   external set oncached(Func1<Event, dynamic> v); | 500   external set oncached(Func1<Event, dynamic> v); | 
| 449   external factory C(); | 501   external factory C(); | 
| 450   external static num get CHECKING; | 502   external static num get CHECKING; | 
| 451   external static set CHECKING(num v); | 503   external static set CHECKING(num v); | 
| 452 }`); | 504 }`); | 
| 453     }); | 505     }); | 
| 454     it('property bag interfaces', () => { | 506     it('property bag interfaces', () => { | 
| 455       expectTranslate(` | 507       expectTranslate(` | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 505   external B get d; | 557   external B get d; | 
| 506   external set d(B v); | 558   external set d(B v); | 
| 507   external dynamic get e; | 559   external dynamic get e; | 
| 508   external set e(dynamic v); | 560   external set e(dynamic v); | 
| 509   external factory Y({B d, dynamic e, A a, num b, X c}); | 561   external factory Y({B d, dynamic e, A a, num b, X c}); | 
| 510 }`); | 562 }`); | 
| 511     }); | 563     }); | 
| 512     it('callable', () => { | 564     it('callable', () => { | 
| 513       expectTranslate('interface X<T> { (a:T):T; Y():T; }').to.equal(`@anonymous | 565       expectTranslate('interface X<T> { (a:T):T; Y():T; }').to.equal(`@anonymous | 
| 514 @JS() | 566 @JS() | 
| 515 abstract class X<T> implements Function { | 567 abstract class X<T> { | 
| 516   external T call(T a); | 568   external T call(T a); | 
| 517   external T Y(); | 569   external T Y(); | 
| 518 }`); | 570 }`); | 
| 519     }); | 571     }); | 
| 520 | 572 | 
| 521     it('supports constructors', () => { | 573     it('supports constructors', () => { | 
| 522       expectTranslate('class X { constructor() { } }').to.equal(`@JS() | 574       expectTranslate('class X { constructor() { } }').to.equal(`@JS() | 
| 523 class X { | 575 class X { | 
| 524   // @Ignore | 576   // @Ignore | 
| 525   X.fakeConstructor$(); | 577   X.fakeConstructor$(); | 
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 828 // End module m2 | 880 // End module m2 | 
| 829 @JS() | 881 @JS() | 
| 830 external register(A x);`); | 882 external register(A x);`); | 
| 831   }); | 883   }); | 
| 832 | 884 | 
| 833   describe('type alias', () => { | 885   describe('type alias', () => { | 
| 834     it('replace with simple type', () => { | 886     it('replace with simple type', () => { | 
| 835       expectTranslate(` | 887       expectTranslate(` | 
| 836 type MyNumber = number; | 888 type MyNumber = number; | 
| 837 export function add(x: MyNumber, y: MyNumber): MyNumber; | 889 export function add(x: MyNumber, y: MyNumber): MyNumber; | 
| 838         `).to.equal(`@JS() | 890         `).to.equal(`/*type MyNumber = number;*/ | 
|  | 891 @JS() | 
| 839 external num add(num x, num y);`); | 892 external num add(num x, num y);`); | 
| 840     }); | 893     }); | 
| 841   }); | 894   }); | 
| 842 | 895 | 
| 843   it('union types', () => { | 896   it('union types', () => { | 
|  | 897     // TODO(jacobr): we should resolve that listener1 and listener2 are both fun
     ctions. | 
|  | 898 | 
| 844     // TODO(jacobr): ideally the draw method should specify that arg el has type | 899     // TODO(jacobr): ideally the draw method should specify that arg el has type | 
| 845     // HtmlElement instead of dynamic. | 900     // HtmlElement instead of dynamic. | 
| 846     expectTranslate(` | 901     expectTranslate(` | 
| 847 type listener1 = ()=>boolean; | 902 type listener1 = ()=>boolean; | 
| 848 type listener2 = (e:string)=>boolean; | 903 type listener2 = (e:string)=>boolean; | 
| 849 function addEventListener(listener: listener1|listener2);`) | 904 function addEventListener(listener: listener1|listener2);`) | 
| 850         .to.equal(`import "package:func/func.dart"; | 905         .to.equal(`typedef bool listener1(); | 
| 851 | 906 typedef bool listener2(String e); | 
| 852 @JS() | 907 @JS() | 
| 853 external addEventListener( | 908 external addEventListener(dynamic /*listener1|listener2*/ listener);`); | 
| 854     Function /*Func0<bool>|Func1<String, bool>*/ listener);`); |  | 
| 855 | 909 | 
| 856     expectTranslate('function draw(el: HTMLCanvasElement|HTMLImageElement):void;
     ') | 910     expectTranslate('function draw(el: HTMLCanvasElement|HTMLImageElement):void;
     ') | 
| 857         .to.equal(`import "dart:html"; | 911         .to.equal(`import "dart:html"; | 
| 858 | 912 | 
| 859 @JS() | 913 @JS() | 
| 860 external void draw(dynamic /*CanvasElement|ImageElement*/ el);`); | 914 external void draw(dynamic /*CanvasElement|ImageElement*/ el);`); | 
| 861   }); | 915   }); | 
|  | 916 | 
|  | 917   it('callback this type', () => { | 
|  | 918     expectTranslate(` | 
|  | 919 function addEventListener(type: string, listener: (this: Element, event: Event) 
     => void);`) | 
|  | 920         .to.equal(`import "dart:html"; | 
|  | 921 | 
|  | 922 @JS() | 
|  | 923 external addEventListener( | 
|  | 924     String type, void listener(/*Element this*/ Event event));`); | 
|  | 925     expectTranslate(` | 
|  | 926 function addEventListener(type: 'load', listener: (this: HTMLImageElement, event
     : Event) => void); | 
|  | 927 function addEventListener(type: string, listener: (this: Element, event: Event) 
     => void); | 
|  | 928 `).to.equal(`import "dart:html"; | 
|  | 929 import "package:func/func.dart"; | 
|  | 930 | 
|  | 931 /*external addEventListener('load' type, void listener(ImageElement JS$this, Eve
     nt event));*/ | 
|  | 932 /*external addEventListener( | 
|  | 933     String type, void listener(Element JS$this, Event event));*/ | 
|  | 934 @JS() | 
|  | 935 external addEventListener( | 
|  | 936     String /*'load'|String*/ type, void listener(/*Element this*/ Event event));
     `); | 
|  | 937   }); | 
| 862 }); | 938 }); | 
| OLD | NEW | 
|---|