<!DOCTYPE html>
<!--
Copyright 2015 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="/tracing/ui/analysis/stacked_pane.html">
<link rel="import" href="/tracing/ui/analysis/stacked_pane_view.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  function createPaneView() {
    return document.createElement('tr-ui-a-stacked-pane-view');
  }

  function createPane(paneId, opt_rebuildPaneCallback, opt_appendedCallback) {
    var paneEl = document.createElement('tr-ui-a-stacked-pane');
    paneEl.paneId = paneId;

    var divEl = document.createElement('div');
    Polymer.dom(divEl).textContent = 'Pane ' + paneId;
    divEl.style.width = '400px';
    divEl.style.background = '#ccc';
    divEl.style.textAlign = 'center';
    Polymer.dom(paneEl).appendChild(divEl);

    if (opt_rebuildPaneCallback)
      paneEl.onRebuild_ = opt_rebuildPaneCallback;

    if (opt_appendedCallback)
      paneEl.appended = opt_appendedCallback;

    return paneEl;
  }

  function createPaneBuilder(paneId, opt_rebuildPaneCallback,
      opt_appendedCallback) {
    return createPane.bind(
        undefined, paneId, opt_rebuildPaneCallback, opt_appendedCallback);
  }

  function assertPanes(paneView, expectedPaneIds) {
    var actualPaneIds = paneView.panesForTesting.map(function(pane) {
      return pane.paneId;
    });
    assert.deepEqual(actualPaneIds, expectedPaneIds);
  }

  test('instantiate_empty', function() {
    var viewEl = createPaneView();
    viewEl.rebuild();
    assertPanes(viewEl, []);
    // Don't add the pane to HTML output because it has zero height.
  });

  test('instantiate_singlePane', function() {
    var viewEl = createPaneView();

    viewEl.setPaneBuilder(createPaneBuilder(1));
    viewEl.rebuild();

    assertPanes(viewEl, [1]);
    this.addHTMLOutput(viewEl);
  });

  test('instantiate_multiplePanes', function() {
    var viewEl = createPaneView();

    viewEl.setPaneBuilder(createPaneBuilder(1));
    viewEl.setPaneBuilder(createPaneBuilder(2), viewEl.panesForTesting[0]);
    viewEl.setPaneBuilder(createPaneBuilder(3), viewEl.panesForTesting[1]);

    assertPanes(viewEl, [1, 2, 3]);
    this.addHTMLOutput(viewEl);
  });

  test('changePanes', function() {
    var viewEl = createPaneView();

    viewEl.setPaneBuilder(createPaneBuilder(1));
    assertPanes(viewEl, [1]);

    viewEl.setPaneBuilder(null);
    assertPanes(viewEl, []);

    viewEl.setPaneBuilder(createPaneBuilder(2));
    assertPanes(viewEl, [2]);

    viewEl.setPaneBuilder(createPaneBuilder(3), viewEl.panesForTesting[0]);
    assertPanes(viewEl, [2, 3]);

    viewEl.setPaneBuilder(createPaneBuilder(4), viewEl.panesForTesting[0]);
    assertPanes(viewEl, [2, 4]);

    viewEl.setPaneBuilder(createPaneBuilder(5), viewEl.panesForTesting[1]);
    assertPanes(viewEl, [2, 4, 5]);

    viewEl.setPaneBuilder(createPaneBuilder(6), viewEl.panesForTesting[2]);
    assertPanes(viewEl, [2, 4, 5, 6]);

    viewEl.setPaneBuilder(createPaneBuilder(7), viewEl.panesForTesting[1]);
    assertPanes(viewEl, [2, 4, 7]);

    this.addHTMLOutput(viewEl);
  });

  test('childPanes', function() {
    var viewEl = createPaneView();

    viewEl.setPaneBuilder(createPaneBuilder(1));
    assertPanes(viewEl, [1]);

    // Pane 1 requests a child pane 2.
    var pane1 = viewEl.panesForTesting[0];
    pane1.childPaneBuilder = createPaneBuilder(2);
    assertPanes(viewEl, [1, 2]);

    // Pane 2 requests removing its child pane (nothing happens).
    var pane2 = viewEl.panesForTesting[1];
    pane2.childPaneBuilder = undefined;
    assertPanes(viewEl, [1, 2]);

    // Pane 2 requests a child pane 3.
    pane2.childPaneBuilder = createPaneBuilder(3);
    assertPanes(viewEl, [1, 2, 3]);

    // Pane 2 requests a child pane 4 (its previous child pane 3 is removed).
    pane2.childPaneBuilder = createPaneBuilder(4);
    assertPanes(viewEl, [1, 2, 4]);

    // Pane 1 requests removing its child pane (panes 2 and 4 are removed).
    pane1.childPaneBuilder = undefined;
    assertPanes(viewEl, [1]);

    // Check that removed panes cannot affect the pane view.
    pane2.childPaneBuilder = createPaneBuilder(5);
    assertPanes(viewEl, [1]);

    // Pane 1 requests a child pane 6 (check that everything still works).
    pane1.childPaneBuilder = createPaneBuilder(6);
    assertPanes(viewEl, [1, 6]);

    // Change the top pane to pane 7.
    viewEl.setPaneBuilder(createPaneBuilder(7));
    assertPanes(viewEl, [7]);

    // Check that removed panes cannot affect the pane view.
    pane1.childPaneBuilder = createPaneBuilder(5);
    assertPanes(viewEl, [7]);
  });

  test('rebuild', function() {
    var viewEl = createPaneView();

    var rebuiltPaneIds = [];
    var rebuildPaneCallback = function() {
      rebuiltPaneIds.push(this.paneId);
    };

    viewEl.setPaneBuilder(createPaneBuilder(1, rebuildPaneCallback));
    viewEl.setPaneBuilder(createPaneBuilder(2, rebuildPaneCallback),
        viewEl.panesForTesting[0]);
    viewEl.setPaneBuilder(createPaneBuilder(3, rebuildPaneCallback),
        viewEl.panesForTesting[1]);

    // Rebuild isn't triggered.
    assert.deepEqual(rebuiltPaneIds, []);

    // Rebuild is triggered, but it isn't necessary (all panes are clean).
    viewEl.rebuild();
    assert.deepEqual(rebuiltPaneIds, []);

    // All panes are now marked as dirty, but rebuild isn't triggered (it was
    // only scheduled).
    viewEl.panesForTesting.forEach(function(pane) {
      pane.scheduleRebuild_();
    });
    assert.deepEqual(rebuiltPaneIds, []);

    // Finally, rebuild was triggered and the panes are dirty.
    viewEl.rebuild();
    assert.deepEqual(rebuiltPaneIds, [1, 2, 3]);

    // Make sure that panes are clean after the previous rebuild.
    viewEl.rebuild();
    assert.deepEqual(rebuiltPaneIds, [1, 2, 3]);
  });

  test('appended', function() {
    var viewEl = createPaneView();
    var didFireAppended;

    didFireAppended = false;
    viewEl.setPaneBuilder(createPaneBuilder(1, undefined, function() {
      didFireAppended = true;
    }));
    assert.isTrue(didFireAppended);
  });
});
</script>
