dbx/tests/dataGridTranspose.test.ts

142 lines
3.6 KiB
TypeScript

import { strict as assert } from "node:assert";
import test from "node:test";
import {
buildTransposeRows,
nextTransposeState,
transposeAnchorRowIndex,
transposeFieldWidth,
transposeScrollLeftForRecord,
visibleTransposeRecordWindow,
} from "../src/lib/dataGridTranspose.ts";
test("row number double click opens transpose for a row", () => {
assert.deepEqual(nextTransposeState(false, null, 2), {
showTranspose: true,
transposeRowIndex: 2,
});
});
test("row number double click switches transpose to another row", () => {
assert.deepEqual(nextTransposeState(true, 2, 4), {
showTranspose: true,
transposeRowIndex: 4,
});
});
test("row number double click closes transpose for the same row", () => {
assert.deepEqual(nextTransposeState(true, 2, 2), {
showTranspose: false,
transposeRowIndex: null,
});
});
test("builds one virtualizable transpose row per field with all record values", () => {
const rows = buildTransposeRows({
columns: ["id", "name", "notes"],
records: [
[1, "Ada", null],
[2, "Grace", "compiler"],
],
typeByColumn: new Map([
["id", "int"],
["name", "varchar"],
]),
displayValue: (value) => (value === null ? "NULL" : String(value)),
});
assert.deepEqual(rows, [
{
id: "0:id",
column: "id",
type: "int",
values: [
{ value: 1, display: "1", isNull: false },
{ value: 2, display: "2", isNull: false },
],
},
{
id: "1:name",
column: "name",
type: "varchar",
values: [
{ value: "Ada", display: "Ada", isNull: false },
{ value: "Grace", display: "Grace", isNull: false },
],
},
{
id: "2:notes",
column: "notes",
type: "",
values: [
{ value: null, display: "NULL", isNull: true },
{ value: "compiler", display: "compiler", isNull: false },
],
},
]);
});
test("calculates a horizontal record window with spacer widths", () => {
assert.deepEqual(
visibleTransposeRecordWindow({
totalRecords: 100,
scrollLeft: 680,
viewportWidth: 720,
pinnedWidth: 320,
recordWidth: 160,
overscan: 1,
}),
{
start: 1,
end: 7,
beforeWidth: 160,
afterWidth: 14880,
},
);
});
test("uses the first selected row as the transpose anchor when context row is inside row selection", () => {
assert.equal(
transposeAnchorRowIndex({
requestedRowIndex: 3,
rowIds: [10, 11, 12, 13, 14, 15],
selectedRowIds: new Set([12, 13, 14]),
selectedRange: null,
}),
2,
);
});
test("uses the first selected cell range row as the transpose anchor when context row is inside range", () => {
assert.equal(
transposeAnchorRowIndex({
requestedRowIndex: 5,
rowIds: [10, 11, 12, 13, 14, 15],
selectedRowIds: new Set(),
selectedRange: { startRow: 2, endRow: 5, startCol: 0, endCol: 2 },
}),
2,
);
});
test("sizes the transpose field column from visible field names", () => {
assert.equal(transposeFieldWidth(["id", "iso3", "year"]), 104);
assert.equal(transposeFieldWidth(["country_name"]), 128);
});
test("caps the transpose field column width for long field names", () => {
assert.equal(transposeFieldWidth(["a_very_long_metric_column_name"]), 220);
});
test("aligns the selected transpose record at the start of the scrollable records", () => {
assert.equal(
transposeScrollLeftForRecord({
recordIndex: 55,
totalRecords: 100,
viewportWidth: 1200,
pinnedWidth: 104,
recordWidth: 168,
}),
9240,
);
});