Remove unncessary CanvasFactory/CMapReaderFactory/FileReaderFactory duplication in unit-tests

Given that the API will now, after PR 12039, automatically pick the correct factories to use depending on the environment (browser vs. Node.js), we can utilize that in the unit-tests as well. This way we don't have to manually repeat the same initialization code in *multiple* unit-tests.
*Note:* The *official* PDF.js API is defined in `src/pdf.js`, hence the new exports in `src/display/api.js` will not affect that.

Also, updates the unit-test `FileReaderFactory` helpers similarily.

*Drive-by change:* Fix the `CMapReaderFactory` usage in the annotation unit-tests, since the cache should only contain raw data and not a Promise. While this obviously works as-is, having unit-tests that "abuse" the intended data format can easily lead to unnecessary failures if changes are made to the relevant `src/core/` code.
This commit is contained in:
Jonas Jenwald 2021-01-08 17:12:58 +01:00
parent 35845d1bbb
commit 941b65f683
6 changed files with 57 additions and 115 deletions

View File

@ -3060,4 +3060,6 @@ export {
setPDFNetworkStreamFactory, setPDFNetworkStreamFactory,
version, version,
build, build,
DefaultCanvasFactory,
DefaultCMapReaderFactory,
}; };

View File

@ -29,21 +29,14 @@ import {
stringToBytes, stringToBytes,
stringToUTF8String, stringToUTF8String,
} from "../../src/shared/util.js"; } from "../../src/shared/util.js";
import { createIdFactory, XRefMock } from "./test_utils.js"; import { CMAP_PARAMS, createIdFactory, XRefMock } from "./test_utils.js";
import { Dict, Name, Ref, RefSetCache } from "../../src/core/primitives.js"; import { Dict, Name, Ref, RefSetCache } from "../../src/core/primitives.js";
import { Lexer, Parser } from "../../src/core/parser.js"; import { Lexer, Parser } from "../../src/core/parser.js";
import { DOMCMapReaderFactory } from "../../src/display/display_utils.js"; import { DefaultCMapReaderFactory } from "../../src/display/api.js";
import { isNodeJS } from "../../src/shared/is_node.js";
import { NodeCMapReaderFactory } from "../../src/display/node_utils.js";
import { PartialEvaluator } from "../../src/core/evaluator.js"; import { PartialEvaluator } from "../../src/core/evaluator.js";
import { StringStream } from "../../src/core/stream.js"; import { StringStream } from "../../src/core/stream.js";
import { WorkerTask } from "../../src/core/worker.js"; import { WorkerTask } from "../../src/core/worker.js";
const cMapUrl = {
dom: "../../external/bcmaps/",
node: "./external/bcmaps/",
};
describe("annotation", function () { describe("annotation", function () {
class PDFManagerMock { class PDFManagerMock {
constructor(params) { constructor(params) {
@ -86,32 +79,24 @@ describe("annotation", function () {
let pdfManagerMock, idFactoryMock, partialEvaluator; let pdfManagerMock, idFactoryMock, partialEvaluator;
beforeAll(function (done) { beforeAll(async function (done) {
pdfManagerMock = new PDFManagerMock({ pdfManagerMock = new PDFManagerMock({
docBaseUrl: null, docBaseUrl: null,
}); });
let CMapReaderFactory; const CMapReaderFactory = new DefaultCMapReaderFactory({
if (isNodeJS) { baseUrl: CMAP_PARAMS.cMapUrl,
CMapReaderFactory = new NodeCMapReaderFactory({ isCompressed: CMAP_PARAMS.cMapPacked,
baseUrl: cMapUrl.node, });
isCompressed: true,
});
} else {
CMapReaderFactory = new DOMCMapReaderFactory({
baseUrl: cMapUrl.dom,
isCompressed: true,
});
}
const builtInCMapCache = new Map(); const builtInCMapCache = new Map();
builtInCMapCache.set( builtInCMapCache.set(
"UniJIS-UTF16-H", "UniJIS-UTF16-H",
CMapReaderFactory.fetch({ name: "UniJIS-UTF16-H" }) await CMapReaderFactory.fetch({ name: "UniJIS-UTF16-H" })
); );
builtInCMapCache.set( builtInCMapCache.set(
"Adobe-Japan1-UCS2", "Adobe-Japan1-UCS2",
CMapReaderFactory.fetch({ name: "Adobe-Japan1-UCS2" }) await CMapReaderFactory.fetch({ name: "Adobe-Japan1-UCS2" })
); );
idFactoryMock = createIdFactory(/* pageIndex = */ 0); idFactoryMock = createIdFactory(/* pageIndex = */ 0);

View File

@ -15,8 +15,7 @@
import { import {
buildGetDocumentParams, buildGetDocumentParams,
DOMFileReaderFactory, DefaultFileReaderFactory,
NodeFileReaderFactory,
TEST_PDFS_PATH, TEST_PDFS_PATH,
} from "./test_utils.js"; } from "./test_utils.js";
import { import {
@ -32,23 +31,22 @@ import {
StreamType, StreamType,
} from "../../src/shared/util.js"; } from "../../src/shared/util.js";
import { import {
DOMCanvasFactory, DefaultCanvasFactory,
RenderingCancelledException,
StatTimer,
} from "../../src/display/display_utils.js";
import {
getDocument, getDocument,
PDFDataRangeTransport, PDFDataRangeTransport,
PDFDocumentProxy, PDFDocumentProxy,
PDFPageProxy, PDFPageProxy,
PDFWorker, PDFWorker,
} from "../../src/display/api.js"; } from "../../src/display/api.js";
import {
RenderingCancelledException,
StatTimer,
} from "../../src/display/display_utils.js";
import { AutoPrintRegExp } from "../../web/ui_utils.js"; import { AutoPrintRegExp } from "../../web/ui_utils.js";
import { GlobalImageCache } from "../../src/core/image_utils.js"; import { GlobalImageCache } from "../../src/core/image_utils.js";
import { GlobalWorkerOptions } from "../../src/display/worker_options.js"; import { GlobalWorkerOptions } from "../../src/display/worker_options.js";
import { isNodeJS } from "../../src/shared/is_node.js"; import { isNodeJS } from "../../src/shared/is_node.js";
import { Metadata } from "../../src/display/metadata.js"; import { Metadata } from "../../src/display/metadata.js";
import { NodeCanvasFactory } from "../../src/display/node_utils.js";
describe("api", function () { describe("api", function () {
const basicApiFileName = "basicapi.pdf"; const basicApiFileName = "basicapi.pdf";
@ -58,11 +56,7 @@ describe("api", function () {
let CanvasFactory; let CanvasFactory;
beforeAll(function (done) { beforeAll(function (done) {
if (isNodeJS) { CanvasFactory = new DefaultCanvasFactory();
CanvasFactory = new NodeCanvasFactory();
} else {
CanvasFactory = new DOMCanvasFactory();
}
done(); done();
}); });
@ -132,16 +126,9 @@ describe("api", function () {
.catch(done.fail); .catch(done.fail);
}); });
it("creates pdf doc from typed array", function (done) { it("creates pdf doc from typed array", function (done) {
let typedArrayPdfPromise; const typedArrayPdfPromise = DefaultFileReaderFactory.fetch({
if (isNodeJS) { path: TEST_PDFS_PATH + basicApiFileName,
typedArrayPdfPromise = NodeFileReaderFactory.fetch({ });
path: TEST_PDFS_PATH.node + basicApiFileName,
});
} else {
typedArrayPdfPromise = DOMFileReaderFactory.fetch({
path: TEST_PDFS_PATH.dom + basicApiFileName,
});
}
typedArrayPdfPromise typedArrayPdfPromise
.then(typedArrayPdf => { .then(typedArrayPdf => {
@ -2197,15 +2184,9 @@ describe("api", function () {
beforeAll(function (done) { beforeAll(function (done) {
const fileName = "tracemonkey.pdf"; const fileName = "tracemonkey.pdf";
if (isNodeJS) { dataPromise = DefaultFileReaderFactory.fetch({
dataPromise = NodeFileReaderFactory.fetch({ path: TEST_PDFS_PATH + fileName,
path: TEST_PDFS_PATH.node + fileName, });
});
} else {
dataPromise = DOMFileReaderFactory.fetch({
path: TEST_PDFS_PATH.dom + fileName,
});
}
done(); done();
}); });

View File

@ -14,35 +14,20 @@
*/ */
import { CMap, CMapFactory, IdentityCMap } from "../../src/core/cmap.js"; import { CMap, CMapFactory, IdentityCMap } from "../../src/core/cmap.js";
import { DOMCMapReaderFactory } from "../../src/display/display_utils.js"; import { CMAP_PARAMS } from "./test_utils.js";
import { isNodeJS } from "../../src/shared/is_node.js"; import { DefaultCMapReaderFactory } from "../../src/display/api.js";
import { Name } from "../../src/core/primitives.js"; import { Name } from "../../src/core/primitives.js";
import { NodeCMapReaderFactory } from "../../src/display/node_utils.js";
import { StringStream } from "../../src/core/stream.js"; import { StringStream } from "../../src/core/stream.js";
const cMapUrl = {
dom: "../../external/bcmaps/",
node: "./external/bcmaps/",
};
const cMapPacked = true;
describe("cmap", function () { describe("cmap", function () {
let fetchBuiltInCMap; let fetchBuiltInCMap;
beforeAll(function (done) { beforeAll(function (done) {
// Allow CMap testing in Node.js, e.g. for Travis. // Allow CMap testing in Node.js, e.g. for Travis.
let CMapReaderFactory; const CMapReaderFactory = new DefaultCMapReaderFactory({
if (isNodeJS) { baseUrl: CMAP_PARAMS.cMapUrl,
CMapReaderFactory = new NodeCMapReaderFactory({ isCompressed: CMAP_PARAMS.cMapPacked,
baseUrl: cMapUrl.node, });
isCompressed: cMapPacked,
});
} else {
CMapReaderFactory = new DOMCMapReaderFactory({
baseUrl: cMapUrl.dom,
isCompressed: cMapPacked,
});
}
fetchBuiltInCMap = function (name) { fetchBuiltInCMap = function (name) {
return CMapReaderFactory.fetch({ return CMapReaderFactory.fetch({
@ -298,9 +283,8 @@ describe("cmap", function () {
it("attempts to load a built-in CMap without the necessary API parameters", function (done) { it("attempts to load a built-in CMap without the necessary API parameters", function (done) {
function tmpFetchBuiltInCMap(name) { function tmpFetchBuiltInCMap(name) {
const CMapReaderFactory = isNodeJS const CMapReaderFactory = new DefaultCMapReaderFactory({});
? new NodeCMapReaderFactory({})
: new DOMCMapReaderFactory({});
return CMapReaderFactory.fetch({ return CMapReaderFactory.fetch({
name, name,
}); });
@ -328,18 +312,11 @@ describe("cmap", function () {
it("attempts to load a built-in CMap with inconsistent API parameters", function (done) { it("attempts to load a built-in CMap with inconsistent API parameters", function (done) {
function tmpFetchBuiltInCMap(name) { function tmpFetchBuiltInCMap(name) {
let CMapReaderFactory; const CMapReaderFactory = new DefaultCMapReaderFactory({
if (isNodeJS) { baseUrl: CMAP_PARAMS.cMapUrl,
CMapReaderFactory = new NodeCMapReaderFactory({ isCompressed: false,
baseUrl: cMapUrl.node, });
isCompressed: false,
});
} else {
CMapReaderFactory = new DOMCMapReaderFactory({
baseUrl: cMapUrl.dom,
isCompressed: false,
});
}
return CMapReaderFactory.fetch({ return CMapReaderFactory.fetch({
name, name,
}); });

View File

@ -13,11 +13,8 @@
* limitations under the License. * limitations under the License.
*/ */
import { DefaultCanvasFactory, getDocument } from "../../src/display/api.js";
import { buildGetDocumentParams } from "./test_utils.js"; import { buildGetDocumentParams } from "./test_utils.js";
import { DOMCanvasFactory } from "../../src/display/display_utils.js";
import { getDocument } from "../../src/display/api.js";
import { isNodeJS } from "../../src/shared/is_node.js";
import { NodeCanvasFactory } from "../../src/display/node_utils.js";
function getTopLeftPixel(canvasContext) { function getTopLeftPixel(canvasContext) {
const imgData = canvasContext.getImageData(0, 0, 1, 1); const imgData = canvasContext.getImageData(0, 0, 1, 1);
@ -39,11 +36,8 @@ describe("custom canvas rendering", function () {
let page; let page;
beforeAll(function (done) { beforeAll(function (done) {
if (isNodeJS) { CanvasFactory = new DefaultCanvasFactory();
CanvasFactory = new NodeCanvasFactory();
} else {
CanvasFactory = new DOMCanvasFactory();
}
loadingTask = getDocument(transparentGetDocumentParams); loadingTask = getDocument(transparentGetDocumentParams);
loadingTask.promise loadingTask.promise
.then(function (doc) { .then(function (doc) {
@ -156,10 +150,8 @@ describe("custom ownerDocument", function () {
getElementsByTagName: () => [{ appendChild: () => {} }], getElementsByTagName: () => [{ appendChild: () => {} }],
}, },
}; };
const CanvasFactory = new DefaultCanvasFactory({ ownerDocument });
const CanvasFactory = isNodeJS
? new NodeCanvasFactory()
: new DOMCanvasFactory({ ownerDocument });
return { return {
elements, elements,
ownerDocument, ownerDocument,

View File

@ -19,6 +19,13 @@ import { assert } from "../../src/shared/util.js";
import { isNodeJS } from "../../src/shared/is_node.js"; import { isNodeJS } from "../../src/shared/is_node.js";
import { StringStream } from "../../src/core/stream.js"; import { StringStream } from "../../src/core/stream.js";
const TEST_PDFS_PATH = isNodeJS ? "./test/pdfs/" : "../pdfs/";
const CMAP_PARAMS = {
cMapUrl: isNodeJS ? "./external/bcmaps/" : "../../external/bcmaps/",
cMapPacked: true,
};
class DOMFileReaderFactory { class DOMFileReaderFactory {
static async fetch(params) { static async fetch(params) {
const response = await fetch(params.path); const response = await fetch(params.path);
@ -45,18 +52,16 @@ class NodeFileReaderFactory {
} }
} }
const TEST_PDFS_PATH = { const DefaultFileReaderFactory = isNodeJS
dom: "../pdfs/", ? NodeFileReaderFactory
node: "./test/pdfs/", : DOMFileReaderFactory;
};
function buildGetDocumentParams(filename, options) { function buildGetDocumentParams(filename, options) {
const params = Object.create(null); const params = Object.create(null);
if (isNodeJS) { params.url = isNodeJS
params.url = TEST_PDFS_PATH.node + filename; ? TEST_PDFS_PATH + filename
} else { : new URL(TEST_PDFS_PATH + filename, window.location).href;
params.url = new URL(TEST_PDFS_PATH.dom + filename, window.location).href;
}
for (const option in options) { for (const option in options) {
params[option] = options[option]; params[option] = options[option];
} }
@ -136,11 +141,11 @@ function isEmptyObj(obj) {
} }
export { export {
DOMFileReaderFactory, DefaultFileReaderFactory,
NodeFileReaderFactory,
XRefMock, XRefMock,
buildGetDocumentParams, buildGetDocumentParams,
TEST_PDFS_PATH, TEST_PDFS_PATH,
CMAP_PARAMS,
createIdFactory, createIdFactory,
isEmptyObj, isEmptyObj,
}; };