155 lines
5.0 KiB
C++
155 lines
5.0 KiB
C++
/*
|
|
* Copyright information and license terms for this software can be
|
|
* found in the file LICENSE that is included with the distribution
|
|
*/
|
|
|
|
|
|
#include <epicsUnitTest.h>
|
|
#include <testMain.h>
|
|
|
|
#include <pv/valueBuilder.h>
|
|
#include <pv/pvData.h>
|
|
#include <pv/createRequest.h>
|
|
|
|
namespace pvd = epics::pvData;
|
|
|
|
namespace {
|
|
|
|
void testBuild()
|
|
{
|
|
testDiag("testBuild()");
|
|
pvd::ValueBuilder builder;
|
|
builder.add<pvd::pvInt>("A", 42)
|
|
.add<pvd::pvShort>("B", 43);
|
|
|
|
pvd::PVStructurePtr val(builder.buildPVStructure());
|
|
|
|
testOk1(val->getStructure()->getID()=="structure");
|
|
{
|
|
pvd::PVIntPtr A(val->getSubField<pvd::PVInt>("A"));
|
|
testOk1(!!A && A->get()==42);
|
|
}
|
|
{
|
|
pvd::PVShortPtr B(val->getSubField<pvd::PVShort>("B"));
|
|
testOk1(!!B && B->get()==43);
|
|
}
|
|
}
|
|
|
|
void testSubStruct()
|
|
{
|
|
testDiag("testSubStruct()");
|
|
pvd::PVStructurePtr val(pvd::ValueBuilder("foo")
|
|
.add<pvd::pvInt>("A", 42)
|
|
.addNested("X", pvd::structure, "bar")
|
|
.add<pvd::pvInt>("Y", 111)
|
|
.add<pvd::pvString>("Z", "hello world")
|
|
.endNested()
|
|
.add<pvd::pvInt>("B", 43)
|
|
.buildPVStructure());
|
|
|
|
testOk1(val->getStructure()->getID()=="foo");
|
|
testOk1(val->getSubFieldT<pvd::PVStructure>("X")->getStructure()->getID()=="bar");
|
|
{
|
|
pvd::PVIntPtr A(val->getSubField<pvd::PVInt>("A"));
|
|
testOk1(!!A && A->get()==42);
|
|
}
|
|
{
|
|
pvd::PVIntPtr B(val->getSubField<pvd::PVInt>("B"));
|
|
testOk1(!!B && B->get()==43);
|
|
}
|
|
{
|
|
pvd::PVIntPtr Y(val->getSubField<pvd::PVInt>("X.Y"));
|
|
testOk1(!!Y && Y->get()==111);
|
|
}
|
|
{
|
|
pvd::PVStringPtr Y(val->getSubField<pvd::PVString>("X.Z"));
|
|
testOk1(!!Y && Y->get()=="hello world");
|
|
}
|
|
}
|
|
|
|
void testReplace()
|
|
{
|
|
testDiag("testReplace()");
|
|
pvd::PVStructurePtr val(pvd::ValueBuilder("foo")
|
|
.add<pvd::pvInt>("A", 42)
|
|
.add<pvd::pvInt>("A", 43)
|
|
.addNested("X", pvd::structure, "bar")
|
|
.add<pvd::pvInt>("Y", 111)
|
|
.endNested()
|
|
.addNested("X", pvd::structure, "baz")
|
|
.add<pvd::pvInt>("Y", 112)
|
|
.endNested()
|
|
.buildPVStructure());
|
|
|
|
testDiag("top id %s", val->getStructure()->getID().c_str());
|
|
testOk1(val->getStructure()->getID()=="foo");
|
|
testDiag("X id %s", val->getSubFieldT<pvd::PVStructure>("X")->getStructure()->getID().c_str());
|
|
testOk1(val->getSubFieldT<pvd::PVStructure>("X")->getStructure()->getID()=="baz");
|
|
{
|
|
pvd::PVIntPtr A(val->getSubField<pvd::PVInt>("A"));
|
|
testOk1(!!A && A->get()==43);
|
|
}
|
|
{
|
|
pvd::PVIntPtr Y(val->getSubField<pvd::PVInt>("X.Y"));
|
|
testOk1(!!Y && Y->get()==112);
|
|
}
|
|
}
|
|
|
|
void testAppend()
|
|
{
|
|
testDiag("testAppend()");
|
|
|
|
pvd::PVStructurePtr base(pvd::createRequest("field(foo)record[bar=5]"));
|
|
std::cerr<<base<<"\n";
|
|
|
|
testOk1(!!base->getSubField<pvd::PVStructure>("field.foo"));
|
|
testOk1(!base->getSubField<pvd::PVStructure>("field.other"));
|
|
testOk1(base->getSubFieldT<pvd::PVString>("record._options.bar")->get()=="5");
|
|
testOk1(!base->getSubField<pvd::PVStructure>("record._options.foo"));
|
|
|
|
pvd::PVStructurePtr mod(pvd::ValueBuilder(*base)
|
|
.addNested("field")
|
|
.addNested("other")
|
|
.endNested()
|
|
.endNested()
|
|
.addNested("record")
|
|
.addNested("_options")
|
|
.add<pvd::pvInt>("bar", 4)
|
|
.add<pvd::pvInt>("foo", 1)
|
|
.endNested()
|
|
.endNested()
|
|
.buildPVStructure());
|
|
std::cerr<<mod<<"\n";
|
|
|
|
testOk1(base->getField().get()!=mod->getField().get());
|
|
testOk1(base->getField()!=mod->getField());
|
|
|
|
// base unchanged
|
|
testOk1(!!base->getSubField<pvd::PVStructure>("field.foo"));
|
|
testOk1(!base->getSubField<pvd::PVStructure>("field.other"));
|
|
testOk1(base->getSubFieldT<pvd::PVString>("record._options.bar")->get()=="5");
|
|
testOk1(!base->getSubField<pvd::PVStructure>("record._options.foo"));
|
|
|
|
testOk1(!!mod->getSubField<pvd::PVStructure>("field.foo"));
|
|
testOk1(!!mod->getSubField<pvd::PVStructure>("field.other"));
|
|
testOk1(mod->getSubFieldT<pvd::PVInt>("record._options.bar")->get()==4);
|
|
testOk1(mod->getSubFieldT<pvd::PVInt>("record._options.foo")->get()==1);
|
|
}
|
|
|
|
} // namespace
|
|
|
|
MAIN(testValueBuilder)
|
|
{
|
|
testPlan(27);
|
|
try {
|
|
testBuild();
|
|
testSubStruct();
|
|
testReplace();
|
|
testAppend();
|
|
}catch(std::exception& e){
|
|
PRINT_EXCEPTION(e);
|
|
testAbort("Unexpected exception: %s", e.what());
|
|
}
|
|
return testDone();
|
|
}
|