Skip to content

Commit 30bd5f0

Browse files
Merge pull request mozilla#14238 from Snuffleupagus/PDFPageViewBuffer-tests
Add a couple of basic unit-tests for `PDFPageViewBuffer`
2 parents e136afb + fe205ef commit 30bd5f0

File tree

4 files changed

+176
-1
lines changed

4 files changed

+176
-1
lines changed

test/unit/base_viewer_spec.js

+162
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
/* Copyright 2021 Mozilla Foundation
2+
*
3+
* Licensed under the Apache License, Version 2.0 (the "License");
4+
* you may not use this file except in compliance with the License.
5+
* You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software
10+
* distributed under the License is distributed on an "AS IS" BASIS,
11+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the License for the specific language governing permissions and
13+
* limitations under the License.
14+
*/
15+
16+
import { PDFPageViewBuffer } from "../../web/base_viewer.js";
17+
18+
describe("BaseViewer", function () {
19+
describe("PDFPageViewBuffer", function () {
20+
function createViewsMap(startId, endId) {
21+
const map = new Map();
22+
23+
for (let id = startId; id <= endId; id++) {
24+
map.set(id, {
25+
id,
26+
destroy: () => {},
27+
});
28+
}
29+
return map;
30+
}
31+
32+
it("handles `push` correctly", function () {
33+
const buffer = new PDFPageViewBuffer(3);
34+
35+
const viewsMap = createViewsMap(1, 5),
36+
iterator = viewsMap.values();
37+
38+
for (let i = 0; i < 3; i++) {
39+
const view = iterator.next().value;
40+
buffer.push(view);
41+
}
42+
// Ensure that the correct views are inserted.
43+
expect(buffer._buffer).toEqual([
44+
viewsMap.get(1),
45+
viewsMap.get(2),
46+
viewsMap.get(3),
47+
]);
48+
49+
for (let i = 3; i < 5; i++) {
50+
const view = iterator.next().value;
51+
buffer.push(view);
52+
}
53+
// Ensure that the correct views are evicted.
54+
expect(buffer._buffer).toEqual([
55+
viewsMap.get(3),
56+
viewsMap.get(4),
57+
viewsMap.get(5),
58+
]);
59+
});
60+
61+
it("handles `resize` correctly", function () {
62+
const buffer = new PDFPageViewBuffer(5);
63+
64+
const viewsMap = createViewsMap(1, 5),
65+
iterator = viewsMap.values();
66+
67+
for (let i = 0; i < 5; i++) {
68+
const view = iterator.next().value;
69+
buffer.push(view);
70+
}
71+
// Ensure that keeping the size constant won't evict any views.
72+
buffer.resize(5);
73+
74+
expect(buffer._buffer).toEqual([
75+
viewsMap.get(1),
76+
viewsMap.get(2),
77+
viewsMap.get(3),
78+
viewsMap.get(4),
79+
viewsMap.get(5),
80+
]);
81+
82+
// Ensure that increasing the size won't evict any views.
83+
buffer.resize(10);
84+
85+
expect(buffer._buffer).toEqual([
86+
viewsMap.get(1),
87+
viewsMap.get(2),
88+
viewsMap.get(3),
89+
viewsMap.get(4),
90+
viewsMap.get(5),
91+
]);
92+
93+
// Ensure that decreasing the size will evict the correct views.
94+
buffer.resize(3);
95+
96+
expect(buffer._buffer).toEqual([
97+
viewsMap.get(3),
98+
viewsMap.get(4),
99+
viewsMap.get(5),
100+
]);
101+
});
102+
103+
it("handles `resize` correctly, with `idsToKeep` provided", function () {
104+
const buffer = new PDFPageViewBuffer(5);
105+
106+
const viewsMap = createViewsMap(1, 5),
107+
iterator = viewsMap.values();
108+
109+
for (let i = 0; i < 5; i++) {
110+
const view = iterator.next().value;
111+
buffer.push(view);
112+
}
113+
// Ensure that keeping the size constant won't evict any views,
114+
// while re-ordering them correctly.
115+
buffer.resize(5, new Set([1, 2]));
116+
117+
expect(buffer._buffer).toEqual([
118+
viewsMap.get(3),
119+
viewsMap.get(4),
120+
viewsMap.get(5),
121+
viewsMap.get(1),
122+
viewsMap.get(2),
123+
]);
124+
125+
// Ensure that increasing the size won't evict any views,
126+
// while re-ordering them correctly.
127+
buffer.resize(10, new Set([3, 4, 5]));
128+
129+
expect(buffer._buffer).toEqual([
130+
viewsMap.get(1),
131+
viewsMap.get(2),
132+
viewsMap.get(3),
133+
viewsMap.get(4),
134+
viewsMap.get(5),
135+
]);
136+
137+
// Ensure that decreasing the size will evict the correct views,
138+
// while re-ordering the remaining ones correctly.
139+
buffer.resize(3, new Set([1, 2, 3]));
140+
141+
expect(buffer._buffer).toEqual([
142+
viewsMap.get(1),
143+
viewsMap.get(2),
144+
viewsMap.get(3),
145+
]);
146+
});
147+
148+
it("handles `has` correctly", function () {
149+
const buffer = new PDFPageViewBuffer(3);
150+
151+
const viewsMap = createViewsMap(1, 2),
152+
iterator = viewsMap.values();
153+
154+
for (let i = 0; i < 1; i++) {
155+
const view = iterator.next().value;
156+
buffer.push(view);
157+
}
158+
expect(buffer.has(viewsMap.get(1))).toEqual(true);
159+
expect(buffer.has(viewsMap.get(2))).toEqual(false);
160+
});
161+
});
162+
});

test/unit/clitests.json

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"annotation_spec.js",
1010
"annotation_storage_spec.js",
1111
"api_spec.js",
12+
"base_viewer_spec.js",
1213
"bidi_spec.js",
1314
"cff_parser_spec.js",
1415
"cmap_spec.js",

test/unit/jasmine-boot.js

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ async function initializePDFJS(callback) {
5454
"pdfjs-test/unit/annotation_spec.js",
5555
"pdfjs-test/unit/annotation_storage_spec.js",
5656
"pdfjs-test/unit/api_spec.js",
57+
"pdfjs-test/unit/base_viewer_spec.js",
5758
"pdfjs-test/unit/bidi_spec.js",
5859
"pdfjs-test/unit/cff_parser_spec.js",
5960
"pdfjs-test/unit/cmap_spec.js",

web/base_viewer.js

+12-1
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,17 @@ function PDFPageViewBuffer(size) {
127127
this.has = function (view) {
128128
return data.includes(view);
129129
};
130+
131+
if (
132+
typeof PDFJSDev === "undefined" ||
133+
PDFJSDev.test("!PRODUCTION || TESTING")
134+
) {
135+
Object.defineProperty(this, "_buffer", {
136+
get() {
137+
return data.slice();
138+
},
139+
});
140+
}
130141
}
131142

132143
function isSameScale(oldScale, newScale) {
@@ -1879,4 +1890,4 @@ class BaseViewer {
18791890
}
18801891
}
18811892

1882-
export { BaseViewer };
1893+
export { BaseViewer, PDFPageViewBuffer };

0 commit comments

Comments
 (0)