- Rename `DirectiveMetadata` into `CompileDirectiveMetadata`, merge with `NormalizedDirectiveMetadata` and remove `ChangeDetectionMetadata` - Store change detector factories not as array but directly at the `CompiledTemplate` or the embedded template to make instantiation easier later on - Already analyze variable values and map them to `Directive.exportAs` - Keep the directive sort order as specified in the `@View()` annotation - Allow to clear the runtime cache in `StyleCompiler` and `TemplateCompiler` - Ignore `script` elements to match the semantics of the current compiler - Make all components dynamically loadable and remove the previously introduced property `@Component#dynamicLoadable` for now until we find a better option to configure this - Don’t allow to specify bindings in `@View#directives` and `@View#pipes` as this was never supported by the transformer (see below for the breaking change) BREAKING CHANGE: - don't support DI bindings in `@View#directives` and `@View@pipes` any more in preparation of integrating the new compiler. Use `@Directive#bindings` to reexport directives under a different token instead. Part of #3605 Closes #4314
		
			
				
	
	
		
			131 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import {ddescribe, describe, it, iit, xit, expect, beforeEach, afterEach} from 'angular2/test_lib';
 | 
						|
 | 
						|
import {HtmlParser} from 'angular2/src/compiler/html_parser';
 | 
						|
import {
 | 
						|
  HtmlAst,
 | 
						|
  HtmlAstVisitor,
 | 
						|
  HtmlElementAst,
 | 
						|
  HtmlAttrAst,
 | 
						|
  HtmlTextAst,
 | 
						|
  htmlVisitAll
 | 
						|
} from 'angular2/src/compiler/html_ast';
 | 
						|
 | 
						|
