<!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.RowSelection");

    suite.addTestCase({
        name: "Table.constructor",
        test() {
            let table = InspectorTest.createTable();

            InspectorTest.expectThat(isNaN(table.selectedRow), "selectedRow should be NaN.");
            InspectorTest.expectEqual(table.selectedRows.length, 0, "Should have no selected rows.");
            InspectorTest.expectFalse(table.allowsMultipleSelection, "allowsMultipleSelection should initially be false.");

            return true;
        }
    });

    function triggerSelectRow(table, rowIndex, extendSelection) {
        InspectorTest.log(`Selecting row ${rowIndex}.`);
        table.selectRow(rowIndex, extendSelection);
        InspectorTest.expectEqual(table.selectedRow, rowIndex, `selectedRow should be ${rowIndex}.`);
    }

    function triggerDeselectRow(table, rowIndex) {
        InspectorTest.log(`Deselecting row ${rowIndex}.`);
        table.deselectRow(rowIndex);
        InspectorTest.expectFalse(table.selectedRows.includes(rowIndex), `selectedRows should not include ${rowIndex}.`);
    }

    suite.addTestCase({
        name: "Table.SelectRow",
        description: "Select a row, then select another row causing the first to become deselected.",
        test() {
            let table = InspectorTest.createTable();

            triggerSelectRow(table, 0);
            InspectorTest.expectShallowEqual(table.selectedRows, [0], "selectedRows should be [0].");
            triggerSelectRow(table, 1);
            InspectorTest.expectShallowEqual(table.selectedRows, [1], "selectedRows should be [1].");

            return true;
        }
    });

    suite.addTestCase({
        name: "Table.DeselectRow",
        description: "Deselect the selected row.",
        test() {
            let table = InspectorTest.createTable();

            triggerSelectRow(table, 0);
            triggerDeselectRow(table, 0);
            InspectorTest.expectEqual(table.selectedRows.length, 0, "Should have no selected rows.");

            return true;
        }
    });

    suite.addTestCase({
        name: "Table.AllowsMultipleSelection",
        description: "Should be able to enable multiple selection.",
        test() {
            let table = InspectorTest.createTable();

            table.allowsMultipleSelection = true;
            InspectorTest.expectThat(table.allowsMultipleSelection, "allowsMultipleSelection enabled.");
            table.allowsMultipleSelection = false;
            InspectorTest.expectFalse(table.allowsMultipleSelection, "allowsMultipleSelection disabled.");

            return true;
        }
    });

    suite.addTestCase({
        name: "Table.SelectMultipleRows.ExtendSelection",
        description: "Select multiple rows, extending the selection.",
        test() {
            let table = InspectorTest.createTable();
            table.allowsMultipleSelection = true;

            const extendSelection = true;

            triggerSelectRow(table, 0, extendSelection);
            triggerSelectRow(table, 1, extendSelection);
            triggerSelectRow(table, 9, extendSelection);
            InspectorTest.expectShallowEqual(table.selectedRows, [0, 1, 9], "selectedRows should be [0, 1, 9].");

            return true;
        }
    });

    suite.addTestCase({
        name: "Table.SelectMultipleRows.ExtendSelection.MultipleSelectionDisabled",
        description: "Attempt to extend the selection when multiple selection is disabled.",
        test() {
            let table = InspectorTest.createTable();
            table.allowsMultipleSelection = false;

            const extendSelection = true;

            triggerSelectRow(table, 0, extendSelection);
            triggerSelectRow(table, 1, extendSelection);
            InspectorTest.expectShallowEqual(table.selectedRows, [1], "selectedRows should be [1].");

            return true;
        }
    });

    suite.addTestCase({
        name: "Table.SelectMultipleRows.SelectTheSameRowTwice.ExtendSelection",
        description: "Select an already selected row, and extend the selection.",
        test() {
            let table = InspectorTest.createTable();
            table.allowsMultipleSelection = true;

            const extendSelection = true;

            triggerSelectRow(table, 0, extendSelection);
            triggerSelectRow(table, 1, extendSelection);
            triggerSelectRow(table, 1, extendSelection);
            InspectorTest.expectShallowEqual(table.selectedRows, [0, 1], "selectedRows should be [0, 1].");

            return true;
        }
    });

    suite.addTestCase({
        name: "Table.SelectMultipleRows.SelectTheSameRowTwice.NoExtendSelection",
        description: "Select an already selected row, and do not extend the selection.",
        test() {
            let table = InspectorTest.createTable();
            table.allowsMultipleSelection = true;

            const extendSelection = true;

            triggerSelectRow(table, 0, extendSelection);
            triggerSelectRow(table, 1, extendSelection);
            triggerSelectRow(table, 1);
            InspectorTest.expectShallowEqual(table.selectedRows, [1], "selectedRows should be [1].");

            return true;
        }
    });

    suite.addTestCase({
        name: "Table.SelectAndDeselectRow.NotCached",
        description: "Select and deselect a row that is not in the table cache.",
        test() {
            let table = InspectorTest.createTable(1000);

            triggerSelectRow(table, 999);
            triggerDeselectRow(table, 999);

            return true;
        }
    });

    suite.addTestCase({
        name: "Table.SelectAll.MultipleSelectionDisabled",
        description: "Select all table rows when multiple selection is disabled.",
        test() {
            let table = InspectorTest.createTable();

            triggerSelectRow(table, 0);
            InspectorTest.log("Select all.");
            table.selectAll();
            InspectorTest.expectEqual(table.selectedRows.length, 1, "Should not have selected additional rows.");
            InspectorTest.expectThat(table.isRowSelected(0), "Row 0 should still be selected.");

            return true;
        }
    });

    suite.addTestCase({
        name: "Table.SelectAll.MultipleSelectionEnabled",
        description: "Select all table rows when multiple selection is enabled.",
        test() {
            let table = InspectorTest.createTable();
            table.allowsMultipleSelection = true;

            triggerSelectRow(table, 0);
            InspectorTest.log("Select all.");
            table.selectAll();
            InspectorTest.expectEqual(table.selectedRows.length, table.numberOfRows, "Should have selected all rows.");

            return true;
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onLoad="runTest()">
    <p>Tests for WI.Table selection.</p>
</body>
</html>
