| /** | |
| * @licstart The following is the entire license notice for the | |
| * Javascript code in this page | |
| * | |
| * Copyright 2020 Mozilla Foundation | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| * | |
| * @licend The above is the entire license notice for the | |
| * Javascript code in this page | |
| */ | |
| "use strict"; | |
| var _cmap = require("../../core/cmap.js"); | |
| var _display_utils = require("../../display/display_utils.js"); | |
| var _is_node = require("../../shared/is_node.js"); | |
| var _primitives = require("../../core/primitives.js"); | |
| var _node_utils = require("../../display/node_utils.js"); | |
| var _stream = require("../../core/stream.js"); | |
| var cMapUrl = { | |
| dom: "../../external/bcmaps/", | |
| node: "./external/bcmaps/" | |
| }; | |
| var cMapPacked = true; | |
| describe("cmap", function () { | |
| var fetchBuiltInCMap; | |
| beforeAll(function (done) { | |
| var CMapReaderFactory; | |
| if (_is_node.isNodeJS) { | |
| CMapReaderFactory = new _node_utils.NodeCMapReaderFactory({ | |
| baseUrl: cMapUrl.node, | |
| isCompressed: cMapPacked | |
| }); | |
| } else { | |
| CMapReaderFactory = new _display_utils.DOMCMapReaderFactory({ | |
| baseUrl: cMapUrl.dom, | |
| isCompressed: cMapPacked | |
| }); | |
| } | |
| fetchBuiltInCMap = function (name) { | |
| return CMapReaderFactory.fetch({ | |
| name | |
| }); | |
| }; | |
| done(); | |
| }); | |
| afterAll(function () { | |
| fetchBuiltInCMap = null; | |
| }); | |
| it("parses beginbfchar", function (done) { | |
| var str = "2 beginbfchar\n" + "<03> <00>\n" + "<04> <01>\n" + "endbfchar\n"; | |
| var stream = new _stream.StringStream(str); | |
| var cmapPromise = _cmap.CMapFactory.create({ | |
| encoding: stream | |
| }); | |
| cmapPromise.then(function (cmap) { | |
| expect(cmap.lookup(0x03)).toEqual(String.fromCharCode(0x00)); | |
| expect(cmap.lookup(0x04)).toEqual(String.fromCharCode(0x01)); | |
| expect(cmap.lookup(0x05)).toBeUndefined(); | |
| done(); | |
| }).catch(function (reason) { | |
| done.fail(reason); | |
| }); | |
| }); | |
| it("parses beginbfrange with range", function (done) { | |
| var str = "1 beginbfrange\n" + "<06> <0B> 0\n" + "endbfrange\n"; | |
| var stream = new _stream.StringStream(str); | |
| var cmapPromise = _cmap.CMapFactory.create({ | |
| encoding: stream | |
| }); | |
| cmapPromise.then(function (cmap) { | |
| expect(cmap.lookup(0x05)).toBeUndefined(); | |
| expect(cmap.lookup(0x06)).toEqual(String.fromCharCode(0x00)); | |
| expect(cmap.lookup(0x0b)).toEqual(String.fromCharCode(0x05)); | |
| expect(cmap.lookup(0x0c)).toBeUndefined(); | |
| done(); | |
| }).catch(function (reason) { | |
| done.fail(reason); | |
| }); | |
| }); | |
| it("parses beginbfrange with array", function (done) { | |
| var str = "1 beginbfrange\n" + "<0D> <12> [ 0 1 2 3 4 5 ]\n" + "endbfrange\n"; | |
| var stream = new _stream.StringStream(str); | |
| var cmapPromise = _cmap.CMapFactory.create({ | |
| encoding: stream | |
| }); | |
| cmapPromise.then(function (cmap) { | |
| expect(cmap.lookup(0x0c)).toBeUndefined(); | |
| expect(cmap.lookup(0x0d)).toEqual(0x00); | |
| expect(cmap.lookup(0x12)).toEqual(0x05); | |
| expect(cmap.lookup(0x13)).toBeUndefined(); | |
| done(); | |
| }).catch(function (reason) { | |
| done.fail(reason); | |
| }); | |
| }); | |
| it("parses begincidchar", function (done) { | |
| var str = "1 begincidchar\n" + "<14> 0\n" + "endcidchar\n"; | |
| var stream = new _stream.StringStream(str); | |
| var cmapPromise = _cmap.CMapFactory.create({ | |
| encoding: stream | |
| }); | |
| cmapPromise.then(function (cmap) { | |
| expect(cmap.lookup(0x14)).toEqual(0x00); | |
| expect(cmap.lookup(0x15)).toBeUndefined(); | |
| done(); | |
| }).catch(function (reason) { | |
| done.fail(reason); | |
| }); | |
| }); | |
| it("parses begincidrange", function (done) { | |
| var str = "1 begincidrange\n" + "<0016> <001B> 0\n" + "endcidrange\n"; | |
| var stream = new _stream.StringStream(str); | |
| var cmapPromise = _cmap.CMapFactory.create({ | |
| encoding: stream | |
| }); | |
| cmapPromise.then(function (cmap) { | |
| expect(cmap.lookup(0x15)).toBeUndefined(); | |
| expect(cmap.lookup(0x16)).toEqual(0x00); | |
| expect(cmap.lookup(0x1b)).toEqual(0x05); | |
| expect(cmap.lookup(0x1c)).toBeUndefined(); | |
| done(); | |
| }).catch(function (reason) { | |
| done.fail(reason); | |
| }); | |
| }); | |
| it("decodes codespace ranges", function (done) { | |
| var str = "1 begincodespacerange\n" + "<01> <02>\n" + "<00000003> <00000004>\n" + "endcodespacerange\n"; | |
| var stream = new _stream.StringStream(str); | |
| var cmapPromise = _cmap.CMapFactory.create({ | |
| encoding: stream | |
| }); | |
| cmapPromise.then(function (cmap) { | |
| var c = {}; | |
| cmap.readCharCode(String.fromCharCode(1), 0, c); | |
| expect(c.charcode).toEqual(1); | |
| expect(c.length).toEqual(1); | |
| cmap.readCharCode(String.fromCharCode(0, 0, 0, 3), 0, c); | |
| expect(c.charcode).toEqual(3); | |
| expect(c.length).toEqual(4); | |
| done(); | |
| }).catch(function (reason) { | |
| done.fail(reason); | |
| }); | |
| }); | |
| it("decodes 4 byte codespace ranges", function (done) { | |
| var str = "1 begincodespacerange\n" + "<8EA1A1A1> <8EA1FEFE>\n" + "endcodespacerange\n"; | |
| var stream = new _stream.StringStream(str); | |
| var cmapPromise = _cmap.CMapFactory.create({ | |
| encoding: stream | |
| }); | |
| cmapPromise.then(function (cmap) { | |
| var c = {}; | |
| cmap.readCharCode(String.fromCharCode(0x8e, 0xa1, 0xa1, 0xa1), 0, c); | |
| expect(c.charcode).toEqual(0x8ea1a1a1); | |
| expect(c.length).toEqual(4); | |
| done(); | |
| }).catch(function (reason) { | |
| done.fail(reason); | |
| }); | |
| }); | |
| it("read usecmap", function (done) { | |
| var str = "/Adobe-Japan1-1 usecmap\n"; | |
| var stream = new _stream.StringStream(str); | |
| var cmapPromise = _cmap.CMapFactory.create({ | |
| encoding: stream, | |
| fetchBuiltInCMap, | |
| useCMap: null | |
| }); | |
| cmapPromise.then(function (cmap) { | |
| expect(cmap instanceof _cmap.CMap).toEqual(true); | |
| expect(cmap.useCMap).not.toBeNull(); | |
| expect(cmap.builtInCMap).toBeFalsy(); | |
| expect(cmap.length).toEqual(0x20a7); | |
| expect(cmap.isIdentityCMap).toEqual(false); | |
| done(); | |
| }).catch(function (reason) { | |
| done.fail(reason); | |
| }); | |
| }); | |
| it("parses cmapname", function (done) { | |
| var str = "/CMapName /Identity-H def\n"; | |
| var stream = new _stream.StringStream(str); | |
| var cmapPromise = _cmap.CMapFactory.create({ | |
| encoding: stream | |
| }); | |
| cmapPromise.then(function (cmap) { | |
| expect(cmap.name).toEqual("Identity-H"); | |
| done(); | |
| }).catch(function (reason) { | |
| done.fail(reason); | |
| }); | |
| }); | |
| it("parses wmode", function (done) { | |
| var str = "/WMode 1 def\n"; | |
| var stream = new _stream.StringStream(str); | |
| var cmapPromise = _cmap.CMapFactory.create({ | |
| encoding: stream | |
| }); | |
| cmapPromise.then(function (cmap) { | |
| expect(cmap.vertical).toEqual(true); | |
| done(); | |
| }).catch(function (reason) { | |
| done.fail(reason); | |
| }); | |
| }); | |
| it("loads built in cmap", function (done) { | |
| var cmapPromise = _cmap.CMapFactory.create({ | |
| encoding: _primitives.Name.get("Adobe-Japan1-1"), | |
| fetchBuiltInCMap, | |
| useCMap: null | |
| }); | |
| cmapPromise.then(function (cmap) { | |
| expect(cmap instanceof _cmap.CMap).toEqual(true); | |
| expect(cmap.useCMap).toBeNull(); | |
| expect(cmap.builtInCMap).toBeTruthy(); | |
| expect(cmap.length).toEqual(0x20a7); | |
| expect(cmap.isIdentityCMap).toEqual(false); | |
| done(); | |
| }).catch(function (reason) { | |
| done.fail(reason); | |
| }); | |
| }); | |
| it("loads built in identity cmap", function (done) { | |
| var cmapPromise = _cmap.CMapFactory.create({ | |
| encoding: _primitives.Name.get("Identity-H"), | |
| fetchBuiltInCMap, | |
| useCMap: null | |
| }); | |
| cmapPromise.then(function (cmap) { | |
| expect(cmap instanceof _cmap.IdentityCMap).toEqual(true); | |
| expect(cmap.vertical).toEqual(false); | |
| expect(cmap.length).toEqual(0x10000); | |
| expect(function () { | |
| return cmap.isIdentityCMap; | |
| }).toThrow(new Error("should not access .isIdentityCMap")); | |
| done(); | |
| }).catch(function (reason) { | |
| done.fail(reason); | |
| }); | |
| }); | |
| it("attempts to load a non-existent built-in CMap", function (done) { | |
| var cmapPromise = _cmap.CMapFactory.create({ | |
| encoding: _primitives.Name.get("null"), | |
| fetchBuiltInCMap, | |
| useCMap: null | |
| }); | |
| cmapPromise.then(function () { | |
| done.fail("No CMap should be loaded"); | |
| }, function (reason) { | |
| expect(reason instanceof Error).toEqual(true); | |
| expect(reason.message).toEqual("Unknown CMap name: null"); | |
| done(); | |
| }); | |
| }); | |
| it("attempts to load a built-in CMap without the necessary API parameters", function (done) { | |
| function tmpFetchBuiltInCMap(name) { | |
| var CMapReaderFactory = _is_node.isNodeJS ? new _node_utils.NodeCMapReaderFactory({}) : new _display_utils.DOMCMapReaderFactory({}); | |
| return CMapReaderFactory.fetch({ | |
| name | |
| }); | |
| } | |
| var cmapPromise = _cmap.CMapFactory.create({ | |
| encoding: _primitives.Name.get("Adobe-Japan1-1"), | |
| fetchBuiltInCMap: tmpFetchBuiltInCMap, | |
| useCMap: null | |
| }); | |
| cmapPromise.then(function () { | |
| done.fail("No CMap should be loaded"); | |
| }, function (reason) { | |
| expect(reason instanceof Error).toEqual(true); | |
| expect(reason.message).toEqual('The CMap "baseUrl" parameter must be specified, ensure that ' + 'the "cMapUrl" and "cMapPacked" API parameters are provided.'); | |
| done(); | |
| }); | |
| }); | |
| it("attempts to load a built-in CMap with inconsistent API parameters", function (done) { | |
| function tmpFetchBuiltInCMap(name) { | |
| let CMapReaderFactory; | |
| if (_is_node.isNodeJS) { | |
| CMapReaderFactory = new _node_utils.NodeCMapReaderFactory({ | |
| baseUrl: cMapUrl.node, | |
| isCompressed: false | |
| }); | |
| } else { | |
| CMapReaderFactory = new _display_utils.DOMCMapReaderFactory({ | |
| baseUrl: cMapUrl.dom, | |
| isCompressed: false | |
| }); | |
| } | |
| return CMapReaderFactory.fetch({ | |
| name | |
| }); | |
| } | |
| const cmapPromise = _cmap.CMapFactory.create({ | |
| encoding: _primitives.Name.get("Adobe-Japan1-1"), | |
| fetchBuiltInCMap: tmpFetchBuiltInCMap, | |
| useCMap: null | |
| }); | |
| cmapPromise.then(function () { | |
| done.fail("No CMap should be loaded"); | |
| }, function (reason) { | |
| expect(reason instanceof Error).toEqual(true); | |
| const message = reason.message; | |
| expect(message.startsWith("Unable to load CMap at: ")).toEqual(true); | |
| expect(message.endsWith("/external/bcmaps/Adobe-Japan1-1")).toEqual(true); | |
| done(); | |
| }); | |
| }); | |
| }); |