export function main() {
 | 
						|
  describe('DomParser', () => {
 | 
						|
    var parser: HtmlParser;
 | 
						|
    beforeEach(() => { parser = new HtmlParser(); });
 | 
						|
 | 
						|
    describe('parse', () => {
 | 
						|
 | 
						|
      describe('text nodes', () => {
 | 
						|
        it('should parse root level text nodes', () => {
 | 
						|
          expect(humanizeDom(parser.parse('a', 'TestComp')))
 | 
						|
              .toEqual([[HtmlTextAst, 'a', 'TestComp > #text(a):nth-child(0)']]);
 | 
						|
        });
 | 
						|
 | 
						|
        it('should parse text nodes inside regular elements', () => {
 | 
						|
          expect(humanizeDom(parser.parse('<div>a</div>', 'TestComp')))
 | 
						|
              .toEqual([
 | 
						|
                [HtmlElementAst, 'div', 'TestComp > div:nth-child(0)'],
 | 
						|
                [HtmlTextAst, 'a', 'TestComp > div:nth-child(0) > #text(a):nth-child(0)']
 | 
						|
              ]);
 | 
						|
        });
 | 
						|
 | 
						|
        it('should parse text nodes inside template elements', () => {
 | 
						|
          expect(humanizeDom(parser.parse('<template>a</template>', 'TestComp')))
 | 
						|
              .toEqual([
 | 
						|
                [HtmlElementAst, 'template', 'TestComp > template:nth-child(0)'],
 | 
						|
                [HtmlTextAst, 'a', 'TestComp > template:nth-child(0) > #text(a):nth-child(0)']
 | 
						|
              ]);
 | 
						|
        });
 | 
						|
      });
 | 
						|
 | 
						|
      describe('elements', () => {
 | 
						|
        it('should parse root level elements', () => {
 | 
						|
          expect(humanizeDom(parser.parse('<div></div>', 'TestComp')))
 | 
						|
              .toEqual([[HtmlElementAst, 'div', 'TestComp > div:nth-child(0)']]);
 | 
						|
        });
 | 
						|
 | 
						|
        it('should parse elements inside of regular elements', () => {
 | 
						|
          expect(humanizeDom(parser.parse('<div><span></span></div>', 'TestComp')))
 | 
						|
              .toEqual([
 | 
						|
                [HtmlElementAst, 'div', 'TestComp > div:nth-child(0)'],
 | 
						|
                [HtmlElementAst, 'span', 'TestComp > div:nth-child(0) > span:nth-child(0)']
 | 
						|
              ]);
 | 
						|
        });
 | 
						|
 | 
						|
        it('should parse elements inside of template elements', () => {
 | 
						|
          expect(humanizeDom(parser.parse('<template><span></span></template>', 'TestComp')))
 | 
						|
              .toEqual([
 | 
						|
                [HtmlElementAst, 'template', 'TestComp > template:nth-child(0)'],
 | 
						|
                [HtmlElementAst, 'span', 'TestComp > template:nth-child(0) > span:nth-child(0)']
 | 
						|
              ]);
 | 
						|
        });
 | 
						|
      });
 | 
						|
 | 
						|
      describe('attributes', () => {
 | 
						|
        it('should parse attributes on regular elements', () => {
 | 
						|
          expect(humanizeDom(parser.parse('<div k="v"></div>', 'TestComp')))
 | 
						|
              .toEqual([
 | 
						|
                [HtmlElementAst, 'div', 'TestComp > div:nth-child(0)'],
 | 
						|
                [HtmlAttrAst, 'k', 'v', 'TestComp > div:nth-child(0)[k=v]']
 | 
						|
              ]);
 | 
						|
        });
 | 
						|
 | 
						|
        it('should parse attributes on template elements', () => {
 | 
						|
          expect(humanizeDom(parser.parse('<template k="v"></template>', 'TestComp')))
 | 
						|
              .toEqual([
 | 
						|
                [HtmlElementAst, 'template', 'TestComp > template:nth-child(0)'],
 | 
						|
                [HtmlAttrAst, 'k', 'v', 'TestComp > template:nth-child(0)[k=v]']
 | 
						|
              ]);
 | 
						|
        });
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    describe('unparse', () => {
 | 
						|
      it('should unparse text nodes',
 | 
						|
         () => { expect(parser.unparse(parser.parse('a', null))).toEqual('a'); });
 | 
						|
 | 
						|
      it('should unparse elements',
 | 
						|
         () => { expect(parser.unparse(parser.parse('<a></a>', null))).toEqual('<a></a>'); });
 | 
						|
 | 
						|
      it('should unparse attributes', () => {
 | 
						|
        expect(parser.unparse(parser.parse('<div a b="c"></div>', null)))
 | 
						|
            .toEqual('<div a="" b="c"></div>');
 | 
						|
      });
 | 
						|
 | 
						|
      it('should unparse nested elements', () => {
 | 
						|
        expect(parser.unparse(parser.parse('<div><a></a></div>', null)))
 | 
						|
            .toEqual('<div><a></a></div>');
 | 
						|
      });
 | 
						|
 | 
						|
      it('should unparse nested text nodes', () => {
 | 
						|
        expect(parser.unparse(parser.parse('<div>a</div>', null))).toEqual('<div>a</div>');
 | 
						|
      });
 | 
						|
    });
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
function humanizeDom(asts: HtmlAst[]): any[] {
 | 
						|
  var humanizer = new Humanizer();
 | 
						|
  htmlVisitAll(humanizer, asts);
 | 
						|
  return humanizer.result;
 | 
						|
}
 | 
						|
 | 
						|
class Humanizer implements HtmlAstVisitor {
 | 
						|
  result: any[] = [];
 | 
						|
  visitElement(ast: HtmlElementAst, context: any): any {
 | 
						|
    this.result.push([HtmlElementAst, ast.name, ast.sourceInfo]);
 | 
						|
    htmlVisitAll(this, ast.attrs);
 | 
						|
    htmlVisitAll(this, ast.children);
 | 
						|
    return null;
 | 
						|
  }
 | 
						|
  visitAttr(ast: HtmlAttrAst, context: any): any {
 | 
						|
    this.result.push([HtmlAttrAst, ast.name, ast.value, ast.sourceInfo]);
 | 
						|
    return null;
 | 
						|
  }
 | 
						|
  visitText(ast: HtmlTextAst, context: any): any {
 | 
						|
    this.result.push([HtmlTextAst, ast.value, ast.sourceInfo]);
 | 
						|
    return null;
 | 
						|
  }
 | 
						|
} |