QRDataMaskTest.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * Copyright 2017 Huy Cuong Nguyen
  3. * Copyright 2007 ZXing authors
  4. */
  5. // SPDX-License-Identifier: Apache-2.0
  6. #include "qrcode/QRDataMask.h"
  7. #include "BitMatrix.h"
  8. #include "gtest/gtest.h"
  9. #include <functional>
  10. using namespace ZXing;
  11. using namespace ZXing::QRCode;
  12. namespace {
  13. void TestMaskAcrossDimensionsImpl(int maskIndex, bool isMicro, const int versionMax, const int dimensionStart, const int dimensionStep, std::function<bool(int, int)> condition)
  14. {
  15. for (int version = 1; version <= versionMax; version++) {
  16. int dimension = dimensionStart + dimensionStep * version;
  17. BitMatrix bits(dimension);
  18. for (int i = 0; i < dimension; i++)
  19. for (int j = 0; j < dimension; j++)
  20. EXPECT_EQ(GetMaskedBit(bits, j, i, maskIndex, isMicro), condition(i, j)) << "(" << i << ',' << j << ')';
  21. }
  22. }
  23. void TestMaskAcrossDimensions(int maskIndex, std::function<bool(int, int)> condition)
  24. {
  25. TestMaskAcrossDimensionsImpl(maskIndex, false, 40, 17, 4, condition);
  26. }
  27. void TestMicroMaskAcrossDimensions(int maskIndex, std::function<bool(int, int)> condition)
  28. {
  29. TestMaskAcrossDimensionsImpl(maskIndex, true, 4, 9, 2, condition);
  30. }
  31. }
  32. TEST(QRDataMaskTest, Mask0)
  33. {
  34. TestMaskAcrossDimensions(0, [](int i, int j) { return (i + j) % 2 == 0; });
  35. }
  36. TEST(QRDataMaskTest, Mask1)
  37. {
  38. TestMaskAcrossDimensions(1, [](int i, int) { return i % 2 == 0; });
  39. }
  40. TEST(QRDataMaskTest, Mask2)
  41. {
  42. TestMaskAcrossDimensions(2, [](int, int j) { return j % 3 == 0; });
  43. }
  44. TEST(QRDataMaskTest, Mask3)
  45. {
  46. TestMaskAcrossDimensions(3, [](int i, int j) { return (i + j) % 3 == 0; });
  47. }
  48. TEST(QRDataMaskTest, Mask4)
  49. {
  50. TestMaskAcrossDimensions(4, [](int i, int j) { return (i / 2 + j / 3) % 2 == 0; });
  51. }
  52. TEST(QRDataMaskTest, Mask5)
  53. {
  54. TestMaskAcrossDimensions(5, [](int i, int j) { return (i * j) % 2 + (i * j) % 3 == 0; });
  55. }
  56. TEST(QRDataMaskTest, Mask6)
  57. {
  58. TestMaskAcrossDimensions(6, [](int i, int j) { return ((i * j) % 2 + (i * j) % 3) % 2 == 0; });
  59. }
  60. TEST(QRDataMaskTest, Mask7)
  61. {
  62. TestMaskAcrossDimensions(7, [](int i, int j) { return ((i + j) % 2 + (i * j) % 3) % 2 == 0; });
  63. }
  64. TEST(QRDataMaskTest, MicroMask0)
  65. {
  66. TestMicroMaskAcrossDimensions(0, [](int i, int) { return i % 2 == 0; });
  67. }
  68. TEST(QRDataMaskTest, MicroMask1)
  69. {
  70. TestMicroMaskAcrossDimensions(1, [](int i, int j) { return (i / 2 + j / 3) % 2 == 0; });
  71. }
  72. TEST(QRDataMaskTest, MicroMask2)
  73. {
  74. TestMicroMaskAcrossDimensions(2, [](int i, int j) { return ((i * j) % 2 + (i * j) % 3) % 2 == 0; });
  75. }
  76. TEST(QRDataMaskTest, MicroMask3)
  77. {
  78. TestMicroMaskAcrossDimensions(3, [](int i, int j) { return ((i + j) % 2 + (i * j) % 3) % 2 == 0; });
  79. }