/* testPVUnion.cpp */ /* * Copyright information and license terms for this software can be * found in the file LICENSE that is included with the distribution */ /* Author: Marty Kraimer Date: 2014.07 */ #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace epics::pvData; using std::tr1::static_pointer_cast; using std::string; using std::cout; using std::endl; static FieldCreatePtr fieldCreate = getFieldCreate(); static PVDataCreatePtr pvDataCreate = getPVDataCreate(); static StandardFieldPtr standardField = getStandardField(); static StandardPVFieldPtr standardPVField = getStandardPVField(); static void testPVUnionType() { testDiag("testPVUnionType"); PVStructurePtr pvStructure = pvDataCreate->createPVStructure( standardField->regUnion( fieldCreate->createFieldBuilder()-> add("doubleValue", pvDouble)-> add("intValue", pvInt)-> add("timeStamp",standardField->timeStamp())-> createUnion(), "alarm,timeStamp")); PVUnionPtr pvValue = pvStructure->getSubField("value"); PVStructurePtr pvTime= pvValue->select(2); TimeStamp timeStamp; timeStamp.getCurrent(); PVTimeStamp pvTimeStamp; pvTimeStamp.attach(pvTime); pvTimeStamp.set(timeStamp); testOk1( pvTime->getSubField("secondsPastEpoch")->get() == pvValue->get()->getSubField("secondsPastEpoch")->get() ); PVDoublePtr pvDouble = pvValue->select("doubleValue"); pvDouble->put(1e5); testOk1(pvDouble->get()==pvValue->get()->get()); PVIntPtr pvInt = pvValue->select("intValue"); pvInt->put(15); testOk1(pvInt->get()==pvValue->get()->get()); std::cout << "testPVUnion PASSED" << std::endl; } static void testPVUnionArray() { testDiag("testPVUnionArray"); PVStructurePtr pvStructure = pvDataCreate->createPVStructure( standardField->unionArray( fieldCreate->createFieldBuilder()-> add("doubleValue", pvDouble)-> add("intValue", pvInt)-> add("timeStamp",standardField->timeStamp())-> createUnion(), "alarm,timeStamp")); PVUnionArrayPtr pvValue = pvStructure->getSubField("value"); size_t num = 3; shared_vector unions(3); for(size_t i=0; icreatePVUnion(pvValue->getUnionArray()->getUnion()); } unions[0]->select("doubleValue"); unions[1]->select("intValue"); unions[2]->select("timeStamp"); PVDoublePtr pvDouble = unions[0]->get(); pvDouble->put(1.235); PVIntPtr pvInt = unions[1]->get(); pvInt->put(5); PVStructurePtr pvTime = unions[2]->get(); TimeStamp timeStamp; timeStamp.getCurrent(); PVTimeStamp pvTimeStamp; pvTimeStamp.attach(pvTime); pvTimeStamp.set(timeStamp); pvValue->replace(freeze(unions)); shared_vector sharedUnions = pvValue->view(); testOk1(pvDouble->get()==sharedUnions[0]->get()->get()); testOk1(pvInt->get()==sharedUnions[1]->get()->get()); testOk1( pvTime->getSubField("secondsPastEpoch")->get() == sharedUnions[2]->get()->getSubField("secondsPastEpoch")->get() ); std::cout << "testPVUnionArray PASSED" << std::endl; } static void testClearUnion() { testDiag("testClearUnion w/ variant"); PVUnionPtr variant(pvDataCreate->createPVVariantUnion()); testOk(!variant->get(), "Initially empty"); variant->select(PVUnion::UNDEFINED_INDEX); testOk(!variant->get(), "Still empty"); { PVFieldPtr bval(pvDataCreate->createPVScalar()); variant->set(bval); testOk(variant->get().get()==bval.get(), "Now with bool"); variant->set(PVUnion::UNDEFINED_INDEX, PVFieldPtr()); testOk(!variant->get(), "Again empty"); } { PVFieldPtr bval(pvDataCreate->createPVScalar()); variant->set(bval); testOk(variant->get().get()==bval.get(), "Now with bool"); variant->select(PVUnion::UNDEFINED_INDEX); testOk(!variant->get(), "Again empty"); } testDiag("testClearUnion w/ discriminating"); PVUnionPtr discrim(pvDataCreate->createPVUnion( fieldCreate->createFieldBuilder()-> add("doubleValue", pvDouble)-> add("intValue", pvInt)-> add("timeStamp",standardField->timeStamp())-> createUnion() )); testOk(!discrim->get(), "Initially empty"); discrim->select(PVUnion::UNDEFINED_INDEX); testOk(!discrim->get(), "Still empty"); { PVFieldPtr bval(pvDataCreate->createPVScalar()); try { discrim->set(bval); testFail("set(bval) with UNDEFINED_INDEX didn't fail as expected"); }catch (std::invalid_argument&){ testPass("cause expected invalid_argument"); } testOk(!discrim->get(), "Still empty"); discrim->select("doubleValue"); discrim->set(bval); testOk(discrim->get().get()==bval.get(), "Now with bool"); discrim->set(PVUnion::UNDEFINED_INDEX, PVFieldPtr()); testOk(!discrim->get(), "Again empty"); } { PVFieldPtr bval(pvDataCreate->createPVScalar()); testOk(!discrim->get(), "Still empty"); discrim->set("doubleValue", bval); testOk(discrim->get().get()==bval.get(), "Now with bool"); discrim->set(PVUnion::UNDEFINED_INDEX, PVFieldPtr()); testOk(!discrim->get(), "Again empty"); } } MAIN(testPVUnion) { testPlan(21); testPVUnionType(); testPVUnionArray(); testClearUnion(); return testDone(); }