MaskUtilTest.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. <?php
  2. /**
  3. * BaconQrCode
  4. *
  5. * @link http://github.com/Bacon/BaconQrCode For the canonical source repository
  6. * @copyright 2013 Ben 'DASPRiD' Scholzen
  7. * @license http://opensource.org/licenses/BSD-2-Clause Simplified BSD License
  8. */
  9. namespace BaconQrCode\Encoder;
  10. use PHPUnit_Framework_TestCase as TestCase;
  11. class MaskUtilTest extends TestCase
  12. {
  13. public static function dataMaskBitProvider()
  14. {
  15. return array(
  16. array(
  17. 0,
  18. array(
  19. array(1, 0, 1, 0, 1, 0),
  20. array(0, 1, 0, 1, 0, 1),
  21. array(1, 0, 1, 0, 1, 0),
  22. array(0, 1, 0, 1, 0, 1),
  23. array(1, 0, 1, 0, 1, 0),
  24. array(0, 1, 0, 1, 0, 1),
  25. )
  26. ),
  27. array(
  28. 1,
  29. array(
  30. array(1, 1, 1, 1, 1, 1),
  31. array(0, 0, 0, 0, 0, 0),
  32. array(1, 1, 1, 1, 1, 1),
  33. array(0, 0, 0, 0, 0, 0),
  34. array(1, 1, 1, 1, 1, 1),
  35. array(0, 0, 0, 0, 0, 0),
  36. )
  37. ),
  38. array(
  39. 2,
  40. array(
  41. array(1, 0, 0, 1, 0, 0),
  42. array(1, 0, 0, 1, 0, 0),
  43. array(1, 0, 0, 1, 0, 0),
  44. array(1, 0, 0, 1, 0, 0),
  45. array(1, 0, 0, 1, 0, 0),
  46. array(1, 0, 0, 1, 0, 0),
  47. )
  48. ),
  49. array(
  50. 3,
  51. array(
  52. array(1, 0, 0, 1, 0, 0),
  53. array(0, 0, 1, 0, 0, 1),
  54. array(0, 1, 0, 0, 1, 0),
  55. array(1, 0, 0, 1, 0, 0),
  56. array(0, 0, 1, 0, 0, 1),
  57. array(0, 1, 0, 0, 1, 0),
  58. )
  59. ),
  60. array(
  61. 4,
  62. array(
  63. array(1, 1, 1, 0, 0, 0),
  64. array(1, 1, 1, 0, 0, 0),
  65. array(0, 0, 0, 1, 1, 1),
  66. array(0, 0, 0, 1, 1, 1),
  67. array(1, 1, 1, 0, 0, 0),
  68. array(1, 1, 1, 0, 0, 0),
  69. )
  70. ),
  71. array(
  72. 5,
  73. array(
  74. array(1, 1, 1, 1, 1, 1),
  75. array(1, 0, 0, 0, 0, 0),
  76. array(1, 0, 0, 1, 0, 0),
  77. array(1, 0, 1, 0, 1, 0),
  78. array(1, 0, 0, 1, 0, 0),
  79. array(1, 0, 0, 0, 0, 0),
  80. )
  81. ),
  82. array(
  83. 6,
  84. array(
  85. array(1, 1, 1, 1, 1, 1),
  86. array(1, 1, 1, 0, 0, 0),
  87. array(1, 1, 0, 1, 1, 0),
  88. array(1, 0, 1, 0, 1, 0),
  89. array(1, 0, 1, 1, 0, 1),
  90. array(1, 0, 0, 0, 1, 1),
  91. )
  92. ),
  93. array(
  94. 7,
  95. array(
  96. array(1, 0, 1, 0, 1, 0),
  97. array(0, 0, 0, 1, 1, 1),
  98. array(1, 0, 0, 0, 1, 1),
  99. array(0, 1, 0, 1, 0, 1),
  100. array(1, 1, 1, 0, 0, 0),
  101. array(0, 1, 1, 1, 0, 0),
  102. )
  103. ),
  104. );
  105. }
  106. /**
  107. * @dataProvider dataMaskBitProvider
  108. * @param integer $maskPattern
  109. * @param array $expected
  110. * @return void
  111. */
  112. public function testGetDatMaskBit($maskPattern, array $expected)
  113. {
  114. for ($x = 0; $x < 6; $x++) {
  115. for ($y = 0; $y < 6; $y++) {
  116. if (($expected[$y][$x] === 1) !== MaskUtil::getDataMaskBit($maskPattern, $x, $y)) {
  117. $this->fail('Data mask bit did not match');
  118. }
  119. }
  120. }
  121. }
  122. public function testApplyMaskPenaltyRule1()
  123. {
  124. $matrix = new ByteMatrix(4, 1);
  125. $matrix->set(0, 0, 0);
  126. $matrix->set(1, 0, 0);
  127. $matrix->set(2, 0, 0);
  128. $matrix->set(3, 0, 0);
  129. $this->assertEquals(0, MaskUtil::applyMaskPenaltyRule1($matrix));
  130. // Horizontal
  131. $matrix = new ByteMatrix(6, 1);
  132. $matrix->set(0, 0, 0);
  133. $matrix->set(1, 0, 0);
  134. $matrix->set(2, 0, 0);
  135. $matrix->set(3, 0, 0);
  136. $matrix->set(4, 0, 0);
  137. $matrix->set(5, 0, 1);
  138. $this->assertEquals(3, MaskUtil::applyMaskPenaltyRule1($matrix));
  139. $matrix->set(5, 0, 0);
  140. $this->assertEquals(4, MaskUtil::applyMaskPenaltyRule1($matrix));
  141. // Vertical
  142. $matrix = new ByteMatrix(1, 6);
  143. $matrix->set(0, 0, 0);
  144. $matrix->set(0, 1, 0);
  145. $matrix->set(0, 2, 0);
  146. $matrix->set(0, 3, 0);
  147. $matrix->set(0, 4, 0);
  148. $matrix->set(0, 5, 1);
  149. $this->assertEquals(3, MaskUtil::applyMaskPenaltyRule1($matrix));
  150. $matrix->set(0, 5, 0);
  151. $this->assertEquals(4, MaskUtil::applyMaskPenaltyRule1($matrix));
  152. }
  153. public function testApplyMaskPenaltyRule2()
  154. {
  155. $matrix = new ByteMatrix(1, 1);
  156. $matrix->set(0, 0, 0);
  157. $this->assertEquals(0, MaskUtil::applyMaskPenaltyRule2($matrix));
  158. $matrix = new ByteMatrix(2, 2);
  159. $matrix->set(0, 0, 0);
  160. $matrix->set(1, 0, 0);
  161. $matrix->set(0, 1, 0);
  162. $matrix->set(1, 1, 1);
  163. $this->assertEquals(0, MaskUtil::applyMaskPenaltyRule2($matrix));
  164. $matrix = new ByteMatrix(2, 2);
  165. $matrix->set(0, 0, 0);
  166. $matrix->set(1, 0, 0);
  167. $matrix->set(0, 1, 0);
  168. $matrix->set(1, 1, 0);
  169. $this->assertEquals(3, MaskUtil::applyMaskPenaltyRule2($matrix));
  170. $matrix = new ByteMatrix(3, 3);
  171. $matrix->set(0, 0, 0);
  172. $matrix->set(1, 0, 0);
  173. $matrix->set(2, 0, 0);
  174. $matrix->set(0, 1, 0);
  175. $matrix->set(1, 1, 0);
  176. $matrix->set(2, 1, 0);
  177. $matrix->set(0, 2, 0);
  178. $matrix->set(1, 2, 0);
  179. $matrix->set(2, 2, 0);
  180. $this->assertEquals(3 * 4, MaskUtil::applyMaskPenaltyRule2($matrix));
  181. }
  182. public function testApplyMaskPenalty3()
  183. {
  184. // Horizontal 00001011101
  185. $matrix = new ByteMatrix(11, 1);
  186. $matrix->set(0, 0, 0);
  187. $matrix->set(1, 0, 0);
  188. $matrix->set(2, 0, 0);
  189. $matrix->set(3, 0, 0);
  190. $matrix->set(4, 0, 1);
  191. $matrix->set(5, 0, 0);
  192. $matrix->set(6, 0, 1);
  193. $matrix->set(7, 0, 1);
  194. $matrix->set(8, 0, 1);
  195. $matrix->set(9, 0, 0);
  196. $matrix->set(10, 0, 1);
  197. $this->assertEquals(40, MaskUtil::applyMaskPenaltyRule3($matrix));
  198. // Horizontal 10111010000
  199. $matrix = new ByteMatrix(11, 1);
  200. $matrix->set(0, 0, 1);
  201. $matrix->set(1, 0, 0);
  202. $matrix->set(2, 0, 1);
  203. $matrix->set(3, 0, 1);
  204. $matrix->set(4, 0, 1);
  205. $matrix->set(5, 0, 0);
  206. $matrix->set(6, 0, 1);
  207. $matrix->set(7, 0, 0);
  208. $matrix->set(8, 0, 0);
  209. $matrix->set(9, 0, 0);
  210. $matrix->set(10, 0, 0);
  211. $this->assertEquals(40, MaskUtil::applyMaskPenaltyRule3($matrix));
  212. // Vertical 00001011101
  213. $matrix = new ByteMatrix(1, 11);
  214. $matrix->set(0, 0, 0);
  215. $matrix->set(0, 1, 0);
  216. $matrix->set(0, 2, 0);
  217. $matrix->set(0, 3, 0);
  218. $matrix->set(0, 4, 1);
  219. $matrix->set(0, 5, 0);
  220. $matrix->set(0, 6, 1);
  221. $matrix->set(0, 7, 1);
  222. $matrix->set(0, 8, 1);
  223. $matrix->set(0, 9, 0);
  224. $matrix->set(0, 10, 1);
  225. $this->assertEquals(40, MaskUtil::applyMaskPenaltyRule3($matrix));
  226. // Vertical 10111010000
  227. $matrix = new ByteMatrix(1, 11);
  228. $matrix->set(0, 0, 1);
  229. $matrix->set(0, 1, 0);
  230. $matrix->set(0, 2, 1);
  231. $matrix->set(0, 3, 1);
  232. $matrix->set(0, 4, 1);
  233. $matrix->set(0, 5, 0);
  234. $matrix->set(0, 6, 1);
  235. $matrix->set(0, 7, 0);
  236. $matrix->set(0, 8, 0);
  237. $matrix->set(0, 9, 0);
  238. $matrix->set(0, 10, 0);
  239. $this->assertEquals(40, MaskUtil::applyMaskPenaltyRule3($matrix));
  240. }
  241. public function testApplyMaskPenaltyRule4()
  242. {
  243. // Dark cell ratio = 0%
  244. $matrix = new ByteMatrix(1, 1);
  245. $matrix->set(0, 0, 0);
  246. $this->assertEquals(100, MaskUtil::applyMaskPenaltyRule4($matrix));
  247. // Dark cell ratio = 5%
  248. $matrix = new ByteMatrix(2, 1);
  249. $matrix->set(0, 0, 0);
  250. $matrix->set(0, 0, 1);
  251. $this->assertEquals(0, MaskUtil::applyMaskPenaltyRule4($matrix));
  252. // Dark cell ratio = 66.67%
  253. $matrix = new ByteMatrix(6, 1);
  254. $matrix->set(0, 0, 0);
  255. $matrix->set(1, 0, 1);
  256. $matrix->set(2, 0, 1);
  257. $matrix->set(3, 0, 1);
  258. $matrix->set(4, 0, 1);
  259. $matrix->set(5, 0, 0);
  260. $this->assertEquals(30, MaskUtil::applyMaskPenaltyRule4($matrix));
  261. }
  262. }