anchor.diff:            ..type(TwoOfTwoDirectives)
             ..type(MyController)
             ..type(MyParentController)
  -          ..type(MyChildController)
  +          ..type(MyChildController);
  +    });
  +
  +    beforeEach(inject((TestBed tb) => _ = tb));
  +
  +    it('should compile basic hello world', inject(() {
  +      var element = $(_.compile('<div ng-bind="name"></div>'));
  +
  +      _.rootScope.context['name'] = 'angular';
  +
  +      expect(element.text()).toEqual('');
  +      _.rootScope.apply();
  +      expect(element.text()).toEqual('angular');
  +    }));
  +
  +    it('should not throw on an empty list', inject(() {
  +      _.compile([]);
  +    }));
  +
  +    it('should compile a comment with no directives around', inject(() {
  +      var element = $(_.compile('<div><!-- comment --></div>'));
  +      expect(element.html()).toEqual('<!-- comment -->');
  +    }));
  +
  +    it('should compile a comment when the parent has a directive', inject(() {
  +      var element = $(_.compile('<div ng-show="true"><!-- comment --></div>'));
  +      expect(element.html()).toEqual('<!-- comment -->');
  +    }));
  +
  +    it('should compile a directive in a child', inject(() {
  +      var element = $(_.compile('<div><div ng-bind="name"></div></div>'));
  +
  +      _.rootScope.context['name'] = 'angular';
  +
  +      expect(element.text()).toEqual('');
  +      _.rootScope.apply();
  +      expect(element.text()).toEqual('angular');
  +    }));
  +
  +    it('should compile repeater', inject(() {
  +      var element = $(_.compile('<div><div ng-repeat="item in items" ng-bind="item"></div></div>'));
  +
  +      _.rootScope.context['items'] = ['A', 'b'];
  +      expect(element.text()).toEqual('');
  +
  +      _.rootScope.apply();
  +      expect(element.text()).toEqual('Ab');
  +
  +      _.rootScope.context['items'] = [];
  +      _.rootScope.apply();
  +      expect(element.html()).toEqual('<!--ANCHOR: [ng-repeat]=item in items-->');
  +    }));
  +
  +    it('should compile repeater with children', inject((Compiler $compile) {
  +      var element = $(_.compile('<div><div ng-repeat="item in items"><div ng-bind="item"></div></div></div>'));
  +
  +      _.rootScope.context['items'] = ['A', 'b'];
  +
  +      expect(element.text()).toEqual('');
  +      _.rootScope.apply();
  +      expect(element.text()).toEqual('Ab');
  +
  +      _.rootScope.context['items'] = [];
  +      _.rootScope.apply();
  +      expect(element.html()).toEqual('<!--ANCHOR: [ng-repeat]=item in items-->');
  +    }));
  +
  +    it('should compile text', inject((Compiler $compile) {
  +      var element = $(_.compile('<div>{{name}}<span>!</span></div>'));
  +      _.rootScope.context['name'] = 'OK';
  +
  +      microLeap();
  +      _.rootScope.apply();
  +      expect(element.text()).toEqual('OK!');
  +    }));
  +
  +    it('should compile nested repeater', inject((Compiler $compile) {
  +      var element = $(_.compile(
  +          '<div>' +
  +          '<ul ng-repeat="lis in uls">' +
  +          '<li ng-repeat="li in lis">{{li}}</li>' +
  +          '</ul>' +
  +          '</div>'));
  +
  +      _.rootScope.context['uls'] = [['A'], ['b']];
  +
  +      _.rootScope.apply();
  +      expect(element.text()).toEqual('Ab');
  +    }));
  +
  +    it('should compile two directives with the same selector', inject((Logger log) {
  +      var element = $(_.compile('<div two-directives></div>'));
  +
  +      _.rootScope.apply();
  +
  +      expect(log).toEqual(['OneOfTwo', 'TwoOfTwo']);
  +    }));
  +
  +    it('should compile a directive that ignores children', inject((Logger log) {
  +      // The ng-repeat comes first, so it is not ignored, but the children *are*
  +      var element = $(_.compile('<div ng-repeat="i in [1,2]" ignore-children><div two-directives></div></div>'));
  +
  +      _.rootScope.apply();
  +
  +      expect(log).toEqual(['Ignore', 'Ignore']);
  +    }));
  +
  +
  +    describe("interpolation", () {
  +      it('should interpolate attribute nodes', inject(() {
  +        var element = $(_.compile('<div test="{{name}}"></div>'));
  +
  +        _.rootScope.context['name'] = 'angular';
  +
  +        _.rootScope.apply();
  +        expect(element.attr('test')).toEqual('angular');
  +      }));
  +
  +      it('should interpolate text nodes', inject(() {
  +        var element = $(_.compile('<div>{{name}}</div>'));
  +
  +        _.rootScope.context['name'] = 'angular';
  +
  +        _.rootScope.apply();
  +        expect(element.text()).toEqual('angular');
  +      }));
  +    });
  +
  +
  +    describe('components', () {
  +      beforeEachModule((Module module) {
  +        module
             ..type(SimpleComponent)
             ..type(CamelCaseMapComponent)
             ..type(IoComponent)
  
positive.code:           ..type(SimpleComponent)
            ..type(ExprAttrComponent)
            ..type(SayHelloFilter);
      });
  
      beforeEach(inject((TestBed tb) => _ = tb));
  
      it('should compile basic hello world', inject(() {
        var element = $(_.compile('<div ng-bind="name"></div>'));
  
        _.rootScope.context['name'] = 'angular';
  
        expect(element.text()).toEqual('');
        _.rootScope.apply();
        expect(element.text()).toEqual('angular');
      }));
  
      it('should not throw on an empty list', inject(() {
        _.compile([]);
      }));
  
      it('should compile a comment with no directives around', inject(() {
        var element = $(_.compile('<div><!-- comment --></div>'));
        expect(element.html()).toEqual('<!-- comment -->');
      }));
  
      it('should compile a comment when the parent has a directive', inject(() {
        var element = $(_.compile('<div ng-show="true"><!-- comment --></div>'));
        expect(element.html()).toEqual('<!-- comment -->');
      }));
  
      it('should compile a directive in a child', inject(() {
        var element = $(_.compile('<div><div ng-bind="name"></div></div>'));
  
        _.rootScope.context['name'] = 'angular';
  
        expect(element.text()).toEqual('');
        _.rootScope.apply();
        expect(element.text()).toEqual('angular');
      }));
  
      it('should compile repeater', inject(() {
        var element = $(_.compile('<div><div ng-repeat="item in items" ng-bind="item"></div></div>'));
  
        _.rootScope.context['items'] = ['A', 'b'];
        expect(element.text()).toEqual('');
  
        _.rootScope.apply();
        expect(element.text()).toEqual('Ab');
  
        _.rootScope.context['items'] = [];
        _.rootScope.apply();
        expect(element.html()).toEqual('<!--ANCHOR: [ng-repeat]=item in items-->');
      }));
  
      it('should compile repeater with children', inject((Compiler $compile) {
        var element = $(_.compile('<div><div ng-repeat="item in items"><div ng-bind="item"></div></div></div>'));
  
        _.rootScope.context['items'] = ['A', 'b'];
  
        expect(element.text()).toEqual('');
        _.rootScope.apply();
        expect(element.text()).toEqual('Ab');
  
        _.rootScope.context['items'] = [];
        _.rootScope.apply();
        expect(element.html()).toEqual('<!--ANCHOR: [ng-repeat]=item in items-->');
      }));
  
      it('should compile text', inject((Compiler $compile) {
        var element = $(_.compile('<div>{{name}}<span>!</span></div>'));
        _.rootScope.context['name'] = 'OK';
  
        microLeap();
        _.rootScope.apply();
        expect(element.text()).toEqual('OK!');
      }));
  
      it('should compile nested repeater', inject((Compiler $compile) {
        var element = $(_.compile(
            '<div>' +
            '<ul ng-repeat="lis in uls">' +
            '<li ng-repeat="li in lis">{{li}}</li>' +
            '</ul>' +
            '</div>'));
  
        _.rootScope.context['uls'] = [['A'], ['b']];
  
        _.rootScope.apply();
        expect(element.text()).toEqual('Ab');
      }));
  
      it('should compile two directives with the same selector', inject((Logger log) {
        var element = $(_.compile('<div two-directives></div>'));
  
        _.rootScope.apply();
  
        expect(log).toEqual(['OneOfTwo', 'TwoOfTwo']);
      }));
  
      it('should compile a directive that ignores children', inject((Logger log) {
        // The ng-repeat comes first, so it is not ignored, but the children *are*
        var element = $(_.compile('<div ng-repeat="i in [1,2]" ignore-children><div two-directives></div></div>'));
  
        _.rootScope.apply();
  
        expect(log).toEqual(['Ignore', 'Ignore']);
      }));
  
  
      describe("interpolation", () {
        it('should interpolate attribute nodes', inject(() {
          var element = $(_.compile('<div test="{{name}}"></div>'));
  
          _.rootScope.context['name'] = 'angular';
  
          _.rootScope.apply();
          expect(element.attr('test')).toEqual('angular');
        }));
  
        it('should interpolate text nodes', inject(() {
          var element = $(_.compile('<div>{{name}}</div>'));
  
          _.rootScope.context['name'] = 'angular';
  
          _.rootScope.apply();
          expect(element.text()).toEqual('angular');
        }));
      });
  
  
      describe('components', () {
  
        it('should select on element', async(inject((NgZone zone) {
          var element = $(_.compile(r'<div><simple></simple></div>'));
  
negative.code:     TestBed _;
  
      beforeEachModule((Module module) {
        module
            ..type(TabComponent)
            ..type(PublishTypesAttrDirective)
  