blob: 26fb8bf32e10f5f3b0cf8f4ba61ac0578ce4086a [file] [log] [blame]
/*
* Copyright 2012 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import "ZXMatrixUtilTestCase.h"
@implementation ZXMatrixUtilTestCase
- (void)testToString {
ZXByteMatrix *array = [[ZXByteMatrix alloc] initWithWidth:3 height:3];
[array setX:0 y:0 intValue:0];
[array setX:1 y:0 intValue:1];
[array setX:2 y:0 intValue:0];
[array setX:0 y:1 intValue:1];
[array setX:1 y:1 intValue:0];
[array setX:2 y:1 intValue:1];
[array setX:0 y:2 intValue:-1];
[array setX:1 y:2 intValue:-1];
[array setX:2 y:2 intValue:-1];
NSString *expected = @" 0 1 0\n 1 0 1\n \n";
STAssertEqualObjects([array description], expected, @"Expected array to equal %@", expected);
}
- (void)testClearMatrix {
ZXByteMatrix *matrix = [[ZXByteMatrix alloc] initWithWidth:2 height:2];
[ZXMatrixUtil clearMatrix:matrix];
STAssertEquals([matrix getX:0 y:0], (char)-1, @"Expected (0, 0) to equal -1");
STAssertEquals([matrix getX:1 y:0], (char)-1, @"Expected (1, 0) to equal -1");
STAssertEquals([matrix getX:0 y:1], (char)-1, @"Expected (0, 1) to equal -1");
STAssertEquals([matrix getX:1 y:1], (char)-1, @"Expected (1, 1) to equal -1");
}
- (void)testEmbedBasicPatterns1 {
// Version 1.
ZXByteMatrix *matrix = [[ZXByteMatrix alloc] initWithWidth:21 height:21];
[ZXMatrixUtil clearMatrix:matrix];
[ZXMatrixUtil embedBasicPatterns:[ZXQRCodeVersion versionForNumber:1] matrix:matrix error:nil];
NSString *expected =
@" 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1\n"
" 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n"
" 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n"
" 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n"
" 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n"
" 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n"
" 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n"
" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
" 1 \n"
" 0 \n"
" 1 \n"
" 0 \n"
" 1 \n"
" 0 0 0 0 0 0 0 0 1 \n"
" 1 1 1 1 1 1 1 0 \n"
" 1 0 0 0 0 0 1 0 \n"
" 1 0 1 1 1 0 1 0 \n"
" 1 0 1 1 1 0 1 0 \n"
" 1 0 1 1 1 0 1 0 \n"
" 1 0 0 0 0 0 1 0 \n"
" 1 1 1 1 1 1 1 0 \n";
STAssertEqualObjects([matrix description], expected, @"Expected matrix to equal %@", expected);
}
- (void)testEmbedBasicPatterns2 {
// Version 2. Position adjustment pattern should apppear at right
// bottom corner.
ZXByteMatrix *matrix = [[ZXByteMatrix alloc] initWithWidth:25 height:25];
[ZXMatrixUtil clearMatrix:matrix];
[ZXMatrixUtil embedBasicPatterns:[ZXQRCodeVersion versionForNumber:2] matrix:matrix error:nil];
NSString *expected =
@" 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1\n"
" 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n"
" 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n"
" 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n"
" 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n"
" 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n"
" 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"
" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
" 1 \n"
" 0 \n"
" 1 \n"
" 0 \n"
" 1 \n"
" 0 \n"
" 1 \n"
" 0 \n"
" 1 1 1 1 1 1 \n"
" 0 0 0 0 0 0 0 0 1 1 0 0 0 1 \n"
" 1 1 1 1 1 1 1 0 1 0 1 0 1 \n"
" 1 0 0 0 0 0 1 0 1 0 0 0 1 \n"
" 1 0 1 1 1 0 1 0 1 1 1 1 1 \n"
" 1 0 1 1 1 0 1 0 \n"
" 1 0 1 1 1 0 1 0 \n"
" 1 0 0 0 0 0 1 0 \n"
" 1 1 1 1 1 1 1 0 \n";
STAssertEqualObjects([matrix description], expected, @"Expected matrix to equal %@", expected);
}
- (void)testEmbedTypeInfo {
// Type info bits = 100000011001110.
ZXByteMatrix *matrix = [[ZXByteMatrix alloc] initWithWidth:21 height:21];
[ZXMatrixUtil clearMatrix:matrix];
[ZXMatrixUtil embedTypeInfo:[ZXErrorCorrectionLevel errorCorrectionLevelM] maskPattern:5 matrix:matrix error:nil];
NSString *expected =
@" 0 \n"
" 1 \n"
" 1 \n"
" 1 \n"
" 0 \n"
" 0 \n"
" \n"
" 1 \n"
" 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0\n"
" \n"
" \n"
" \n"
" \n"
" \n"
" 0 \n"
" 0 \n"
" 0 \n"
" 0 \n"
" 0 \n"
" 0 \n"
" 1 \n";
STAssertEqualObjects([matrix description], expected, @"Expected matrix to equal %@", expected);
}
- (void)testEmbedVersionInfo {
// Version info bits = 000111 110010 010100
// Actually, version 7 QR Code has 45x45 matrix but we use 21x21 here
// since 45x45 matrix is too big to depict.
ZXByteMatrix *matrix = [[ZXByteMatrix alloc] initWithWidth:21 height:21];
[ZXMatrixUtil clearMatrix:matrix];
[ZXMatrixUtil maybeEmbedVersionInfo:[ZXQRCodeVersion versionForNumber:7] matrix:matrix error:nil];
NSString *expected =
@" 0 0 1 \n"
" 0 1 0 \n"
" 0 1 0 \n"
" 0 1 1 \n"
" 1 1 1 \n"
" 0 0 0 \n"
" \n"
" \n"
" \n"
" \n"
" 0 0 0 0 1 0 \n"
" 0 1 1 1 1 0 \n"
" 1 0 0 1 1 0 \n"
" \n"
" \n"
" \n"
" \n"
" \n"
" \n"
" \n"
" \n";
STAssertEqualObjects([matrix description], expected, @"Expected matrix to equal %@", expected);
}
- (void)testEmbedDataBits {
// Cells other than basic patterns should be filled with zero.
ZXByteMatrix *matrix = [[ZXByteMatrix alloc] initWithWidth:21 height:21];
[ZXMatrixUtil clearMatrix:matrix];
[ZXMatrixUtil embedBasicPatterns:[ZXQRCodeVersion versionForNumber:1] matrix:matrix error:nil];
ZXBitArray *bits = [[ZXBitArray alloc] init];
[ZXMatrixUtil embedDataBits:bits maskPattern:-1 matrix:matrix error:nil];
NSString *expected =
@" 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1\n"
" 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1\n"
" 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1\n"
" 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1\n"
" 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1\n"
" 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1\n"
" 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n"
" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
" 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
" 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
" 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
" 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0\n"
" 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
" 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
" 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
" 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
" 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
" 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
" 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n";
STAssertEqualObjects([matrix description], expected, @"Expected matrix to equal %@", expected);
}
- (void)testBuildMatrix {
// From http://www.swetake.com/qr/qr7.html
const int bytesLen = 26;
int8_t bytes[bytesLen] = {32, 65, 205, 69, 41, 220, 46, 128, 236,
42, 159, 74, 221, 244, 169, 239, 150, 138,
70, 237, 85, 224, 96, 74, 219, 61};
ZXBitArray *bits = [[ZXBitArray alloc] init];
for (int i = 0; i < bytesLen; i++) {
[bits appendBits:bytes[i] numBits:8];
}
ZXByteMatrix *matrix = [[ZXByteMatrix alloc] initWithWidth:21 height:21];
[ZXMatrixUtil buildMatrix:bits
ecLevel:[ZXErrorCorrectionLevel errorCorrectionLevelH]
version:[ZXQRCodeVersion versionForNumber:1]
maskPattern:3 // Mask pattern 3
matrix:matrix
error:nil];
NSString *expected =
@" 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 1 1\n"
" 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1\n"
" 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 1 1 0 1\n"
" 1 0 1 1 1 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 1\n"
" 1 0 1 1 1 0 1 0 1 1 0 0 1 0 1 0 1 1 1 0 1\n"
" 1 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1\n"
" 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n"
" 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0\n"
" 0 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 0 0 0 0\n"
" 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 0 1 1 1 0\n"
" 1 1 1 1 0 1 1 0 1 0 1 1 1 0 0 1 1 1 0 1 0\n"
" 1 0 1 0 1 1 0 1 1 1 0 0 1 1 1 0 0 1 0 1 0\n"
" 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 1 1 1 1 1\n"
" 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1 1\n"
" 1 1 1 1 1 1 1 0 1 1 1 1 0 0 0 0 1 0 1 1 0\n"
" 1 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0\n"
" 1 0 1 1 1 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1\n"
" 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 1 1 1 0\n"
" 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 0\n"
" 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0\n"
" 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 0 0 1 0\n";
STAssertEqualObjects([matrix description], expected, @"Expected matrix to equal %@", expected);
}
- (void)testFindMSBSet {
STAssertEquals([ZXMatrixUtil findMSBSet:0], 0, @"Expected findMSBSet to equal 0");
STAssertEquals([ZXMatrixUtil findMSBSet:1], 1, @"Expected findMSBSet to equal 1");
STAssertEquals([ZXMatrixUtil findMSBSet:0x80], 8, @"Expected findMSBSet to equal 8");
STAssertEquals([ZXMatrixUtil findMSBSet:0x80000000], 32, @"Expected findMSBSet to equal 32");
}
- (void)testCalculateBCHCode {
// Encoding of type information.
// From Appendix C in JISX0510:2004 (p 65)
STAssertEquals([ZXMatrixUtil calculateBCHCode:5 poly:0x537], 0xdc, @"Expected calculateBCHCode to equal 0xdc");
// From http://www.swetake.com/qr/qr6.html
STAssertEquals([ZXMatrixUtil calculateBCHCode:0x13 poly:0x537], 0x1c2, @"Expected calculateBCHCode to equal 0x1c2");
// From http://www.swetake.com/qr/qr11.html
STAssertEquals([ZXMatrixUtil calculateBCHCode:0x1b poly:0x537], 0x214, @"Expected calculateBCHCode to equal 0x214");
// Encofing of version information.
// From Appendix D in JISX0510:2004 (p 68)
STAssertEquals([ZXMatrixUtil calculateBCHCode:7 poly:0x1f25], 0xc94, @"Expected calculateBCHCode to equal 0xc94");
STAssertEquals([ZXMatrixUtil calculateBCHCode:8 poly:0x1f25], 0x5bc, @"Expected calculateBCHCode to equal 0x5bc");
STAssertEquals([ZXMatrixUtil calculateBCHCode:9 poly:0x1f25], 0xa99, @"Expected calculateBCHCode to equal 0xa99");
STAssertEquals([ZXMatrixUtil calculateBCHCode:10 poly:0x1f25], 0x4d3, @"Expected calculateBCHCode to equal 0x4d3");
STAssertEquals([ZXMatrixUtil calculateBCHCode:20 poly:0x1f25], 0x9a6, @"Expected calculateBCHCode to equal 0x9a6");
STAssertEquals([ZXMatrixUtil calculateBCHCode:30 poly:0x1f25], 0xd75, @"Expected calculateBCHCode to equal 0xd75");
STAssertEquals([ZXMatrixUtil calculateBCHCode:40 poly:0x1f25], 0xc69, @"Expected calculateBCHCode to equal 0xc69");
}
// We don't test a lot of cases in this function since we've already
// tested them in TEST(calculateBCHCode).
- (void)testMakeVersionInfoBits {
// From Appendix D in JISX0510:2004 (p 68)
ZXBitArray *bits = [[ZXBitArray alloc] init];
[ZXMatrixUtil makeVersionInfoBits:[ZXQRCodeVersion versionForNumber:7] bits:bits error:nil];
NSString *expected = @" ...XXXXX ..X..X.X ..";
STAssertEqualObjects([bits description], expected, @"Expected bits to equal %@", expected);
}
// We don't test a lot of cases in this function since we've already
// tested them in TEST(calculateBCHCode).
- (void)testMakeTypeInfoInfoBits {
// From Appendix C in JISX0510:2004 (p 65)
ZXBitArray *bits = [[ZXBitArray alloc] init];
[ZXMatrixUtil makeTypeInfoBits:[ZXErrorCorrectionLevel errorCorrectionLevelM] maskPattern:5 bits:bits error:nil];
NSString *expected = @" X......X X..XXX.";
STAssertEqualObjects([bits description], expected, @"Expected bits to equal %@", expected);
}
@end