Repository navigation
Expand file tree
/
Copy pathreader-viewport.test.mjs
More file actions
61 lines (58 loc) · 2.19 KB
/
Copy pathreader-viewport.test.mjs
File metadata and controls
61 lines (58 loc) · 2.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import assert from 'node:assert/strict';
import test from 'node:test';
import { effect, reactive, ref, stop } from 'vue';
import { createReaderViewport } from '../../src/features/reader/reader-viewport.mjs';
function readerViewport(bounds) {
const pages = ref(reactive([1, 2, 3].map((number) => ({ number, visible: 0 }))));
const layout = {
columns: 1,
rows: [0, 1, 2].map((i) => ({ offset: i * 110, extent: 100, start: i, end: i + 1 })),
frames: [0, 1, 2].map((i) => ({ number: i + 1, x: 0, y: i * 110, width: 100, height: 100 })),
};
const rect = (r) => ({ getBoundingClientRect: () => r });
const renderState = {
layoutElement: { value: rect({ left: 0, top: 0 }) },
renderMetrics: { viewportLookups: 0, geometryReads: 0 },
visiblePages: new Set(),
renderWindow: ref(new Set()),
canvasEls: new Map(),
};
const viewport = createReaderViewport({
renderState,
session: { pages, restoringView: { value: false } },
motion: { pinching: { value: false }, referenceReturn: { value: null } },
view: { reader: { value: rect(bounds) }, pageLayout: { value: layout }, active: ref(1) },
activity: { foreground: { value: true } },
actions: { canvasRendering: { releaseCanvas() {} } },
});
return { pages, viewport };
}
test('repeating an unchanged viewport lookup does not touch page visibility', () => {
const { pages, viewport } = readerViewport({ left: 0, right: 100, top: 50, bottom: 150 });
viewport.viewportPages();
let runs = 0;
const runner = effect(() => {
for (const page of pages.value) void page.visible;
runs++;
});
runs = 0;
viewport.viewportPages();
stop(runner);
// A reset-then-restore would re-run pageLayout and schedule another lookup.
assert.equal(runs, 0);
assert.deepEqual(
pages.value.map((page) => page.visible),
[0.5, 0.4, 0],
);
});
test('pages that scroll out of the viewport are cleared', () => {
const bounds = { left: 0, right: 100, top: 50, bottom: 150 };
const { pages, viewport } = readerViewport(bounds);
viewport.viewportPages();
Object.assign(bounds, { top: 220, bottom: 320 });
viewport.viewportPages();
assert.deepEqual(
pages.value.map((page) => page.visible),
[0, 0, 1],
);
});