import {describe, xit, it, expect} from 'test_lib/test_lib';
import {ProtoWatchGroup} from 'change_detection/watch_group';
import {ProtoView, View} from 'core/compiler/view';
import {ProtoElementInjector, ElementInjector} from 'core/compiler/element_injector';
import {DOM, Element} from 'facade/dom';
import {Module} from 'di/di';

export function main() {
  describe('view', function() {
    describe('ProtoView', function() {
      it('should create an instance of view', function() {
        var template = DOM.createTemplate('Hello <b>world</b>!');
        var pv = new ProtoView(template, null, null, null, false);
        var view:View = pv.instantiate();
        expect(view instanceof View).toBe(true);
      });


      xit('should create view instance and locate basic parts', function() {
        var template = DOM.createTemplate(
            '<section class="ng-binding" no-injector>' +
               'Hello {}!' +
               '<div directive class="ng-binding" injector>' +
                 '<span class="ng-binding" [hidden]="exp" no-injector>don\'t show me</span>' +
               '</div>' +
             '</section>');
        var module:Module = null;
        var sectionPI = new ProtoElementInjector(null, null, null);
        sectionPI.textNodes = [0];
        var divPI = new ProtoElementInjector(null, null, null);
        var spanPI = new ProtoElementInjector(null, null, null);
        spanPI.hasProperties = true;
        var protoElementInjector:List<ProtoElementInjector> = [sectionPI, divPI, spanPI];
        var protoWatchGroup:ProtoWatchGroup = null;
        var hasSingleRoot:boolean = false;
        var pv = new ProtoView(template, module, protoElementInjector, protoWatchGroup, hasSingleRoot);
        var view:View = pv.instantiate();
        var section:Element = template.content.firstChild;
        var div:Element = DOM.getElementsByTagName(section, 'div');
        var span:Element = DOM.getElementsByTagName(div, 'span');
        expect(DOM.getInnerHTML(view.fragment)).toEqual(DOM.getInnerHTML(section)); // exclude top level <section>
        expect(view.nodes).toEqual([view.fragment.firstChild.childNodes]); // TextNode(Hello...), <div>
        var elementInjector:ElementInjector = view.elementInjectors[1];
        expect(view.elementInjectors).toEqual([null, elementInjector, null]); // only second one has directive
        expect(view.bindElements).toEqual([span]);
        expect(view.textNodes).toEqual([section.childNodes[0]]);
      });
    });
  });
}