139 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			139 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								import {
							 | 
						||
| 
								 | 
							
								  ddescribe,
							 | 
						||
| 
								 | 
							
								  describe,
							 | 
						||
| 
								 | 
							
								  xdescribe,
							 | 
						||
| 
								 | 
							
								  it,
							 | 
						||
| 
								 | 
							
								  iit,
							 | 
						||
| 
								 | 
							
								  xit,
							 | 
						||
| 
								 | 
							
								  expect,
							 | 
						||
| 
								 | 
							
								  beforeEach,
							 | 
						||
| 
								 | 
							
								  afterEach,
							 | 
						||
| 
								 | 
							
								  AsyncTestCompleter,
							 | 
						||
| 
								 | 
							
								  inject
							 | 
						||
| 
								 | 
							
								} from 'angular2/test_lib';
							 | 
						||
| 
								 | 
							
								import {IS_DART} from '../platform';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {CONST_EXPR} from 'angular2/src/core/facade/lang';
							 | 
						||
| 
								 | 
							
								import {MapWrapper} from 'angular2/src/core/facade/collection';
							 | 
						||
| 
								 | 
							
								import {Promise} from 'angular2/src/core/facade/async';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {ChangeDetectionCompiler} from 'angular2/src/compiler/change_detector_compiler';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {HtmlParser} from 'angular2/src/compiler/html_parser';
							 | 
						||
| 
								 | 
							
								import {
							 | 
						||
| 
								 | 
							
								  DirectiveMetadata,
							 | 
						||
| 
								 | 
							
								  TypeMetadata,
							 | 
						||
| 
								 | 
							
								  ChangeDetectionMetadata,
							 | 
						||
| 
								 | 
							
								  SourceModule
							 | 
						||
| 
								 | 
							
								} from 'angular2/src/compiler/api';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {MockSchemaRegistry} from './template_parser_spec';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {TemplateParser} from 'angular2/src/compiler/template_parser';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {
							 | 
						||
| 
								 | 
							
								  Parser,
							 | 
						||
| 
								 | 
							
								  Lexer,
							 | 
						||
| 
								 | 
							
								  ChangeDetectorGenConfig,
							 | 
						||
| 
								 | 
							
								  ChangeDetectionStrategy,
							 | 
						||
| 
								 | 
							
								  ChangeDispatcher,
							 | 
						||
| 
								 | 
							
								  DirectiveIndex,
							 | 
						||
| 
								 | 
							
								  Locals,
							 | 
						||
| 
								 | 
							
								  BindingTarget,
							 | 
						||
| 
								 | 
							
								  ChangeDetector
							 | 
						||
| 
								 | 
							
								} from 'angular2/src/core/change_detection/change_detection';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {evalModule} from './eval_module';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {TestContext, TestDispatcher, TestPipes} from './change_detector_mocks';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Attention: These module names have to correspond to real modules!
							 | 
						||
