blob: 4bee224c6720916b2a6937123ee67fc2e051fa48 [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 "ZXMaskUtilTestCase.h"
@implementation ZXMaskUtilTestCase
- (void)testApplyMaskPenaltyRule1 {
ZXByteMatrix *matrix = [[ZXByteMatrix alloc] initWithWidth:4 height:1];
[matrix setX:0 y:0 intValue:0];
[matrix setX:1 y:0 intValue:0];
[matrix setX:2 y:0 intValue:0];
[matrix setX:3 y:0 intValue:0];
STAssertEquals([ZXMaskUtil applyMaskPenaltyRule1:matrix], 0, @"Expected applyMaskPenaltyRule1 to return 0");
// Horizontal.
matrix = [[ZXByteMatrix alloc] initWithWidth:6 height:1];
[matrix setX:0 y:0 intValue:0];
[matrix setX:1 y:0 intValue:0];
[matrix setX:2 y:0 intValue:0];
[matrix setX:3 y:0 intValue:0];
[matrix setX:4 y:0 intValue:0];
[matrix setX:5 y:0 intValue:1];
STAssertEquals([ZXMaskUtil applyMaskPenaltyRule1:matrix], 3, @"Expected applyMaskPenaltyRule1 to return 3");
[matrix setX:5 y:0 intValue:0];
STAssertEquals([ZXMaskUtil applyMaskPenaltyRule1:matrix], 4, @"Expected applyMaskPenaltyRule1 to return 4");
// Vertical.
matrix = [[ZXByteMatrix alloc] initWithWidth:1 height:6];
[matrix setX:0 y:0 intValue:0];
[matrix setX:0 y:1 intValue:0];
[matrix setX:0 y:2 intValue:0];
[matrix setX:0 y:3 intValue:0];
[matrix setX:0 y:4 intValue:0];
[matrix setX:0 y:5 intValue:1];
STAssertEquals([ZXMaskUtil applyMaskPenaltyRule1:matrix], 3, @"Expected applyMaskPenaltyRule1 to return 3");
[matrix setX:0 y:5 intValue:0];
STAssertEquals([ZXMaskUtil applyMaskPenaltyRule1:matrix], 4, @"Expected applyMaskPenaltyRule1 to return 4");
}
- (void)testApplyMaskPenaltyRule2 {
ZXByteMatrix *matrix = [[ZXByteMatrix alloc] initWithWidth:1 height:1];
[matrix setX:0 y:0 intValue:0];
STAssertEquals([ZXMaskUtil applyMaskPenaltyRule2:matrix], 0, @"Expected applyMaskPenaltyRule2 to return 0");
matrix = [[ZXByteMatrix alloc] initWithWidth:2 height:2];
[matrix setX:0 y:0 intValue:0];
[matrix setX:1 y:0 intValue:0];
[matrix setX:0 y:1 intValue:0];
[matrix setX:1 y:1 intValue:1];
STAssertEquals([ZXMaskUtil applyMaskPenaltyRule2:matrix], 0, @"Expected applyMaskPenaltyRule2 to return 0");
matrix = [[ZXByteMatrix alloc] initWithWidth:2 height:2];
[matrix setX:0 y:0 intValue:0];
[matrix setX:1 y:0 intValue:0];
[matrix setX:0 y:1 intValue:0];
[matrix setX:1 y:1 intValue:0];
STAssertEquals([ZXMaskUtil applyMaskPenaltyRule2:matrix], 3, @"Expected applyMaskPenaltyRule2 to return 3");
matrix = [[ZXByteMatrix alloc] initWithWidth:3 height:3];
[matrix setX:0 y:0 intValue:0];
[matrix setX:1 y:0 intValue:0];
[matrix setX:2 y:0 intValue:0];
[matrix setX:0 y:1 intValue:0];
[matrix setX:1 y:1 intValue:0];
[matrix setX:2 y:1 intValue:0];
[matrix setX:0 y:2 intValue:0];
[matrix setX:1 y:2 intValue:0];
[matrix setX:2 y:2 intValue:0];
// Four instances of 2x2 blocks.
STAssertEquals([ZXMaskUtil applyMaskPenaltyRule2:matrix], 3 * 4, @"Expected applyMaskPenaltyRule2 to return 3 * 4");
}
- (void)testApplyMaskPenaltyRule3 {
// Horizontal 00001011101.
ZXByteMatrix *matrix = [[ZXByteMatrix alloc] initWithWidth:11 height:1];
[matrix setX:0 y:0 intValue:0];
[matrix setX:1 y:0 intValue:0];
[matrix setX:2 y:0 intValue:0];
[matrix setX:3 y:0 intValue:0];
[matrix setX:4 y:0 intValue:1];
[matrix setX:5 y:0 intValue:0];
[matrix setX:6 y:0 intValue:1];
[matrix setX:7 y:0 intValue:1];
[matrix setX:8 y:0 intValue:1];
[matrix setX:9 y:0 intValue:0];
[matrix setX:10 y:0 intValue:1];
STAssertEquals([ZXMaskUtil applyMaskPenaltyRule3:matrix], 40, @"Expected applyMaskPenaltyRule3 to return 40");
// Horizontal 10111010000.
matrix = [[ZXByteMatrix alloc] initWithWidth:11 height:1];
[matrix setX:0 y:0 intValue:1];
[matrix setX:1 y:0 intValue:0];
[matrix setX:2 y:0 intValue:1];
[matrix setX:3 y:0 intValue:1];
[matrix setX:4 y:0 intValue:1];
[matrix setX:5 y:0 intValue:0];
[matrix setX:6 y:0 intValue:1];
[matrix setX:7 y:0 intValue:0];
[matrix setX:8 y:0 intValue:0];
[matrix setX:9 y:0 intValue:0];
[matrix setX:10 y:0 intValue:0];
STAssertEquals([ZXMaskUtil applyMaskPenaltyRule3:matrix], 40, @"Expected applyMaskPenaltyRule3 to return 40");
// Vertical 00001011101.
matrix = [[ZXByteMatrix alloc] initWithWidth:11 height:1];
[matrix setX:0 y:0 intValue:0];
[matrix setX:1 y:0 intValue:0];
[matrix setX:2 y:0 intValue:0];
[matrix setX:3 y:0 intValue:0];
[matrix setX:4 y:0 intValue:1];
[matrix setX:5 y:0 intValue:0];
[matrix setX:6 y:0 intValue:1];
[matrix setX:7 y:0 intValue:1];
[matrix setX:8 y:0 intValue:1];
[matrix setX:9 y:0 intValue:0];
[matrix setX:10 y:0 intValue:1];
STAssertEquals([ZXMaskUtil applyMaskPenaltyRule3:matrix], 40, @"Expected applyMaskPenaltyRule3 to return 40");
// Vertical 10111010000.
matrix = [[ZXByteMatrix alloc] initWithWidth:11 height:1];
[matrix setX:0 y:0 intValue:1];
[matrix setX:1 y:0 intValue:0];
[matrix setX:2 y:0 intValue:1];
[matrix setX:3 y:0 intValue:1];
[matrix setX:4 y:0 intValue:1];
[matrix setX:5 y:0 intValue:0];
[matrix setX:6 y:0 intValue:1];
[matrix setX:7 y:0 intValue:0];
[matrix setX:8 y:0 intValue:0];
[matrix setX:9 y:0 intValue:0];
[matrix setX:10 y:0 intValue:0];
STAssertEquals([ZXMaskUtil applyMaskPenaltyRule3:matrix], 40, @"Expected applyMaskPenaltyRule3 to return 40");
}
- (void)testApplyMaskPenaltyRule4 {
// Dark cell ratio = 0%
ZXByteMatrix *matrix = [[ZXByteMatrix alloc] initWithWidth:1 height:1];
[matrix setX:0 y:0 intValue:0];
STAssertEquals([ZXMaskUtil applyMaskPenaltyRule4:matrix], 100, @"Expected applyMaskPenaltyRule4 to return 100");
// Dark cell ratio = 5%
matrix = [[ZXByteMatrix alloc] initWithWidth:2 height:1];
[matrix setX:0 y:0 intValue:0];
[matrix setX:0 y:0 intValue:1];
STAssertEquals([ZXMaskUtil applyMaskPenaltyRule4:matrix], 0, @"Expected applyMaskPenaltyRule4 to return 0");
// Dark cell ratio = 66.67%
matrix = [[ZXByteMatrix alloc] initWithWidth:6 height:1];
[matrix setX:0 y:0 intValue:0];
[matrix setX:1 y:0 intValue:1];
[matrix setX:2 y:0 intValue:1];
[matrix setX:3 y:0 intValue:1];
[matrix setX:4 y:0 intValue:1];
[matrix setX:5 y:0 intValue:0];
STAssertEquals([ZXMaskUtil applyMaskPenaltyRule4:matrix], 30, @"Expected applyMaskPenaltyRule4 to return 30");
}
BOOL TestGetDataMaskBitInternal(int maskPattern, int *expected) {
for (int x = 0; x < 6; ++x) {
for (int y = 0; y < 6; ++y) {
if ((expected[y*6+x] == 1) != [ZXMaskUtil dataMaskBit:maskPattern x:x y:y]) {
return NO;
}
}
}
return YES;
}
// See mask patterns on the page 43 of JISX0510:2004.
- (void)testGetDataMaskBit {
int mask0[6][6] = {
{1, 0, 1, 0, 1, 0},
{0, 1, 0, 1, 0, 1},
{1, 0, 1, 0, 1, 0},
{0, 1, 0, 1, 0, 1},
{1, 0, 1, 0, 1, 0},
{0, 1, 0, 1, 0, 1},
};
STAssertTrue(TestGetDataMaskBitInternal(0, (int *)mask0), @"Expected TestGetDataMaskBitInternal to return YES");
int mask1[6][6] = {
{1, 1, 1, 1, 1, 1},
{0, 0, 0, 0, 0, 0},
{1, 1, 1, 1, 1, 1},
{0, 0, 0, 0, 0, 0},
{1, 1, 1, 1, 1, 1},
{0, 0, 0, 0, 0, 0},
};
STAssertTrue(TestGetDataMaskBitInternal(1, (int *)mask1), @"Expected TestGetDataMaskBitInternal to return YES");
int mask2[6][6] = {
{1, 0, 0, 1, 0, 0},
{1, 0, 0, 1, 0, 0},
{1, 0, 0, 1, 0, 0},
{1, 0, 0, 1, 0, 0},
{1, 0, 0, 1, 0, 0},
{1, 0, 0, 1, 0, 0},
};
STAssertTrue(TestGetDataMaskBitInternal(2, (int *)mask2), @"Expected TestGetDataMaskBitInternal to return YES");
int mask3[6][6] = {
{1, 0, 0, 1, 0, 0},
{0, 0, 1, 0, 0, 1},
{0, 1, 0, 0, 1, 0},
{1, 0, 0, 1, 0, 0},
{0, 0, 1, 0, 0, 1},
{0, 1, 0, 0, 1, 0},
};
STAssertTrue(TestGetDataMaskBitInternal(3, (int *)mask3), @"Expected TestGetDataMaskBitInternal to return YES");
int mask4[6][6] = {
{1, 1, 1, 0, 0, 0},
{1, 1, 1, 0, 0, 0},
{0, 0, 0, 1, 1, 1},
{0, 0, 0, 1, 1, 1},
{1, 1, 1, 0, 0, 0},
{1, 1, 1, 0, 0, 0},
};
STAssertTrue(TestGetDataMaskBitInternal(4, (int *)mask4), @"Expected TestGetDataMaskBitInternal to return YES");
int mask5[6][6] = {
{1, 1, 1, 1, 1, 1},
{1, 0, 0, 0, 0, 0},
{1, 0, 0, 1, 0, 0},
{1, 0, 1, 0, 1, 0},
{1, 0, 0, 1, 0, 0},
{1, 0, 0, 0, 0, 0},
};
STAssertTrue(TestGetDataMaskBitInternal(5, (int *)mask5), @"Expected TestGetDataMaskBitInternal to return YES");
int mask6[6][6] = {
{1, 1, 1, 1, 1, 1},
{1, 1, 1, 0, 0, 0},
{1, 1, 0, 1, 1, 0},
{1, 0, 1, 0, 1, 0},
{1, 0, 1, 1, 0, 1},
{1, 0, 0, 0, 1, 1},
};
STAssertTrue(TestGetDataMaskBitInternal(6, (int *)mask6), @"Expected TestGetDataMaskBitInternal to return YES");
int mask7[6][6] = {
{1, 0, 1, 0, 1, 0},
{0, 0, 0, 1, 1, 1},
{1, 0, 0, 0, 1, 1},
{0, 1, 0, 1, 0, 1},
{1, 1, 1, 0, 0, 0},
{0, 1, 1, 1, 0, 0},
};
STAssertTrue(TestGetDataMaskBitInternal(7, (int *)mask7), @"Expected TestGetDataMaskBitInternal to return YES");
}
@end