1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 | 'use strict';
|
23 |
|
24 | var _primitives = require('../../core/primitives');
|
25 |
|
26 | var _util = require('../../shared/util');
|
27 |
|
28 | var _stream = require('../../core/stream');
|
29 |
|
30 | var _operator_list = require('../../core/operator_list');
|
31 |
|
32 | var _evaluator = require('../../core/evaluator');
|
33 |
|
34 | var _worker = require('../../core/worker');
|
35 |
|
36 | var _test_utils = require('./test_utils');
|
37 |
|
38 | describe('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 |