/**
 * @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 {openBrowser, verifyNoBrowserErrors} from 'e2e_util/e2e_util';
import {$} from 'protractor';

describe('tree benchmark spec', () => {

  afterEach(verifyNoBrowserErrors);

  it('should work for ng2', () => {
    testTreeBenchmark({
      url: 'all/benchmarks/src/tree/ng2/index.html',
    });
  });

  it('should work for ng2 detect changes', () => {
    let params = [{name: 'depth', value: 4}];
    openBrowser({url: 'all/benchmarks/src/tree/ng2/index.html', params});
    $('#detectChanges').click();
    expect($('#numberOfChecks').getText()).toContain('10');
  });

  it('should work for ng2 next', () => {
    testTreeBenchmark({
      url: 'all/benchmarks/src/tree/ng2_next/index.html',
      ignoreBrowserSynchronization: true,
      // Can't use bundles as we use non exported code
      extraParams: [{name: 'bundles', value: false}]
    });
  });

  it('should work for ng2 next detect changes', () => {
    let params = [
      {name: 'depth', value: 4},
      // Can't use bundles as we use non exported code
      {name: 'bundles', value: false}
    ];
    openBrowser({
      url: 'all/benchmarks/src/tree/ng2_next/index.html',
      ignoreBrowserSynchronization: true, params
    });
    $('#detectChanges').click();
    expect($('#numberOfChecks').getText()).toContain('10');
  });

  // TODO: delete ftl benchmarks
  xit('should work for ng2 ftl', () => {
    testTreeBenchmark({
      url: 'all/benchmarks/src/tree/ng2_ftl/index.html',
      // Can't use bundles as we use AoT generated code
      // which relies on deep imports
      extraParams: [{name: 'bundles', value: false}]
    });
  });

  it('should work for ng2 static', () => {
    testTreeBenchmark({
      url: 'all/benchmarks/src/tree/ng2_static/index.html',
    });
  });

  // TODO: delete ftl benchmarks
  xit('should work for ng2 static ftl', () => {
    testTreeBenchmark({
      url: 'all/benchmarks/src/tree/ng2_static_ftl/index.html',
      // Can't use bundles as we use AoT generated code
      // which relies on deep imports
      extraParams: [{name: 'bundles', value: false}]
    });
  });

  it('should work for ng2 switch', () => {
    testTreeBenchmark({
      url: 'all/benchmarks/src/tree/ng2_switch/index.html',
    });
  });

  it('should work for the baseline', () => {
    testTreeBenchmark({
      url: 'all/benchmarks/src/tree/baseline/index.html',
      ignoreBrowserSynchronization: true,
    });
  });

  it('should work for incremental dom', () => {
    testTreeBenchmark({
      url: 'all/benchmarks/src/tree/incremental_dom/index.html',
      ignoreBrowserSynchronization: true,
    });
  });

  it('should work for polymer binary tree', () => {
    testTreeBenchmark({
      url: 'all/benchmarks/src/tree/polymer/index.html',
      ignoreBrowserSynchronization: true,
    });
  });

  it('should work for polymer leaves', () => {
    testTreeBenchmark({
      url: 'all/benchmarks/src/tree/polymer_leaves/index.html',
      ignoreBrowserSynchronization: true,
    });
  });

  function testTreeBenchmark(openConfig: {
    url: string,
    ignoreBrowserSynchronization?: boolean,
    extraParams?: {name: string, value: any}[]
  }) {
    let params = [{name: 'depth', value: 4}];
    if (openConfig.extraParams) {
      params = params.concat(openConfig.extraParams);
    }
    openBrowser({
      url: openConfig.url,
      ignoreBrowserSynchronization: openConfig.ignoreBrowserSynchronization,
      params: params,
    });
    $('#createDom').click();
    expect($('#root').getText()).toContain('0');
    $('#createDom').click();
    expect($('#root').getText()).toContain('A');
    $('#destroyDom').click();
    expect($('#root').getText()).toEqual('');
  }
});
