6 void print_eccTable(void)
13 for(i=1; i<=QRSPEC_VERSION_MAX; i++) {
14 printf("Version %2d\n", i);
16 QRspec_getEccSpec(i, (QRecLevel)j, spec);
17 data = QRspec_rsBlockNum1(spec) * QRspec_rsDataCodes1(spec)
18 + QRspec_rsBlockNum2(spec) * QRspec_rsDataCodes2(spec);
19 ecc = QRspec_rsBlockNum1(spec) * QRspec_rsEccCodes1(spec)
20 + QRspec_rsBlockNum2(spec) * QRspec_rsEccCodes2(spec);
22 printf("%2d\t", QRspec_rsBlockNum1(spec));
23 printf("(%3d, %3d, %3d)\n",
24 QRspec_rsDataCodes1(spec) + QRspec_rsEccCodes1(spec),
25 QRspec_rsDataCodes1(spec),
26 QRspec_rsEccCodes1(spec));
27 if(QRspec_rsBlockNum2(spec) > 0) {
28 printf("\t%2d\t", QRspec_rsBlockNum2(spec));
29 printf("(%3d, %3d, %3d)\n",
30 QRspec_rsDataCodes2(spec) + QRspec_rsEccCodes2(spec),
31 QRspec_rsDataCodes2(spec),
32 QRspec_rsEccCodes2(spec));
38 void test_eccTable(void)
46 testStart("Checking ECC table.");
47 for(i=1; i<=QRSPEC_VERSION_MAX; i++) {
49 QRspec_getEccSpec(i, (QRecLevel)j, spec);
50 data = QRspec_rsBlockNum1(spec) * QRspec_rsDataCodes1(spec)
51 + QRspec_rsBlockNum2(spec) * QRspec_rsDataCodes2(spec);
52 ecc = QRspec_rsBlockNum1(spec) * QRspec_rsEccCodes1(spec)
53 + QRspec_rsBlockNum2(spec) * QRspec_rsEccCodes2(spec);
54 if(data + ecc != QRspec_getDataLength(i, (QRecLevel)j) + QRspec_getECCLength(i, (QRecLevel)j)) {
55 printf("Error in version %d, level %d: invalid size\n", i, j);
56 printf("%d %d %d %d %d %d\n", spec[0], spec[1], spec[2], spec[3], spec[4], spec[2]);
59 if(ecc != QRspec_getECCLength(i, (QRecLevel)j)) {
60 printf("Error in version %d, level %d: invalid data\n", i, j);
61 printf("%d %d %d %d %d %d\n", spec[0], spec[1], spec[2], spec[3], spec[4], spec[2]);
69 void test_eccTable2(void)
74 const int correct[7][6] = {
75 { 8, 1, 0, 2, 60, 38},
76 { 8, 1, 1, 2, 61, 39},
77 {24, 2, 0, 11, 54, 24},
78 {24, 2, 1, 16, 55, 25},
79 {32, 0, 0, 17, 145, 115},
80 {40, 3, 0, 20, 45, 15},
81 {40, 3, 1, 61, 46, 16},
84 testStart("Checking ECC table(2)");
86 QRspec_getEccSpec(correct[i][0], (QRecLevel)correct[i][1], spec);
87 if(correct[i][2] == 0) {
88 assert_equal(QRspec_rsBlockNum1(spec), correct[i][3],
89 "Error in version %d, level %d. rsBlockNum1 was %d, expected %d.\n",
90 correct[i][0], correct[i][1],
91 QRspec_rsBlockNum1(spec), correct[i][3]);
92 assert_equal(QRspec_rsDataCodes1(spec) + QRspec_rsEccCodes1(spec), correct[i][4],
93 "Error in version %d, level %d. rsDataCodes1 + rsEccCodes1 was %d, expected %d.\n",
94 correct[i][0], correct[i][1],
95 QRspec_rsDataCodes1(spec) + QRspec_rsEccCodes1(spec), correct[i][4]);
96 assert_equal(QRspec_rsDataCodes1(spec), correct[i][5],
97 "Error in version %d, level %d. rsDataCodes1 was %d, expected %d.\n",
98 correct[i][0], correct[i][1],
99 QRspec_rsDataCodes1(spec), correct[i][5]);
101 assert_equal(QRspec_rsBlockNum2(spec), correct[i][3],
102 "Error in version %d, level %d. rsBlockNum2 was %d, expected %d.\n",
103 correct[i][0], correct[i][1],
104 QRspec_rsBlockNum2(spec), correct[i][3]);
105 assert_equal(QRspec_rsDataCodes2(spec) + QRspec_rsEccCodes2(spec), correct[i][4],
106 "Error in version %d, level %d. rsDataCodes2 + rsEccCodes2 was %d, expected %d.\n",
107 correct[i][0], correct[i][1],
108 QRspec_rsDataCodes2(spec) + QRspec_rsEccCodes2(spec), correct[i][4]);
109 assert_equal(QRspec_rsDataCodes2(spec), correct[i][5],
110 "Error in version %d, level %d. rsDataCodes2 was %d, expected %d.\n",
111 correct[i][0], correct[i][1],
112 QRspec_rsDataCodes2(spec), correct[i][5]);
118 void test_newframe(void)
120 unsigned char buf[QRSPEC_WIDTH_MAX * QRSPEC_WIDTH_MAX];
124 unsigned char *frame;
126 testStart("Checking newly created frame.");
127 fp = fopen("frame", "rb");
129 perror("Failed to open \"frame\":");
132 for(i=1; i<=QRSPEC_VERSION_MAX; i++) {
133 frame = QRspec_newFrame(i);
134 width = QRspec_getWidth(i);
135 len = fread(buf, 1, width * width, fp);
136 if((int)len != width * width) {
137 perror("Failed to read the pattern file:");
140 assert_zero(memcmp(frame, buf, len), "frame pattern mismatch (version %d)\n", i);
149 /* This test is used to check positions of alignment pattern. See Appendix E
150 * (pp.71) of JIS X0510:2004 and compare to the output. Before comment out
151 * this test, change the value of the pattern marker's center dot from 0xa1
152 * to 0xb1 (QRspec_putAlignmentMarker() : finder).
154 void test_alignment(void)
156 unsigned char *frame;
157 int i, x, y, width, c;
159 testStart("Checking alignment pattern.");
160 for(i=2; i<=QRSPEC_VERSION_MAX; i++) {
162 frame = QRspec_newFrame(i);
163 width = QRspec_getWidth(i);
165 for(x=0; x<width * width; x++) {
166 if(frame[x] == 0xb1) {
170 printf("|%2d| 6", c);
172 for(x=0; x < width; x++) {
173 if(frame[y * width + x] == 0xb1) {
184 void test_verpat(void)
187 unsigned int pattern;
194 for(version=7; version <= QRSPEC_VERSION_MAX; version++) {
195 pattern = QRspec_getVersionPattern(version);
196 if((pattern >> 12) != (unsigned int)version) {
197 printf("Error in version %d.\n", version);
202 for(i=0; mask != 0; i++) {
203 if(version & mask) break;
207 data = version << 12;
209 mask = 0x40000 >> (6 - c);
210 for(i=0; i<=c; i++) {
217 data = (version << 12) | (data & 0xfff);
218 if(data != pattern) {
219 printf("Error in version %d\n", version);
225 void print_newFrame(void)
229 unsigned char *frame;
231 frame = QRspec_newFrame(7);
232 width = QRspec_getWidth(7);
233 for(y=0; y<width; y++) {
234 for(x=0; x<width; x++) {
235 printf("%02x ", frame[y * width + x]);
242 /* See Table 22 (pp.45) and Appendix C (pp. 65) of JIS X0510:2004 */
243 static unsigned int levelIndicator[4] = {1, 0, 3, 2};
244 static unsigned int calcFormatInfo(int mask, QRecLevel level)
246 unsigned int data, ecc, b, code;
249 data = (levelIndicator[level] << 13) | (mask << 10);
252 for(i=0; b != 0; i++) {
257 code = 0x537 << c ; //10100110111
259 for(i=0; i<=c; i++) {
267 return (data | ecc) ^ 0x5412;
270 void test_format(void)
276 testStart("Format info test");
279 format = calcFormatInfo(j, (QRecLevel)i);
280 // printf("0x%04x, ", format);
281 if(format != QRspec_getFormatInfo(j, (QRecLevel)i)) {
282 printf("Level %d, mask %x\n", i, j);
291 int main(int argc, char **argv)