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;
 | 
						|
}
 |