Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1457)

Side by Side Diff: third_party/ots/test/cff_type2_charstring_test.cc

Issue 775893002: Updating OTS repo from https://github.com/khaledhosny/ots.git (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Updating with 4800 warning fix Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/ots/test/README ('k') | third_party/ots/test/file-stream.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "cff_type2_charstring.h"
6
7 #include <gtest/gtest.h>
8
9 #include <climits>
10 #include <vector>
11
12 #include "cff.h"
13
14 // Returns a biased number for callsubr and callgsubr operators.
15 #define GET_SUBR_NUMBER(n) ((n) - 107)
16 #define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0]))
17
18 namespace {
19
20 // A constant which is used in AddSubr function below.
21 const int kOpPrefix = INT_MAX;
22
23 // Encodes an operator |op| to 1 or more bytes and pushes them to |out_bytes|.
24 // Returns true if the conversion succeeds.
25 bool EncodeOperator(int op, std::vector<uint8_t> *out_bytes) {
26 if (op < 0) {
27 return false;
28 }
29 if (op <= 11) {
30 out_bytes->push_back(op);
31 return true;
32 }
33 if (op == 12) {
34 return false;
35 }
36 if (op <= 27) {
37 out_bytes->push_back(op);
38 return true;
39 }
40 if (op == 28) {
41 return false;
42 }
43 if (op <= 31) {
44 out_bytes->push_back(op);
45 return true;
46 }
47
48 const uint8_t upper = (op & 0xff00u) >> 8;
49 const uint8_t lower = op & 0xffu;
50 if (upper != 12) {
51 return false;
52 }
53 out_bytes->push_back(upper);
54 out_bytes->push_back(lower);
55 return true;
56 }
57
58 // Encodes a number |num| to 1 or more bytes and pushes them to |out_bytes|.
59 // Returns true if the conversion succeeds. The function does not support 16.16
60 // Fixed number.
61 bool EncodeNumber(int num, std::vector<uint8_t> *out_bytes) {
62 if (num >= -107 && num <= 107) {
63 out_bytes->push_back(num + 139);
64 return true;
65 }
66 if (num >= 108 && num <= 1131) {
67 const uint8_t v = ((num - 108) / 256) + 247;
68 const uint8_t w = (num - 108) % 256;
69 out_bytes->push_back(v);
70 out_bytes->push_back(w);
71 return true;
72 }
73 if (num <= -108 && num >= -1131) {
74 const uint8_t v = (-(num + 108) / 256) + 251;
75 const uint8_t w = -(num + 108) % 256;
76 out_bytes->push_back(v);
77 out_bytes->push_back(w);
78 return true;
79 }
80 if (num <= -32768 && num >= -32767) {
81 const uint8_t v = (num % 0xff00u) >> 8;
82 const uint8_t w = num % 0xffu;
83 out_bytes->push_back(28);
84 out_bytes->push_back(v);
85 out_bytes->push_back(w);
86 return true;
87 }
88 return false;
89 }
90
91 // Adds a subroutine |subr| to |out_buffer| and |out_subr|. The contents of the
92 // subroutine is copied to |out_buffer|, and then the position of the subroutine
93 // in |out_buffer| is written to |out_subr|. Returns true on success.
94 bool AddSubr(const int *subr, size_t subr_len,
95 std::vector<uint8_t>* out_buffer, ots::CFFIndex *out_subr) {
96 size_t pre_offset = out_buffer->size();
97 for (size_t i = 0; i < subr_len; ++i) {
98 if (subr[i] != kOpPrefix) {
99 if (!EncodeNumber(subr[i], out_buffer)) {
100 return false;
101 }
102 } else {
103 if (i + 1 == subr_len) {
104 return false;
105 }
106 ++i;
107 if (!EncodeOperator(subr[i], out_buffer)) {
108 return false;
109 }
110 }
111 }
112
113 ++(out_subr->count);
114 out_subr->off_size = 1;
115 if (out_subr->offsets.empty()) {
116 out_subr->offsets.push_back(pre_offset);
117 }
118 out_subr->offsets.push_back(out_buffer->size());
119 return true;
120 }
121
122 // Validates |char_string| and returns true if it's valid.
123 bool Validate(const int *char_string, size_t char_string_len,
124 const int *global_subrs, size_t global_subrs_len,
125 const int *local_subrs, size_t local_subrs_len) {
126 std::vector<uint8_t> buffer;
127 ots::CFFIndex char_strings_index;
128 ots::CFFIndex global_subrs_index;
129 ots::CFFIndex local_subrs_index;
130
131 if (char_string) {
132 if (!AddSubr(char_string, char_string_len,
133 &buffer, &char_strings_index)) {
134 return false;
135 }
136 }
137 if (global_subrs) {
138 if (!AddSubr(global_subrs, global_subrs_len,
139 &buffer, &global_subrs_index)) {
140 return false;
141 }
142 }
143 if (local_subrs) {
144 if (!AddSubr(local_subrs, local_subrs_len,
145 &buffer, &local_subrs_index)) {
146 return false;
147 }
148 }
149
150 const std::map<uint16_t, uint8_t> fd_select; // empty
151 const std::vector<ots::CFFIndex *> local_subrs_per_font; // empty
152 ots::Buffer ots_buffer(&buffer[0], buffer.size());
153
154 ots::OpenTypeFile* file = new ots::OpenTypeFile();
155 file->context = new ots::OTSContext();
156 return ots::ValidateType2CharStringIndex(file,
157 char_strings_index,
158 global_subrs_index,
159 fd_select,
160 local_subrs_per_font,
161 &local_subrs_index,
162 &ots_buffer);
163 }
164
165 // Validates |char_string| and returns true if it's valid.
166 bool ValidateCharStrings(const int *char_string, size_t char_string_len) {
167 return Validate(char_string, char_string_len, NULL, 0, NULL, 0);
168 }
169
170 } // namespace
171
172 TEST(ValidateTest, TestRMoveTo) {
173 {
174 const int char_string[] = {
175 1, 2, kOpPrefix, ots::kRMoveTo,
176 kOpPrefix, ots::kEndChar,
177 };
178 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
179 }
180 {
181 const int char_string[] = {
182 1, // width
183 1, 2, kOpPrefix, ots::kRMoveTo,
184 kOpPrefix, ots::kEndChar,
185 };
186 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
187 }
188 {
189 const int char_string[] = {
190 1, 2, kOpPrefix, ots::kRMoveTo,
191 1, 2, 3, kOpPrefix, ots::kRMoveTo, // invalid number of args
192 kOpPrefix, ots::kEndChar,
193 };
194 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
195 }
196 }
197
198 TEST(ValidateTest, TestHMoveTo) {
199 {
200 const int char_string[] = {
201 1, kOpPrefix, ots::kHMoveTo,
202 kOpPrefix, ots::kEndChar,
203 };
204 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
205 }
206 {
207 const int char_string[] = {
208 1, // width
209 1, kOpPrefix, ots::kHMoveTo,
210 kOpPrefix, ots::kEndChar,
211 };
212 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
213 }
214 {
215 const int char_string[] = {
216 1, kOpPrefix, ots::kHMoveTo,
217 1, 2, kOpPrefix, ots::kHMoveTo, // invalid
218 kOpPrefix, ots::kEndChar,
219 };
220 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
221 }
222 }
223
224 TEST(ValidateTest, TestVMoveTo) {
225 {
226 const int char_string[] = {
227 1, kOpPrefix, ots::kVMoveTo,
228 kOpPrefix, ots::kEndChar,
229 };
230 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
231 }
232 {
233 const int char_string[] = {
234 1, // width
235 1, kOpPrefix, ots::kVMoveTo,
236 kOpPrefix, ots::kEndChar,
237 };
238 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
239 }
240 {
241 const int char_string[] = {
242 1, kOpPrefix, ots::kVMoveTo,
243 1, 2, kOpPrefix, ots::kVMoveTo, // invalid
244 kOpPrefix, ots::kEndChar,
245 };
246 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
247 }
248 }
249
250 TEST(ValidateTest, TestRLineTo) {
251 {
252 const int char_string[] = {
253 1, kOpPrefix, ots::kVMoveTo,
254 1, 2, kOpPrefix, ots::kRLineTo,
255 kOpPrefix, ots::kEndChar,
256 };
257 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
258 }
259 {
260 const int char_string[] = {
261 1, kOpPrefix, ots::kVMoveTo,
262 1, 2, 3, kOpPrefix, ots::kRLineTo, // invalid
263 kOpPrefix, ots::kEndChar,
264 };
265 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
266 }
267 {
268 const int char_string[] = {
269 1, kOpPrefix, ots::kVMoveTo,
270 1, 2, 3, 4, kOpPrefix, ots::kRLineTo,
271 kOpPrefix, ots::kEndChar,
272 };
273 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
274 }
275 {
276 const int char_string[] = {
277 1, 2, kOpPrefix, ots::kRLineTo, // can't be the first op.
278 kOpPrefix, ots::kEndChar,
279 };
280 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
281 }
282 }
283
284 TEST(ValidateTest, TestHLineTo) {
285 {
286 const int char_string[] = {
287 1, kOpPrefix, ots::kVMoveTo,
288 1, kOpPrefix, ots::kHLineTo,
289 1, 2, kOpPrefix, ots::kHLineTo,
290 1, 2, 3, kOpPrefix, ots::kHLineTo,
291 1, 2, 3, 4, kOpPrefix, ots::kHLineTo,
292 1, 2, 3, 4, 5, kOpPrefix, ots::kHLineTo,
293 kOpPrefix, ots::kEndChar,
294 };
295 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
296 }
297 {
298 const int char_string[] = {
299 1, kOpPrefix, ots::kVMoveTo,
300 kOpPrefix, ots::kHLineTo, // invalid
301 kOpPrefix, ots::kEndChar,
302 };
303 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
304 }
305 {
306 const int char_string[] = {
307 1, kOpPrefix, ots::kHLineTo, // can't be the first op.
308 kOpPrefix, ots::kEndChar,
309 };
310 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
311 }
312 }
313
314 TEST(ValidateTest, TestVLineTo) {
315 {
316 const int char_string[] = {
317 1, kOpPrefix, ots::kVMoveTo,
318 1, kOpPrefix, ots::kVLineTo,
319 1, 2, kOpPrefix, ots::kVLineTo,
320 1, 2, 3, kOpPrefix, ots::kVLineTo,
321 1, 2, 3, 4, kOpPrefix, ots::kVLineTo,
322 1, 2, 3, 4, 5, kOpPrefix, ots::kVLineTo,
323 kOpPrefix, ots::kEndChar,
324 };
325 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
326 }
327 {
328 const int char_string[] = {
329 1, kOpPrefix, ots::kVMoveTo,
330 kOpPrefix, ots::kVLineTo, // invalid
331 kOpPrefix, ots::kEndChar,
332 };
333 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
334 }
335 {
336 const int char_string[] = {
337 1, kOpPrefix, ots::kVLineTo, // can't be the first op.
338 kOpPrefix, ots::kEndChar,
339 };
340 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
341 }
342 }
343
344 TEST(ValidateTest, TestRRCurveTo) {
345 {
346 const int char_string[] = {
347 1, kOpPrefix, ots::kVMoveTo,
348 1, 2, 3, 4, 5, 6, kOpPrefix, ots::kRRCurveTo,
349 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, kOpPrefix, ots::kRRCurveTo,
350 kOpPrefix, ots::kEndChar,
351 };
352 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
353 }
354 {
355 const int char_string[] = {
356 1, kOpPrefix, ots::kVMoveTo,
357 kOpPrefix, ots::kRRCurveTo, // invalid
358 kOpPrefix, ots::kEndChar,
359 };
360 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
361 }
362 {
363 const int char_string[] = {
364 1, 2, 3, 4, 5, 6, kOpPrefix, ots::kRRCurveTo, // can't be the first op.
365 kOpPrefix, ots::kEndChar,
366 };
367 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
368 }
369 }
370
371 TEST(ValidateTest, TestHHCurveTo) {
372 {
373 const int char_string[] = {
374 1, kOpPrefix, ots::kVMoveTo,
375 1, 2, 3, 4, kOpPrefix, ots::kHHCurveTo,
376 1, 2, 3, 4, 5, kOpPrefix, ots::kHHCurveTo,
377 1, 2, 3, 4, 5, 6, 7, 8, 9, kOpPrefix, ots::kHHCurveTo,
378 kOpPrefix, ots::kEndChar,
379 };
380 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
381 }
382 {
383 const int char_string[] = {
384 1, kOpPrefix, ots::kVMoveTo,
385 1, kOpPrefix, ots::kHHCurveTo, // invalid
386 kOpPrefix, ots::kEndChar,
387 };
388 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
389 }
390 {
391 const int char_string[] = {
392 1, kOpPrefix, ots::kVMoveTo,
393 1, 2, 3, kOpPrefix, ots::kHHCurveTo, // invalid
394 kOpPrefix, ots::kEndChar,
395 };
396 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
397 }
398 {
399 const int char_string[] = {
400 1, 2, 3, 4, 5, kOpPrefix, ots::kHHCurveTo, // can't be the first op.
401 kOpPrefix, ots::kEndChar,
402 };
403 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
404 }
405 }
406
407 TEST(ValidateTest, TestHVCurveTo) {
408 {
409 const int char_string[] = {
410 1, kOpPrefix, ots::kVMoveTo,
411 // The first form.
412 1, 2, 3, 4, kOpPrefix, ots::kHVCurveTo,
413 1, 2, 3, 4, 5, kOpPrefix, ots::kHVCurveTo,
414 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, kOpPrefix, ots::kHVCurveTo,
415 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
416 kOpPrefix, ots::kHVCurveTo,
417 // The second form.
418 1, 2, 3, 4, 5, 6, 7, 8, kOpPrefix, ots::kHVCurveTo,
419 1, 2, 3, 4, 5, 6, 7, 8, 9, kOpPrefix, ots::kHVCurveTo,
420 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
421 kOpPrefix, ots::kHVCurveTo,
422 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
423 22, 23, 24, 25, kOpPrefix, ots::kHVCurveTo,
424 kOpPrefix, ots::kEndChar,
425 };
426 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
427 }
428 {
429 const int char_string[] = {
430 1, kOpPrefix, ots::kVMoveTo,
431 1, kOpPrefix, ots::kHVCurveTo, // invalid
432 kOpPrefix, ots::kEndChar,
433 };
434 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
435 }
436 {
437 const int char_string[] = {
438 1, kOpPrefix, ots::kVMoveTo,
439 1, 2, 3, kOpPrefix, ots::kHVCurveTo, // invalid
440 kOpPrefix, ots::kEndChar,
441 };
442 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
443 }
444 {
445 const int char_string[] = {
446 1, 2, 3, 4, kOpPrefix, ots::kHVCurveTo, // can't be the first op.
447 kOpPrefix, ots::kEndChar,
448 };
449 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
450 }
451 }
452
453 TEST(ValidateTest, TestRCurveLine) {
454 {
455 const int char_string[] = {
456 1, kOpPrefix, ots::kVMoveTo,
457 1, 2, 3, 4, 5, 6, 7, 8, kOpPrefix, ots::kRCurveLine,
458 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
459 kOpPrefix, ots::kRCurveLine,
460 kOpPrefix, ots::kEndChar,
461 };
462 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
463 }
464 {
465 const int char_string[] = {
466 1, kOpPrefix, ots::kVMoveTo,
467 1, 2, 3, 4, 5, 6, 7, kOpPrefix, ots::kRCurveLine, // invalid
468 kOpPrefix, ots::kEndChar,
469 };
470 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
471 }
472 {
473 const int char_string[] = {
474 // can't be the first op.
475 1, 2, 3, 4, 5, 6, 7, 8, kOpPrefix, ots::kRCurveLine,
476 kOpPrefix, ots::kEndChar,
477 };
478 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
479 }
480 }
481
482 TEST(ValidateTest, TestRLineCurve) {
483 {
484 const int char_string[] = {
485 1, kOpPrefix, ots::kVMoveTo,
486 1, 2, 3, 4, 5, 6, 7, 8, kOpPrefix, ots::kRLineCurve,
487 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, kOpPrefix, ots::kRLineCurve,
488 kOpPrefix, ots::kEndChar,
489 };
490 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
491 }
492 {
493 const int char_string[] = {
494 1, kOpPrefix, ots::kVMoveTo,
495 1, 2, 3, 4, 5, 6, 7, kOpPrefix, ots::kRLineCurve, // invalid
496 kOpPrefix, ots::kEndChar,
497 };
498 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
499 }
500 {
501 const int char_string[] = {
502 // can't be the first op.
503 1, 2, 3, 4, 5, 6, 7, 8, kOpPrefix, ots::kRLineCurve,
504 kOpPrefix, ots::kEndChar,
505 };
506 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
507 }
508 }
509
510 TEST(ValidateTest, TestVHCurveTo) {
511 {
512 const int char_string[] = {
513 1, kOpPrefix, ots::kVMoveTo,
514 // The first form.
515 1, 2, 3, 4, kOpPrefix, ots::kVHCurveTo,
516 1, 2, 3, 4, 5, kOpPrefix, ots::kVHCurveTo,
517 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, kOpPrefix, ots::kVHCurveTo,
518 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
519 kOpPrefix, ots::kVHCurveTo,
520 // The second form.
521 1, 2, 3, 4, 5, 6, 7, 8, kOpPrefix, ots::kVHCurveTo,
522 1, 2, 3, 4, 5, 6, 7, 8, 9, kOpPrefix, ots::kVHCurveTo,
523 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
524 kOpPrefix, ots::kVHCurveTo,
525 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
526 22, 23, 24, 25, kOpPrefix, ots::kVHCurveTo,
527 kOpPrefix, ots::kEndChar,
528 };
529 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
530 }
531 {
532 const int char_string[] = {
533 1, kOpPrefix, ots::kVMoveTo,
534 1, kOpPrefix, ots::kVHCurveTo, // invalid
535 kOpPrefix, ots::kEndChar,
536 };
537 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
538 }
539 {
540 const int char_string[] = {
541 1, kOpPrefix, ots::kVMoveTo,
542 1, 2, 3, kOpPrefix, ots::kVHCurveTo, // invalid
543 kOpPrefix, ots::kEndChar,
544 };
545 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
546 }
547 {
548 const int char_string[] = {
549 1, 2, 3, 4, kOpPrefix, ots::kVHCurveTo, // can't be the first op.
550 kOpPrefix, ots::kEndChar,
551 };
552 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
553 }
554 }
555
556 TEST(ValidateTest, TestVVCurveTo) {
557 {
558 const int char_string[] = {
559 1, kOpPrefix, ots::kVMoveTo,
560 1, 2, 3, 4, kOpPrefix, ots::kVVCurveTo,
561 1, 2, 3, 4, 5, kOpPrefix, ots::kVVCurveTo,
562 1, 2, 3, 4, 5, 6, 7, 8, kOpPrefix, ots::kVVCurveTo,
563 1, 2, 3, 4, 5, 6, 7, 8, 9, kOpPrefix, ots::kVVCurveTo,
564 kOpPrefix, ots::kEndChar,
565 };
566 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
567 }
568 {
569 const int char_string[] = {
570 1, kOpPrefix, ots::kVMoveTo,
571 kOpPrefix, ots::kVVCurveTo, // invalid
572 kOpPrefix, ots::kEndChar,
573 };
574 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
575 }
576 {
577 const int char_string[] = {
578 1, kOpPrefix, ots::kVMoveTo,
579 1, kOpPrefix, ots::kVVCurveTo, // invalid
580 kOpPrefix, ots::kEndChar,
581 };
582 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
583 }
584 {
585 const int char_string[] = {
586 1, 2, 3, 4, kOpPrefix, ots::kVVCurveTo, // can't be the first op.
587 kOpPrefix, ots::kEndChar,
588 };
589 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
590 }
591 }
592
593 TEST(ValidateTest, TestFlex) {
594 {
595 const int char_string[] = {
596 1, kOpPrefix, ots::kVMoveTo,
597 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, kOpPrefix, ots::kFlex,
598 kOpPrefix, ots::kEndChar,
599 };
600 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
601 }
602 {
603 const int char_string[] = {
604 1, kOpPrefix, ots::kVMoveTo,
605 kOpPrefix, ots::kFlex, // invalid
606 kOpPrefix, ots::kEndChar,
607 };
608 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
609 }
610 {
611 const int char_string[] = {
612 1, kOpPrefix, ots::kVMoveTo,
613 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, kOpPrefix, ots::kFlex, // invalid
614 kOpPrefix, ots::kEndChar,
615 };
616 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
617 }
618 {
619 const int char_string[] = {
620 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, kOpPrefix, ots::kFlex,
621 kOpPrefix, ots::kEndChar,
622 };
623 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
624 }
625 }
626
627 TEST(ValidateTest, TestHFlex) {
628 {
629 const int char_string[] = {
630 1, kOpPrefix, ots::kVMoveTo,
631 1, 2, 3, 4, 5, 6, 7, kOpPrefix, ots::kHFlex,
632 kOpPrefix, ots::kEndChar,
633 };
634 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
635 }
636 {
637 const int char_string[] = {
638 1, kOpPrefix, ots::kVMoveTo,
639 kOpPrefix, ots::kHFlex, // invalid
640 kOpPrefix, ots::kEndChar,
641 };
642 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
643 }
644 {
645 const int char_string[] = {
646 1, kOpPrefix, ots::kVMoveTo,
647 1, 2, 3, 4, 5, 6, kOpPrefix, ots::kHFlex, // invalid
648 kOpPrefix, ots::kEndChar,
649 };
650 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
651 }
652 {
653 const int char_string[] = {
654 1, 2, 3, 4, 5, 6, 7, kOpPrefix, ots::kHFlex,
655 kOpPrefix, ots::kEndChar,
656 };
657 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
658 }
659 }
660
661 TEST(ValidateTest, TestHFlex1) {
662 {
663 const int char_string[] = {
664 1, kOpPrefix, ots::kVMoveTo,
665 1, 2, 3, 4, 5, 6, 7, 8, 9, kOpPrefix, ots::kHFlex1,
666 kOpPrefix, ots::kEndChar,
667 };
668 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
669 }
670 {
671 const int char_string[] = {
672 1, kOpPrefix, ots::kVMoveTo,
673 kOpPrefix, ots::kHFlex1, // invalid
674 kOpPrefix, ots::kEndChar,
675 };
676 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
677 }
678 {
679 const int char_string[] = {
680 1, kOpPrefix, ots::kVMoveTo,
681 1, 2, 3, 4, 5, 6, 7, 8, kOpPrefix, ots::kHFlex1, // invalid
682 kOpPrefix, ots::kEndChar,
683 };
684 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
685 }
686 {
687 const int char_string[] = {
688 1, 2, 3, 4, 5, 6, 7, 8, 9, kOpPrefix, ots::kHFlex1,
689 kOpPrefix, ots::kEndChar,
690 };
691 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
692 }
693 }
694
695 TEST(ValidateTest, TestFlex1) {
696 {
697 const int char_string[] = {
698 1, kOpPrefix, ots::kVMoveTo,
699 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, kOpPrefix, ots::kFlex1,
700 kOpPrefix, ots::kEndChar,
701 };
702 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
703 }
704 {
705 const int char_string[] = {
706 1, kOpPrefix, ots::kVMoveTo,
707 kOpPrefix, ots::kFlex1, // invalid
708 kOpPrefix, ots::kEndChar,
709 };
710 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
711 }
712 {
713 const int char_string[] = {
714 1, kOpPrefix, ots::kVMoveTo,
715 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, kOpPrefix, ots::kFlex1, // invalid
716 kOpPrefix, ots::kEndChar,
717 };
718 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
719 }
720 {
721 const int char_string[] = {
722 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, kOpPrefix, ots::kFlex1,
723 kOpPrefix, ots::kEndChar,
724 };
725 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
726 }
727 }
728
729 TEST(ValidateTest, TestEndChar) {
730 {
731 const int char_string[] = {
732 kOpPrefix, ots::kEndChar,
733 };
734 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
735 }
736 {
737 const int char_string[] = {
738 1, kOpPrefix, ots::kVMoveTo,
739 kOpPrefix, ots::kEndChar,
740 };
741 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
742 }
743 {
744 const int char_string[] = {
745 GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallSubr,
746 };
747 const int local_subrs[] = {
748 kOpPrefix, ots::kEndChar,
749 };
750 EXPECT_TRUE(Validate(char_string, ARRAYSIZE(char_string),
751 NULL, 0,
752 local_subrs, ARRAYSIZE(local_subrs)));
753 }
754 {
755 const int char_string[] = {
756 GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallGSubr,
757 };
758 const int global_subrs[] = {
759 kOpPrefix, ots::kEndChar,
760 };
761 EXPECT_TRUE(Validate(char_string, ARRAYSIZE(char_string),
762 global_subrs, ARRAYSIZE(global_subrs),
763 NULL, 0));
764 }
765 }
766
767 TEST(ValidateTest, TestHStem) {
768 {
769 const int char_string[] = {
770 1, 2, kOpPrefix, ots::kHStem,
771 kOpPrefix, ots::kEndChar,
772 };
773 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
774 }
775 {
776 const int char_string[] = {
777 1, 2, 3, 4, kOpPrefix, ots::kHStem,
778 kOpPrefix, ots::kEndChar,
779 };
780 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
781 }
782 {
783 const int char_string[] = {
784 0, // width
785 1, 2, kOpPrefix, ots::kHStem,
786 kOpPrefix, ots::kEndChar,
787 };
788 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
789 }
790 {
791 const int char_string[] = {
792 1, kOpPrefix, ots::kVMoveTo,
793 0, 1, 2, kOpPrefix, ots::kHStem, // invalid
794 kOpPrefix, ots::kEndChar,
795 };
796 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
797 }
798 {
799 const int char_string[] = {
800 1, kOpPrefix, ots::kVMoveTo,
801 1, 2, 3, 4, 5, kOpPrefix, ots::kHStem, // invalid
802 kOpPrefix, ots::kEndChar,
803 };
804 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
805 }
806 }
807
808 TEST(ValidateTest, TestVStem) {
809 {
810 const int char_string[] = {
811 1, 2, kOpPrefix, ots::kVStem,
812 kOpPrefix, ots::kEndChar,
813 };
814 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
815 }
816 {
817 const int char_string[] = {
818 1, 2, 3, 4, kOpPrefix, ots::kVStem,
819 kOpPrefix, ots::kEndChar,
820 };
821 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
822 }
823 {
824 const int char_string[] = {
825 0, // width
826 1, 2, kOpPrefix, ots::kVStem,
827 kOpPrefix, ots::kEndChar,
828 };
829 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
830 }
831 {
832 const int char_string[] = {
833 1, kOpPrefix, ots::kVMoveTo,
834 0, 1, 2, kOpPrefix, ots::kVStem, // invalid
835 kOpPrefix, ots::kEndChar,
836 };
837 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
838 }
839 {
840 const int char_string[] = {
841 1, kOpPrefix, ots::kVMoveTo,
842 1, 2, 3, 4, 5, kOpPrefix, ots::kVStem, // invalid
843 kOpPrefix, ots::kEndChar,
844 };
845 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
846 }
847 }
848
849 TEST(ValidateTest, TestHStemHm) {
850 {
851 const int char_string[] = {
852 1, 2, kOpPrefix, ots::kHStemHm,
853 kOpPrefix, ots::kEndChar,
854 };
855 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
856 }
857 {
858 const int char_string[] = {
859 1, 2, 3, 4, kOpPrefix, ots::kHStemHm,
860 kOpPrefix, ots::kEndChar,
861 };
862 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
863 }
864 {
865 const int char_string[] = {
866 0, // width
867 1, 2, kOpPrefix, ots::kHStemHm,
868 kOpPrefix, ots::kEndChar,
869 };
870 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
871 }
872 {
873 const int char_string[] = {
874 1, kOpPrefix, ots::kVMoveTo,
875 0, 1, 2, kOpPrefix, ots::kHStemHm, // invalid
876 kOpPrefix, ots::kEndChar,
877 };
878 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
879 }
880 {
881 const int char_string[] = {
882 1, kOpPrefix, ots::kVMoveTo,
883 1, 2, 3, 4, 5, kOpPrefix, ots::kHStemHm, // invalid
884 kOpPrefix, ots::kEndChar,
885 };
886 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
887 }
888 }
889
890 TEST(ValidateTest, TestVStemHm) {
891 {
892 const int char_string[] = {
893 1, 2, kOpPrefix, ots::kVStemHm,
894 kOpPrefix, ots::kEndChar,
895 };
896 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
897 }
898 {
899 const int char_string[] = {
900 1, 2, 3, 4, kOpPrefix, ots::kVStemHm,
901 kOpPrefix, ots::kEndChar,
902 };
903 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
904 }
905 {
906 const int char_string[] = {
907 0, // width
908 1, 2, kOpPrefix, ots::kVStemHm,
909 kOpPrefix, ots::kEndChar,
910 };
911 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
912 }
913 {
914 const int char_string[] = {
915 1, kOpPrefix, ots::kVMoveTo,
916 0, 1, 2, kOpPrefix, ots::kVStemHm, // invalid
917 kOpPrefix, ots::kEndChar,
918 };
919 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
920 }
921 {
922 const int char_string[] = {
923 1, kOpPrefix, ots::kVMoveTo,
924 1, 2, 3, 4, 5, kOpPrefix, ots::kVStemHm, // invalid
925 kOpPrefix, ots::kEndChar,
926 };
927 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
928 }
929 }
930
931 TEST(ValidateTest, TestHintMask) {
932 {
933 const int char_string[] = {
934 1, 2, kOpPrefix, ots::kHStem,
935 kOpPrefix, ots::kHintMask, 0x00,
936 kOpPrefix, ots::kEndChar,
937 };
938 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
939 }
940 {
941 const int char_string[] = {
942 1, 2, kOpPrefix, ots::kHStem,
943 3, 4, 5, 6, kOpPrefix, ots::kHintMask, 0x00, // vstem
944 kOpPrefix, ots::kEndChar,
945 };
946 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
947 }
948 {
949 const int char_string[] = {
950 kOpPrefix, ots::kHintMask, 0x00, // no stems to mask
951 kOpPrefix, ots::kEndChar,
952 };
953 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
954 }
955 {
956 const int char_string[] = {
957 1, 2, kOpPrefix, ots::kHStem,
958 3, 4, 5, kOpPrefix, ots::kHintMask, 0x00, // invalid vstem
959 kOpPrefix, ots::kEndChar,
960 };
961 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
962 }
963 }
964
965 TEST(ValidateTest, TestCntrMask) {
966 {
967 const int char_string[] = {
968 1, 2, kOpPrefix, ots::kHStem,
969 kOpPrefix, ots::kCntrMask, 0x00,
970 kOpPrefix, ots::kEndChar,
971 };
972 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
973 }
974 {
975 const int char_string[] = {
976 1, 2, kOpPrefix, ots::kHStem,
977 3, 4, 5, 6, kOpPrefix, ots::kCntrMask, 0x00, // vstem
978 kOpPrefix, ots::kEndChar,
979 };
980 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
981 }
982 {
983 const int char_string[] = {
984 kOpPrefix, ots::kCntrMask, 0x00, // no stems to mask
985 kOpPrefix, ots::kEndChar,
986 };
987 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
988 }
989 {
990 const int char_string[] = {
991 1, 2, kOpPrefix, ots::kHStem,
992 3, 4, 5, kOpPrefix, ots::kCntrMask, 0x00, // invalid vstem
993 kOpPrefix, ots::kEndChar,
994 };
995 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
996 }
997 }
998
999 TEST(ValidateTest, TestAbs) {
1000 {
1001 const int char_string[] = {
1002 -1, kOpPrefix, ots::kAbs,
1003 2, kOpPrefix, ots::kHStem,
1004 kOpPrefix, ots::kEndChar,
1005 };
1006 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1007 }
1008 {
1009 const int char_string[] = {
1010 kOpPrefix, ots::kAbs, // invalid
1011 2, kOpPrefix, ots::kHStem,
1012 kOpPrefix, ots::kEndChar,
1013 };
1014 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1015 }
1016 }
1017
1018 TEST(ValidateTest, TestAdd) {
1019 {
1020 const int char_string[] = {
1021 0, 1, kOpPrefix, ots::kAdd,
1022 2, kOpPrefix, ots::kHStem,
1023 kOpPrefix, ots::kEndChar,
1024 };
1025 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1026 }
1027 {
1028 const int char_string[] = {
1029 1, kOpPrefix, ots::kAdd, // invalid
1030 2, kOpPrefix, ots::kHStem,
1031 kOpPrefix, ots::kEndChar,
1032 };
1033 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1034 }
1035 }
1036
1037 TEST(ValidateTest, TestSub) {
1038 {
1039 const int char_string[] = {
1040 2, 1, kOpPrefix, ots::kSub,
1041 2, kOpPrefix, ots::kHStem,
1042 kOpPrefix, ots::kEndChar,
1043 };
1044 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1045 }
1046 {
1047 const int char_string[] = {
1048 1, kOpPrefix, ots::kSub, // invalid
1049 2, kOpPrefix, ots::kHStem,
1050 kOpPrefix, ots::kEndChar,
1051 };
1052 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1053 }
1054 }
1055
1056 TEST(ValidateTest, TestDiv) {
1057 // TODO(yusukes): Test div-by-zero.
1058 {
1059 const int char_string[] = {
1060 2, 1, kOpPrefix, ots::kDiv,
1061 2, kOpPrefix, ots::kHStem,
1062 kOpPrefix, ots::kEndChar,
1063 };
1064 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1065 }
1066 {
1067 const int char_string[] = {
1068 1, kOpPrefix, ots::kDiv, // invalid
1069 2, kOpPrefix, ots::kHStem,
1070 kOpPrefix, ots::kEndChar,
1071 };
1072 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1073 }
1074 }
1075
1076 TEST(ValidateTest, TestNeg) {
1077 {
1078 const int char_string[] = {
1079 -1, kOpPrefix, ots::kNeg,
1080 2, kOpPrefix, ots::kHStem,
1081 kOpPrefix, ots::kEndChar,
1082 };
1083 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1084 }
1085 {
1086 const int char_string[] = {
1087 kOpPrefix, ots::kNeg, // invalid
1088 2, kOpPrefix, ots::kHStem,
1089 kOpPrefix, ots::kEndChar,
1090 };
1091 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1092 }
1093 }
1094
1095 TEST(ValidateTest, TestRandom) {
1096 {
1097 const int char_string[] = {
1098 kOpPrefix, ots::kRandom, // OTS rejects the operator.
1099 2, kOpPrefix, ots::kHStem,
1100 kOpPrefix, ots::kEndChar,
1101 };
1102 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1103 }
1104 }
1105
1106 TEST(ValidateTest, TestMul) {
1107 {
1108 const int char_string[] = {
1109 2, 1, kOpPrefix, ots::kMul,
1110 2, kOpPrefix, ots::kHStem,
1111 kOpPrefix, ots::kEndChar,
1112 };
1113 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1114 }
1115 {
1116 const int char_string[] = {
1117 1, kOpPrefix, ots::kMul, // invalid
1118 2, kOpPrefix, ots::kHStem,
1119 kOpPrefix, ots::kEndChar,
1120 };
1121 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1122 }
1123 }
1124
1125 TEST(ValidateTest, TestSqrt) {
1126 // TODO(yusukes): Test negative numbers.
1127 {
1128 const int char_string[] = {
1129 4, kOpPrefix, ots::kSqrt,
1130 2, kOpPrefix, ots::kHStem,
1131 kOpPrefix, ots::kEndChar,
1132 };
1133 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1134 }
1135 {
1136 const int char_string[] = {
1137 kOpPrefix, ots::kSqrt, // invalid
1138 2, kOpPrefix, ots::kHStem,
1139 kOpPrefix, ots::kEndChar,
1140 };
1141 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1142 }
1143 }
1144
1145 TEST(ValidateTest, TestDrop) {
1146 {
1147 const int char_string[] = {
1148 1, 1, kOpPrefix, ots::kAdd,
1149 kOpPrefix, ots::kDrop,
1150 1, 2, kOpPrefix, ots::kHStem,
1151 kOpPrefix, ots::kEndChar,
1152 };
1153 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1154 }
1155 {
1156 const int char_string[] = {
1157 kOpPrefix, ots::kDrop, // invalid
1158 1, 2, kOpPrefix, ots::kHStem,
1159 kOpPrefix, ots::kEndChar,
1160 };
1161 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1162 }
1163 }
1164
1165 TEST(ValidateTest, TestExch) {
1166 {
1167 const int char_string[] = {
1168 1, 1, kOpPrefix, ots::kAdd,
1169 kOpPrefix, ots::kDup,
1170 kOpPrefix, ots::kExch,
1171 kOpPrefix, ots::kHStem,
1172 kOpPrefix, ots::kEndChar,
1173 };
1174 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1175 }
1176 {
1177 const int char_string[] = {
1178 1, 1, kOpPrefix, ots::kAdd,
1179 kOpPrefix, ots::kExch, // invalid
1180 2, kOpPrefix, ots::kHStem,
1181 kOpPrefix, ots::kEndChar,
1182 };
1183 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1184 }
1185 }
1186
1187 TEST(ValidateTest, TestIndex) {
1188 {
1189 const int char_string[] = {
1190 1, 2, 3, -1, kOpPrefix, ots::kIndex, // OTS rejects the operator.
1191 kOpPrefix, ots::kHStem,
1192 kOpPrefix, ots::kEndChar,
1193 };
1194 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1195 }
1196 }
1197
1198 TEST(ValidateTest, TestRoll) {
1199 {
1200 const int char_string[] = {
1201 1, 2, 2, 1, kOpPrefix, ots::kRoll, // OTS rejects the operator.
1202 kOpPrefix, ots::kHStem,
1203 kOpPrefix, ots::kEndChar,
1204 };
1205 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1206 }
1207 }
1208
1209 TEST(ValidateTest, TestDup) {
1210 {
1211 const int char_string[] = {
1212 1, 1, kOpPrefix, ots::kAdd,
1213 kOpPrefix, ots::kDup,
1214 kOpPrefix, ots::kHStem,
1215 kOpPrefix, ots::kEndChar,
1216 };
1217 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1218 }
1219 {
1220 const int char_string[] = {
1221 kOpPrefix, ots::kDup, // invalid
1222 2, kOpPrefix, ots::kHStem,
1223 kOpPrefix, ots::kEndChar,
1224 };
1225 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1226 }
1227 }
1228
1229 TEST(ValidateTest, TestPut) {
1230 {
1231 const int char_string[] = {
1232 1, 10, kOpPrefix, ots::kPut, // OTS rejects the operator.
1233 1, 2, kOpPrefix, ots::kHStem,
1234 kOpPrefix, ots::kEndChar,
1235 };
1236 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1237 }
1238 }
1239
1240 TEST(ValidateTest, TestGet) {
1241 {
1242 const int char_string[] = {
1243 1, 10, kOpPrefix, ots::kGet, // OTS rejects the operator.
1244 1, 2, kOpPrefix, ots::kHStem,
1245 kOpPrefix, ots::kEndChar,
1246 };
1247 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1248 }
1249 }
1250
1251 TEST(ValidateTest, TestAnd) {
1252 {
1253 const int char_string[] = {
1254 2, 1, kOpPrefix, ots::kAnd,
1255 2, kOpPrefix, ots::kHStem,
1256 kOpPrefix, ots::kEndChar,
1257 };
1258 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1259 }
1260 {
1261 const int char_string[] = {
1262 1, kOpPrefix, ots::kAnd, // invalid
1263 2, kOpPrefix, ots::kHStem,
1264 kOpPrefix, ots::kEndChar,
1265 };
1266 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1267 }
1268 }
1269
1270 TEST(ValidateTest, TestOr) {
1271 {
1272 const int char_string[] = {
1273 2, 1, kOpPrefix, ots::kOr,
1274 2, kOpPrefix, ots::kHStem,
1275 kOpPrefix, ots::kEndChar,
1276 };
1277 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1278 }
1279 {
1280 const int char_string[] = {
1281 1, kOpPrefix, ots::kOr, // invalid
1282 2, kOpPrefix, ots::kHStem,
1283 kOpPrefix, ots::kEndChar,
1284 };
1285 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1286 }
1287 }
1288
1289 TEST(ValidateTest, TestNot) {
1290 {
1291 const int char_string[] = {
1292 1, kOpPrefix, ots::kNot,
1293 2, kOpPrefix, ots::kHStem,
1294 kOpPrefix, ots::kEndChar,
1295 };
1296 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1297 }
1298 {
1299 const int char_string[] = {
1300 kOpPrefix, ots::kNot, // invalid
1301 2, kOpPrefix, ots::kHStem,
1302 kOpPrefix, ots::kEndChar,
1303 };
1304 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1305 }
1306 }
1307
1308 TEST(ValidateTest, TestEq) {
1309 {
1310 const int char_string[] = {
1311 2, 1, kOpPrefix, ots::kEq,
1312 2, kOpPrefix, ots::kHStem,
1313 kOpPrefix, ots::kEndChar,
1314 };
1315 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1316 }
1317 {
1318 const int char_string[] = {
1319 1, kOpPrefix, ots::kEq, // invalid
1320 2, kOpPrefix, ots::kHStem,
1321 kOpPrefix, ots::kEndChar,
1322 };
1323 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1324 }
1325 }
1326
1327 TEST(ValidateTest, TestIfElse) {
1328 {
1329 const int char_string[] = {
1330 1, 2, 3, 4, kOpPrefix, ots::kIfElse,
1331 2, kOpPrefix, ots::kHStem,
1332 kOpPrefix, ots::kEndChar,
1333 };
1334 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1335 }
1336 {
1337 const int char_string[] = {
1338 1, 2, 3, kOpPrefix, ots::kIfElse, // invalid
1339 2, kOpPrefix, ots::kHStem,
1340 kOpPrefix, ots::kEndChar,
1341 };
1342 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1343 }
1344 }
1345
1346 TEST(ValidateTest, TestCallSubr) {
1347 // Call valid subr.
1348 {
1349 const int char_string[] = {
1350 GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallSubr,
1351 };
1352 const int local_subrs[] = {
1353 kOpPrefix, ots::kEndChar,
1354 };
1355 EXPECT_TRUE(Validate(char_string, ARRAYSIZE(char_string),
1356 NULL, 0,
1357 local_subrs, ARRAYSIZE(local_subrs)));
1358 }
1359 // Call undefined subr.
1360 {
1361 const int char_string[] = {
1362 GET_SUBR_NUMBER(-1), kOpPrefix, ots::kCallSubr,
1363 };
1364 const int local_subrs[] = {
1365 kOpPrefix, ots::kEndChar,
1366 };
1367 EXPECT_FALSE(Validate(char_string, ARRAYSIZE(char_string),
1368 NULL, 0,
1369 local_subrs, ARRAYSIZE(local_subrs)));
1370 }
1371 {
1372 const int char_string[] = {
1373 GET_SUBR_NUMBER(1), kOpPrefix, ots::kCallSubr,
1374 };
1375 const int local_subrs[] = {
1376 kOpPrefix, ots::kEndChar,
1377 };
1378 EXPECT_FALSE(Validate(char_string, ARRAYSIZE(char_string),
1379 NULL, 0,
1380 local_subrs, ARRAYSIZE(local_subrs)));
1381 }
1382 {
1383 const int char_string[] = {
1384 GET_SUBR_NUMBER(-1), kOpPrefix, ots::kCallSubr,
1385 };
1386 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1387 }
1388 {
1389 const int char_string[] = {
1390 GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallSubr,
1391 };
1392 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1393 }
1394 {
1395 const int char_string[] = {
1396 GET_SUBR_NUMBER(1), kOpPrefix, ots::kCallSubr,
1397 };
1398 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1399 }
1400 }
1401
1402 TEST(ValidateTest, TestCallGSubr) {
1403 // Call valid subr.
1404 {
1405 const int char_string[] = {
1406 GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallGSubr,
1407 };
1408 const int global_subrs[] = {
1409 kOpPrefix, ots::kEndChar,
1410 };
1411 EXPECT_TRUE(Validate(char_string, ARRAYSIZE(char_string),
1412 global_subrs, ARRAYSIZE(global_subrs),
1413 NULL, 0));
1414 }
1415 // Call undefined subr.
1416 {
1417 const int char_string[] = {
1418 GET_SUBR_NUMBER(-1), kOpPrefix, ots::kCallGSubr,
1419 };
1420 const int global_subrs[] = {
1421 kOpPrefix, ots::kEndChar,
1422 };
1423 EXPECT_FALSE(Validate(char_string, ARRAYSIZE(char_string),
1424 global_subrs, ARRAYSIZE(global_subrs),
1425 NULL, 0));
1426 }
1427 {
1428 const int char_string[] = {
1429 GET_SUBR_NUMBER(1), kOpPrefix, ots::kCallGSubr,
1430 };
1431 const int global_subrs[] = {
1432 kOpPrefix, ots::kEndChar,
1433 };
1434 EXPECT_FALSE(Validate(char_string, ARRAYSIZE(char_string),
1435 global_subrs, ARRAYSIZE(global_subrs),
1436 NULL, 0));
1437 }
1438 {
1439 const int char_string[] = {
1440 GET_SUBR_NUMBER(-1), kOpPrefix, ots::kCallGSubr,
1441 };
1442 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1443 }
1444 {
1445 const int char_string[] = {
1446 GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallGSubr,
1447 };
1448 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1449 }
1450 {
1451 const int char_string[] = {
1452 GET_SUBR_NUMBER(1), kOpPrefix, ots::kCallGSubr,
1453 };
1454 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1455 }
1456 }
1457
1458 TEST(ValidateTest, TestCallGSubrWithComputedValues) {
1459 {
1460 // OTS does not allow to call(g)subr with a subroutine number which is
1461 // not a immediate value for safety.
1462 const int char_string[] = {
1463 0, 0, kOpPrefix, ots::kAdd,
1464 kOpPrefix, ots::kCallGSubr,
1465 };
1466 const int global_subrs[] = {
1467 kOpPrefix, ots::kEndChar,
1468 };
1469 EXPECT_FALSE(Validate(char_string, ARRAYSIZE(char_string),
1470 global_subrs, ARRAYSIZE(global_subrs),
1471 NULL, 0));
1472 }
1473 }
1474
1475 TEST(ValidateTest, TestInfiniteLoop) {
1476 {
1477 const int char_string[] = {
1478 GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallSubr,
1479 };
1480 const int local_subrs[] = {
1481 GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallSubr,
1482 };
1483 EXPECT_FALSE(Validate(char_string, ARRAYSIZE(char_string),
1484 NULL, 0,
1485 local_subrs, ARRAYSIZE(local_subrs)));
1486 }
1487 {
1488 const int char_string[] = {
1489 GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallGSubr,
1490 };
1491 const int global_subrs[] = {
1492 GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallGSubr,
1493 };
1494 EXPECT_FALSE(Validate(char_string, ARRAYSIZE(char_string),
1495 global_subrs, ARRAYSIZE(global_subrs),
1496 NULL, 0));
1497 }
1498 // mutual recursion which doesn't stop.
1499 {
1500 const int char_string[] = {
1501 GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallSubr,
1502 };
1503 const int global_subrs[] = {
1504 GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallSubr,
1505 };
1506 const int local_subrs[] = {
1507 GET_SUBR_NUMBER(0), kOpPrefix, ots::kCallGSubr,
1508 };
1509 EXPECT_FALSE(Validate(char_string, ARRAYSIZE(char_string),
1510 global_subrs, ARRAYSIZE(global_subrs),
1511 local_subrs, ARRAYSIZE(local_subrs)));
1512 }
1513 }
1514
1515 TEST(ValidateTest, TestStackOverflow) {
1516 {
1517 const int char_string[] = {
1518 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1519 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1520 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1521 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1522 1, 2, 3, 4, 5, 6, 7, 8,
1523 kOpPrefix, ots::kEndChar,
1524 };
1525 EXPECT_TRUE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1526 }
1527 {
1528 const int char_string[] = {
1529 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1530 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1531 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1532 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1533 1, 2, 3, 4, 5, 6, 7, 8, 9, // overflow
1534 kOpPrefix, ots::kEndChar,
1535 };
1536 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1537 }
1538 }
1539
1540 TEST(ValidateTest, TestDeprecatedOperators) {
1541 {
1542 const int char_string[] = {
1543 kOpPrefix, 16, // 'blend'.
1544 kOpPrefix, ots::kEndChar,
1545 };
1546 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1547 }
1548 {
1549 const int char_string[] = {
1550 kOpPrefix, (12 << 8) + 8, // 'store'.
1551 kOpPrefix, ots::kEndChar,
1552 };
1553 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1554 }
1555 {
1556 const int char_string[] = {
1557 kOpPrefix, (12 << 8) + 13, // 'load'.
1558 kOpPrefix, ots::kEndChar,
1559 };
1560 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1561 }
1562 }
1563
1564 TEST(ValidateTest, TestUnterminatedCharString) {
1565 // No endchar operator.
1566 {
1567 const int char_string[] = {
1568 123,
1569 };
1570 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1571 }
1572 {
1573 const int char_string[] = {
1574 123, 456,
1575 };
1576 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1577 }
1578 {
1579 const int char_string[] = {
1580 123, 456, kOpPrefix, ots::kReturn,
1581 };
1582 EXPECT_FALSE(ValidateCharStrings(char_string, ARRAYSIZE(char_string)));
1583 }
1584 }
OLDNEW
« no previous file with comments | « third_party/ots/test/README ('k') | third_party/ots/test/file-stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698