blob: 2a4d8cc6aa3e1a2629dcb79f3e1fb50c6c4003e7 [file] [log] [blame]
// Copyright 2018 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.
(async function() {
TestRunner.addResult(`Verifies viewport's visible and active message ranges.\n`);
await TestRunner.loadModule('console_test_runner');
await TestRunner.showPanel('console');
await TestRunner.evaluateInPagePromise(`
function addNormalMessages(count)
{
for (var i = 0; i < count; ++i)
console.log("Message #" + i);
}
function addMultilineMessages(count)
{
for (var i = 0; i < count; ++i)
console.log("Message\\n#" + i);
}
function addSlightlyBiggerMessages(count)
{
for (var i = 0; i < count; ++i)
console.log('%cMessage #' + i, 'padding-bottom: 1px');
}
//# sourceURL=console-viewport-indices.js
`);
ConsoleTestRunner.fixConsoleViewportDimensions(600, 200);
var consoleView = Console.ConsoleView.instance();
var viewport = consoleView._viewport;
function logMessages(count, type) {
TestRunner.addResult(`Logging ${count} ${type} messages`);
return new Promise(resolve => {
var awaitingMessagesCount = count;
function messageAdded() {
if (!--awaitingMessagesCount) {
viewport.invalidate();
resolve();
} else {
ConsoleTestRunner.addConsoleSniffer(messageAdded, false);
}
}
ConsoleTestRunner.addConsoleSniffer(messageAdded, false);
TestRunner.evaluateInPage(String.sprintf(`add${type}Messages(%d)`, count));
});
}
function dumpVisibleIndices() {
var {first, last, count} = ConsoleTestRunner.visibleIndices();
var activeTotal = viewport._firstActiveIndex === -1 ? 0 : (viewport._lastActiveIndex - viewport._firstActiveIndex + 1);
var calculatedFirst = viewport.firstVisibleIndex();
var calculatedLast = viewport.lastVisibleIndex();
var calculatedTotal = calculatedFirst === -1 ? 0 : (calculatedLast - calculatedFirst + 1);
if (calculatedFirst !== first || calculatedLast !== last) {
TestRunner.addResult('TEST ENDED IN ERROR: viewport is calculated incorrect visible indices!');
TestRunner.addResult(`Calculated visible range: ${calculatedFirst} to ${calculatedLast}, Total: ${calculatedTotal}
Actual visible range: ${first} to ${last}, Total: ${count}`);
TestRunner.completeTest();
} else {
TestRunner.addResult(`Expected and actual visible ranges match`);
}
}
function forceItemAndDump(index, first) {
TestRunner.addResult(`Force item to be ${first ? 'first' : 'last'}: ${index}`);
if (first)
viewport.forceScrollItemToBeFirst(index);
else
viewport.forceScrollItemToBeLast(index);
dumpVisibleIndices();
}
TestRunner.runTestSuite([
async function testEmptyViewport(next) {
Console.ConsoleView.clearConsole();
dumpVisibleIndices();
next();
},
async function testFirstLastVisibleIndices(next) {
Console.ConsoleView.clearConsole();
await logMessages(100, 'Normal');
forceItemAndDump(0, true);
forceItemAndDump(1, true);
var lessThanOneRowHeight = consoleView.minimumRowHeight() - 1;
TestRunner.addResult(`Scroll a bit down: ${lessThanOneRowHeight}px`);
viewport.element.scrollTop += lessThanOneRowHeight;
viewport.refresh();
dumpVisibleIndices();
forceItemAndDump(50, false);
forceItemAndDump(99, false);
next();
},
async function testMultilineMessages(next) {
Console.ConsoleView.clearConsole();
await logMessages(100, 'Multiline');
forceItemAndDump(0, true);
forceItemAndDump(1, true);
var lessThanOneRowHeight = consoleView.minimumRowHeight() - 1;
TestRunner.addResult(`Scroll a bit down: ${lessThanOneRowHeight}px`);
viewport.element.scrollTop += lessThanOneRowHeight;
viewport.refresh();
dumpVisibleIndices();
forceItemAndDump(50, false);
forceItemAndDump(99, false);
next();
},
async function testSlightlyBiggerMessages(next) {
Console.ConsoleView.clearConsole();
await logMessages(100, 'SlightlyBigger');
forceItemAndDump(0, true);
forceItemAndDump(1, true);
var lessThanOneRowHeight = consoleView.minimumRowHeight() - 1;
TestRunner.addResult(`Scroll a bit down: ${lessThanOneRowHeight}px`);
viewport.element.scrollTop += lessThanOneRowHeight;
viewport.refresh();
dumpVisibleIndices();
forceItemAndDump(50, false);
forceItemAndDump(99, false);
next();
}
]);
})();