mirror of
https://github.com/zxing/zxing.git
synced 2025-03-05 20:48:51 -08:00
added unit tests for C++ BitArray::reverse(). Closes issue 1104
From evansepdx. Thanks! git-svn-id: https://zxing.googlecode.com/svn/trunk@2086 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
parent
703cc2e8bf
commit
d7a9a8b96a
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
#include "BitArrayTest.h"
|
#include "BitArrayTest.h"
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
@ -30,7 +31,7 @@ CPPUNIT_TEST_SUITE_REGISTRATION(BitArrayTest);
|
||||||
void BitArrayTest::testGetSet() {
|
void BitArrayTest::testGetSet() {
|
||||||
size_t bits = numeric_limits<unsigned int>::digits + 1;
|
size_t bits = numeric_limits<unsigned int>::digits + 1;
|
||||||
BitArray array(bits);
|
BitArray array(bits);
|
||||||
for (size_t i = 0; i < bits; i++) {
|
for(size_t i = 0; i < bits; i++) {
|
||||||
CPPUNIT_ASSERT_EQUAL(false, array.get(i));
|
CPPUNIT_ASSERT_EQUAL(false, array.get(i));
|
||||||
array.set(i);
|
array.set(i);
|
||||||
CPPUNIT_ASSERT_EQUAL(true, array.get(i));
|
CPPUNIT_ASSERT_EQUAL(true, array.get(i));
|
||||||
|
@ -40,10 +41,10 @@ void BitArrayTest::testGetSet() {
|
||||||
void BitArrayTest::testSetBulk() {
|
void BitArrayTest::testSetBulk() {
|
||||||
BitArray array(64);
|
BitArray array(64);
|
||||||
array.setBulk(32, 0xFFFF0000);
|
array.setBulk(32, 0xFFFF0000);
|
||||||
for (int i = 0; i < 48; i++) {
|
for(int i = 0; i < 48; i++) {
|
||||||
CPPUNIT_ASSERT_EQUAL(false, array.get(i));
|
CPPUNIT_ASSERT_EQUAL(false, array.get(i));
|
||||||
}
|
}
|
||||||
for (int i = 48; i < 64; i++) {
|
for(int i = 48; i < 64; i++) {
|
||||||
CPPUNIT_ASSERT_EQUAL(true, array.get(i));
|
CPPUNIT_ASSERT_EQUAL(true, array.get(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,20 +52,20 @@ void BitArrayTest::testSetBulk() {
|
||||||
void BitArrayTest::testClear() {
|
void BitArrayTest::testClear() {
|
||||||
size_t bits = numeric_limits<unsigned int>::digits;
|
size_t bits = numeric_limits<unsigned int>::digits;
|
||||||
BitArray array(bits);
|
BitArray array(bits);
|
||||||
for (size_t i = 0; i < bits; i++) {
|
for(size_t i = 0; i < bits; i++) {
|
||||||
array.set(i);
|
array.set(i);
|
||||||
}
|
}
|
||||||
array.clear();
|
array.clear();
|
||||||
for (size_t i = 0; i < bits; i++) {
|
for(size_t i = 0; i < bits; i++) {
|
||||||
CPPUNIT_ASSERT_EQUAL(false, array.get(i));
|
CPPUNIT_ASSERT_EQUAL(false, array.get(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BitArrayTest::testGetArray() {
|
void BitArrayTest::testGetArray() {
|
||||||
size_t bits = numeric_limits<unsigned int>::digits;
|
size_t bits = numeric_limits<unsigned int>::digits;
|
||||||
BitArray array(2*bits);
|
BitArray array(2 * bits);
|
||||||
array.set(0);
|
array.set(0);
|
||||||
array.set(2*bits - 1);
|
array.set(2 * bits - 1);
|
||||||
vector<unsigned> words(array.getBitArray());
|
vector<unsigned> words(array.getBitArray());
|
||||||
CPPUNIT_ASSERT_EQUAL(1u, words[0]);
|
CPPUNIT_ASSERT_EQUAL(1u, words[0]);
|
||||||
CPPUNIT_ASSERT_EQUAL((1u << (bits - 1)), words[1]);
|
CPPUNIT_ASSERT_EQUAL((1u << (bits - 1)), words[1]);
|
||||||
|
@ -82,15 +83,134 @@ void BitArrayTest::testIsRange() {
|
||||||
CPPUNIT_ASSERT_EQUAL(true, array.isRange(bits - 1, bits + 1, true));
|
CPPUNIT_ASSERT_EQUAL(true, array.isRange(bits - 1, bits + 1, true));
|
||||||
array.set(bits + 2);
|
array.set(bits + 2);
|
||||||
CPPUNIT_ASSERT_EQUAL(false, array.isRange(bits - 1, bits + 3, true));
|
CPPUNIT_ASSERT_EQUAL(false, array.isRange(bits - 1, bits + 3, true));
|
||||||
for (size_t i = 0; i < bits - 1; i++) {
|
for(size_t i = 0; i < bits - 1; i++) {
|
||||||
array.set(i);
|
array.set(i);
|
||||||
}
|
}
|
||||||
CPPUNIT_ASSERT_EQUAL(true, array.isRange(0, bits + 1, true));
|
CPPUNIT_ASSERT_EQUAL(true, array.isRange(0, bits + 1, true));
|
||||||
for (int i = 33; i < 64; i++) {
|
for(int i = 33; i < 64; i++) {
|
||||||
array.set(i);
|
array.set(i);
|
||||||
}
|
}
|
||||||
CPPUNIT_ASSERT_EQUAL(true, array.isRange(0, 64, true));
|
CPPUNIT_ASSERT_EQUAL(true, array.isRange(0, 64, true));
|
||||||
CPPUNIT_ASSERT_EQUAL(false, array.isRange(0, 64, false));
|
CPPUNIT_ASSERT_EQUAL(false, array.isRange(0, 64, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fills the two arrays with identical random bits
|
||||||
|
void BitArrayTest::fillRandom(BitArray& test, BitArray& reference) {
|
||||||
|
srandom(0xDEADBEEFL + test.getSize());
|
||||||
|
for(size_t i = 0; i < test.getSize(); ++i) {
|
||||||
|
if(random() & 0x1) {
|
||||||
|
test.set(i);
|
||||||
|
reference.set(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BitArrayTest::testReverseHalves() {
|
||||||
|
// one word test, split in half
|
||||||
|
{
|
||||||
|
size_t bits = numeric_limits<unsigned int>::digits;
|
||||||
|
BitArray test(bits);
|
||||||
|
|
||||||
|
test.clear();
|
||||||
|
for(size_t i = 0; i < bits / 2; ++i) {
|
||||||
|
test.set(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
test.reverse();
|
||||||
|
for(size_t i = 0; i < bits / 2; ++i) {
|
||||||
|
CPPUNIT_ASSERT_EQUAL(test.get(i), !test.get(bits - 1 - i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// two word test
|
||||||
|
{
|
||||||
|
size_t bits2 = numeric_limits<unsigned int>::digits * 2;
|
||||||
|
BitArray test2(bits2);
|
||||||
|
|
||||||
|
test2.clear();
|
||||||
|
for(size_t i = 0; i < bits2 / 2; ++i) {
|
||||||
|
test2.set(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
test2.reverse();
|
||||||
|
for(size_t i = 0; i < bits2 / 2; ++i) {
|
||||||
|
CPPUNIT_ASSERT_EQUAL(test2.get(i), !test2.get(bits2 - 1 - i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BitArrayTest::testReverseEven() {
|
||||||
|
size_t bits = numeric_limits<unsigned int>::digits * 8;
|
||||||
|
BitArray test(bits);
|
||||||
|
BitArray reference(bits);
|
||||||
|
|
||||||
|
test.clear();
|
||||||
|
reference.clear();
|
||||||
|
|
||||||
|
fillRandom(test, reference);
|
||||||
|
|
||||||
|
test.reverse();
|
||||||
|
for(size_t i = 0; i < bits; ++i) {
|
||||||
|
CPPUNIT_ASSERT_EQUAL(test.get(i), reference.get(bits - 1 - i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BitArrayTest::testReverseOdd() {
|
||||||
|
size_t bits = numeric_limits<unsigned int>::digits * 6 + 11;
|
||||||
|
BitArray test(bits);
|
||||||
|
BitArray reference(bits);
|
||||||
|
|
||||||
|
test.clear();
|
||||||
|
reference.clear();
|
||||||
|
|
||||||
|
fillRandom(test, reference);
|
||||||
|
|
||||||
|
test.reverse();
|
||||||
|
for(size_t i = 0; i < bits; ++i) {
|
||||||
|
CPPUNIT_ASSERT_EQUAL(test.get(i), reference.get(bits - 1 - i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BitArrayTest::testReverseSweep() {
|
||||||
|
size_t bits;
|
||||||
|
size_t bitsHigh = numeric_limits<unsigned int>::digits * 10;
|
||||||
|
|
||||||
|
for(bits = 1; bits < bitsHigh; ++bits) {
|
||||||
|
BitArray test(bits);
|
||||||
|
BitArray reference(bits);
|
||||||
|
|
||||||
|
test.clear();
|
||||||
|
reference.clear();
|
||||||
|
|
||||||
|
fillRandom(test, reference);
|
||||||
|
|
||||||
|
test.reverse();
|
||||||
|
for(size_t i = 0; i < bits; ++i) {
|
||||||
|
CPPUNIT_ASSERT_EQUAL(test.get(i), reference.get(bits - 1 - i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BitArrayTest::testReverseReverse() {
|
||||||
|
size_t bits = numeric_limits<unsigned int>::digits * 4 + 17;
|
||||||
|
BitArray test(bits);
|
||||||
|
BitArray reference(bits);
|
||||||
|
|
||||||
|
test.clear();
|
||||||
|
reference.clear();
|
||||||
|
|
||||||
|
fillRandom(test, reference);
|
||||||
|
|
||||||
|
// flip it once and test
|
||||||
|
test.reverse();
|
||||||
|
for(size_t i = 0; i < bits; ++i) {
|
||||||
|
CPPUNIT_ASSERT_EQUAL(test.get(i), reference.get(bits - 1 - i));
|
||||||
|
}
|
||||||
|
// flip it back and test
|
||||||
|
test.reverse();
|
||||||
|
for(size_t i = 0; i < bits; ++i) {
|
||||||
|
CPPUNIT_ASSERT_EQUAL(test.get(i), reference.get(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,11 @@ class BitArrayTest : public CPPUNIT_NS::TestFixture {
|
||||||
CPPUNIT_TEST(testClear);
|
CPPUNIT_TEST(testClear);
|
||||||
CPPUNIT_TEST(testGetArray);
|
CPPUNIT_TEST(testGetArray);
|
||||||
CPPUNIT_TEST(testIsRange);
|
CPPUNIT_TEST(testIsRange);
|
||||||
|
CPPUNIT_TEST(testReverseHalves);
|
||||||
|
CPPUNIT_TEST(testReverseEven);
|
||||||
|
CPPUNIT_TEST(testReverseOdd);
|
||||||
|
CPPUNIT_TEST(testReverseSweep);
|
||||||
|
CPPUNIT_TEST(testReverseReverse);
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -42,8 +47,14 @@ protected:
|
||||||
void testClear();
|
void testClear();
|
||||||
void testGetArray();
|
void testGetArray();
|
||||||
void testIsRange();
|
void testIsRange();
|
||||||
|
void testReverseHalves();
|
||||||
|
void testReverseEven();
|
||||||
|
void testReverseOdd();
|
||||||
|
void testReverseSweep();
|
||||||
|
void testReverseReverse();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static void fillRandom(BitArray& test, BitArray& reference);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue