blob: 0f3a5e29e600909baf41b8fc01c753435fd07717 [file] [log] [blame]
<!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>