AZDetectorTest.cpp 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. /*
  2. * Copyright 2017 Huy Cuong Nguyen
  3. * Copyright 2013 ZXing authors
  4. */
  5. // SPDX-License-Identifier: Apache-2.0
  6. #include "aztec/AZDetector.h"
  7. #include "BitMatrixIO.h"
  8. #include "DecoderResult.h"
  9. #include "PseudoRandom.h"
  10. #include "Utf.h"
  11. #include "aztec/AZDecoder.h"
  12. #include "aztec/AZDetectorResult.h"
  13. #include "gtest/gtest.h"
  14. #include <string_view>
  15. #include <vector>
  16. using namespace ZXing;
  17. namespace {
  18. struct Point {
  19. int x;
  20. int y;
  21. };
  22. std::vector<Point> GetOrientationPoints(const BitMatrix& matrix, bool isCompact) {
  23. int center = matrix.width() / 2;
  24. int offset = isCompact ? 5 : 7;
  25. std::vector<Point> result;
  26. result.reserve(12);
  27. for (int xSign : { -1, 1}) {
  28. for (int ySign : { -1, 1}) {
  29. result.push_back({ center + xSign * offset, center + ySign * offset });
  30. result.push_back({ center + xSign * (offset - 1), center + ySign * offset });
  31. result.push_back({ center + xSign * offset, center + ySign * (offset - 1) });
  32. }
  33. }
  34. return result;
  35. }
  36. // Test that we can tolerate errors in the parameter locator bits
  37. void TestErrorInOrientationBits(std::string_view data, int nbLayers, bool isCompact, const BitMatrix &matrix_)
  38. {
  39. PseudoRandom random(std::hash<std::string_view>()(data));
  40. auto orientationPoints = GetOrientationPoints(matrix_, isCompact);
  41. for (bool mirror : { false, true }) {
  42. BitMatrix matrix = matrix_.copy();
  43. if (mirror)
  44. matrix.mirror();
  45. for (int i = 0; i < 4; ++i) {
  46. Aztec::DetectorResult r = Aztec::Detect(matrix, true, false);
  47. EXPECT_EQ(r.isValid(), true);
  48. EXPECT_EQ(r.nbLayers(), nbLayers);
  49. EXPECT_EQ(r.isCompact(), isCompact);
  50. EXPECT_EQ(r.isMirrored(), mirror);
  51. EXPECT_EQ(data, ToUtf8(Aztec::Decode(r).text()));
  52. // Systematically try every possible 1- and 2-bit error.
  53. for (int error1 = 0; error1 < Size(orientationPoints); error1++) {
  54. for (int error2 = error1; error2 < Size(orientationPoints); error2++) {
  55. BitMatrix copy = matrix.copy();
  56. copy.flip(orientationPoints[error1].x, orientationPoints[error1].y);
  57. if (error2 > error1 && (nbLayers > 1 || !mirror)) { // in ErrorInModeMessageZero and mirror==true test only 1-bit errors
  58. // if error2 == error1, we only test a single error
  59. copy.flip(orientationPoints[error2].x, orientationPoints[error2].y);
  60. }
  61. Aztec::DetectorResult r = Aztec::Detect(copy, true, false);
  62. EXPECT_EQ(r.isValid(), true);
  63. EXPECT_EQ(r.nbLayers(), nbLayers);
  64. EXPECT_EQ(r.isCompact(), isCompact);
  65. EXPECT_EQ(r.isMirrored(), mirror);
  66. EXPECT_EQ(data, ToUtf8(Aztec::Decode(r).text()));
  67. }
  68. }
  69. // here used to be a test for 3-bit errors but since we determine both the rotation and the mirrored info
  70. // from the orentation bits (as suggested in the specification) this does not work anymore.
  71. matrix.rotate90();
  72. }
  73. }
  74. }
  75. } // anonymous
  76. TEST(AZDetectorTest, ErrorInModeMessageZero)
  77. {
  78. // Layers=1, CodeWords=1. So the ModeMessage and its Reed-Solomon bits will be completely zero!
  79. TestErrorInOrientationBits("X", 1, true, ParseBitMatrix(
  80. " X X X X X X X X X X X X \n"
  81. "X X X X X X X X \n"
  82. " X X X X \n"
  83. "X X X X X X X X X X X X X X \n"
  84. "X X X X X \n"
  85. "X X X X X X X X X X \n"
  86. "X X X X X X X X \n"
  87. " X X X X X X \n"
  88. "X X X X X X X X \n"
  89. " X X X X X X X X \n"
  90. "X X X X \n"
  91. " X X X X X X X X X X X X \n"
  92. " X X \n"
  93. "X X X X X X X \n"
  94. "X X X X X X X \n"
  95. , 'X', true)
  96. );
  97. }
  98. TEST(AZDetectorTest, ErrorInOrientationBitsCompact)
  99. {
  100. TestErrorInOrientationBits("This is an example Aztec symbol for Wikipedia.", 3, true, ParseBitMatrix(
  101. "X X X X X X X X \n"
  102. "X X X X X X X X X X \n"
  103. "X X X X X X X X X X X \n"
  104. "X X X X X X X X X X X \n"
  105. " X X X X X X X X X X X \n"
  106. " X X X X X X X X X X X X X \n"
  107. " X X X X X X X X X X X X \n"
  108. "X X X X X X X X X X X X X X X X \n"
  109. "X X X X X X X X X X X \n"
  110. "X X X X X X X X X X X X X X X X \n"
  111. "X X X X X X X X X X \n"
  112. "X X X X X X X X X X \n"
  113. " X X X X X X X X X X \n"
  114. " X X X X X X X X X X X X X X X X X X \n"
  115. " X X X X X X X X X X X X \n"
  116. " X X X X X X X X X X X X X X X X \n"
  117. " X X X X X X X X X X X \n"
  118. " X X X X X X X X \n"
  119. " X X X X X X X X X X X X X X X X \n"
  120. " X X X X X X X X X X X X \n"
  121. " X X X \n"
  122. " X X X X X X X X X X \n"
  123. " X X X X X X X X X X \n"
  124. , 'X', true)
  125. );
  126. }
  127. TEST(AZDetectorTest, ErrorInOrientationBitsNotCompact)
  128. {
  129. std::string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz";
  130. TestErrorInOrientationBits(alphabet + alphabet + alphabet, 6, false, ParseBitMatrix(
  131. " X X X X X X X X X X X X X X X X X X X X \n"
  132. " X X X X X X X X X X X X X X X X X X X X X X \n"
  133. " X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  134. " X X X X X X X X X X X X X X X X X \n"
  135. "X X X X X X X X X X X X X X X X X X X X X \n"
  136. "X X X X X X X X X X X X X X X X X X \n"
  137. " X X X X X X X X X X X X X X X X X X X X X X \n"
  138. "X X X X X X X X X X X X X X X X X X X X X X X \n"
  139. " X X X X X X X X X X X X X X X X X X \n"
  140. " X X X X X X X X X X X X X X X X \n"
  141. " X X X X X X X X X X X X X X X X X X X X X X X X \n"
  142. " X X X X X X X X X X X X X X X X X X X X X X \n"
  143. "X X X X X X X X X X X X X X X X X X X X X X \n"
  144. " X X X X X X X X X X X X X X X \n"
  145. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  146. "X X X X X X X X X X X X X X X X X X \n"
  147. " X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  148. " X X X X X X X X X X X X X X X \n"
  149. " X X X X X X X X X X X X X X X X X X X X \n"
  150. "X X X X X X X X X X X X X X X X X X X X X X X X \n"
  151. "X X X X X X X X X X X X X X X X X X X X X \n"
  152. " X X X X X X X X X X X X X X X X X X X X \n"
  153. " X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  154. " X X X X X X X X X X X X X X X X X \n"
  155. " X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  156. "X X X X X X X X X X X X X X X \n"
  157. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  158. " X X X X X X X X X X X X X X \n"
  159. "X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  160. " X X X X X X X X X X X X \n"
  161. "X X X X X X X X X X X X X X X X X \n"
  162. " X X X X X X X X X X X X X X X X X X X X \n"
  163. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  164. "X X X X X X X X X X X X X X X X X \n"
  165. " X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  166. "X X X X X X X X X X X X X X X X X X X \n"
  167. "X X X X X X X X X X X X X X X X X X X X X \n"
  168. "X X X X X X X X X X X X X X X \n"
  169. "X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  170. " X X X X X X X X X X X X X X X X X X X X X X \n"
  171. " X X X X X X X X X X X X X X X X \n"
  172. , 'X', true)
  173. );
  174. }
  175. TEST(AZDetectorTest, ReaderInitFull2Layers)
  176. {
  177. {
  178. // Null (not set)
  179. auto r = Aztec::Detect(ParseBitMatrix(
  180. " X X X X X X X X X X X X X X X \n"
  181. " X X X X X X X X X X X X \n"
  182. " X X X X X X X X X X X X X X X \n"
  183. " X X X X X X X X X X X X X X X \n"
  184. " X X X X X X X X X \n"
  185. "X X X X X X X X X X X X X X X X X X \n"
  186. "X X X X X X X \n"
  187. "X X X X X X X X X X X X X X X \n"
  188. "X X X X X X X X X X \n"
  189. "X X X X X X X X X X X X X X X \n"
  190. "X X X X X X X X X X X X \n"
  191. " X X X X X X X X X X X \n"
  192. " X X X X X X X X X X X \n"
  193. "X X X X X X X X X X X X X X \n"
  194. "X X X X X X X X X X \n"
  195. " X X X X X X X X X X X X X X X X \n"
  196. "X X X X X X \n"
  197. "X X X X X X X X X X X X X X X X X X X X \n"
  198. "X X X X X X X X X \n"
  199. " X X X X X X X X X X X \n"
  200. " X X X X X X X X X \n"
  201. " X X X X X X X X X X \n"
  202. " X X X X X X X X \n"
  203. ), false /*isPure*/, false /*tryHarder*/);
  204. EXPECT_TRUE(r.isValid());
  205. EXPECT_FALSE(r.readerInit());
  206. EXPECT_FALSE(r.isCompact());
  207. EXPECT_EQ(r.nbLayers(), 2);
  208. }
  209. {
  210. // Set
  211. auto r = Aztec::Detect(ParseBitMatrix(
  212. " X X X X X X X X X X X X X X X \n"
  213. " X X X X X X X X X X X X \n"
  214. " X X X X X X X X X X X X X X X \n"
  215. " X X X X X X X X X X X X X X X \n"
  216. " X X X X X X X X X X \n"
  217. "X X X X X X X X X X X X X X X X X X \n"
  218. "X X X X X X X \n"
  219. "X X X X X X X X X X X X X X \n"
  220. "X X X X X X X X X \n"
  221. "X X X X X X X X X X X X X X X \n"
  222. "X X X X X X X X X X X X X \n"
  223. " X X X X X X X X X X X \n"
  224. " X X X X X X X X X X X \n"
  225. "X X X X X X X X X X X X \n"
  226. "X X X X X X X X X \n"
  227. " X X X X X X X X X X X X X X X X X \n"
  228. "X X X X X \n"
  229. "X X X X X X X X X X X X X X X X X X X X \n"
  230. "X X X X X X X X X X \n"
  231. " X X X X X X X X X X X \n"
  232. " X X X X X X X X X \n"
  233. " X X X X X X X X X X \n"
  234. " X X X X X X X X \n"
  235. ), true /*isPure*/, false /*tryHarder*/);
  236. EXPECT_TRUE(r.isValid());
  237. EXPECT_TRUE(r.readerInit());
  238. EXPECT_FALSE(r.isCompact());
  239. EXPECT_EQ(r.nbLayers(), 2);
  240. }
  241. }
  242. TEST(AZDetectorTest, ReaderInitFull22Layers)
  243. {
  244. // Set
  245. auto r = Aztec::Detect(ParseBitMatrix(
  246. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  247. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  248. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  249. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  250. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  251. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  252. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  253. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  254. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  255. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  256. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  257. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  258. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  259. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  260. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  261. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  262. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  263. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  264. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  265. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  266. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  267. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  268. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  269. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  270. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  271. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  272. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  273. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  274. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  275. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  276. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  277. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  278. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  279. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  280. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  281. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  282. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  283. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  284. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  285. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  286. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  287. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  288. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  289. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  290. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  291. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  292. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  293. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  294. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  295. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  296. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  297. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  298. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  299. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  300. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  301. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  302. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  303. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  304. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  305. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  306. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  307. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  308. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  309. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  310. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  311. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  312. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  313. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  314. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  315. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  316. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  317. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  318. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  319. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  320. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  321. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  322. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  323. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  324. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  325. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  326. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  327. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  328. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  329. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  330. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  331. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  332. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  333. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  334. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  335. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  336. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  337. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  338. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  339. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  340. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  341. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  342. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  343. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  344. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  345. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  346. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  347. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  348. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  349. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  350. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  351. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  352. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  353. " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  354. "X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"
  355. ), true /*isPure*/, false /*tryHarder*/);
  356. EXPECT_TRUE(r.isValid());
  357. EXPECT_TRUE(r.readerInit());
  358. EXPECT_FALSE(r.isCompact());
  359. EXPECT_EQ(r.nbLayers(), 22);
  360. }
  361. TEST(AZDetectorTest, ReaderInitCompact)
  362. {
  363. {
  364. // Null (not set)
  365. auto r = Aztec::Detect(ParseBitMatrix(
  366. " X X X X \n"
  367. " X X X X X X X X X \n"
  368. " X X X X \n"
  369. " X X X X X X X X X X X X \n"
  370. " X X X \n"
  371. " X X X X X X X X X \n"
  372. "X X X X X X \n"
  373. "X X X X X X X \n"
  374. "X X X X X X X \n"
  375. "X X X X X X X X X X X X \n"
  376. " X X X X \n"
  377. " X X X X X X X X X X X \n"
  378. "X X X X X \n"
  379. "X X X X X \n"
  380. "X X X X X X X X X \n"
  381. ), true /*isPure*/, false /*tryHarder*/);
  382. EXPECT_TRUE(r.isValid());
  383. EXPECT_FALSE(r.readerInit());
  384. EXPECT_TRUE(r.isCompact());
  385. EXPECT_EQ(r.nbLayers(), 1);
  386. }
  387. {
  388. // Set
  389. auto r = Aztec::Detect(ParseBitMatrix(
  390. " X X X X \n"
  391. " X X X X X X X X X \n"
  392. " X X X X X \n"
  393. " X X X X X X X X X X X X \n"
  394. " X X X X \n"
  395. " X X X X X X X X X X \n"
  396. "X X X X X X X \n"
  397. "X X X X X X X \n"
  398. "X X X X X X \n"
  399. "X X X X X X X X X X X \n"
  400. " X X X X \n"
  401. " X X X X X X X X X X X \n"
  402. "X X X X X X X X \n"
  403. "X X X X X \n"
  404. "X X X X X X X X X \n"
  405. ), true /*isPure*/, false /*tryHarder*/);
  406. EXPECT_TRUE(r.isValid());
  407. EXPECT_TRUE(r.readerInit());
  408. EXPECT_TRUE(r.isCompact());
  409. EXPECT_EQ(r.nbLayers(), 1);
  410. }
  411. }
  412. TEST(AZDetectorTest, Rune)
  413. {
  414. {
  415. auto r = Aztec::Detect(ParseBitMatrix(
  416. "X X X X X X X \n"
  417. "X X X X X X X X X X X \n"
  418. " X X \n"
  419. "X X X X X X X X X \n"
  420. " X X X X \n"
  421. "X X X X X X X \n"
  422. " X X X X \n"
  423. "X X X X X X X X X \n"
  424. " X X \n"
  425. " X X X X X X X X X X \n"
  426. " X X X X \n"
  427. ), false /*isPure*/, false /*tryHarder*/);
  428. EXPECT_TRUE(r.isValid());
  429. EXPECT_EQ(r.nbDatablocks(), 0);
  430. EXPECT_EQ(r.runeValue(), 0);
  431. }
  432. {
  433. auto r = Aztec::Detect(ParseBitMatrix(
  434. "X X X X X X X \n"
  435. "X X X X X X X X X X X \n"
  436. " X X X \n"
  437. " X X X X X X X X \n"
  438. " X X X X \n"
  439. "X X X X X X X \n"
  440. "X X X X X X \n"
  441. "X X X X X X X X \n"
  442. "X X X X \n"
  443. " X X X X X X X X X X \n"
  444. " X X \n"
  445. ), true /*isPure*/, false /*tryHarder*/);
  446. EXPECT_TRUE(r.isValid());
  447. EXPECT_EQ(r.nbDatablocks(), 0);
  448. EXPECT_EQ(r.runeValue(), 25);
  449. }
  450. {
  451. auto r = Aztec::Detect(ParseBitMatrix(
  452. "X X X X \n"
  453. "X X X X X X X X X X X \n"
  454. " X X \n"
  455. "X X X X X X X X \n"
  456. " X X X X X \n"
  457. " X X X X X \n"
  458. " X X X X X \n"
  459. " X X X X X X X X \n"
  460. "X X X \n"
  461. " X X X X X X X X X X \n"
  462. " X X \n"
  463. ), true /*isPure*/, false /*tryHarder*/);
  464. // This is just the core of a regular compact code, and not a valid rune
  465. EXPECT_FALSE(r.isValid());
  466. }
  467. }