<!DOCTYPE html>
<!--
Copyright (c) 2013 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->

<link rel="import" href="/extras/about_tracing/record_selection_dialog.html">
<link rel="import" href="/base/settings.html">
<link rel="import" href="/core/test_utils.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() { // @suppress longLineCheck
  test('instantitate', function() {
    var categories = [];
    for (var i = 0; i < 30; i++)
      categories.push('cat-' + i);
    for (var i = 0; i < 20; i++)
      categories.push('disabled-by-default-cat-' + i);
    categories.push('really-really-really-really-really-really-very-loong-cat');
    categories.push('first,second,third');
    categories.push('cc,disabled-by-default-cc.debug');

    var dlg = new tr.e.about_tracing.RecordSelectionDialog();
    dlg.categories = categories;
    dlg.settings_key = 'key';
    dlg.currentlyChosenPreset = [];

    var showButton = document.createElement('button');
    showButton.textContent = 'Show record selection dialog';
    showButton.addEventListener('click', function(e) {
      dlg.visible = true;
      e.stopPropagation();
    });
    this.addHTMLOutput(showButton);
  });

  test('recordSelectionDialog_splitCategories', function() {
    var dlg = new tr.e.about_tracing.RecordSelectionDialog();
    dlg.categories =
        ['cc,disabled-by-default-one,cc.debug', 'two,three', 'three'];
    dlg.settings_key = 'key';
    dlg.currentlyChosenPreset = [];
    dlg.updateForm_();

    var expected =
        ['"cc"', '"cc.debug"', '"disabled-by-default-one"', '"three"', '"two"'];

    var labels = dlg.querySelectorAll('.categories input');
    var results = [];
    for (var i = 0; i < labels.length; i++) {
      results.push('"' + labels[i].value + '"');
    }
    results = results.sort();

    assert.deepEqual(results, expected);
  });

  test('recordSelectionDialog_UpdateForm_NoSettings', function() {
    var dlg = new tr.e.about_tracing.RecordSelectionDialog();
    dlg.categories = ['disabled-by-default-one', 'two', 'three'];
    dlg.settings_key = 'key';
    dlg.currentlyChosenPreset = [];
    dlg.updateForm_();

    var checkboxes = dlg.querySelectorAll('.categories input');
    assert.equal(checkboxes.length, 3);
    assert.equal(checkboxes[0].id, 'three');
    assert.equal(checkboxes[0].value, 'three');
    assert.isTrue(checkboxes[0].checked);
    assert.equal(checkboxes[1].id, 'two');
    assert.equal(checkboxes[1].value, 'two');
    assert.isTrue(checkboxes[1].checked);
    assert.equal(checkboxes[2].id, 'disabled-by-default-one');
    assert.equal(checkboxes[2].value, 'disabled-by-default-one');
    assert.isFalse(checkboxes[2].checked);

    assert.equal(dlg.categoryFilter(), '');

    var labels = dlg.querySelectorAll('.categories label');
    assert.equal(labels.length, 3);
    assert.equal(labels[0].textContent, 'three');
    assert.equal(labels[1].textContent, 'two');
    assert.equal(labels[2].textContent, 'one');
  });

  test('recordSelectionDialog_UpdateForm_Settings', function() {
    tr.b.Settings.set('two', true, 'categories');
    tr.b.Settings.set('three', false, 'categories');

    var dlg = new tr.e.about_tracing.RecordSelectionDialog();
    dlg.categories = ['disabled-by-default-one'];
    dlg.settings_key = 'categories';
    dlg.currentlyChosenPreset = [];
    dlg.updateForm_();

    var checkboxes = dlg.querySelectorAll('.categories input');
    assert.equal(checkboxes.length, 3);
    assert.equal(checkboxes[0].id, 'three');
    assert.equal(checkboxes[0].value, 'three');
    assert.isFalse(checkboxes[0].checked);
    assert.equal(checkboxes[1].id, 'two');
    assert.equal(checkboxes[1].value, 'two');
    assert.isTrue(checkboxes[1].checked);
    assert.equal(checkboxes[2].id, 'disabled-by-default-one');
    assert.equal(checkboxes[2].value, 'disabled-by-default-one');
    assert.isFalse(checkboxes[2].checked);

    assert.equal(dlg.categoryFilter(), '-three');

    var labels = dlg.querySelectorAll('.categories label');
    assert.equal(labels.length, 3);
    assert.equal(labels[0].textContent, 'three');
    assert.equal(labels[1].textContent, 'two');
    assert.equal(labels[2].textContent, 'one');
  });

  test('recordSelectionDialog_UpdateForm_DisabledByDefault', function() {
    var dlg = new tr.e.about_tracing.RecordSelectionDialog();
    dlg.categories = ['disabled-by-default-bar', 'baz'];
    dlg.settings_key = 'categories';
    dlg.currentlyChosenPreset = [];
    dlg.updateForm_();

    assert.equal(dlg.categoryFilter(), '');

    var inputs =
        dlg.querySelector('input#disabled-by-default-bar').click();

    assert.equal(dlg.categoryFilter(), 'disabled-by-default-bar');

    assert.isFalse(
        tr.b.Settings.get('disabled-by-default-foo', false, 'categories'));
  });

  test('selectAll', function() {
    tr.b.Settings.set('two', true, 'categories');
    tr.b.Settings.set('three', false, 'categories');

    var dlg = new tr.e.about_tracing.RecordSelectionDialog();
    dlg.categories = ['disabled-by-default-one'];
    dlg.settings_key = 'categories';
    dlg.currentlyChosenPreset = [];
    dlg.updateForm_();
  });

  test('selectNone', function() {
    tr.b.Settings.set('two', true, 'categories');
    tr.b.Settings.set('three', false, 'categories');

    var dlg = new tr.e.about_tracing.RecordSelectionDialog();
    dlg.categories = ['disabled-by-default-one'];
    dlg.settings_key = 'categories';
    dlg.currentlyChosenPreset = [];
    dlg.updateForm_();

    // Enables the three option, two already enabled.
    dlg.querySelector('.default-enabled-categories .all-btn').click();
    assert.equal(dlg.categoryFilter(), '');
    assert.isTrue(tr.b.Settings.get('three', false, 'categories'));

    // Disables three and two.
    dlg.querySelector('.default-enabled-categories .none-btn').click();
    assert.equal(dlg.categoryFilter(), '-three,-two');
    assert.isFalse(tr.b.Settings.get('two', false, 'categories'));
    assert.isFalse(tr.b.Settings.get('three', false, 'categories'));

    // Turn categories back on so they can be ignored.
    dlg.querySelector('.default-enabled-categories .all-btn').click();

    // Enables disabled category.
    dlg.querySelector('.default-disabled-categories .all-btn').click();
    assert.equal(dlg.categoryFilter(), 'disabled-by-default-one');
    assert.isTrue(
        tr.b.Settings.get('disabled-by-default-one', false, 'categories'));

    // Turn disabled by default back off.
    dlg.querySelector('.default-disabled-categories .none-btn').click();
    assert.equal(dlg.categoryFilter(), '');
    assert.isFalse(
        tr.b.Settings.get('disabled-by-default-one', false, 'categories'));
  });

  test('recordSelectionDialog_noPreset', function() {
    tr.b.Settings.set('about_tracing.record_selection_dialog_preset', []);
    var dlg = new tr.e.about_tracing.RecordSelectionDialog();
    assert.isFalse(dlg.usingPreset_());
  });

  test('recordSelectionDialog_defaultPreset', function() {
    tr.b.Settings.set('two', true, 'categories');
    tr.b.Settings.set('three', false, 'categories');

    var dlg = new tr.e.about_tracing.RecordSelectionDialog();
    dlg.categories = ['disabled-by-default-one'];
    dlg.settings_key = 'categories';
    // Note: currentlyChosenPreset is not set here, so the default is used.
    dlg.updateForm_();

    // Make sure the default filter is returned.
    assert.equal(dlg.categoryFilter(), '-three,-two');

    // Make sure the default tracing types are returned.
    assert.equal(dlg.tracingRecordMode, 'record-until-full');
    assert.isFalse(dlg.useSystemTracing);
    assert.isFalse(dlg.useSampling);

    // Make sure the manual settings are not visible.
    var classList = dlg.categoriesView_.classList;
    assert.isTrue(classList.contains('categories-column-view-hidden'));

    // Verify manual settings do not modify the checkboxes.
    var checkboxes = dlg.querySelectorAll('.categories input');
    assert.equal(checkboxes.length, 3);
    assert.equal(checkboxes[0].id, 'three');
    assert.equal(checkboxes[0].value, 'three');
    assert.isFalse(checkboxes[0].checked);
    assert.equal(checkboxes[1].id, 'two');
    assert.equal(checkboxes[1].value, 'two');
    assert.isTrue(checkboxes[1].checked);
    assert.equal(checkboxes[2].id, 'disabled-by-default-one');
    assert.equal(checkboxes[2].value, 'disabled-by-default-one');
    assert.isFalse(checkboxes[2].checked);
  });

  test('recordSelectionDialog_changePresets', function() {
    tr.b.Settings.set('two', true, 'categories');
    tr.b.Settings.set('three', false, 'categories');
    tr.b.Settings.set('disabled-by-default-cc.debug', true, 'categories');
    tr.b.Settings.set('recordSelectionDialog.tracingRecordMode',
        'record-as-much-as-possible');
    tr.b.Settings.set('recordSelectionDialog.useSystemTracing', true);
    tr.b.Settings.set('recordSelectionDialog.useSampling', false);

    var dlg = new tr.e.about_tracing.RecordSelectionDialog();
    dlg.categories = ['disabled-by-default-one'];
    dlg.settings_key = 'categories';
    // Note: currentlyChosenPreset is not set here, so the default is used.
    dlg.updateForm_();

    // Preset mode is on.
    assert.isTrue(dlg.usingPreset_());

    // Make sure the default filter is returned.
    assert.equal(dlg.categoryFilter(),
        '-three,-two');

    // Make sure the default tracing types are returned.
    assert.equal(dlg.tracingRecordMode, 'record-until-full');
    assert.isFalse(dlg.useSystemTracing);
    assert.isFalse(dlg.useSampling);

    // Make sure the manual settings are not visible.
    var classList = dlg.categoriesView_.classList;
    assert.isTrue(classList.contains('categories-column-view-hidden'));

    // Switch to manual settings and verify the default values are not returned.
    dlg.currentlyChosenPreset = [];

    // Preset mode is off.
    assert.isFalse(dlg.usingPreset_());

    // Make sure the default filter is returned.
    assert.equal(dlg.categoryFilter(), '-three,disabled-by-default-cc.debug');

    // Make sure the tracing types set by catalog are returned.
    assert.equal(dlg.tracingRecordMode, 'record-as-much-as-possible');
    assert.isTrue(dlg.useSystemTracing);
    assert.isFalse(dlg.useSampling);
    assert.isFalse(classList.contains('categories-column-view-hidden'));

    // Switch to the graphics, rendering, and rasterization preset.
    dlg.currentlyChosenPreset = ['blink', 'cc', 'renderer',
      'disabled-by-default-cc.debug'];
    assert.equal(dlg.categoryFilter(),
        'disabled-by-default-cc.debug,-three,-two');
  });

  test('recordSelectionDialog_savedPreset', function() {
    tr.b.Settings.set('two', true, 'categories');
    tr.b.Settings.set('three', false, 'categories');
    tr.b.Settings.set('recordSelectionDialog.tracingRecordMode',
        'record-continuously');
    tr.b.Settings.set('recordSelectionDialog.useSystemTracing', true);
    tr.b.Settings.set('recordSelectionDialog.useSampling', true);
    tr.b.Settings.set('tr.e.about_tracing.record_selection_dialog_preset',
        ['blink', 'cc', 'renderer', 'cc.debug']);

    var dlg = new tr.e.about_tracing.RecordSelectionDialog();
    dlg.categories = ['disabled-by-default-one'];
    dlg.settings_key = 'categories';
    dlg.updateForm_();

    // Make sure the correct filter is returned.
    assert.equal(dlg.categoryFilter(), '-three,-two');

    // Make sure the correct tracing types are returned.
    assert.equal(dlg.tracingRecordMode, 'record-until-full');
    assert.isFalse(dlg.useSystemTracing);
    assert.isFalse(dlg.useSampling);

    // Make sure the manual settings are not visible.
    var classList = dlg.categoriesView_.classList;
    assert.isTrue(classList.contains('categories-column-view-hidden'));

    // Switch to manual settings and verify the default values are not returned.
    dlg.currentlyChosenPreset = [];
    assert.equal(dlg.categoryFilter(), '-three');
    assert.equal(dlg.tracingRecordMode, 'record-continuously');
    assert.isTrue(dlg.useSystemTracing);
    assert.isTrue(dlg.useSampling);
    assert.isFalse(classList.contains('categories-column-view-hidden'));
  });

  test('recordSelectionDialog_categoryFilters', function() {
    tr.b.Settings.set('default1', true, 'categories');
    tr.b.Settings.set('disabled1', false, 'categories');
    tr.b.Settings.set('disabled-by-default-cc.disabled2', false, 'categories');
    tr.b.Settings.set('input', true, 'categories');
    tr.b.Settings.set('blink', true, 'categories');
    tr.b.Settings.set('cc', false, 'categories');
    tr.b.Settings.set('disabled-by-default-cc.debug', true, 'categories');

    var dlg = new tr.e.about_tracing.RecordSelectionDialog();
    dlg.settings_key = 'categories';
    dlg.categories = [];
    dlg.currentlyChosenPreset = [];
    dlg.updateForm_();

    assert.equal(dlg.categoryFilter(),
        '-cc,-disabled1,disabled-by-default-cc.debug');

    // Switch to the graphics, rendering, and rasterization preset.
    dlg.currentlyChosenPreset = ['blink', 'cc', 'renderer',
      'disabled-by-default-cc.debug'];
    assert.equal(dlg.categoryFilter(),
        '-default1,disabled-by-default-cc.debug,-disabled1,-input');
  });
});
</script>
