diff --git a/gulpfile.js b/gulpfile.js index c90cd8e0c5..804f35282e 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1060,11 +1060,15 @@ gulp.task('!test.compiler_cli.codegen', function(done) { } }); +gulp.task('!test.compiler_cli.unit', + function(done) { runJasmineTests(['dist/js/cjs/compiler_cli/**/*_spec.js'], done) }); + // End-to-end test for compiler CLI. // Calls the compiler using its command-line interface, then compiles the app with the codegen. // TODO(alexeagle): wire up the playground tests with offline compilation, similar to dart. -gulp.task('test.compiler_cli', ['!build.compiler_cli'], - function(done) { runSequence('!test.compiler_cli.codegen', sequenceComplete(done)); }); +gulp.task('test.compiler_cli', ['!build.compiler_cli'], function(done) { + runSequence('!test.compiler_cli.unit', '!test.compiler_cli.codegen', sequenceComplete(done)); +}); // ----------------- // orchestrated targets diff --git a/tools/compiler_cli/src/codegen.ts b/tools/compiler_cli/src/codegen.ts index d8d9392fa1..4f80b6ddca 100644 --- a/tools/compiler_cli/src/codegen.ts +++ b/tools/compiler_cli/src/codegen.ts @@ -6,7 +6,7 @@ import * as ts from 'typescript'; import * as path from 'path'; import * as compiler from 'angular2/compiler'; -import {StaticReflector} from 'angular2/src/compiler/static_reflector'; +import {StaticReflector} from './static_reflector'; import {CompileMetadataResolver} from 'angular2/src/compiler/metadata_resolver'; import {HtmlParser} from 'angular2/src/compiler/html_parser'; import {DirectiveNormalizer} from 'angular2/src/compiler/directive_normalizer'; diff --git a/tools/compiler_cli/src/reflector_host.ts b/tools/compiler_cli/src/reflector_host.ts index 6f80f7e073..5e9168983c 100644 --- a/tools/compiler_cli/src/reflector_host.ts +++ b/tools/compiler_cli/src/reflector_host.ts @@ -1,4 +1,4 @@ -import {StaticReflectorHost, StaticSymbol} from 'angular2/src/compiler/static_reflector'; +import {StaticReflectorHost, StaticSymbol} from './static_reflector'; import * as ts from 'typescript'; import {MetadataCollector, ModuleMetadata} from 'ts-metadata-collector'; import * as fs from 'fs'; diff --git a/tools/compiler_cli/src/static_reflector.ts b/tools/compiler_cli/src/static_reflector.ts index 9a96c38405..3c733c35c9 100644 --- a/tools/compiler_cli/src/static_reflector.ts +++ b/tools/compiler_cli/src/static_reflector.ts @@ -130,7 +130,7 @@ export class StaticReflector implements ReflectorReader { parameters = []; ListWrapper.forEachWithIndex(parameterTypes, (paramType, index) => { - let nestedResult = []; + let nestedResult: any[] = []; if (isPresent(paramType)) { nestedResult.push(paramType); } @@ -155,9 +155,9 @@ export class StaticReflector implements ReflectorReader { private registerDecoratorOrConstructor(type: StaticSymbol, ctor: any): void { this.conversionMap.set(type, (context: StaticSymbol, args: any[]) => { - let argValues = []; + let argValues: any[] = []; ListWrapper.forEachWithIndex(args, (arg, index) => { - let argValue; + let argValue: any; if (isStringMap(arg) && isBlank(arg['__symbolic'])) { argValue = mapStringMap(arg, (value, key) => this.simplify(context, value)); } else { @@ -237,7 +237,7 @@ export class StaticReflector implements ReflectorReader { return expression; } if (isArray(expression)) { - let result = []; + let result: any[] = []; for (let item of(expression)) { result.push(simplify(item)); } @@ -245,7 +245,7 @@ export class StaticReflector implements ReflectorReader { } if (isPresent(expression)) { if (isPresent(expression['__symbolic'])) { - let staticSymbol; + let staticSymbol: StaticSymbol; switch (expression['__symbolic']) { case "binop": let left = simplify(expression['left']); @@ -396,7 +396,7 @@ function isClassMetadata(expression: any): boolean { function mapStringMap(input: {[key: string]: any}, transform: (value: any, key: string) => any): {[key: string]: any} { if (isBlank(input)) return {}; - var result = {}; + var result: {[key: string]: any} = {}; StringMapWrapper.keys(input).forEach((key) => { result[key] = transform(input[key], key); }); return result; } diff --git a/tools/compiler_cli/src/static_reflector_spec.ts b/tools/compiler_cli/src/static_reflector_spec.ts index 51ce2968ba..5c07b0cc3a 100644 --- a/tools/compiler_cli/src/static_reflector_spec.ts +++ b/tools/compiler_cli/src/static_reflector_spec.ts @@ -1,244 +1,235 @@ +/// + import {describe, it, iit, expect, ddescribe, beforeEach} from 'angular2/testing_internal'; -import {IS_DART, isBlank} from 'angular2/src/facade/lang'; +import {isBlank} from 'angular2/src/facade/lang'; import {ListWrapper} from 'angular2/src/facade/collection'; -import { - StaticReflector, - StaticReflectorHost, - StaticSymbol -} from 'angular2/src/compiler/static_reflector'; +import {StaticReflector, StaticReflectorHost, StaticSymbol} from './static_reflector'; -export function main() { - // Static reflector is not supported in Dart - // as we use reflection to create objects. - if (IS_DART) return; +describe('StaticReflector', () => { let noContext = new StaticSymbol('', '', ''); + let host: StaticReflectorHost; + let reflector: StaticReflector; - describe('StaticReflector', () => { - let host: StaticReflectorHost; - let reflector: StaticReflector; - - beforeEach(() => { - host = new MockReflectorHost(); - reflector = new StaticReflector(host); - }); - - function simplify(context: StaticSymbol, value: any) { - return reflector.simplify(context, value); - } - - it('should get annotations for NgFor', () => { - let NgFor = host.findDeclaration('angular2/src/common/directives/ng_for', 'NgFor'); - let annotations = reflector.annotations(NgFor); - expect(annotations.length).toEqual(1); - let annotation = annotations[0]; - expect(annotation.selector).toEqual('[ngFor][ngForOf]'); - expect(annotation.inputs).toEqual(['ngForTrackBy', 'ngForOf', 'ngForTemplate']); - - }); - - it('should get constructor for NgFor', () => { - let NgFor = host.findDeclaration('angular2/src/common/directives/ng_for', 'NgFor'); - let ViewContainerRef = - host.findDeclaration('angular2/src/core/linker/view_container_ref', 'ViewContainerRef'); - let TemplateRef = - host.findDeclaration('angular2/src/core/linker/template_ref', 'TemplateRef'); - let IterableDiffers = host.findDeclaration( - 'angular2/src/core/change_detection/differs/iterable_differs', 'IterableDiffers'); - let ChangeDetectorRef = host.findDeclaration( - 'angular2/src/core/change_detection/change_detector_ref', 'ChangeDetectorRef'); - - let parameters = reflector.parameters(NgFor); - expect(parameters) - .toEqual([[ViewContainerRef], [TemplateRef], [IterableDiffers], [ChangeDetectorRef]]); - }); - - it('should get annotations for HeroDetailComponent', () => { - let HeroDetailComponent = - host.findDeclaration('src/app/hero-detail.component', 'HeroDetailComponent'); - let annotations = reflector.annotations(HeroDetailComponent); - expect(annotations.length).toEqual(1); - let annotation = annotations[0]; - expect(annotation.selector).toEqual('my-hero-detail'); - expect(annotation.directives) - .toEqual([[host.findDeclaration('angular2/src/common/directives/ng_for', 'NgFor')]]); - }); - - it('should get and empty annotation list for an unknown class', () => { - let UnknownClass = host.findDeclaration('src/app/app.component', 'UnknownClass'); - let annotations = reflector.annotations(UnknownClass); - expect(annotations).toEqual([]); - }); - - it('should get propMetadata for HeroDetailComponent', () => { - let HeroDetailComponent = - host.findDeclaration('src/app/hero-detail.component', 'HeroDetailComponent'); - let props = reflector.propMetadata(HeroDetailComponent); - expect(props['hero']).toBeTruthy(); - }); - - it('should get an empty object from propMetadata for an unknown class', () => { - let UnknownClass = host.findDeclaration('src/app/app.component', 'UnknownClass'); - let properties = reflector.propMetadata(UnknownClass); - expect(properties).toEqual({}); - }); - - it('should get empty parameters list for an unknown class ', () => { - let UnknownClass = host.findDeclaration('src/app/app.component', 'UnknownClass'); - let parameters = reflector.parameters(UnknownClass); - expect(parameters).toEqual([]); - }); - - it('should simplify primitive into itself', () => { - expect(simplify(noContext, 1)).toBe(1); - expect(simplify(noContext, true)).toBe(true); - expect(simplify(noContext, "some value")).toBe("some value"); - }); - - it('should simplify an array into a copy of the array', - () => { expect(simplify(noContext, [1, 2, 3])).toEqual([1, 2, 3]); }); - - it('should simplify an object to a copy of the object', () => { - let expr = {a: 1, b: 2, c: 3}; - expect(simplify(noContext, expr)).toEqual(expr); - }); - - it('should simplify &&', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '&&', left: true, right: true}))).toBe(true); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '&&', left: true, right: false}))).toBe(false); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '&&', left: false, right: true}))).toBe(false); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '&&', left: false, right: false}))).toBe(false); - }); - - it('should simplify ||', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '||', left: true, right: true}))).toBe(true); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '||', left: true, right: false}))).toBe(true); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '||', left: false, right: true}))).toBe(true); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '||', left: false, right: false}))).toBe(false); - }); - - it('should simplify &', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '&', left: 0x22, right: 0x0F}))).toBe(0x22 & 0x0F); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '&', left: 0x22, right: 0xF0}))).toBe(0x22 & 0xF0); - }); - - it('should simplify |', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '|', left: 0x22, right: 0x0F}))).toBe(0x22 | 0x0F); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '|', left: 0x22, right: 0xF0}))).toBe(0x22 | 0xF0); - }); - - it('should simplify ^', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '|', left: 0x22, right: 0x0F}))).toBe(0x22 | 0x0F); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '|', left: 0x22, right: 0xF0}))).toBe(0x22 | 0xF0); - }); - - it('should simplify ==', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '==', left: 0x22, right: 0x22}))).toBe(0x22 == 0x22); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '==', left: 0x22, right: 0xF0}))).toBe(0x22 == 0xF0); - }); - - it('should simplify !=', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '!=', left: 0x22, right: 0x22}))).toBe(0x22 != 0x22); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '!=', left: 0x22, right: 0xF0}))).toBe(0x22 != 0xF0); - }); - - it('should simplify ===', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '===', left: 0x22, right: 0x22}))).toBe(0x22 === 0x22); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '===', left: 0x22, right: 0xF0}))).toBe(0x22 === 0xF0); - }); - - it('should simplify !==', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '!==', left: 0x22, right: 0x22}))).toBe(0x22 !== 0x22); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '!==', left: 0x22, right: 0xF0}))).toBe(0x22 !== 0xF0); - }); - - it('should simplify >', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '>', left: 1, right: 1}))).toBe(1 > 1); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '>', left: 1, right: 0}))).toBe(1 > 0); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '>', left: 0, right: 1}))).toBe(0 > 1); - }); - - it('should simplify >=', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '>=', left: 1, right: 1}))).toBe(1 >= 1); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '>=', left: 1, right: 0}))).toBe(1 >= 0); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '>=', left: 0, right: 1}))).toBe(0 >= 1); - }); - - it('should simplify <=', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '<=', left: 1, right: 1}))).toBe(1 <= 1); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '<=', left: 1, right: 0}))).toBe(1 <= 0); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '<=', left: 0, right: 1}))).toBe(0 <= 1); - }); - - it('should simplify <', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '<', left: 1, right: 1}))).toBe(1 < 1); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '<', left: 1, right: 0}))).toBe(1 < 0); - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '<', left: 0, right: 1}))).toBe(0 < 1); - }); - - it('should simplify <<', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '<<', left: 0x55, right: 2}))).toBe(0x55 << 2); - }); - - it('should simplify >>', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '>>', left: 0x55, right: 2}))).toBe(0x55 >> 2); - }); - - it('should simplify +', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '+', left: 0x55, right: 2}))).toBe(0x55 + 2); - }); - - it('should simplify -', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '-', left: 0x55, right: 2}))).toBe(0x55 - 2); - }); - - it('should simplify *', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '*', left: 0x55, right: 2}))).toBe(0x55 * 2); - }); - - it('should simplify /', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '/', left: 0x55, right: 2}))).toBe(0x55 / 2); - }); - - it('should simplify %', () => { - expect(simplify(noContext, ({ __symbolic: 'binop', operator: '%', left: 0x55, right: 2}))).toBe(0x55 % 2); - }); - - it('should simplify prefix -', () => { - expect(simplify(noContext, ({ __symbolic: 'pre', operator: '-', operand: 2}))).toBe(-2); - }); - - it('should simplify prefix ~', () => { - expect(simplify(noContext, ({ __symbolic: 'pre', operator: '~', operand: 2}))).toBe(~2); - }); - - it('should simplify prefix !', () => { - expect(simplify(noContext, ({ __symbolic: 'pre', operator: '!', operand: true}))).toBe(!true); - expect(simplify(noContext, ({ __symbolic: 'pre', operator: '!', operand: false}))).toBe(!false); - }); - - it('should simplify an array index', () => { - expect(simplify(noContext, ({__symbolic: "index", expression: [1, 2, 3], index: 2}))).toBe(3); - }); - - it('should simplify an object index', () => { - let expr = {__symbolic: "select", expression: {a: 1, b: 2, c: 3}, member: "b"}; - expect(simplify(noContext, expr)).toBe(2); - }); - - it('should simplify a module reference', () => { - expect(simplify(new StaticSymbol('', '/src/cases', ''), - ({__symbolic: "reference", module: "./extern", name: "s"}))) - .toEqual("s"); - }); - - it('should simplify a non existing reference as a static symbol', () => { - expect(simplify(new StaticSymbol('', '/src/cases', ''), - ({__symbolic: "reference", module: "./extern", name: "nonExisting"}))) - .toEqual(host.getStaticSymbol('', '/src/extern.d.ts', 'nonExisting')); - }); + beforeEach(() => { + host = new MockReflectorHost(); + reflector = new StaticReflector(host); }); -} + + function simplify(context: StaticSymbol, value: any) { + return reflector.simplify(context, value); + } + + it('should get annotations for NgFor', () => { + let NgFor = host.findDeclaration('angular2/src/common/directives/ng_for', 'NgFor'); + let annotations = reflector.annotations(NgFor); + expect(annotations.length).toEqual(1); + let annotation = annotations[0]; + expect(annotation.selector).toEqual('[ngFor][ngForOf]'); + expect(annotation.inputs).toEqual(['ngForTrackBy', 'ngForOf', 'ngForTemplate']); + + }); + + it('should get constructor for NgFor', () => { + let NgFor = host.findDeclaration('angular2/src/common/directives/ng_for', 'NgFor'); + let ViewContainerRef = + host.findDeclaration('angular2/src/core/linker/view_container_ref', 'ViewContainerRef'); + let TemplateRef = host.findDeclaration('angular2/src/core/linker/template_ref', 'TemplateRef'); + let IterableDiffers = host.findDeclaration( + 'angular2/src/core/change_detection/differs/iterable_differs', 'IterableDiffers'); + let ChangeDetectorRef = host.findDeclaration( + 'angular2/src/core/change_detection/change_detector_ref', 'ChangeDetectorRef'); + + let parameters = reflector.parameters(NgFor); + expect(parameters) + .toEqual([[ViewContainerRef], [TemplateRef], [IterableDiffers], [ChangeDetectorRef]]); + }); + + it('should get annotations for HeroDetailComponent', () => { + let HeroDetailComponent = + host.findDeclaration('src/app/hero-detail.component', 'HeroDetailComponent'); + let annotations = reflector.annotations(HeroDetailComponent); + expect(annotations.length).toEqual(1); + let annotation = annotations[0]; + expect(annotation.selector).toEqual('my-hero-detail'); + expect(annotation.directives) + .toEqual([[host.findDeclaration('angular2/src/common/directives/ng_for', 'NgFor')]]); + }); + + it('should get and empty annotation list for an unknown class', () => { + let UnknownClass = host.findDeclaration('src/app/app.component', 'UnknownClass'); + let annotations = reflector.annotations(UnknownClass); + expect(annotations).toEqual([]); + }); + + it('should get propMetadata for HeroDetailComponent', () => { + let HeroDetailComponent = + host.findDeclaration('src/app/hero-detail.component', 'HeroDetailComponent'); + let props = reflector.propMetadata(HeroDetailComponent); + expect(props['hero']).toBeTruthy(); + }); + + it('should get an empty object from propMetadata for an unknown class', () => { + let UnknownClass = host.findDeclaration('src/app/app.component', 'UnknownClass'); + let properties = reflector.propMetadata(UnknownClass); + expect(properties).toEqual({}); + }); + + it('should get empty parameters list for an unknown class ', () => { + let UnknownClass = host.findDeclaration('src/app/app.component', 'UnknownClass'); + let parameters = reflector.parameters(UnknownClass); + expect(parameters).toEqual([]); + }); + + it('should simplify primitive into itself', () => { + expect(simplify(noContext, 1)).toBe(1); + expect(simplify(noContext, true)).toBe(true); + expect(simplify(noContext, "some value")).toBe("some value"); + }); + + it('should simplify an array into a copy of the array', + () => { expect(simplify(noContext, [1, 2, 3])).toEqual([1, 2, 3]); }); + + it('should simplify an object to a copy of the object', () => { + let expr = {a: 1, b: 2, c: 3}; + expect(simplify(noContext, expr)).toEqual(expr); + }); + + it('should simplify &&', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '&&', left: true, right: true}))).toBe(true); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '&&', left: true, right: false}))).toBe(false); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '&&', left: false, right: true}))).toBe(false); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '&&', left: false, right: false}))).toBe(false); + }); + + it('should simplify ||', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '||', left: true, right: true}))).toBe(true); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '||', left: true, right: false}))).toBe(true); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '||', left: false, right: true}))).toBe(true); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '||', left: false, right: false}))).toBe(false); + }); + + it('should simplify &', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '&', left: 0x22, right: 0x0F}))).toBe(0x22 & 0x0F); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '&', left: 0x22, right: 0xF0}))).toBe(0x22 & 0xF0); + }); + + it('should simplify |', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '|', left: 0x22, right: 0x0F}))).toBe(0x22 | 0x0F); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '|', left: 0x22, right: 0xF0}))).toBe(0x22 | 0xF0); + }); + + it('should simplify ^', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '|', left: 0x22, right: 0x0F}))).toBe(0x22 | 0x0F); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '|', left: 0x22, right: 0xF0}))).toBe(0x22 | 0xF0); + }); + + it('should simplify ==', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '==', left: 0x22, right: 0x22}))).toBe(0x22 == 0x22); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '==', left: 0x22, right: 0xF0}))).toBe(0x22 == 0xF0); + }); + + it('should simplify !=', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '!=', left: 0x22, right: 0x22}))).toBe(0x22 != 0x22); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '!=', left: 0x22, right: 0xF0}))).toBe(0x22 != 0xF0); + }); + + it('should simplify ===', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '===', left: 0x22, right: 0x22}))).toBe(0x22 === 0x22); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '===', left: 0x22, right: 0xF0}))).toBe(0x22 === 0xF0); + }); + + it('should simplify !==', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '!==', left: 0x22, right: 0x22}))).toBe(0x22 !== 0x22); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '!==', left: 0x22, right: 0xF0}))).toBe(0x22 !== 0xF0); + }); + + it('should simplify >', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '>', left: 1, right: 1}))).toBe(1 > 1); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '>', left: 1, right: 0}))).toBe(1 > 0); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '>', left: 0, right: 1}))).toBe(0 > 1); + }); + + it('should simplify >=', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '>=', left: 1, right: 1}))).toBe(1 >= 1); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '>=', left: 1, right: 0}))).toBe(1 >= 0); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '>=', left: 0, right: 1}))).toBe(0 >= 1); + }); + + it('should simplify <=', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '<=', left: 1, right: 1}))).toBe(1 <= 1); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '<=', left: 1, right: 0}))).toBe(1 <= 0); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '<=', left: 0, right: 1}))).toBe(0 <= 1); + }); + + it('should simplify <', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '<', left: 1, right: 1}))).toBe(1 < 1); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '<', left: 1, right: 0}))).toBe(1 < 0); + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '<', left: 0, right: 1}))).toBe(0 < 1); + }); + + it('should simplify <<', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '<<', left: 0x55, right: 2}))).toBe(0x55 << 2); + }); + + it('should simplify >>', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '>>', left: 0x55, right: 2}))).toBe(0x55 >> 2); + }); + + it('should simplify +', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '+', left: 0x55, right: 2}))).toBe(0x55 + 2); + }); + + it('should simplify -', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '-', left: 0x55, right: 2}))).toBe(0x55 - 2); + }); + + it('should simplify *', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '*', left: 0x55, right: 2}))).toBe(0x55 * 2); + }); + + it('should simplify /', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '/', left: 0x55, right: 2}))).toBe(0x55 / 2); + }); + + it('should simplify %', () => { + expect(simplify(noContext, ({ __symbolic: 'binop', operator: '%', left: 0x55, right: 2}))).toBe(0x55 % 2); + }); + + it('should simplify prefix -', () => { + expect(simplify(noContext, ({ __symbolic: 'pre', operator: '-', operand: 2}))).toBe(-2); + }); + + it('should simplify prefix ~', () => { + expect(simplify(noContext, ({ __symbolic: 'pre', operator: '~', operand: 2}))).toBe(~2); + }); + + it('should simplify prefix !', () => { + expect(simplify(noContext, ({ __symbolic: 'pre', operator: '!', operand: true}))).toBe(!true); + expect(simplify(noContext, ({ __symbolic: 'pre', operator: '!', operand: false}))).toBe(!false); + }); + + it('should simplify an array index', () => { + expect(simplify(noContext, ({__symbolic: "index", expression: [1, 2, 3], index: 2}))).toBe(3); + }); + + it('should simplify an object index', () => { + let expr = {__symbolic: "select", expression: {a: 1, b: 2, c: 3}, member: "b"}; + expect(simplify(noContext, expr)).toBe(2); + }); + + it('should simplify a module reference', () => { + expect(simplify(new StaticSymbol('', '/src/cases', ''), + ({__symbolic: "reference", module: "./extern", name: "s"}))) + .toEqual("s"); + }); + + it('should simplify a non existing reference as a static symbol', () => { + expect(simplify(new StaticSymbol('', '/src/cases', ''), + ({__symbolic: "reference", module: "./extern", name: "nonExisting"}))) + .toEqual(host.getStaticSymbol('', '/src/extern.d.ts', 'nonExisting')); + }); +}); class MockReflectorHost implements StaticReflectorHost { private staticTypeCache = new Map(); @@ -258,7 +249,7 @@ class MockReflectorHost implements StaticReflectorHost { function splitPath(path: string): string[] { return path.split(/\/|\\/g); } function resolvePath(pathParts: string[]): string { - let result = []; + let result: string[] = []; ListWrapper.forEachWithIndex(pathParts, (part, index) => { switch (part) { case '': @@ -293,149 +284,131 @@ class MockReflectorHost implements StaticReflectorHost { } getMetadataFor(moduleId: string): any { - return { - '/tmp/angular2/src/common/forms/directives.d.ts': - { - "__symbolic": "module", - "metadata": { - "FORM_DIRECTIVES": [ - { + let data: {[key: string]: any} = { + '/tmp/angular2/src/common/forms/directives.d.ts': { + "__symbolic": "module", + "metadata": { + "FORM_DIRECTIVES": [ + { + "__symbolic": "reference", + "name": "NgFor", + "module": "angular2/src/common/directives/ng_for" + } + ] + } + }, + '/tmp/angular2/src/common/directives/ng_for.d.ts': { + "__symbolic": "module", + "metadata": { + "NgFor": { + "__symbolic": "class", + "decorators": [ + { + "__symbolic": "call", + "expression": { "__symbolic": "reference", - "name": "NgFor", - "module": "angular2/src/common/directives/ng_for" + "name": "Directive", + "module": "../../core/metadata" + }, + "arguments": [ + { + "selector": "[ngFor][ngForOf]", + "inputs": ["ngForTrackBy", "ngForOf", "ngForTemplate"] + } + ] + } + ], + "members": { + "__ctor__": [ + { + "__symbolic": "constructor", + "parameters": [ + { + "__symbolic": "reference", + "module": "../../core/linker/view_container_ref", + "name": "ViewContainerRef" + }, + { + "__symbolic": "reference", + "module": "../../core/linker/template_ref", + "name": "TemplateRef" + }, + { + "__symbolic": "reference", + "module": "../../core/change_detection/differs/iterable_differs", + "name": "IterableDiffers" + }, + { + "__symbolic": "reference", + "module": "../../core/change_detection/change_detector_ref", + "name": "ChangeDetectorRef" + } + ] } ] } - }, - '/tmp/angular2/src/common/directives/ng_for.d.ts': + } + } + }, + '/tmp/angular2/src/core/linker/view_container_ref.d.ts': + {"metadata": {"ViewContainerRef": {"__symbolic": "class"}}}, + '/tmp/angular2/src/core/linker/template_ref.d.ts': + {"module": "./template_ref", "metadata": {"TemplateRef": {"__symbolic": "class"}}}, + '/tmp/angular2/src/core/change_detection/differs/iterable_differs.d.ts': + {"metadata": {"IterableDiffers": {"__symbolic": "class"}}}, + '/tmp/angular2/src/core/change_detection/change_detector_ref.d.ts': + {"metadata": {"ChangeDetectorRef": {"__symbolic": "class"}}}, + '/tmp/src/app/hero-detail.component.d.ts': { + "__symbolic": "module", + "metadata": { + "HeroDetailComponent": { + "__symbolic": "class", + "decorators": [ { - "__symbolic": "module", - "metadata": + "__symbolic": "call", + "expression": { + "__symbolic": "reference", + "name": "Component", + "module": "angular2/src/core/metadata" + }, + "arguments": [ + { + "selector": "my-hero-detail", + "template": + "\n
\n

