PDF417DecoderTest.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. /*
  2. * Copyright 2017 Huy Cuong Nguyen
  3. * Copyright 2016 ZXing authors
  4. */
  5. // SPDX-License-Identifier: Apache-2.0
  6. #include "DecoderResult.h"
  7. #include "pdf417/PDFDecoder.h"
  8. #include "pdf417/PDFDecoderResultExtra.h"
  9. #include "gtest/gtest.h"
  10. namespace ZXing::Pdf417 {
  11. int DecodeMacroBlock(const std::vector<int>& codewords, int codeIndex, DecoderResultExtra& resultMetadata);
  12. }
  13. using namespace ZXing;
  14. using namespace ZXing::Pdf417;
  15. /**
  16. * Tests the first sample given in ISO/IEC 15438:2015(E) - Annex H.4
  17. */
  18. TEST(PDF417DecoderTest, StandardSample1)
  19. {
  20. std::vector<int> sampleCodes = { 20, 928, 111, 100, 17, 53, 923, 1, 111, 104, 923, 3, 64, 416, 34, 923, 4, 258, 446, 67,
  21. // we should never reach these
  22. 1000, 1000, 1000 };
  23. DecoderResultExtra resultMetadata;
  24. DecodeMacroBlock(sampleCodes, 2, resultMetadata);
  25. EXPECT_EQ(0, resultMetadata.segmentIndex());
  26. EXPECT_EQ("017053", resultMetadata.fileId());
  27. EXPECT_EQ(false, resultMetadata.isLastSegment());
  28. EXPECT_EQ(4, resultMetadata.segmentCount());
  29. EXPECT_EQ("CEN BE", resultMetadata.sender());
  30. EXPECT_EQ("ISO CH", resultMetadata.addressee());
  31. auto optionalData = resultMetadata.optionalData();
  32. EXPECT_EQ(1, optionalData.front()) << "first element of optional array should be the first field identifier";
  33. EXPECT_EQ(67, optionalData.back()) << "last element of optional array should be the last codeword of the last field";
  34. auto result = Decode(sampleCodes);
  35. EXPECT_EQ(0, result.structuredAppend().index);
  36. EXPECT_EQ("017053", result.structuredAppend().id);
  37. EXPECT_EQ(4, result.structuredAppend().count);
  38. }
  39. /**
  40. * Tests the second given in ISO/IEC 15438:2015(E) - Annex H.4
  41. */
  42. TEST(PDF417DecoderTest, StandardSample2)
  43. {
  44. std::vector<int> sampleCodes = { 11, 928, 111, 103, 17, 53, 923, 1, 111, 104, 922,
  45. // we should never reach these
  46. 1000, 1000, 1000 };
  47. DecoderResultExtra resultMetadata;
  48. DecodeMacroBlock(sampleCodes, 2, resultMetadata);
  49. EXPECT_EQ(3, resultMetadata.segmentIndex());
  50. EXPECT_EQ("017053", resultMetadata.fileId());
  51. EXPECT_EQ(true, resultMetadata.isLastSegment());
  52. EXPECT_EQ(4, resultMetadata.segmentCount());
  53. EXPECT_EQ("", resultMetadata.sender());
  54. EXPECT_EQ("", resultMetadata.addressee());
  55. auto optionalData = resultMetadata.optionalData();
  56. EXPECT_EQ(1, optionalData.front()) << "first element of optional array should be the first field identifier";
  57. EXPECT_EQ(104, optionalData.back()) << "last element of optional array should be the last codeword of the last field";
  58. auto result = Decode(sampleCodes);
  59. EXPECT_EQ(3, result.structuredAppend().index);
  60. EXPECT_EQ("017053", result.structuredAppend().id);
  61. EXPECT_EQ(4, result.structuredAppend().count);
  62. }
  63. /**
  64. * Tests the example given in ISO/IEC 15438:2015(E) - Annex H.6
  65. */
  66. TEST(PDF417DecoderTest, StandardSample3)
  67. {
  68. std::vector<int> sampleCodes = { 7, 928, 111, 100, 100, 200, 300 };
  69. DecoderResultExtra resultMetadata;
  70. DecodeMacroBlock(sampleCodes, 2, resultMetadata);
  71. EXPECT_EQ(0, resultMetadata.segmentIndex());
  72. EXPECT_EQ("100200300", resultMetadata.fileId());
  73. EXPECT_EQ(-1, resultMetadata.segmentCount());
  74. auto result = Decode(sampleCodes);
  75. EXPECT_EQ(0, result.structuredAppend().index);
  76. EXPECT_EQ("100200300", result.structuredAppend().id);
  77. EXPECT_EQ(0, result.structuredAppend().count);
  78. }
  79. TEST(PDF417DecoderTest, SampleWithFilename)
  80. {
  81. std::vector<int> sampleCodes = { 23, 477, 928, 111, 100, 0, 252, 21, 86, 923, 0, 815, 251, 133, 12, 148, 537, 593,
  82. 599, 923, 1, 111, 102, 98, 311, 355, 522, 920, 779, 40, 628, 33, 749, 267, 506, 213, 928, 465, 248, 493, 72,
  83. 780, 699, 780, 493, 755, 84, 198, 628, 368, 156, 198, 809, 19, 113 };
  84. DecoderResultExtra resultMetadata;
  85. DecodeMacroBlock(sampleCodes, 3, resultMetadata);
  86. EXPECT_EQ(0, resultMetadata.segmentIndex());
  87. EXPECT_EQ("000252021086", resultMetadata.fileId());
  88. EXPECT_EQ(false, resultMetadata.isLastSegment());
  89. EXPECT_EQ(2, resultMetadata.segmentCount());
  90. EXPECT_EQ("", resultMetadata.sender());
  91. EXPECT_EQ("", resultMetadata.addressee());
  92. EXPECT_EQ("filename.txt", resultMetadata.fileName());
  93. auto result = Decode(sampleCodes);
  94. EXPECT_EQ(0, result.structuredAppend().index);
  95. EXPECT_EQ("000252021086", result.structuredAppend().id);
  96. EXPECT_EQ(2, result.structuredAppend().count);
  97. }
  98. TEST(PDF417DecoderTest, SampleWithNumericValues)
  99. {
  100. std::vector<int> sampleCodes = { 25, 477, 928, 111, 100, 0, 252, 21, 86, 923, 2, 2, 0, 1, 0, 0, 0, 923, 5, 130,
  101. 923, 6, 1, 500, 13 };
  102. DecoderResultExtra resultMetadata;
  103. DecodeMacroBlock(sampleCodes, 3, resultMetadata);
  104. EXPECT_EQ(0, resultMetadata.segmentIndex());
  105. EXPECT_EQ("000252021086", resultMetadata.fileId());
  106. EXPECT_EQ(false, resultMetadata.isLastSegment());
  107. EXPECT_EQ(180980729000000L, resultMetadata.timestamp());
  108. EXPECT_EQ(30, resultMetadata.fileSize());
  109. EXPECT_EQ(260013, resultMetadata.checksum());
  110. EXPECT_EQ(-1, resultMetadata.segmentCount());
  111. auto result = Decode(sampleCodes);
  112. EXPECT_EQ(0, result.structuredAppend().index);
  113. EXPECT_EQ("000252021086", result.structuredAppend().id);
  114. EXPECT_EQ(0, result.structuredAppend().count);
  115. }
  116. TEST(PDF417DecoderTest, SampleWithMacroTerminatorOnly)
  117. {
  118. std::vector<int> sampleCodes = { 7, 477, 928, 222, 198, 0, 922 };
  119. DecoderResultExtra resultMetadata;
  120. DecodeMacroBlock(sampleCodes, 3, resultMetadata);
  121. EXPECT_EQ(99998, resultMetadata.segmentIndex());
  122. EXPECT_EQ("000", resultMetadata.fileId());
  123. EXPECT_EQ(true, resultMetadata.isLastSegment());
  124. EXPECT_EQ(-1, resultMetadata.segmentCount());
  125. auto result = Decode(sampleCodes);
  126. EXPECT_EQ(99998, result.structuredAppend().index);
  127. EXPECT_EQ("000", result.structuredAppend().id);
  128. EXPECT_EQ(99999, result.structuredAppend().count);
  129. }
  130. // Shorthand to decode and return text
  131. static std::wstring decode(const std::vector<int>& codewords)
  132. {
  133. return Decode(codewords).text();
  134. }
  135. // Shorthand to decode and return isValid
  136. static bool valid(const std::vector<int>& codewords)
  137. {
  138. return Decode(codewords).isValid();
  139. }
  140. TEST(PDF417DecoderTest, TextCompactionSimple)
  141. {
  142. // ISO/IEC 15438:2015 Figure 1
  143. EXPECT_EQ(decode({ 16, 453, 178, 121, 236, 858, 834, 361, 431, 426, 746, 828, 570, 393, 17, 119 }),
  144. L"PDF417 Symbology Standard");
  145. EXPECT_EQ(decode({ 16, 453, 178, 121, 237, 807, 564, 361, 431, 426, 746, 828, 570, 393, 17, 119 }),
  146. L"PDF417 Symbology Standard");
  147. // Alpha
  148. EXPECT_EQ(decode({ 15, 1, 63, 125, 187, 249, 311, 373, 435, 497, 559, 621, 683, 745, 809 }),
  149. L"ABCDEFGHIJKLMNOPQRSTUVWXYZ ");
  150. // Lower
  151. EXPECT_EQ(decode({ 15, 810, 32, 94, 156, 218, 280, 342, 404, 466, 528, 590, 652, 714, 776 }),
  152. L"abcdefghijklmnopqrstuvwxyz ");
  153. // Mixed
  154. EXPECT_EQ(decode({ 15, 840, 32, 94, 156, 311, 373, 435, 497, 559, 621, 683, 746, 218, 299 }),
  155. L"0123456&\r\t,:#-.$/+%*=^ 789");
  156. // Punctuation
  157. EXPECT_EQ(decode({ 16, 865, 1, 63, 125, 187, 849, 311, 373, 435, 497, 559, 621, 683, 745, 809 }),
  158. L";<>@[\\]_'~!\r\t,:\n-.$/\"|*()?{");
  159. // Alpha Punctuation Lower Mixed
  160. EXPECT_EQ(decode({ 27, 1, 865, 807, 896, 782, 855, 626, 807, 94, 865, 807, 896, 808, 776, 839, 176, 808, 32, 776,
  161. 839, 806, 208, 776, 839, 806, 239 }),
  162. L"AB{} C#+ de{} {}F 12{} G{} H");
  163. EXPECT_EQ(decode({ 25, 1, 896, 897, 806, 88, 470, 836, 783, 148, 776, 839, 806, 896, 897, 178, 806, 32, 776, 839,
  164. 806, 209, 809, 836, 787 }),
  165. L"AB{} C#+ de{} {}F 12{} G{} H");
  166. }
  167. TEST(PDF417DecoderTest, TextCompactionShiftByte)
  168. {
  169. // Alpha ShiftByte Alpha
  170. EXPECT_EQ(decode({ 7, 0, 0, 913, 233, 0, 0 }), L"AAAA\u00E9AAAA");
  171. // Alpha ShiftByte Alpha(PS) (Padding)
  172. EXPECT_EQ(decode({ 8, 0, 0, 913, 233, 0, 0, 29 }), L"AAAA\u00E9AAAAA");
  173. // Alpha(PS) ShiftByte Alpha (Section 5.4.2.4 (b) (1) PS ignored)
  174. EXPECT_EQ(decode({ 8, 0, 0, 29, 913, 233, 0, 0 }), L"AAAAA\u00E9AAAA");
  175. // Alpha(PS) ShiftByte Lower(PS) (Padding)
  176. EXPECT_EQ(decode({ 10, 0, 0, 29, 913, 233, 810, 0, 0, 29 }), L"AAAAA\u00E9aaaaaa");
  177. // Lower ShiftByte Lower
  178. EXPECT_EQ(decode({ 9, 810, 0, 0, 913, 233, 0, 0, 0 }), L"aaaaa\u00E9aaaaaa");
  179. // Lower(PS) ShiftByte Lower (Section 5.4.2.4 (b) (1) PS ignored)
  180. EXPECT_EQ(decode({ 10, 810, 0, 0, 29, 913, 233, 0, 0, 0 }), L"aaaaaa\u00E9aaaaaa");
  181. // Mixed ShiftByte Mixed
  182. EXPECT_EQ(decode({ 9, 840, 0, 0, 913, 233, 0, 0, 0 }), L"00000\u00E9000000");
  183. // Mixed(PS) ShiftByte Mixed (Section 5.4.2.4 (b) (1) PS ignored)
  184. EXPECT_EQ(decode({ 8, 840, 0, 29, 913, 233, 0, 0, }), L"0000\u00E90000");
  185. // Punctuation ShiftByte Punctuation
  186. EXPECT_EQ(decode({ 8, 865, 0, 0, 913, 233, 0, 0 }), L";;;;\u00E9;;;;");
  187. // Punctuation(AL) ShiftByte (Alpha) (Section 5.4.2.4 (b) (2) AL not ignored)
  188. EXPECT_EQ(decode({ 9, 865, 0, 0, 29, 913, 233, 0, 0 }), L";;;;;\u00E9AAAA");
  189. // Punctuation(AL) ShiftByte Punctuation(AL) (Padding)
  190. EXPECT_EQ(decode({ 11, 865, 0, 0, 29, 913, 233, 865, 0, 0, 29 }), L";;;;;\u00E9;;;;;");
  191. // Punctuation(AL) ShiftByte Lower
  192. EXPECT_EQ(decode({ 10, 865, 0, 0, 29, 913, 233, 810, 0, 0 }), L";;;;;\u00E9aaaaa");
  193. // ShiftByte (first position, which defaults to Text Compaction)
  194. EXPECT_EQ(decode({ 5, 913, 255, 775, 775 }), L"\u00FFZZZZ");
  195. // Byte ShiftByte (ShiftByte can only occur in Text Compaction)
  196. EXPECT_FALSE(valid({ 6, 901, 255, 255, 913, 255 }));
  197. // Numeric ShiftByte (ShiftByte can only occur in Text Compaction)
  198. EXPECT_FALSE(valid({ 7, 902, 171, 209, 268, 913, 255 }));
  199. // Text, Numeric, Byte, ShiftByte
  200. EXPECT_FALSE(valid({ 18, 1, 63, 125, 902, 17, 110, 836, 811, 223, 901, 127, 127, 127, 127, 913, 255, 775 }));
  201. // Text, Numeric, ShiftByte
  202. EXPECT_FALSE(valid({ 13, 1, 63, 125, 902, 17, 110, 836, 811, 223, 913, 255, 775 }));
  203. }
  204. TEST(PDF417DecoderTest, ByteCompaction)
  205. {
  206. // Byte (901)
  207. EXPECT_EQ(decode({ 12, 901, 213, 598, 413, 118, 87, 127, 127, 127, 127, 127 }),
  208. L"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F");
  209. // Byte6 (924) (mod 6 == 0)
  210. EXPECT_EQ(decode({ 12, 924, 213, 598, 413, 118, 87, 213, 598, 413, 118, 87 }),
  211. L"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F");
  212. // 924/901
  213. EXPECT_EQ(decode({ 13, 924, 213, 598, 413, 118, 87, 901, 127, 127, 127, 127, 127 }),
  214. L"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F");
  215. EXPECT_EQ(decode({ 17, 924, 213, 598, 413, 118, 87, 213, 598, 413, 118, 87, 901, 127, 127, 901, 127 }),
  216. L"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F");
  217. // Multiple 901s
  218. EXPECT_EQ(decode({ 15, 901, 127, 127, 127, 127, 127, 901, 127, 127, 127, 127, 901, 127, 127 }),
  219. L"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F");
  220. EXPECT_EQ(decode({ 13, 901, 213, 598, 413, 118, 87, 127, 901, 127, 127, 127, 127 }),
  221. L"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F");
  222. EXPECT_EQ(decode({ 13, 901, 213, 598, 413, 118, 87, 127, 127, 127, 127, 901, 127 }),
  223. L"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F");
  224. EXPECT_EQ(decode({ 13, 901, 213, 598, 413, 118, 87, 127, 127, 127, 127, 127, 901 }),
  225. L"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F");
  226. EXPECT_EQ(decode({ 14, 901, 213, 598, 413, 118, 87, 127, 127, 127, 127, 901, 901, 127 }),
  227. L"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F");
  228. EXPECT_EQ(decode({ 15, 901, 213, 598, 413, 118, 87, 127, 127, 127, 127, 901, 901, 127, 901 }),
  229. L"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F");
  230. EXPECT_EQ(decode({ 17, 901, 213, 598, 413, 118, 87, 127, 127, 127, 127, 127, 901, 127, 127, 127, 127 }),
  231. L"\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F");
  232. }
  233. TEST(PDF417DecoderTest, NumericCompaction)
  234. {
  235. // 43 consecutive
  236. EXPECT_EQ(decode({ 17, 902, 49, 98, 103, 675, 30, 186, 631, 467, 409, 266, 246, 677, 536, 811, 223 }),
  237. L"1234567890123456789012345678901234567890123");
  238. // 44 consecutive
  239. EXPECT_EQ(decode({ 17, 902, 491, 81, 137, 450, 302, 67, 15, 174, 492, 862, 667, 475, 869, 12, 434 }),
  240. L"12345678901234567890123456789012345678901234");
  241. // 45 consecutive
  242. EXPECT_EQ(decode({ 18, 902, 491, 81, 137, 450, 302, 67, 15, 174, 492, 862, 667, 475, 869, 12, 434, 15 }),
  243. L"123456789012345678901234567890123456789012345");
  244. // 87 consecutive
  245. EXPECT_EQ(decode({ 32, 902, 491, 81, 137, 450, 302, 67, 15, 174, 492, 862, 667, 475, 869, 12, 434, 68, 482, 582,
  246. 185, 641, 663, 847, 653, 803, 879, 734, 537, 34, 771, 667 }),
  247. L"123456789012345678901234567890123456789012345678901234567890123456789012345678901234567");
  248. // 88 consecutive
  249. EXPECT_EQ(decode({ 32, 902, 491, 81, 137, 450, 302, 67, 15, 174, 492, 862, 667, 475, 869, 12, 434, 685, 326, 422,
  250. 57, 117, 339, 377, 238, 839, 698, 145, 870, 348, 517, 378 }),
  251. L"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678");
  252. // 89 consecutive
  253. EXPECT_EQ(decode({ 33, 902, 491, 81, 137, 450, 302, 67, 15, 174, 492, 862, 667, 475, 869, 12, 434, 685, 326, 422,
  254. 57, 117, 339, 377, 238, 839, 698, 145, 870, 348, 517, 378, 19 }),
  255. L"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789");
  256. }
  257. TEST(PDF417DecoderTest, CompactionCombos)
  258. {
  259. // Text, Byte, Numeric, Text
  260. EXPECT_EQ(decode({ 19, 1, 63, 125, 901, 127, 127, 127, 127, 902, 17, 110, 836, 811, 223, 900, 652, 714, 779 }),
  261. L"ABCDEF\x7F\x7F\x7F\x7F" L"1234567890123VWXYZ");
  262. // Text, Numeric, Byte, Text
  263. EXPECT_EQ(decode({ 19, 1, 63, 125, 902, 17, 110, 836, 811, 223, 901, 127, 127, 127, 127, 900, 652, 714, 779 }),
  264. L"ABCDEF1234567890123\x7F\x7F\x7F\x7FVWXYZ");
  265. // Byte, Text, Numeric, Text
  266. EXPECT_EQ(decode({ 19, 901, 127, 127, 127, 900, 1, 63, 125, 902, 17, 110, 836, 811, 223, 900, 652, 714, 779 }),
  267. L"\x7F\x7F\x7F" L"ABCDEF1234567890123VWXYZ");
  268. // Byte, Numeric, Text
  269. EXPECT_EQ(decode({ 17, 901, 127, 127, 127, 127, 127, 902, 17, 110, 836, 811, 223, 900, 652, 714, 779 }),
  270. L"\x7F\x7F\x7F\x7F\x7F" L"1234567890123VWXYZ");
  271. // Numeric, Text, Byte, Text
  272. EXPECT_EQ(decode({ 19, 902, 17, 110, 836, 811, 223, 900, 1, 63, 125, 901, 127, 127, 127, 900, 652, 714, 779 }),
  273. L"1234567890123ABCDEF\x7F\x7F\x7FVWXYZ");
  274. // Numeric, Byte, Text
  275. EXPECT_EQ(decode({ 18, 902, 17, 110, 836, 811, 223, 901, 127, 127, 127, 900, 1, 63, 125, 652, 714, 779 }),
  276. L"1234567890123\x7F\x7F\x7F" L"ABCDEFVWXYZ");
  277. }
  278. TEST(PDF417DecoderTest, ECISingleText)
  279. {
  280. // ECI 3 "Aé"
  281. EXPECT_EQ(decode({ 7, 927, 3, 900, 29, 913, 233 }), L"A\u00E9"); // ECI Text ShiftByte
  282. EXPECT_EQ(decode({ 7, 900, 927, 3, 29, 913, 233 }), L"A\u00E9"); // Text ECI ShiftByte
  283. EXPECT_EQ(decode({ 6, 927, 3, 29, 913, 233 }), L"A\u00E9"); // ECI (Text) ShiftByte
  284. EXPECT_EQ(decode({ 6, 927, 3, 901, 65, 233 }), L"A\u00E9"); // ECI Byte
  285. EXPECT_EQ(decode({ 6, 29, 913, 927, 3, 233 }), L"A\u00E9"); // (Text) ShiftByte ECI
  286. // ECI 9 "Aβ"
  287. EXPECT_EQ(decode({ 7, 927, 9, 900, 29, 913, 226 }), L"A\u03B2"); // ECI Text ShiftByte
  288. EXPECT_EQ(decode({ 7, 900, 927, 9, 29, 913, 226 }), L"A\u03B2"); // Text ECI ShiftByte
  289. EXPECT_EQ(decode({ 6, 927, 9, 29, 913, 226 }), L"A\u03B2"); // ECI (Text) ShiftByte
  290. EXPECT_EQ(decode({ 6, 927, 9, 901, 65, 226 }), L"A\u03B2"); // ECI Byte
  291. EXPECT_EQ(decode({ 6, 29, 913, 927, 9, 226 }), L"A\u03B2"); // (Text) ShiftByte ECI
  292. // "AB" ShiftByte ECI 9 "β"
  293. EXPECT_EQ(decode({ 6, 1, 913, 927, 9, 226 }), L"AB\u03B2");
  294. }
  295. TEST(PDF417DecoderTest, ECISingleByte)
  296. {
  297. // ECI 20 Byte "点茗"
  298. EXPECT_EQ(decode({ 8, 927, 20, 901, 147, 95, 228, 170 }), L"\u70B9\u8317");
  299. // Byte ECI 20 "点茗"
  300. EXPECT_EQ(decode({ 8, 901, 927, 20, 147, 95, 228, 170 }), L"\u70B9\u8317");
  301. // ECI 20 Byte "点茗A"
  302. EXPECT_EQ(decode({ 9, 927, 20, 901, 147, 95, 228, 170, 65 }), L"\u70B9\u8317A");
  303. // Byte ECI 20 "点茗A"
  304. EXPECT_EQ(decode({ 9, 901, 927, 20, 147, 95, 228, 170, 65 }), L"\u70B9\u8317A");
  305. // ECI 20 Byte6 "点茗テ"
  306. EXPECT_EQ(decode({ 9, 927, 20, 924, 246, 877, 166, 106, 797 }), L"\u70B9\u8317\u30C6");
  307. // Byte6 ECI 20 "点茗テ"
  308. EXPECT_EQ(decode({ 9, 924, 927, 20, 246, 877, 166, 106, 797 }), L"\u70B9\u8317\u30C6");
  309. // Byte6 ECI 20 (not allowed inside 5-codeword batch)
  310. EXPECT_FALSE(valid({ 9, 924, 246, 877, 166, 106, 927, 20, 797 }));
  311. // Byte ECI 20 "点茗テA"
  312. EXPECT_EQ(decode({ 10, 901, 927, 20, 246, 877, 166, 106, 797, 65 }), L"\u70B9\u8317\u30C6A");
  313. }
  314. TEST(PDF417DecoderTest, ECISingleNumeric)
  315. {
  316. // ECIs allowed anywhere in Numeric Compaction
  317. // Numeric ECI 20 Numeric(15)
  318. EXPECT_EQ(decode({ 19, 902, 927, 20, 491, 81, 137, 450, 302, 67, 15, 174, 492, 862, 667, 475, 869, 12, 434 }),
  319. L"12345678901234567890123456789012345678901234");
  320. // Numeric(1) ECI 20 Numeric(14)
  321. EXPECT_EQ(decode({ 19, 902, 11, 927, 20, 485, 624, 192, 160, 521, 439, 324, 737, 864, 136, 732, 282, 410, 12 }),
  322. L"123456789012345678901234567890123456789012");
  323. // Numeric(4) ECI 20 Numeric(11) Byte(ShiftJIS) "点茗"
  324. EXPECT_EQ(decode({ 24, 902, 154, 98, 332, 101, 927, 20, 354, 63, 496, 448, 236, 148, 354, 624, 335, 600, 123,
  325. 901, 147, 95, 228, 170 }),
  326. L"1234567890123456789012345678901234567890123\u70B9\u8317");
  327. // Numeric(11) ECI 25 Numeric(4) Byte(UnicodeBig) "AĀ" (U+0100)
  328. // (ASCII values of "3456789012" as UTF-16 "343536373839303132" (CJK compatibility block)
  329. EXPECT_EQ(decode({ 24, 902, 322, 183, 750, 813, 535, 621, 854, 718, 783, 621, 112, 927, 25, 18, 413, 287, 712,
  330. 901, 0, 'A', 1, 0 }),
  331. L"12345678901234567890123456789012\u3334\u3536\u3738\u3930\u3132A\u0100");
  332. }
  333. TEST(PDF417DecoderTest, ECIMultipleTextByte)
  334. {
  335. // Text "ABCDEFG" ECI 9 Byte "αβ" ECI 3 "áA"
  336. EXPECT_EQ(decode({ 15, 1, 63, 125, 209, 927, 9, 901, 225, 226, 927, 3, 901, 225, 65 }),
  337. L"ABCDEFG\u03B1\u03B2\u00E1A");
  338. EXPECT_EQ(decode({ 14, 1, 63, 125, 209, 927, 9, 901, 225, 226, 927, 3, 225, 65 }), L"ABCDEFG\u03B1\u03B2\u00E1A");
  339. // Text "ABCDEFG" ECI 9 Byte6 "αβγδεζ" ECI 3 "áA" ECI 7 "жзи"
  340. EXPECT_EQ(decode({ 24, 1, 63, 125, 209, 927, 9, 924, 378, 492, 165, 708, 390, 927, 3, 901, 225, 65, 927, 7, 901,
  341. 214, 215, 216 }),
  342. L"ABCDEFG\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u00E1A\u0436\u0437\u0438");
  343. // "AB" ShiftByte ECI 9 "β" ShiftByte ECI 7 "ж"
  344. EXPECT_EQ(decode({ 10, 1, 913, 927, 9, 226, 913, 927, 7, 214 }), L"AB\u03B2\u0436");
  345. }
  346. TEST(PDF417DecoderTest, ECIMultipleByte)
  347. {
  348. // Byte "AB" ECI 9 Byte "αβ" ECI 3 "á"
  349. EXPECT_EQ(decode({ 13, 901, 65, 66, 927, 9, 901, 225, 226, 927, 3, 901, 225 }), L"AB\u03B1\u03B2\u00E1");
  350. // Byte "AB" ECI 9 "αβ" ECI 3 "á"
  351. EXPECT_EQ(decode({ 11, 901, 65, 66, 927, 9, 225, 226, 927, 3, 225 }), L"AB\u03B1\u03B2\u00E1");
  352. // Byte ECI 20 "点茗" ECI 9 "α"
  353. EXPECT_EQ(decode({ 11, 901, 927, 20, 147, 95, 228, 170, 927, 9, 225 }), L"\u70B9\u8317\u03B1");
  354. // Byte ECI 20 "点茗" ECI 810899 ECI 9 ECI 811799 "α"
  355. EXPECT_EQ(decode({ 16, 901, 927, 20, 147, 95, 228, 170, 926, 899, 899, 927, 9, 925, 0, 225 }),
  356. L"\u70B9\u8317\u03B1");
  357. // Byte6 ECI 20 "点茗テ" ECI 22 Byte "ђ"
  358. EXPECT_EQ(decode({ 13, 924, 927, 20, 246, 877, 166, 106, 797, 927, 22, 901, 0x90 }), L"\u70B9\u8317\u30C6\u0452");
  359. // Byte ECI 20 "点茗テ" ECI 9 "α" ECI 22 "ђ"
  360. EXPECT_EQ(decode({ 15, 901, 927, 20, 246, 877, 166, 106, 797, 927, 9, 225, 927, 22, 0x90 }),
  361. L"\u70B9\u8317\u30C6\u03B1\u0452");
  362. // ECI 10 Byte ECI 20 "点茗テ" ECI 30 ECI 29 "齄膀赧" ECI 8 ECI 9 "α" ECI 810898 ECI 22 "ђ" ECI 4 Text ShiftByte
  363. // "Ź" ECI 811800
  364. EXPECT_EQ(decode({ 37, 927, 10, 901, 927, 20, 246, 877, 166, 106, 797, 927, 30, 927, 29, 415, 537, 357, 329, 194,
  365. 927, 8, 927, 9, 225, 926, 899, 898, 927, 22, 0x90, 927, 4, 900, 913, 0xAC, 925, 1 }),
  366. L"\u70B9\u8317\u30C6\u9F44\u8180\u8D67\u03B1\u0452\u0179");
  367. }
  368. TEST(PDF417DecoderTest, ECIMultipleNumeric)
  369. {
  370. // Numeric(5) ECI 16 ECI 20 Numeric(10) Text(ShiftJIS) "AB点"
  371. EXPECT_EQ(decode({ 25, 902, 171, 209, 269, 12, 434, 927, 20, 404, 629, 775, 441, 213, 222, 288, 513, 400, 123,
  372. 900, 1, 913, 147, 913, 95 }),
  373. L"1234567890123456789012345678901234567890123AB\u70B9");
  374. // Numeric(6) ECI 16 Numeric(4) ECI 20 Numeric(5) Byte(ShiftJIS) "AB点" ECI 26 "Θ"
  375. EXPECT_EQ(decode({ 31, 902, 190, 232, 498, 813, 782, 767, 927, 16, 259, 248, 517, 378, 927, 20, 289, 700, 317, 21,
  376. 112, 901, 'A', 'B', 147, 95, 927, 26, 0xCE, 901, 0x98 }),
  377. L"123456789012345678901234567890123456789012AB\u70B9\u0398");
  378. // Numeric(10) ECI 16 ECI 25 Numeric(5) Byte6(UnicodeBig) "AĀŁ" ECI 26 Byte "Θ"
  379. EXPECT_EQ(decode({ 32, 902, 289, 885, 405, 732, 212, 109, 679, 286, 885, 289, 927, 16, 927, 25, 289, 700, 317, 21,
  380. 112, 924, 0, 382, 878, 524, 177, 927, 26, 901, 0xCE, 0x98 }),
  381. L"12345678901234567890123456789\u3930\u3132\u3334\u3536\u3738\u3930\u3132A\u0100\u0141\u0398");
  382. }
  383. TEST(PDF417DecoderTest, ECIInvalid)
  384. {
  385. EXPECT_EQ(decode({ 4, 927, 901, 0 }), L""); // non-charset ECI > 899 -> empty text result
  386. EXPECT_EQ(Decode({4, 927, 901, 0}).content().bytes, ByteArray("AA")); // non-charset ECI > 899 -> ignored in binary result
  387. EXPECT_EQ(decode({ 3, 0, 927 }), L"AA"); // Malformed ECI at end silently ignored
  388. }
  389. TEST(PDF417DecoderTest, ECIMacroOptionalNumeric)
  390. {
  391. // Check that ECI 25 (UnicodeBig) in numeric field (resulting in "\u3x3x" codepoints) still parses
  392. // File Size is "1234567890" ECI 25 "12345" ("\u3132\u3334\x35", the final odd byte gets dropped on UTF-16
  393. // conversion)
  394. std::vector<int> sampleCodes = { 19, 477, 928, 111, 100, 0, 252, 21, 86, 923, 5, 15, 369, 753, 190, 927, 25, 124,
  395. 745 };
  396. DecoderResultExtra resultMetadata;
  397. DecodeMacroBlock(sampleCodes, 3, resultMetadata);
  398. EXPECT_EQ(0, resultMetadata.segmentIndex());
  399. EXPECT_EQ("000252021086", resultMetadata.fileId());
  400. EXPECT_EQ(false, resultMetadata.isLastSegment());
  401. EXPECT_EQ(1234567890, resultMetadata.fileSize());
  402. EXPECT_EQ(-1, resultMetadata.segmentCount());
  403. }
  404. TEST(PDF417DecoderTest, ECIGeneralPurpose)
  405. {
  406. // 2-byte
  407. EXPECT_EQ(decode({ 5, 926, 10, 10, 0 }), L"AA"); // All General Purpose ECIs silently ignored
  408. EXPECT_TRUE(valid({ 4, 0, 926, 10 })); // Malformed ECI at end silently ignored
  409. EXPECT_TRUE(valid({ 3, 0, 926 })); // Malformed ECI at end silently ignored
  410. }
  411. TEST(PDF417DecoderTest, ECIUserDefined)
  412. {
  413. // 1-byte
  414. EXPECT_EQ(decode({ 4, 925, 10, 0 }), L"AA"); // All User Defined ECIs silently ignored
  415. EXPECT_TRUE(valid({ 3, 0, 925 })); // Malformed ECI at end silently ignored
  416. }
  417. TEST(PDF417DecoderTest, ReaderInit)
  418. {
  419. // Null
  420. EXPECT_FALSE(Decode({2, 0}).readerInit());
  421. EXPECT_EQ(decode({ 2, 0 }), L"AA");
  422. // Set
  423. EXPECT_TRUE(Decode({3, 921, 0}).readerInit());
  424. EXPECT_EQ(decode({ 3, 921, 0 }), L"AA");
  425. // Must be first
  426. EXPECT_FALSE(Decode({3, 0, 921}).readerInit());
  427. EXPECT_FALSE(valid({ 3, 0, 921 }));
  428. EXPECT_FALSE(Decode({4, 901, 65, 921}).readerInit());
  429. EXPECT_FALSE(valid({ 4, 901, 65, 921 }));
  430. EXPECT_FALSE(Decode({4, 901, 921, 65}).readerInit());
  431. EXPECT_FALSE(valid({ 4, 901, 921, 65 }));
  432. }
  433. TEST(PDF417DecoderTest, LinkageOther)
  434. {
  435. EXPECT_FALSE(valid({ 3, 918, 0 })); // Not supported
  436. EXPECT_FALSE(valid({ 3, 0, 918 }));
  437. }
  438. TEST(PDF417DecoderTest, LinkageEANUCC)
  439. {
  440. EXPECT_TRUE(valid({ 3, 920, 0 })); // Ignored if first codeword after length
  441. EXPECT_FALSE(valid({ 3, 0, 920 })); // But not elsewhere
  442. }
  443. TEST(PDF417DecoderTest, Reserved)
  444. {
  445. EXPECT_FALSE(valid({ 3, 903, 0 })); // Not supported
  446. EXPECT_FALSE(valid({ 3, 0, 903 }));
  447. }