| /* |
| * 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 |