From a1b89c9a3b0117a8b3778fc645287a091579e4ec Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Tue, 17 Feb 2015 21:54:35 +0100 Subject: [PATCH] PVScalar::copy made public; copy tests --- src/pv/pvData.h | 29 +++++----- testApp/pv/testPVData.cpp | 113 +++++++++++++++++++++++++++++++++++++- 2 files changed, 127 insertions(+), 15 deletions(-) diff --git a/src/pv/pvData.h b/src/pv/pvData.h index cddb6a4..b8afbc5 100644 --- a/src/pv/pvData.h +++ b/src/pv/pvData.h @@ -391,20 +391,6 @@ public: put(castUnsafe(val)); } -protected: - PVScalarValue(ScalarConstPtr const & scalar) - : PVScalar(scalar) {} - virtual void getAs(void * result, ScalarType rtype) const - { - const T src = get(); - castUnsafeV(1, rtype, result, typeCode, (const void*)&src); - } - virtual void putFrom(const void *src, ScalarType stype) - { - T result; - castUnsafeV(1, typeCode, (void*)&result, stype, src); - put(result); - } virtual void assign(const PVScalar& scalar) { if(isImmutable()) @@ -424,6 +410,21 @@ protected: put(result); } +protected: + PVScalarValue(ScalarConstPtr const & scalar) + : PVScalar(scalar) {} + virtual void getAs(void * result, ScalarType rtype) const + { + const T src = get(); + castUnsafeV(1, rtype, result, typeCode, (const void*)&src); + } + virtual void putFrom(const void *src, ScalarType stype) + { + T result; + castUnsafeV(1, typeCode, (void*)&result, stype, src); + put(result); + } + private: friend class PVDataCreate; }; diff --git a/testApp/pv/testPVData.cpp b/testApp/pv/testPVData.cpp index 3e1c804..ed1f024 100644 --- a/testApp/pv/testPVData.cpp +++ b/testApp/pv/testPVData.cpp @@ -21,6 +21,8 @@ #include #include #include +#include +#include using namespace epics::pvData; using std::tr1::static_pointer_cast; @@ -415,9 +417,117 @@ cout << "fieldName " << fieldName << " fullName " << fullName << endl; } +#define STRINGIZE(A) #A +#define TEST_COPY(T, V) testCopyCase(V, STRINGIZE(T)) + +template +void testCopyCase(typename T::value_type val, const char* typeName) +{ + typename T::shared_pointer pv = pvDataCreate->createPVScalar(); + pv->put(val); + + typename T::shared_pointer pv2 = pvDataCreate->createPVScalar(); + pv2->copy(*pv); + + testOk(*pv == *pv2, "testCopyCase (copy) for type '%s'", typeName); + + typename T::shared_pointer pv3 = pvDataCreate->createPVScalar(); + pv3->copy(*pv); + + testOk(*pv == *pv3, "testCopyCase (copyUnchecked) for type '%s'", typeName); +} + +static void testCopy() +{ + if(debug) + std::cout << std::endl << "testCopy" << std::endl; + + TEST_COPY(PVBoolean, 1); + TEST_COPY(PVByte, 12); + TEST_COPY(PVShort, 128); + TEST_COPY(PVInt, 128000); + TEST_COPY(PVLong, 128000000); + TEST_COPY(PVUByte, 12); + TEST_COPY(PVUShort, 128); + TEST_COPY(PVUInt, 128000); + TEST_COPY(PVULong, 128000000); + TEST_COPY(PVFloat, 12.8); + TEST_COPY(PVDouble, 8.12); + TEST_COPY(PVString, "jikes"); + + int32 testValue = 128; + + // PVStructure test + PVStructurePtr pvStructure = + standardPVField->scalar(pvInt, alarmTimeStampValueAlarm); + pvStructure->getSubField("value")->put(testValue); + + PVTimeStamp timeStamp; + timeStamp.attach(pvStructure->getSubField("timeStamp")); + TimeStamp current; + current.getCurrent(); + timeStamp.set(current); + + PVStructurePtr pvStructureCopy = + standardPVField->scalar(pvInt, alarmTimeStampValueAlarm); + pvStructureCopy->copy(*pvStructure); + testOk(*pvStructure == *pvStructureCopy, "PVStructure copy"); + + + PVStructurePtr pvStructureCopy2 = + standardPVField->scalar(pvInt, alarmTimeStampValueAlarm); + pvStructureCopy2->copyUnchecked(*pvStructure); + testOk(*pvStructure == *pvStructureCopy2, "PVStructure copyUnchecked"); + + BitSet mask(pvStructure->getNumberFields()); + PVStructurePtr pvStructureCopy3 = + standardPVField->scalar(pvInt, alarmTimeStampValueAlarm); + PVStructurePtr pvStructureCopy4 = + standardPVField->scalar(pvInt, alarmTimeStampValueAlarm); + pvStructureCopy3->copyUnchecked(*pvStructure, mask); + testOk(*pvStructureCopy3 == *pvStructureCopy4, "PVStructure copyUnchecked w/ cleared mask"); + + mask.set(pvStructure->getSubField("value")->getFieldOffset()); + pvStructureCopy3->copyUnchecked(*pvStructure, mask); + pvStructureCopy4->getSubField("value")->put(testValue); + testOk(*pvStructureCopy3 == *pvStructureCopy4, "PVStructure copyUnchecked w/ value mask only"); + + mask.set(pvStructure->getSubField("timeStamp")->getFieldOffset()); + PVStructurePtr pvStructureCopy5 = + standardPVField->scalar(pvInt, alarmTimeStampValueAlarm); + pvStructureCopy5->copyUnchecked(*pvStructure, mask); + testOk(*pvStructure == *pvStructureCopy5, "PVStructure copyUnchecked w/ value+timeStamp mask"); + + + UnionConstPtr _union = fieldCreate->createFieldBuilder()-> + add("doubleValue", pvDouble)-> + add("intValue", pvInt)-> + add("timeStamp",standardField->timeStamp())-> + createUnion(); + + PVUnionPtr pvUnion = pvDataCreate->createPVUnion(_union); + PVUnionPtr pvUnion2 = pvDataCreate->createPVUnion(_union); + pvUnion2->copy(*pvUnion); + testOk(*pvUnion == *pvUnion2, "null PVUnion copy"); + + pvUnion->select("intValue")->put(123); + pvUnion2->copy(*pvUnion); + testOk(*pvUnion == *pvUnion2, "PVUnion scalar copy, to null PVUnion"); + + pvUnion->select("doubleValue"); + pvUnion2->copy(*pvUnion); + testOk(*pvUnion == *pvUnion2, "PVUnion scalar copy, to different type PVUnion"); + + pvUnion->select("timeStamp")->copy( + *pvStructure->getSubField("timeStamp") + ); + pvUnion2->copy(*pvUnion); + testOk(*pvUnion == *pvUnion2, "PVUnion PVStructure copy, to different type PVUnion"); +} + MAIN(testPVData) { - testPlan(189); + testPlan(222); fieldCreate = getFieldCreate(); pvDataCreate = getPVDataCreate(); standardField = getStandardField(); @@ -427,6 +537,7 @@ MAIN(testPVData) testPVScalar(); testScalarArray(); testRequest(); + testCopy(); return testDone(); }