2 * Copyright 2008 ZXing authors
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com.google.zxing.qrcode.encoder;
19 import com.google.zxing.common.ByteMatrix;
20 import com.google.zxing.WriterException;
21 import junit.framework.TestCase;
24 * @author satorux@google.com (Satoru Takabayashi) - creator
25 * @author mysen@google.com (Chris Mysen) - ported from C++
27 public final class MatrixUtilTestCase extends TestCase {
28 public void testtoString() {
29 ByteMatrix array = new ByteMatrix(3, 3);
39 String expected = " 0 1 0\n" + " 1 0 1\n" + " \n";
40 assertEquals(expected, array.toString());
43 public void testClearMatrix() {
44 ByteMatrix matrix = new ByteMatrix(2, 2);
45 MatrixUtil.ClearMatrix(matrix);
46 assertEquals(-1, matrix.get(0, 0));
47 assertEquals(-1, matrix.get(0, 1));
48 assertEquals(-1, matrix.get(1, 0));
49 assertEquals(-1, matrix.get(1, 1));
52 public void testEmbedBasicPatterns() throws WriterException {
56 " 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1\n" +
57 " 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n" +
58 " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" +
59 " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" +
60 " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" +
61 " 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n" +
62 " 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" +
63 " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +
69 " 0 0 0 0 0 0 0 0 1 \n" +
70 " 1 1 1 1 1 1 1 0 \n" +
71 " 1 0 0 0 0 0 1 0 \n" +
72 " 1 0 1 1 1 0 1 0 \n" +
73 " 1 0 1 1 1 0 1 0 \n" +
74 " 1 0 1 1 1 0 1 0 \n" +
75 " 1 0 0 0 0 0 1 0 \n" +
76 " 1 1 1 1 1 1 1 0 \n";
77 ByteMatrix matrix = new ByteMatrix(21, 21);
78 MatrixUtil.ClearMatrix(matrix);
79 MatrixUtil.EmbedBasicPatterns(1, matrix);
80 assertEquals(expected, matrix.toString());
83 // Version 2. Position adjustment pattern should apppear at right
86 " 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1\n" +
87 " 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n" +
88 " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" +
89 " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" +
90 " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" +
91 " 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n" +
92 " 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" +
93 " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +
103 " 0 0 0 0 0 0 0 0 1 1 0 0 0 1 \n" +
104 " 1 1 1 1 1 1 1 0 1 0 1 0 1 \n" +
105 " 1 0 0 0 0 0 1 0 1 0 0 0 1 \n" +
106 " 1 0 1 1 1 0 1 0 1 1 1 1 1 \n" +
107 " 1 0 1 1 1 0 1 0 \n" +
108 " 1 0 1 1 1 0 1 0 \n" +
109 " 1 0 0 0 0 0 1 0 \n" +
110 " 1 1 1 1 1 1 1 0 \n";
111 ByteMatrix matrix = new ByteMatrix(25, 25);
112 MatrixUtil.ClearMatrix(matrix);
113 MatrixUtil.EmbedBasicPatterns(2, matrix);
114 assertEquals(expected, matrix.toString());
118 public void testEmbedTypeInfo() throws WriterException {
119 // Type info bits = 100000011001110.
129 " 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0\n" +
142 ByteMatrix matrix = new ByteMatrix(21, 21);
143 MatrixUtil.ClearMatrix(matrix);
144 MatrixUtil.EmbedTypeInfo(QRCode.EC_LEVEL_M, 5, matrix);
145 assertEquals(expected, matrix.toString());
148 public void testEmbedVersionInfo() throws WriterException {
149 // Version info bits = 000111 110010 010100
172 // Actually, version 7 QR Code has 45x45 matrix but we use 21x21 here
173 // since 45x45 matrix is too big to depict.
174 ByteMatrix matrix = new ByteMatrix(21, 21);
175 MatrixUtil.ClearMatrix(matrix);
176 MatrixUtil.MaybeEmbedVersionInfo(7, matrix);
177 assertEquals(expected, matrix.toString());
180 public void testEmbedDataBits() throws WriterException {
181 // Cells other than basic patterns should be filled with zero.
183 " 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1\n" +
184 " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1\n" +
185 " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1\n" +
186 " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1\n" +
187 " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1\n" +
188 " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1\n" +
189 " 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" +
190 " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +
191 " 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +
192 " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +
193 " 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +
194 " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +
195 " 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +
196 " 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0\n" +
197 " 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +
198 " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +
199 " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +
200 " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +
201 " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +
202 " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +
203 " 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n";
204 BitVector bits = new BitVector();
205 ByteMatrix matrix = new ByteMatrix(21, 21);
206 MatrixUtil.ClearMatrix(matrix);
207 MatrixUtil.EmbedBasicPatterns(1, matrix);
208 MatrixUtil.EmbedDataBits(bits, -1, matrix);
209 assertEquals(expected, matrix.toString());
212 public void testBuildMatrix() throws WriterException {
213 // From http://www.swetake.com/qr/qr7.html
215 " 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 1 1\n" +
216 " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1\n" +
217 " 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 1 1 0 1\n" +
218 " 1 0 1 1 1 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 1\n" +
219 " 1 0 1 1 1 0 1 0 1 1 0 0 1 0 1 0 1 1 1 0 1\n" +
220 " 1 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1\n" +
221 " 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" +
222 " 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0\n" +
223 " 0 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 0 0 0 0\n" +
224 " 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 0 1 1 1 0\n" +
225 " 1 1 1 1 0 1 1 0 1 0 1 1 1 0 0 1 1 1 0 1 0\n" +
226 " 1 0 1 0 1 1 0 1 1 1 0 0 1 1 1 0 0 1 0 1 0\n" +
227 " 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 1 1 1 1 1\n" +
228 " 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1 1\n" +
229 " 1 1 1 1 1 1 1 0 1 1 1 1 0 0 0 0 1 0 1 1 0\n" +
230 " 1 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0\n" +
231 " 1 0 1 1 1 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1\n" +
232 " 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 1 1 1 0\n" +
233 " 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 0\n" +
234 " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0\n" +
235 " 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 0 0 1 0\n";
236 char bytes[] = {32, 65, 205, 69, 41, 220, 46, 128, 236,
237 42, 159, 74, 221, 244, 169, 239, 150, 138,
238 70, 237, 85, 224, 96, 74, 219 , 61};
239 BitVector bits = new BitVector();
240 for (char c: bytes) {
241 bits.AppendBits(c, 8);
243 ByteMatrix matrix = new ByteMatrix(21, 21);
244 MatrixUtil.BuildMatrix(bits,
251 public void testFindMSBSet() {
252 assertEquals(0, MatrixUtil.FindMSBSet(0));
253 assertEquals(1, MatrixUtil.FindMSBSet(1));
254 assertEquals(8, MatrixUtil.FindMSBSet(0x80));
255 assertEquals(32, MatrixUtil.FindMSBSet(0x80000000));
258 public void testCalculateBCHCode() {
259 // Encoding of type information.
260 // From Appendix C in JISX0510:2004 (p 65)
261 assertEquals(0xdc, MatrixUtil.CalculateBCHCode(5, 0x537));
262 // From http://www.swetake.com/qr/qr6.html
263 assertEquals(0x1c2, MatrixUtil.CalculateBCHCode(0x13, 0x537));
264 // From http://www.swetake.com/qr/qr11.html
265 assertEquals(0x214, MatrixUtil.CalculateBCHCode(0x1b, 0x537));
267 // Encofing of version information.
268 // From Appendix D in JISX0510:2004 (p 68)
269 assertEquals(0xc94, MatrixUtil.CalculateBCHCode(7, 0x1f25));
270 assertEquals(0x5bc, MatrixUtil.CalculateBCHCode(8, 0x1f25));
271 assertEquals(0xa99, MatrixUtil.CalculateBCHCode(9, 0x1f25));
272 assertEquals(0x4d3, MatrixUtil.CalculateBCHCode(10, 0x1f25));
273 assertEquals(0x9a6, MatrixUtil.CalculateBCHCode(20, 0x1f25));
274 assertEquals(0xd75, MatrixUtil.CalculateBCHCode(30, 0x1f25));
275 assertEquals(0xc69, MatrixUtil.CalculateBCHCode(40, 0x1f25));
278 // We don't test a lot of cases in this function since we've already
279 // tested them in TEST(CalculateBCHCode).
280 public void testMakeVersionInfoBits() throws WriterException {
281 // From Appendix D in JISX0510:2004 (p 68)
282 BitVector bits = new BitVector();
283 MatrixUtil.MakeVersionInfoBits(7, bits);
284 assertEquals("000111110010010100", bits.toString());
287 // We don't test a lot of cases in this function since we've already
288 // tested them in TEST(CalculateBCHCode).
289 public void testMakeTypeInfoInfoBits() throws WriterException {
290 // From Appendix C in JISX0510:2004 (p 65)
291 BitVector bits = new BitVector();
292 MatrixUtil.MakeTypeInfoBits(QRCode.EC_LEVEL_M,
294 assertEquals("100000011001110", bits.toString());