QRVersionTest.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. /*
  2. * Copyright 2017 Huy Cuong Nguyen
  3. * Copyright 2008 ZXing authors
  4. */
  5. // SPDX-License-Identifier: Apache-2.0
  6. #include "qrcode/QRVersion.h"
  7. #include "BitMatrix.h"
  8. #include "BitMatrixIO.h"
  9. #include "gtest/gtest.h"
  10. using namespace ZXing;
  11. using namespace ZXing::QRCode;
  12. namespace {
  13. void CheckVersion(const Version* version, int number, int dimension) {
  14. ASSERT_NE(version, nullptr);
  15. EXPECT_EQ(number, version->versionNumber());
  16. if (number > 1 && version->isModel2()) {
  17. EXPECT_FALSE(version->alignmentPatternCenters().empty());
  18. }
  19. EXPECT_EQ(dimension, version->dimension());
  20. }
  21. void DoTestVersion(int expectedVersion, int mask) {
  22. auto version = Version::DecodeVersionInformation(mask);
  23. ASSERT_NE(version, nullptr);
  24. EXPECT_EQ(expectedVersion, version->versionNumber());
  25. }
  26. }
  27. TEST(QRVersionTest, VersionForNumber)
  28. {
  29. auto version = Version::Model2(0);
  30. EXPECT_EQ(version, nullptr) << "There is version with number 0";
  31. for (int i = 1; i <= 40; i++) {
  32. CheckVersion(Version::Model2(i), i, 4*i + 17);
  33. }
  34. }
  35. TEST(QRVersionTest, GetProvisionalVersionForDimension)
  36. {
  37. for (int i = 1; i <= 40; i++) {
  38. EXPECT_EQ(i, Version::Number(BitMatrix(4 * i + 17)));
  39. }
  40. }
  41. TEST(QRVersionTest, DecodeVersionInformation)
  42. {
  43. // Spot check
  44. DoTestVersion(7, 0x07C94);
  45. DoTestVersion(12, 0x0C762);
  46. DoTestVersion(17, 0x1145D);
  47. DoTestVersion(22, 0x168C9);
  48. DoTestVersion(27, 0x1B08E);
  49. DoTestVersion(32, 0x209D5);
  50. }
  51. TEST(QRVersionTest, MicroVersionForNumber)
  52. {
  53. auto version = Version::Micro(0);
  54. EXPECT_EQ(version, nullptr) << "There is version with number 0";
  55. for (int i = 1; i <= 4; i++) {
  56. CheckVersion(Version::Micro(i), i, 2 * i + 9);
  57. }
  58. }
  59. TEST(QRVersionTest, GetProvisionalMicroVersionForDimension)
  60. {
  61. for (int i = 1; i <= 4; i++) {
  62. EXPECT_EQ(i, Version::Number(BitMatrix(2 * i + 9)));
  63. }
  64. }
  65. TEST(QRVersionTest, FunctionPattern)
  66. {
  67. auto testFinderPatternRegion = [](const BitMatrix& bitMatrix) {
  68. for (int row = 0; row < 9; row++)
  69. for (int col = 0; col < 9; col++)
  70. EXPECT_TRUE(bitMatrix.get(col, row));
  71. };
  72. for (int i = 1; i <= 4; i++) {
  73. const auto version = Version::Micro(i);
  74. const auto functionPattern = version->buildFunctionPattern();
  75. testFinderPatternRegion(functionPattern);
  76. // Check timing pattern areas.
  77. const auto dimension = version->dimension();
  78. for (int row = dimension; row < functionPattern.height(); row++)
  79. EXPECT_TRUE(functionPattern.get(0, row));
  80. for (int col = dimension; col < functionPattern.width(); col++)
  81. EXPECT_TRUE(functionPattern.get(col, 0));
  82. }
  83. }
  84. namespace {
  85. void CheckRMQRVersion(const Version* version, int number) {
  86. ASSERT_NE(version, nullptr);
  87. EXPECT_EQ(number, version->versionNumber());
  88. EXPECT_EQ(Version::SymbolSize(number, Type::rMQR).x == 27, version->alignmentPatternCenters().empty());
  89. }
  90. }
  91. TEST(QRVersionTest, RMQRVersionForNumber)
  92. {
  93. auto version = Version::rMQR(0);
  94. EXPECT_EQ(version, nullptr) << "There is version with number 0";
  95. for (int i = 1; i <= 32; i++) {
  96. CheckRMQRVersion(Version::rMQR(i), i);
  97. }
  98. }
  99. TEST(QRVersionTest, RMQRFunctionPattern)
  100. {
  101. {
  102. const auto expected = ParseBitMatrix(
  103. "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"
  104. "XXXXXXXXXXXX XXX XXXXXXXX\n"
  105. "XXXXXXXXXXXX XXX XXXXXXXX\n"
  106. "XXXXXXXXXXXX X XXXXXXXX\n"
  107. "XXXXXXXXXXX XXX XXXXXXXX\n"
  108. "XXXXXXXXXXX XXX XXXXXXXX\n"
  109. "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n",
  110. 'X', false);
  111. const auto version = Version::rMQR(1); // R7x43
  112. const auto functionPattern = version->buildFunctionPattern();
  113. EXPECT_EQ(expected, functionPattern);
  114. }
  115. {
  116. const auto expected = ParseBitMatrix(
  117. "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"
  118. "XXXXXXXXXXXX XXX XX\n"
  119. "XXXXXXXXXXXX XXX X\n"
  120. "XXXXXXXXXXXX X XXXXXX X\n"
  121. "XXXXXXXXXXX X XXXXXXXX\n"
  122. "XXXXXXXXXXX X XXXXXXXX\n"
  123. "XXXXXXXX XXX XXXXXXXX\n"
  124. "XXXXXXXX XXX XXXXXXXX\n"
  125. "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n",
  126. 'X', false);
  127. const auto version = Version::rMQR(6); // R9x43
  128. const auto functionPattern = version->buildFunctionPattern();
  129. EXPECT_EQ(expected, functionPattern);
  130. }
  131. {
  132. const auto expected = ParseBitMatrix(
  133. "XXXXXXXXXXXXXXXXXXXXXXXXXXX\n"
  134. "XXXXXXXXXXXX XX\n"
  135. "XXXXXXXXXXXX X\n"
  136. "XXXXXXXXXXXX X\n"
  137. "XXXXXXXXXXX X\n"
  138. "XXXXXXXXXXX XXXXXX X\n"
  139. "XXXXXXXX XXXXXXXX\n"
  140. "XXXXXXXX XXXXXXXX\n"
  141. "X XXXXXXXX\n"
  142. "XX XXXXXXXX\n"
  143. "XXXXXXXXXXXXXXXXXXXXXXXXXXX\n",
  144. 'X', false);
  145. const auto version = Version::rMQR(11); // R11x27
  146. const auto functionPattern = version->buildFunctionPattern();
  147. EXPECT_EQ(expected, functionPattern);
  148. }
  149. {
  150. const auto expected = ParseBitMatrix(
  151. "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"
  152. "XXXXXXXXXXXX XXX XX\n"
  153. "XXXXXXXXXXXX XXX X\n"
  154. "XXXXXXXXXXXX X X\n"
  155. "XXXXXXXXXXX X X\n"
  156. "XXXXXXXXXXX X XXXXXX X\n"
  157. "XXXXXXXX X XXXXXXXX\n"
  158. "XXXXXXXX X XXXXXXXX\n"
  159. "X XXX XXXXXXXX\n"
  160. "XX XXX XXXXXXXX\n"
  161. "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n",
  162. 'X', false);
  163. const auto version = Version::rMQR(12); // R11x43
  164. const auto functionPattern = version->buildFunctionPattern();
  165. EXPECT_EQ(expected, functionPattern);
  166. }
  167. {
  168. const auto expected = ParseBitMatrix(
  169. "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"
  170. "XXXXXXXXXXXX XXX XXX XX\n"
  171. "XXXXXXXXXXXX XXX XXX X\n"
  172. "XXXXXXXXXXXX X X X\n"
  173. "XXXXXXXXXXX X X X\n"
  174. "XXXXXXXXXXX X X XXXXXX X\n"
  175. "XXXXXXXX X X XXXXXXXX\n"
  176. "XXXXXXXX X X XXXXXXXX\n"
  177. "X XXX XXX XXXXXXXX\n"
  178. "XX XXX XXX XXXXXXXX\n"
  179. "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n",
  180. 'X', false);
  181. const auto version = Version::rMQR(13); // R11x59
  182. const auto functionPattern = version->buildFunctionPattern();
  183. EXPECT_EQ(expected, functionPattern);
  184. }
  185. }