{{hero.name}} details!

\n
{{hero.id}}
\n
\n \n \n
\n
\n", + "directives": [ + { + "__symbolic": "reference", + "name": "FORM_DIRECTIVES", + "module": "angular2/src/common/forms/directives" + } + ] + } + ] + } + ], + "members": { + "hero": [ + { + "__symbolic": "property", + "decorators": [ { - "NgFor": - { - "__symbolic": "class", - "decorators": - [ - { - "__symbolic": "call", - "expression": { - "__symbolic": "reference", - "name": "Directive", - "module": "../../core/metadata" - }, - "arguments": [ - { - "selector": "[ngFor][ngForOf]", - "inputs": ["ngForTrackBy", "ngForOf", "ngForTemplate"] - } - ] - } - ], - "members": - { - "__ctor__": [ - { - "__symbolic": "constructor", - "parameters": - [ - { - "__symbolic": "reference", - "module": "../../core/linker/view_container_ref", - "name": "ViewContainerRef" - }, - { - "__symbolic": "reference", - "module": "../../core/linker/template_ref", - "name": "TemplateRef" - }, - { - "__symbolic": "reference", - "module": - "../../core/change_detection/differs/iterable_differs", - "name": "IterableDiffers" - }, - { - "__symbolic": "reference", - "module": - "../../core/change_detection/change_detector_ref", - "name": "ChangeDetectorRef" - } - ] - } - ] - } - } + "__symbolic": "call", + "expression": { + "__symbolic": "reference", + "name": "Input", + "module": "angular2/src/core/metadata" + } } - }, - '/tmp/angular2/src/core/linker/view_container_ref.d.ts': - {"metadata": {"ViewContainerRef": {"__symbolic": "class"}}}, - '/tmp/angular2/src/core/linker/template_ref.d.ts': - {"module": "./template_ref", "metadata": {"TemplateRef": {"__symbolic": "class"}}}, - '/tmp/angular2/src/core/change_detection/differs/iterable_differs.d.ts': - {"metadata": {"IterableDiffers": {"__symbolic": "class"}}}, - '/tmp/angular2/src/core/change_detection/change_detector_ref.d.ts': - {"metadata": {"ChangeDetectorRef": {"__symbolic": "class"}}}, - '/tmp/src/app/hero-detail.component.d.ts': - { - "__symbolic": "module", - "metadata": - { - "HeroDetailComponent": - { - "__symbolic": "class", - "decorators": - [ - { - "__symbolic": "call", - "expression": { - "__symbolic": "reference", - "name": "Component", - "module": "angular2/src/core/metadata" - }, - "arguments": [ - { - "selector": "my-hero-detail", - "template": "\n
\n

{{hero.name}} details!

\n
{{hero.id}}
\n
\n \n \n
\n
\n", - "directives": - [ - { - "__symbolic": "reference", - "name": "FORM_DIRECTIVES", - "module": "angular2/src/common/forms/directives" - } - ] - } - ] - } - ], - "members": - { - "hero": [ - { - "__symbolic": "property", - "decorators": - [ - { - "__symbolic": "call", - "expression": - { - "__symbolic": "reference", - "name": "Input", - "module": "angular2/src/core/metadata" - } - } - ] - } - ] - } - } - } - }, - '/src/extern.d.ts': { - "__symbolic": "module", metadata: { s: "s" } - } - } - [moduleId]; + ] + } + ] + } + } + } + }, + '/src/extern.d.ts': {"__symbolic": "module", metadata: {s: "s"}} + }; + return data[moduleId]; } }