| 
								 | 
							
								const MODULE_NAME = 'angular2/test/compiler/change_detector_compiler_spec';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export function main() {
							 | 
						||
| 
								 | 
							
								  describe('ChangeDetectorCompiler', () => {
							 | 
						||
| 
								 | 
							
								    var domParser: HtmlParser;
							 | 
						||
| 
								 | 
							
								    var parser: TemplateParser;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    function createCompiler(useJit: boolean): ChangeDetectionCompiler {
							 | 
						||
| 
								 | 
							
								      return new ChangeDetectionCompiler(new ChangeDetectorGenConfig(true, true, false, useJit));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    beforeEach(() => {
							 | 
						||
| 
								 | 
							
								      domParser = new HtmlParser();
							 | 
						||
| 
								 | 
							
								      parser = new TemplateParser(
							 | 
						||
| 
								 | 
							
								          new Parser(new Lexer()),
							 | 
						||
| 
								 | 
							
								          new MockSchemaRegistry({'invalidProp': false}, {'mappedAttr': 'mappedProp'}));
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    describe('compileComponentRuntime', () => {
							 | 
						||
| 
								 | 
							
								      function detectChanges(compiler: ChangeDetectionCompiler, template: string,
							 | 
						||
| 
								 | 
							
								                             directives: DirectiveMetadata[] = CONST_EXPR([])): string[] {
							 | 
						||
| 
								 | 
							
								        var type = new TypeMetadata({typeName: 'SomeComp'});
							 | 
						||
| 
								 | 
							
								        var parsedTemplate = parser.parse(domParser.parse(template, 'TestComp'), directives);
							 | 
						||
| 
								 | 
							
								        var factories =
							 | 
						||
| 
								 | 
							
								            compiler.compileComponentRuntime(type, ChangeDetectionStrategy.Default, parsedTemplate);
							 | 
						||
| 
								 | 
							
								        return testChangeDetector(factories[0]);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      it('should watch element properties (no jit)', () => {
							 | 
						||
| 
								 | 
							
								        expect(detectChanges(createCompiler(false), '<div [el-prop]="someProp">'))
							 | 
						||
| 
								 | 
							
								            .toEqual(['elementProperty(elProp)=someValue']);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      it('should watch element properties (jit)', () => {
							 | 
						||
| 
								 | 
							
								        expect(detectChanges(createCompiler(true), '<div [el-prop]="someProp">'))
							 | 
						||
| 
								 | 
							
								            .toEqual(['elementProperty(elProp)=someValue']);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    describe('compileComponentCodeGen', () => {
							 | 
						||
| 
								 | 
							
								      function detectChanges(compiler: ChangeDetectionCompiler, template: string,
							 | 
						||
| 
								 | 
							
								                             directives: DirectiveMetadata[] = CONST_EXPR([])): Promise<string[]> {
							 | 
						||
| 
								 | 
							
								        var type = new TypeMetadata({typeName: 'SomeComp'});
							 | 
						||
| 
								 | 
							
								        var parsedTemplate = parser.parse(domParser.parse(template, 'TestComp'), directives);
							 | 
						||
| 
								 | 
							
								        var sourceModule =
							 | 
						||
| 
								 | 
							
								            compiler.compileComponentCodeGen(type, ChangeDetectionStrategy.Default, parsedTemplate);
							 | 
						||
| 
								 | 
							
								        var testableModule = createTestableModule(sourceModule, 0);
							 | 
						||
| 
								 | 
							
								        return evalModule(testableModule.source, testableModule.imports, null);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      it('should watch element properties', inject([AsyncTestCompleter], (async) => {
							 | 
						||
| 
								 | 
							
								           detectChanges(createCompiler(true), '<div [el-prop]="someProp">')
							 | 
						||
| 
								 | 
							
								               .then((value) => {
							 | 
						||
| 
								 | 
							
								                 expect(value).toEqual(['elementProperty(elProp)=someValue']);
							 | 
						||
| 
								 | 
							
								                 async.done();
							 | 
						||
| 
								 | 
							
								               });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								         }));
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function createTestableModule(sourceModule: SourceModule, changeDetectorIndex: number):
							 | 
						||
| 
								 | 
							
								    SourceModule {
							 | 
						||
| 
								 | 
							
								  var testableSource;
							 | 
						||
| 
								 | 
							
								  var testableImports = [[MODULE_NAME, 'mocks']].concat(sourceModule.imports);
							 | 
						||
| 
								 | 
							
								  if (IS_DART) {
							 | 
						||
| 
								 | 
							
								    testableSource = `${sourceModule.source}  
							 | 
						||
| 
								 | 
							
								  run(_) { return mocks.testChangeDetector(CHANGE_DETECTORS[${changeDetectorIndex}]); }`;
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    testableSource = `${sourceModule.source}  
							 | 
						||
| 
								 | 
							
								  exports.run = function(_) { return mocks.testChangeDetector(CHANGE_DETECTORS[${changeDetectorIndex}]); }`;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return new SourceModule(null, testableSource, testableImports);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export function testChangeDetector(changeDetectorFactory: Function): string[] {
							 | 
						||
| 
								 | 
							
								  var dispatcher = new TestDispatcher([], []);
							 | 
						||
| 
								 | 
							
								  var cd = changeDetectorFactory(dispatcher);
							 | 
						||
| 
								 | 
							
								  var ctx = new TestContext();
							 | 
						||
| 
								 | 
							
								  ctx.someProp = 'someValue';
							 | 
						||
| 
								 | 
							
								  var locals = new Locals(null, MapWrapper.createFromStringMap({'someVar': null}));
							 | 
						||
| 
								 | 
							
								  cd.hydrate(ctx, locals, dispatcher, new TestPipes());
							 | 
						||
| 
								 | 
							
								  cd.detectChanges();
							 | 
						||
| 
								 | 
							
								  return dispatcher.log;
							 | 
						||
| 
								 | 
							
								}
							 |