UNPKG

11.9 kBJavaScriptView Raw
1/**
2 * @licstart The following is the entire license notice for the
3 * Javascript code in this page
4 *
5 * Copyright 2017 Mozilla Foundation
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * @licend The above is the entire license notice for the
20 * Javascript code in this page
21 */
22'use strict';
23
24var _primitives = require('../../core/primitives');
25
26var _util = require('../../shared/util');
27
28var _stream = require('../../core/stream');
29
30var _operator_list = require('../../core/operator_list');
31
32var _evaluator = require('../../core/evaluator');
33
34var _worker = require('../../core/worker');
35
36var _test_utils = require('./test_utils');
37
38describe('evaluator', function () {
39 function HandlerMock() {
40 this.inputs = [];
41 }
42 HandlerMock.prototype = {
43 send: function send(name, data) {
44 this.inputs.push({
45 name: name,
46 data: data
47 });
48 }
49 };
50 function ResourcesMock() {}
51 ResourcesMock.prototype = {
52 get: function get(name) {
53 return this[name];
54 }
55 };
56 function PdfManagerMock() {}
57 function runOperatorListCheck(evaluator, stream, resources, callback) {
58 var result = new _operator_list.OperatorList();
59 var task = new _worker.WorkerTask('OperatorListCheck');
60 evaluator.getOperatorList({
61 stream: stream,
62 task: task,
63 resources: resources,
64 operatorList: result
65 }).then(function () {
66 callback(result);
67 }, function (reason) {
68 callback(reason);
69 });
70 }
71 var partialEvaluator;
72 beforeAll(function (done) {
73 partialEvaluator = new _evaluator.PartialEvaluator({
74 pdfManager: new PdfManagerMock(),
75 xref: new _test_utils.XRefMock(),
76 handler: new HandlerMock(),
77 pageIndex: 0
78 });
79 done();
80 });
81 afterAll(function () {
82 partialEvaluator = null;
83 });
84 describe('splitCombinedOperations', function () {
85 it('should reject unknown operations', function (done) {
86 var stream = new _stream.StringStream('fTT');
87 runOperatorListCheck(partialEvaluator, stream, new ResourcesMock(), function (result) {
88 expect(!!result.fnArray && !!result.argsArray).toEqual(true);
89 expect(result.fnArray.length).toEqual(1);
90 expect(result.fnArray[0]).toEqual(_util.OPS.fill);
91 expect(result.argsArray[0]).toEqual(null);
92 done();
93 });
94 });
95 it('should handle one operation', function (done) {
96 var stream = new _stream.StringStream('Q');
97 runOperatorListCheck(partialEvaluator, stream, new ResourcesMock(), function (result) {
98 expect(!!result.fnArray && !!result.argsArray).toEqual(true);
99 expect(result.fnArray.length).toEqual(1);
100 expect(result.fnArray[0]).toEqual(_util.OPS.restore);
101 done();
102 });
103 });
104 it('should handle two glued operations', function (done) {
105 var resources = new ResourcesMock();
106 resources.Res1 = {};
107 var stream = new _stream.StringStream('/Res1 DoQ');
108 runOperatorListCheck(partialEvaluator, stream, resources, function (result) {
109 expect(!!result.fnArray && !!result.argsArray).toEqual(true);
110 expect(result.fnArray.length).toEqual(2);
111 expect(result.fnArray[0]).toEqual(_util.OPS.paintXObject);
112 expect(result.fnArray[1]).toEqual(_util.OPS.restore);
113 done();
114 });
115 });
116 it('should handle three glued operations', function (done) {
117 var stream = new _stream.StringStream('fff');
118 runOperatorListCheck(partialEvaluator, stream, new ResourcesMock(), function (result) {
119 expect(!!result.fnArray && !!result.argsArray).toEqual(true);
120 expect(result.fnArray.length).toEqual(3);
121 expect(result.fnArray[0]).toEqual(_util.OPS.fill);
122 expect(result.fnArray[1]).toEqual(_util.OPS.fill);
123 expect(result.fnArray[2]).toEqual(_util.OPS.fill);
124 done();
125 });
126 });
127 it('should handle three glued operations #2', function (done) {
128 var resources = new ResourcesMock();
129 resources.Res1 = {};
130 var stream = new _stream.StringStream('B*Bf*');
131 runOperatorListCheck(partialEvaluator, stream, resources, function (result) {
132 expect(!!result.fnArray && !!result.argsArray).toEqual(true);
133 expect(result.fnArray.length).toEqual(3);
134 expect(result.fnArray[0]).toEqual(_util.OPS.eoFillStroke);
135 expect(result.fnArray[1]).toEqual(_util.OPS.fillStroke);
136 expect(result.fnArray[2]).toEqual(_util.OPS.eoFill);
137 done();
138 });
139 });
140 it('should handle glued operations and operands', function (done) {
141 var stream = new _stream.StringStream('f5 Ts');
142 runOperatorListCheck(partialEvaluator, stream, new ResourcesMock(), function (result) {
143 expect(!!result.fnArray && !!result.argsArray).toEqual(true);
144 expect(result.fnArray.length).toEqual(2);
145 expect(result.fnArray[0]).toEqual(_util.OPS.fill);
146 expect(result.fnArray[1]).toEqual(_util.OPS.setTextRise);
147 expect(result.argsArray.length).toEqual(2);
148 expect(result.argsArray[1].length).toEqual(1);
149 expect(result.argsArray[1][0]).toEqual(5);
150 done();
151 });
152 });
153 it('should handle glued operations and literals', function (done) {
154 var stream = new _stream.StringStream('trueifalserinulln');
155 runOperatorListCheck(partialEvaluator, stream, new ResourcesMock(), function (result) {
156 expect(!!result.fnArray && !!result.argsArray).toEqual(true);
157 expect(result.fnArray.length).toEqual(3);
158 expect(result.fnArray[0]).toEqual(_util.OPS.setFlatness);
159 expect(result.fnArray[1]).toEqual(_util.OPS.setRenderingIntent);
160 expect(result.fnArray[2]).toEqual(_util.OPS.endPath);
161 expect(result.argsArray.length).toEqual(3);
162 expect(result.argsArray[0].length).toEqual(1);
163 expect(result.argsArray[0][0]).toEqual(true);
164 expect(result.argsArray[1].length).toEqual(1);
165 expect(result.argsArray[1][0]).toEqual(false);
166 expect(result.argsArray[2]).toEqual(null);
167 done();
168 });
169 });
170 });
171 describe('validateNumberOfArgs', function () {
172 it('should execute if correct number of arguments', function (done) {
173 var stream = new _stream.StringStream('5 1 d0');
174 runOperatorListCheck(partialEvaluator, stream, new ResourcesMock(), function (result) {
175 expect(result.argsArray[0][0]).toEqual(5);
176 expect(result.argsArray[0][1]).toEqual(1);
177 expect(result.fnArray[0]).toEqual(_util.OPS.setCharWidth);
178 done();
179 });
180 });
181 it('should execute if too many arguments', function (done) {
182 var stream = new _stream.StringStream('5 1 4 d0');
183 runOperatorListCheck(partialEvaluator, stream, new ResourcesMock(), function (result) {
184 expect(result.argsArray[0][0]).toEqual(1);
185 expect(result.argsArray[0][1]).toEqual(4);
186 expect(result.fnArray[0]).toEqual(_util.OPS.setCharWidth);
187 done();
188 });
189 });
190 it('should execute if nested commands', function (done) {
191 var stream = new _stream.StringStream('/F2 /GS2 gs 5.711 Tf');
192 runOperatorListCheck(partialEvaluator, stream, new ResourcesMock(), function (result) {
193 expect(result.fnArray.length).toEqual(3);
194 expect(result.fnArray[0]).toEqual(_util.OPS.setGState);
195 expect(result.fnArray[1]).toEqual(_util.OPS.dependency);
196 expect(result.fnArray[2]).toEqual(_util.OPS.setFont);
197 expect(result.argsArray.length).toEqual(3);
198 expect(result.argsArray[0].length).toEqual(1);
199 expect(result.argsArray[1].length).toEqual(1);
200 expect(result.argsArray[2].length).toEqual(2);
201 done();
202 });
203 });
204 it('should skip if too few arguments', function (done) {
205 var stream = new _stream.StringStream('5 d0');
206 runOperatorListCheck(partialEvaluator, stream, new ResourcesMock(), function (result) {
207 expect(result.argsArray).toEqual([]);
208 expect(result.fnArray).toEqual([]);
209 done();
210 });
211 });
212 it('should close opened saves', function (done) {
213 var stream = new _stream.StringStream('qq');
214 runOperatorListCheck(partialEvaluator, stream, new ResourcesMock(), function (result) {
215 expect(!!result.fnArray && !!result.argsArray).toEqual(true);
216 expect(result.fnArray.length).toEqual(4);
217 expect(result.fnArray[0]).toEqual(_util.OPS.save);
218 expect(result.fnArray[1]).toEqual(_util.OPS.save);
219 expect(result.fnArray[2]).toEqual(_util.OPS.restore);
220 expect(result.fnArray[3]).toEqual(_util.OPS.restore);
221 done();
222 });
223 });
224 it('should skip paintXObject if name is missing', function (done) {
225 var stream = new _stream.StringStream('/ Do');
226 runOperatorListCheck(partialEvaluator, stream, new ResourcesMock(), function (result) {
227 expect(result instanceof _util.FormatError).toEqual(true);
228 expect(result.message).toEqual('XObject must be referred to by name.');
229 done();
230 });
231 });
232 it('should skip paintXObject if subtype is PS', function (done) {
233 var xobjStreamDict = new _primitives.Dict();
234 xobjStreamDict.set('Subtype', _primitives.Name.get('PS'));
235 var xobjStream = new _stream.Stream([], 0, 0, xobjStreamDict);
236 var xobjs = new _primitives.Dict();
237 xobjs.set('Res1', xobjStream);
238 var resources = new _primitives.Dict();
239 resources.set('XObject', xobjs);
240 var stream = new _stream.StringStream('/Res1 Do');
241 runOperatorListCheck(partialEvaluator, stream, resources, function (result) {
242 expect(result.argsArray).toEqual([]);
243 expect(result.fnArray).toEqual([]);
244 done();
245 });
246 });
247 });
248 describe('thread control', function () {
249 it('should abort operator list parsing', function (done) {
250 var stream = new _stream.StringStream('qqQQ');
251 var resources = new ResourcesMock();
252 var result = new _operator_list.OperatorList();
253 var task = new _worker.WorkerTask('OperatorListAbort');
254 task.terminate();
255 partialEvaluator.getOperatorList({
256 stream: stream,
257 task: task,
258 resources: resources,
259 operatorList: result
260 }).catch(function () {
261 expect(!!result.fnArray && !!result.argsArray).toEqual(true);
262 expect(result.fnArray.length).toEqual(0);
263 done();
264 });
265 });
266 it('should abort text parsing parsing', function (done) {
267 var resources = new ResourcesMock();
268 var stream = new _stream.StringStream('qqQQ');
269 var task = new _worker.WorkerTask('TextContentAbort');
270 task.terminate();
271 partialEvaluator.getTextContent({
272 stream: stream,
273 task: task,
274 resources: resources
275 }).catch(function () {
276 expect(true).toEqual(true);
277 done();
278 });
279 });
280 });
281 describe('operator list', function () {
282 function MessageHandlerMock() {}
283 MessageHandlerMock.prototype = {
284 send: function send() {}
285 };
286 it('should get correct total length after flushing', function () {
287 var operatorList = new _operator_list.OperatorList(null, new MessageHandlerMock());
288 operatorList.addOp(_util.OPS.save, null);
289 operatorList.addOp(_util.OPS.restore, null);
290 expect(operatorList.totalLength).toEqual(2);
291 expect(operatorList.length).toEqual(2);
292 operatorList.flush();
293 expect(operatorList.totalLength).toEqual(2);
294 expect(operatorList.length).toEqual(0);
295 });
296 });
297});
\No newline at end of file