blob: d5aeca1fc2fc17056db0ac7c953ed9b850ace26f [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 "BitVectorTestCase.h"
@implementation BitVectorTestCase
- (unsigned long)unsignedInt:(ZXBitArray *)v index:(int)index {
unsigned long result = 0L;
for (int i = 0, offset = index << 3; i < 32; i++) {
if ([v get:offset + i]) {
result |= 1L << (31 - i);
}
}
return result;
}
- (void)testAppendBit {
ZXBitArray *v = [[ZXBitArray alloc] init];
STAssertEquals(v.sizeInBytes, 0, @"Expected sizeInBytes to be 0");
// 1
[v appendBit:YES];
STAssertEquals(v.size, 1, @"Expected size to be 1");
STAssertEquals([self unsignedInt:v index:0], (unsigned long)0x80000000L, @"Expected unsigned int at index 0 to equal %d", 0x80000000L);
// 10
[v appendBit:NO];
STAssertEquals(v.size, 2, @"Expected size to be 2");
STAssertEquals([self unsignedInt:v index:0], (unsigned long)0x80000000L, @"Expected unsigned int at index 0 to equal %d", 0x80000000L);
// 101
[v appendBit:YES];
STAssertEquals(v.size, 3, @"Expected size to be 3");
STAssertEquals([self unsignedInt:v index:0], (unsigned long)0xa0000000L, @"Expected unsigned int at index 0 to equal %d", 0xa0000000L);
// 1010
[v appendBit:NO];
STAssertEquals(v.size, 4, @"Expected size to be 4");
STAssertEquals([self unsignedInt:v index:0], (unsigned long)0xa0000000L, @"Expected unsigned int at index 0 to equal %d", 0xa0000000L);
// 10101
[v appendBit:YES];
STAssertEquals(v.size, 5, @"Expected size to be 5");
STAssertEquals([self unsignedInt:v index:0], (unsigned long)0xa8000000L, @"Expected unsigned int at index 0 to equal %d", 0xa8000000L);
// 101010
[v appendBit:NO];
STAssertEquals(v.size, 6, @"Expected size to be 6");
STAssertEquals([self unsignedInt:v index:0], (unsigned long)0xa8000000L, @"Expected unsigned int at index 0 to equal %d", 0xa8000000L);
// 1010101
[v appendBit:YES];
STAssertEquals(v.size, 7, @"Expected size to be 7");
STAssertEquals([self unsignedInt:v index:0], (unsigned long)0xaa000000L, @"Expected unsigned int at index 0 to equal %d", 0xaa000000L);
// 10101010
[v appendBit:NO];
STAssertEquals(v.size, 8, @"Expected size to be 8");
STAssertEquals([self unsignedInt:v index:0], (unsigned long)0xaa000000L, @"Expected unsigned int at index 0 to equal %d", 0xaa000000L);
// 10101010 1
[v appendBit:YES];
STAssertEquals(v.size, 9, @"Expected size to be 9");
STAssertEquals([self unsignedInt:v index:0], (unsigned long)0xaa800000L, @"Expected unsigned int at index 0 to equal %d", 0xaa800000L);
// 10101010 10
[v appendBit:NO];
STAssertEquals(v.size, 10, @"Expected size to be 10");
STAssertEquals([self unsignedInt:v index:0], (unsigned long)0xaa800000L, @"Expected unsigned int at index 0 to equal %d", 0xaa800000L);
}
- (void)testAppendBits {
ZXBitArray *v = [[ZXBitArray alloc] init];
[v appendBits:0x1 numBits:1];
STAssertEquals(v.size, 1, @"Expected size to be 1");
STAssertEquals([self unsignedInt:v index:0], (unsigned long)0x80000000L, @"Expected unsigned int at index 0 to equal %d", 0x80000000L);
v = [[ZXBitArray alloc] init];
[v appendBits:0xff numBits:8];
STAssertEquals(v.size, 8, @"Expected size to be 8");
STAssertEquals([self unsignedInt:v index:0], (unsigned long)0xff000000L, @"Expected unsigned int at index 0 to equal %d", 0xff000000L);
v = [[ZXBitArray alloc] init];
[v appendBits:0xff7 numBits:12];
STAssertEquals(v.size, 12, @"Expected size to be 12");
STAssertEquals([self unsignedInt:v index:0], (unsigned long)0xff700000L, @"Expected unsigned int at index 0 to equal %d", 0xff700000L);
}
- (void)testNumBytes {
ZXBitArray *v = [[ZXBitArray alloc] init];
STAssertEquals(v.sizeInBytes, 0, @"Expected sizeInBytes to be 0");
[v appendBit:NO];
// 1 bit was added in the vector, so 1 byte should be consumed.
STAssertEquals(v.sizeInBytes, 1, @"Expected sizeInBytes to be 1");
[v appendBits:0 numBits:7];
STAssertEquals(v.sizeInBytes, 1, @"Expected sizeInBytes to be 1");
[v appendBits:0 numBits:8];
STAssertEquals(v.sizeInBytes, 2, @"Expected sizeInBytes to be 2");
[v appendBits:0 numBits:1];
// We now have 17 bits, so 3 bytes should be consumed.
STAssertEquals(v.sizeInBytes, 3, @"Expected sizeInBytes to be 3");
}
- (void)testAppendBitVector {
ZXBitArray *v1 = [[ZXBitArray alloc] init];
[v1 appendBits:0xbe numBits:8];
ZXBitArray *v2 = [[ZXBitArray alloc] init];
[v2 appendBits:0xef numBits:8];
[v1 appendBitArray:v2];
// beef = 1011 1110 1110 1111
NSString *expected = @" X.XXXXX. XXX.XXXX";
STAssertEqualObjects([v1 description], expected, @"Expected v1 to be %@", expected);
}
- (void)testXOR {
{
ZXBitArray *v1 = [[ZXBitArray alloc] init];
[v1 appendBits:0x5555aaaa numBits:32];
ZXBitArray *v2 = [[ZXBitArray alloc] init];
[v2 appendBits:0xaaaa5555 numBits:32];
[v1 xor:v2];
STAssertEquals([self unsignedInt:v1 index:0], (unsigned long)0xffffffffL,
@"Expected unsigned int at index 0 to equal %d", 0xffffffffL);
}
{
ZXBitArray *v1 = [[ZXBitArray alloc] init];
[v1 appendBits:0x2a numBits:7]; // 010 1010
ZXBitArray *v2 = [[ZXBitArray alloc] init];
[v2 appendBits:0x55 numBits:7]; // 101 0101
[v1 xor:v2];
STAssertEquals([self unsignedInt:v1 index:0], (unsigned long)0xfe000000L,
@"Expected unsigned int at index 0 to equal %d", 0xfe000000L); // 1111 1110
}
}
- (void)testAt {
ZXBitArray *v = [[ZXBitArray alloc] init];
[v appendBits:0xdead numBits:16]; // 1101 1110 1010 1101
STAssertTrue([v get:0], @"Expected value at 0 to be 1");
STAssertTrue([v get:1], @"Expected value at 1 to be 1");
STAssertFalse([v get:2], @"Expected value at 2 to be 0");
STAssertTrue([v get:3], @"Expected value at 3 to be 1");
STAssertTrue([v get:4], @"Expected value at 4 to be 1");
STAssertTrue([v get:5], @"Expected value at 5 to be 1");
STAssertTrue([v get:6], @"Expected value at 6 to be 1");
STAssertFalse([v get:7], @"Expected value at 7 to be 0");
STAssertTrue([v get:8], @"Expected value at 8 to be 1");
STAssertFalse([v get:9], @"Expected value at 9 to be 0");
STAssertTrue([v get:10], @"Expected value at 10 to be 1");
STAssertFalse([v get:11], @"Expected value at 11 to be 0");
STAssertTrue([v get:12], @"Expected value at 12 to be 1");
STAssertTrue([v get:13], @"Expected value at 13 to be 1");
STAssertFalse([v get:14], @"Expected value at 14 to be 0");
STAssertTrue([v get:15], @"Expected value at 15 to be 1");
}
- (void)testToString {
ZXBitArray *v = [[ZXBitArray alloc] init];
[v appendBits:0xdead numBits:16]; // 1101 1110 1010 1101
NSString *expected = @" XX.XXXX. X.X.XX.X";
STAssertEqualObjects([v description], expected, @"Expected v to be %@", expected);
}
@end