Files
pvData/testApp/misc/testBitSet.cpp
Dave Hickin acd19c10d0 BitSet: truncation in or_and
For "this |= set1 & set2" the result size
should be "max(this, min(set1, set2))" while
at present it is "min(set1, set2)" resulting
in truncation if the LHS is longer than the
RHS.
(cherry picked from commit d4292d81f2)

Number of tests planned corrected.
2016-03-04 23:51:12 +00:00

167 lines
3.3 KiB
C++

/* testBitSet.cpp */
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* EPICS pvData is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
/* Author: Matej Sekoranja Date: 2010.10.18 */
#include <iostream>
#include <stddef.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include <sstream>
#include <pv/bitSet.h>
#include <epicsUnitTest.h>
#include <testMain.h>
using namespace epics::pvData;
using std::string;
static string toString(BitSet& bitSet)
{
std::ostringstream oss;
oss << bitSet;
return oss.str();
}
static void testGetSetClearFlip()
{
testDiag("testGetSetClearFlip... ");
// empty
BitSet* b1 = new BitSet();
testOk1(b1->isEmpty());
testOk1(b1->cardinality() == 0);
// to string check
string str = toString(*b1);
testOk1(str == "{}");
// one
b1->set(3);
testOk1(b1->get(3));
testOk1(!b1->isEmpty());
testOk1(b1->cardinality() == 1);
// to string check
str = toString(*b1);
testOk1(str == "{3}");
// grow
b1->set(66);
b1->set(67);
b1->set(68);
testOk1(b1->cardinality() == 4);
str = toString(*b1);
testOk1(str == "{3, 66, 67, 68}");
// clear one
b1->clear(67);
testOk1(b1->cardinality() == 3);
str = toString(*b1);
testOk1(str == "{3, 66, 68}");
// flip
b1->flip(66);
b1->flip(130);
testOk1(b1->cardinality() == 3);
str = toString(*b1);
testOk1(str == "{3, 68, 130}");
// flip
b1->set(130, false);
b1->set(4, true);
testOk1(b1->cardinality() == 3);
str = toString(*b1);
testOk1(str == "{3, 4, 68}");
// clear all
b1->clear();
testOk1(b1->isEmpty());
testOk1(b1->cardinality() == 0);
str = toString(*b1);
testOk1(str == "{}");
delete b1;
}
static void testOperators()
{
testDiag("testOperators... ");
BitSet b1;
testOk1(b1 == b1);
BitSet b2;
testOk1(b1 == b2);
b1.set(1);
testOk1(!(b1 == b2));
// different internal length, but the same
b2.set(100);
b2.set(1);
b2.flip(100);
testOk1(b1 == b2);
// OR test
b2.set(65);
b2.set(106);
b2.set(105);
b1 |= b2;
string str = toString(b1);
testOk1(str == "{1, 65, 105, 106}");
b1.clear();
b1 |= b2;
str = toString(b1);
testOk1(str == "{1, 65, 105, 106}");
// AND test
b1.set(128);
b1 &= b2;
testOk1(b1 == b2);
// XOR test
b1.set(128);
b1 ^= b2;
testOk1((b1.cardinality() == 1 && b1.get(128) == true));
b1.clear();
b2.clear();
b1.set(1);
b2.set(256);
b1 ^= b2;
testOk1((b1.cardinality() == 2 && b1.get(1) == true && b1.get(256) == true));
// assign
b1 = b2;
testOk1(b1 == b2);
// or_and
b1.clear(); b1.set(2);
b2.clear(); b2.set(66); b2.set(128);
BitSet b3; b3.set(128); b3.set(520);
b1.or_and(b2, b3);
str = toString(b1);
testOk1(str == "{2, 128}");
b1.clear(); b1.set(1);
b2.clear();
b3.clear(); b3.set(1);
std::cout<<"# "<<toString(b3)<<" |= "<<toString(b1)<<" & "<<toString(b2)<<"\n";
b3.or_and(b1, b2);
testOk(toString(b3) == "{1}", "%s == {1}", toString(b3).c_str());
}
MAIN(testBitSet)
{
testPlan(30);
testGetSetClearFlip();
testOperators();
return testDone();
}