/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
import {NgIf} from '@angular/common';
import {Component} from '@angular/core';
import {TestBed, async} from '@angular/core/testing';
import {beforeEach, ddescribe, describe, iit, inject, it, xit} from '@angular/core/testing/testing_internal';
import {getDOM} from '@angular/platform-browser/src/dom/dom_adapter';
import {expect} from '@angular/platform-browser/testing/matchers';
export function main() {
  describe('ngIf directive', () => {
    beforeEach(() => {
      TestBed.configureTestingModule({
        declarations: [TestComponent],
      });
    });
    it('should work in a template attribute', async(() => {
         const template = '
hello
';
         TestBed.overrideComponent(TestComponent, {set: {template: template}});
         let fixture = TestBed.createComponent(TestComponent);
         fixture.detectChanges();
         expect(getDOM().querySelectorAll(fixture.debugElement.nativeElement, 'copy-me').length)
             .toEqual(1);
         expect(fixture.debugElement.nativeElement).toHaveText('hello');
       }));
    it('should work in a template element', async(() => {
         const template =
             'hello2
';
         TestBed.overrideComponent(TestComponent, {set: {template: template}});
         let fixture = TestBed.createComponent(TestComponent);
         fixture.detectChanges();
         expect(getDOM().querySelectorAll(fixture.debugElement.nativeElement, 'copy-me').length)
             .toEqual(1);
         expect(fixture.debugElement.nativeElement).toHaveText('hello2');
       }));
    it('should toggle node when condition changes', async(() => {
         const template = 'hello
';
         TestBed.overrideComponent(TestComponent, {set: {template: template}});
         let fixture = TestBed.createComponent(TestComponent);
         fixture.debugElement.componentInstance.booleanCondition = false;
         fixture.detectChanges();
         expect(getDOM().querySelectorAll(fixture.debugElement.nativeElement, 'copy-me').length)
             .toEqual(0);
         expect(fixture.debugElement.nativeElement).toHaveText('');
         fixture.debugElement.componentInstance.booleanCondition = true;
         fixture.detectChanges();
         expect(getDOM().querySelectorAll(fixture.debugElement.nativeElement, 'copy-me').length)
             .toEqual(1);
         expect(fixture.debugElement.nativeElement).toHaveText('hello');
         fixture.debugElement.componentInstance.booleanCondition = false;
         fixture.detectChanges();
         expect(getDOM().querySelectorAll(fixture.debugElement.nativeElement, 'copy-me').length)
             .toEqual(0);
         expect(fixture.debugElement.nativeElement).toHaveText('');
       }));
    it('should handle nested if correctly', async(() => {
         const template =
             'hello
';
         TestBed.overrideComponent(TestComponent, {set: {template: template}});
         let fixture = TestBed.createComponent(TestComponent);
         fixture.debugElement.componentInstance.booleanCondition = false;
         fixture.detectChanges();
         expect(getDOM().querySelectorAll(fixture.debugElement.nativeElement, 'copy-me').length)
             .toEqual(0);
         expect(fixture.debugElement.nativeElement).toHaveText('');
         fixture.debugElement.componentInstance.booleanCondition = true;
         fixture.detectChanges();
         expect(getDOM().querySelectorAll(fixture.debugElement.nativeElement, 'copy-me').length)
             .toEqual(1);
         expect(fixture.debugElement.nativeElement).toHaveText('hello');
         fixture.debugElement.componentInstance.nestedBooleanCondition = false;
         fixture.detectChanges();
         expect(getDOM().querySelectorAll(fixture.debugElement.nativeElement, 'copy-me').length)
             .toEqual(0);
         expect(fixture.debugElement.nativeElement).toHaveText('');
         fixture.debugElement.componentInstance.nestedBooleanCondition = true;
         fixture.detectChanges();
         expect(getDOM().querySelectorAll(fixture.debugElement.nativeElement, 'copy-me').length)
             .toEqual(1);
         expect(fixture.debugElement.nativeElement).toHaveText('hello');
         fixture.debugElement.componentInstance.booleanCondition = false;
         fixture.detectChanges();
         expect(getDOM().querySelectorAll(fixture.debugElement.nativeElement, 'copy-me').length)
             .toEqual(0);
         expect(fixture.debugElement.nativeElement).toHaveText('');
       }));
    it('should update several nodes with if', async(() => {
         const template = '' +
             'helloNumber' +
             'helloString' +
             'helloFunction' +
             '
';
         TestBed.overrideComponent(TestComponent, {set: {template: template}});
         let fixture = TestBed.createComponent(TestComponent);
         fixture.detectChanges();
         expect(getDOM().querySelectorAll(fixture.debugElement.nativeElement, 'copy-me').length)
             .toEqual(3);
         expect(getDOM().getText(fixture.debugElement.nativeElement))
             .toEqual('helloNumberhelloStringhelloFunction');
         fixture.debugElement.componentInstance.numberCondition = 0;
         fixture.detectChanges();
         expect(getDOM().querySelectorAll(fixture.debugElement.nativeElement, 'copy-me').length)
             .toEqual(1);
         expect(fixture.debugElement.nativeElement).toHaveText('helloString');
         fixture.debugElement.componentInstance.numberCondition = 1;
         fixture.debugElement.componentInstance.stringCondition = 'bar';
         fixture.detectChanges();
         expect(getDOM().querySelectorAll(fixture.debugElement.nativeElement, 'copy-me').length)
             .toEqual(1);
         expect(fixture.debugElement.nativeElement).toHaveText('helloNumber');
       }));
    it('should not add the element twice if the condition goes from true to true (JS)',
       async(() => {
         const template = 'hello
';
         TestBed.overrideComponent(TestComponent, {set: {template: template}});
         let fixture = TestBed.createComponent(TestComponent);
         fixture.detectChanges();
         expect(getDOM().querySelectorAll(fixture.debugElement.nativeElement, 'copy-me').length)
             .toEqual(1);
         expect(fixture.debugElement.nativeElement).toHaveText('hello');
         fixture.debugElement.componentInstance.numberCondition = 2;
         fixture.detectChanges();
         expect(getDOM().querySelectorAll(fixture.debugElement.nativeElement, 'copy-me').length)
             .toEqual(1);
         expect(fixture.debugElement.nativeElement).toHaveText('hello');
       }));
    it('should not recreate the element if the condition goes from true to true (JS)', async(() => {
         const template = 'hello
';
         TestBed.overrideComponent(TestComponent, {set: {template: template}});
         let fixture = TestBed.createComponent(TestComponent);
         fixture.detectChanges();
         getDOM().addClass(
             getDOM().querySelector(fixture.debugElement.nativeElement, 'copy-me'), 'foo');
         fixture.debugElement.componentInstance.numberCondition = 2;
         fixture.detectChanges();
         expect(getDOM().hasClass(
                    getDOM().querySelector(fixture.debugElement.nativeElement, 'copy-me'), 'foo'))
             .toBe(true);
       }));
  });
}
@Component({selector: 'test-cmp', directives: [NgIf], template: ''})
class TestComponent {
  booleanCondition: boolean;
  nestedBooleanCondition: boolean;
  numberCondition: number;
  stringCondition: string;
  functionCondition: Function;
  constructor() {
    this.booleanCondition = true;
    this.nestedBooleanCondition = true;
    this.numberCondition = 1;
    this.stringCondition = 'foo';
    this.functionCondition = function(s: any, n: any): boolean { return s == 'foo' && n == 1; };
  }
}