<!DOCTYPE html>
<!--
Copyright (c) 2014 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="/core/analysis/toggle_container.html">

<script>
'use strict';

tv.b.unittest.testSuite(function() {
  var THIS_DOC = document._currentScript.ownerDocument;

  test('instantiateVisibleProperty', function() {
    var container = THIS_DOC.createElement('div');
    var firstToggleContainer = new TracingAnalysisToggleContainer();
    var secondToggleContainer = new TracingAnalysisToggleContainer();
    var defaultSettingsToggleContainer = new TracingAnalysisToggleContainer();

    var visibleChild = THIS_DOC.createElement('div');
    var hiddenChild = THIS_DOC.createElement('div');
    var defaultHiddenChild = THIS_DOC.createElement('div');

    var button1 = THIS_DOC.createElement('button');
    button1.textContent = '1: Toggle Visibility';

    var button2 = THIS_DOC.createElement('button');
    button2.textContent = '2: Toggle Visibility';

    var button3 = THIS_DOC.createElement('button');
    button3.textContent = '3: Toggle Visibility';

    var buttonToggleAll = THIS_DOC.createElement('button');
    buttonToggleAll.textContent = 'Toggle All';

    visibleChild.textContent = '1: Should be visible';
    hiddenChild.textContent = '2: Should not be visible';
    defaultHiddenChild.textContent = '3: Should also not be visible';

    firstToggleContainer.visible = true;
    secondToggleContainer.visible = false;
    // Default toggle container should have default visibility set to false.

    firstToggleContainer.appendChild(visibleChild);
    secondToggleContainer.appendChild(hiddenChild);
    defaultSettingsToggleContainer.appendChild(defaultHiddenChild);

    container.appendChild(button1);
    container.appendChild(button2);
    container.appendChild(button3);
    container.appendChild(buttonToggleAll);
    container.appendChild(firstToggleContainer);
    container.appendChild(secondToggleContainer);
    container.appendChild(defaultSettingsToggleContainer);

    firstToggleContainer.setToggleListener(button1, 'click');
    secondToggleContainer.setToggleListener(button2, 'click');
    defaultSettingsToggleContainer.setToggleListener(button3, 'click');

    firstToggleContainer.setToggleListener(buttonToggleAll, 'click');
    secondToggleContainer.setToggleListener(buttonToggleAll, 'click');
    defaultSettingsToggleContainer.setToggleListener(buttonToggleAll, 'click');

    this.addHTMLOutput(container);
  });

  test('visiblePropertyReflection', function() {
    var toggleContainer = new TracingAnalysisToggleContainer();

    assert.isFalse(toggleContainer.hasAttribute('visible'));
    toggleContainer.visible = true;
    assert.isTrue(toggleContainer.hasAttribute('visible'));
    toggleContainer.visible = false;
    assert.isFalse(toggleContainer.hasAttribute('visible'));
    toggleContainer.setAttribute('visible', 'true');
    assert.isTrue(toggleContainer.visible);
    toggleContainer.removeAttribute('visible');
    assert.isFalse(toggleContainer.visible);
  });

  test('setAndClearToggleListener', function() {
    var toggleContainer = new TracingAnalysisToggleContainer();

    var firstTarget = THIS_DOC.createElement('div');
    var secondTarget = THIS_DOC.createElement('div');
    var invalidTarget = THIS_DOC.createElement('div');
    toggleContainer.setToggleListener(firstTarget, 'click');
    toggleContainer.setToggleListener(secondTarget, 'click');

    var clickEvent = new MouseEvent('click', {
      'view': window,
      'bubbles': true,
      'cancelable': true
    });

    firstTarget.dispatchEvent(clickEvent);
    assert.isTrue(toggleContainer.visible);

    firstTarget.dispatchEvent(clickEvent);
    assert.isFalse(toggleContainer.visible);

    secondTarget.dispatchEvent(clickEvent);
    assert.isTrue(toggleContainer.visible);

    secondTarget.dispatchEvent(clickEvent);
    assert.isFalse(toggleContainer.visible);

    toggleContainer.clearToggleListener(firstTarget, 'click');
    firstTarget.dispatchEvent(clickEvent);
    // This event should not toggle the state.
    assert.isFalse(toggleContainer.visible);

    secondTarget.dispatchEvent(clickEvent);
    // This event should toggle the state.
    assert.isTrue(toggleContainer.visible);

    toggleContainer.clearToggleListener(invalidTarget, 'click');
    secondTarget.dispatchEvent(clickEvent);
    // This event should toggle the state.
    assert.isFalse(toggleContainer.visible);

    toggleContainer.clearToggleListener(secondTarget, 'invalidEventName');
    secondTarget.dispatchEvent(clickEvent);
    // This event should toggle the state.
    assert.isTrue(toggleContainer.visible);

    toggleContainer.clearToggleListener(secondTarget, 'click');
    secondTarget.dispatchEvent(clickEvent);
    // This event should not toggle the state as we've removed the listener.
    assert.isTrue(toggleContainer.visible);
  });
});
</script>
