243 lines
7.3 KiB
HTML
243 lines
7.3 KiB
HTML
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
|
|
<script src="resources/table-utilities.js"></script>
|
|
<script>
|
|
function test()
|
|
{
|
|
InspectorTest.redirectRequestAnimationFrame();
|
|
|
|
let suite = InspectorTest.createSyncSuite("Table.RemoveRows");
|
|
|
|
function logTable(table, rowsToRemove = []) {
|
|
for (let rowIndex = 0; rowIndex < table.numberOfRows; ++rowIndex) {
|
|
let type = " ";
|
|
if (rowsToRemove.includes(rowIndex))
|
|
type = "-";
|
|
else if (table.selectedRows.includes(rowIndex))
|
|
type = "*";
|
|
InspectorTest.log(` ${type} Row ${rowIndex}`);
|
|
}
|
|
}
|
|
|
|
class RemoveRowTestDelegate extends InspectorTest.TableDelegate
|
|
{
|
|
constructor()
|
|
{
|
|
super();
|
|
|
|
this._rowIndex = NaN;
|
|
}
|
|
|
|
// Public
|
|
|
|
triggerRemoveRow(table, rowIndex)
|
|
{
|
|
InspectorTest.assert(isNaN(this._rowIndex));
|
|
|
|
this._rowIndex = rowIndex;
|
|
|
|
InspectorTest.log(`Given a Table with selected rows [${table.selectedRows}], remove row ${rowIndex}.`);
|
|
table.removeRow(rowIndex);
|
|
}
|
|
|
|
// Table delegate
|
|
|
|
tableDidRemoveRows(table, rowIndexes)
|
|
{
|
|
super.tableDidRemoveRows(table, rowIndexes);
|
|
|
|
InspectorTest.expectShallowEqual(rowIndexes, [this._rowIndex], `Should remove row ${this._rowIndex}.`);
|
|
this._rowIndex = NaN;
|
|
}
|
|
|
|
tableSelectionDidChange(table)
|
|
{
|
|
if (isNaN(this._rowIndex))
|
|
return;
|
|
|
|
InspectorTest.log(`Selection changed to [${table.selectedRows}] before removing row ${this._rowIndex}.`);
|
|
}
|
|
}
|
|
|
|
class RemoveSelectedRowsTestDelegate extends InspectorTest.TableDelegate
|
|
{
|
|
constructor()
|
|
{
|
|
super();
|
|
|
|
this._rowIndexes = null;
|
|
}
|
|
|
|
// Public
|
|
|
|
triggerRemoveSelectedRows(table)
|
|
{
|
|
InspectorTest.assert(!this._rowIndexes);
|
|
|
|
this._rowIndexes = table.selectedRows;
|
|
|
|
InspectorTest.log(`Given a Table with selected rows [${this._rowIndexes}]:`);
|
|
logTable(table);
|
|
|
|
table.removeSelectedRows();
|
|
}
|
|
|
|
// Table delegate
|
|
|
|
tableDidRemoveRows(table, rowIndexes)
|
|
{
|
|
super.tableDidRemoveRows(table, rowIndexes);
|
|
|
|
InspectorTest.expectShallowEqual(rowIndexes, this._rowIndexes, `Should remove rows [${this._rowIndexes}].`);
|
|
this._rowIndexes = null;
|
|
}
|
|
|
|
tableSelectionDidChange(table)
|
|
{
|
|
if (!this._rowIndexes)
|
|
return;
|
|
|
|
InspectorTest.log(`Selection changed before removing rows:`);
|
|
logTable(table, this._rowIndexes);
|
|
}
|
|
}
|
|
|
|
const numberOfRows = 4;
|
|
const lastRowIndex = numberOfRows - 1;
|
|
|
|
suite.addTestCase({
|
|
name: "Table.RemoveRow.NoneSelected",
|
|
description: "Remove a row from a table with no selected rows.",
|
|
test() {
|
|
let testDelegate = new RemoveRowTestDelegate;
|
|
let table = InspectorTest.createTableWithDelegate(testDelegate, numberOfRows);
|
|
|
|
testDelegate.triggerRemoveRow(table, 0);
|
|
|
|
return true;
|
|
}
|
|
});
|
|
|
|
suite.addTestCase({
|
|
name: "Table.RemoveRow.Selected",
|
|
description: "Remove the only selected table row.",
|
|
test() {
|
|
let testDelegate = new RemoveRowTestDelegate;
|
|
let table = InspectorTest.createTableWithDelegate(testDelegate, numberOfRows);
|
|
|
|
table.selectRow(0);
|
|
testDelegate.triggerRemoveRow(table, 0);
|
|
|
|
return true;
|
|
}
|
|
});
|
|
|
|
suite.addTestCase({
|
|
name: "Table.RemoveRow.PrecedingSelected",
|
|
description: "Remove a row preceding the selection, causing the selection to shift up.",
|
|
test() {
|
|
let testDelegate = new RemoveRowTestDelegate;
|
|
let table = InspectorTest.createTableWithDelegate(testDelegate, numberOfRows);
|
|
table.allowsMultipleSelection = true;
|
|
|
|
table.selectRow(1);
|
|
table.selectRow(3, true);
|
|
testDelegate.triggerRemoveRow(table, 0);
|
|
|
|
InspectorTest.expectShallowEqual(table.selectedRows, [0, 2], "Selected row indexes should be adjusted.");
|
|
|
|
return true;
|
|
}
|
|
});
|
|
|
|
function addTestCase({name, description, rowIndexes}) {
|
|
suite.addTestCase({
|
|
name, description,
|
|
test() {
|
|
let testDelegate = new RemoveSelectedRowsTestDelegate;
|
|
let table = InspectorTest.createTableWithDelegate(testDelegate, numberOfRows);
|
|
table.allowsMultipleSelection = true;
|
|
|
|
for (let rowIndex of rowIndexes)
|
|
table.selectRow(rowIndex, true);
|
|
|
|
testDelegate.triggerRemoveSelectedRows(table);
|
|
|
|
return true;
|
|
}
|
|
});
|
|
}
|
|
|
|
addTestCase({
|
|
name: "Table.RemoveSelectedRows.Single.SelectFollowing",
|
|
description: "Remove a selected row not preceded by a selectable row.",
|
|
rowIndexes: [0],
|
|
});
|
|
|
|
addTestCase({
|
|
name: "Table.RemoveSelectedRows.Single.SelectPreceding",
|
|
description: "Remove a selected row not followed by a selectable row.",
|
|
rowIndexes: [lastRowIndex],
|
|
});
|
|
|
|
addTestCase({
|
|
name: "Table.RemoveSelectedRows.Single.SelectPrecedingOverFollowing",
|
|
description: "Remove a selected row between two selectable rows.",
|
|
rowIndexes: [lastRowIndex - 1],
|
|
});
|
|
|
|
addTestCase({
|
|
name: "Table.RemoveSelectedRows.Multiple.SelectFollowing",
|
|
description: "Remove a contiguous selection not preceded by a selectable row.",
|
|
rowIndexes: [0, 1],
|
|
});
|
|
|
|
addTestCase({
|
|
name: "Table.RemoveSelectedRows.Multiple.SelectPreceding",
|
|
description: "Remove a contiguous selection not followed by a selectable row.",
|
|
rowIndexes: [lastRowIndex - 1, lastRowIndex],
|
|
});
|
|
|
|
addTestCase({
|
|
name: "Table.RemoveSelectedRows.Multiple.SelectPrecedingOverFollowing",
|
|
description: "Remove a contiguous selection between two selectable rows.",
|
|
rowIndexes: [1, 2],
|
|
});
|
|
|
|
addTestCase({
|
|
name: "Table.RemoveSelectedRows.Multiple.SelectPrecedingOverGap",
|
|
description: "Remove a non-contiguous selection preceded by a selectable row.",
|
|
rowIndexes: [1, 3],
|
|
});
|
|
|
|
addTestCase({
|
|
name: "Table.RemoveSelectedRows.Multiple.SelectGapOverFollowing",
|
|
description: "Remove a non-contiguous selection followed by a selectable row.",
|
|
rowIndexes: [0, 2],
|
|
});
|
|
|
|
suite.addTestCase({
|
|
name: "Table.RemoveRow.NotCached",
|
|
description: "Remove a row that is not in the table cache.",
|
|
test() {
|
|
let testDelegate = new RemoveRowTestDelegate;
|
|
let table = InspectorTest.createTableWithDelegate(testDelegate, 1000);
|
|
|
|
testDelegate.triggerRemoveRow(table, 999);
|
|
|
|
return true;
|
|
}
|
|
});
|
|
|
|
suite.runTestCasesAndFinish();
|
|
}
|
|
</script>
|
|
</head>
|
|
<body onLoad="runTest()">
|
|
<p>Tests that rows can be removed from Table, and that the selection is updated when removing selected rows.</p>
|
|
<p>An asterix (*) indicates a selected row; a hyphen (-) indicates a removed row.</p>
|
|
</body>
|
|
</html>
|