From ddee226a493af72cb5e3be6a96be04969e49ce54 Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Fri, 12 Sep 2014 09:56:08 -0400 Subject: [PATCH] added "add(name,field)" to each bulder; added is_compatible to each NT(code is not complete) --- src/nt/ntmultiChannel.cpp | 25 ++++++++++++++++++++++++- src/nt/ntmultiChannel.h | 24 ++++++++++++++++++++++-- src/nt/ntnameValue.cpp | 11 ++++++++++- src/nt/ntnameValue.h | 9 ++++++++- src/nt/ntndarray.cpp | 27 ++++++++++++++++++++++++--- src/nt/ntndarray.h | 21 ++++++++++++++++++++- src/nt/ntscalar.cpp | 21 ++++++++++++++++++++- src/nt/ntscalar.h | 21 ++++++++++++++++++++- src/nt/ntscalarArray.cpp | 22 +++++++++++++++++++++- src/nt/ntscalarArray.h | 20 ++++++++++++++++++++ src/nt/nttable.cpp | 19 ++++++++++++++++++- src/nt/nttable.h | 20 +++++++++++++++++++- test/nt/ntmultiChannelTest.cpp | 5 ++++- test/nt/ntnameValueTest.cpp | 13 +++++++++++-- test/nt/ntndarrayTest.cpp | 6 +++++- test/nt/ntscalarArrayTest.cpp | 9 +++++++-- test/nt/ntscalarTest.cpp | 8 ++++++-- test/nt/nttableTest.cpp | 6 +++++- 18 files changed, 264 insertions(+), 23 deletions(-) diff --git a/src/nt/ntmultiChannel.cpp b/src/nt/ntmultiChannel.cpp index 88dc9c2..55b3d48 100644 --- a/src/nt/ntmultiChannel.cpp +++ b/src/nt/ntmultiChannel.cpp @@ -87,6 +87,8 @@ StructureConstPtr NTMultiChannelBuilder::createStructure() { StandardFieldPtr standardField = getStandardField(); size_t nfields = 3; + size_t extraCount = extraFieldNames.size(); + nfields += extraCount; if(descriptor) ++nfields; if(alarm) ++nfields; if(timeStamp) ++nfields; @@ -145,6 +147,11 @@ StructureConstPtr NTMultiChannelBuilder::createStructure() names[ind] = "userTag"; fields[ind++] = fieldCreate->createScalarArray(pvInt); } + for (size_t i = 0; i< extraCount; i++) { + names[ind] = extraFieldNames[i]; + fields[ind++] = extraFields[i]; + } + StructureConstPtr st = fieldCreate->createStructure(NTMultiChannel::URI,names,fields); reset(); return st; @@ -168,6 +175,8 @@ NTMultiChannelBuilder::NTMultiChannelBuilder() void NTMultiChannelBuilder::reset() { valueUnion.reset(); + extraFieldNames.clear(); + extraFields.clear(); value = false; descriptor = false; alarm = false; @@ -180,9 +189,16 @@ void NTMultiChannelBuilder::reset() userTag = false; } + +NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::add(string const & name, FieldConstPtr const & field) +{ + extraFields.push_back(field); extraFieldNames.push_back(name); + return shared_from_this(); } -const std::string NTMultiChannel::URI("uri:ev4:nt/2012/pwd:NTMultiChannel"); +} + +const std::string NTMultiChannel::URI("uri:ev4:nt/2014/pwd:NTMultiChannel"); NTMultiChannel::shared_pointer NTMultiChannel::narrow(PVStructurePtr const & structure) { @@ -202,6 +218,13 @@ bool NTMultiChannel::is_a(StructureConstPtr const &structure) return structure->getID() == URI; } +bool NTMultiChannel::is_compatible(PVStructurePtr const &pvStructure) +{ + PVUnionArrayPtr pvValue = pvStructure->getSubField("value"); + if(!pvValue) return false; + return true; +} + NTMultiChannelBuilderPtr NTMultiChannel::createBuilder() { return NTMultiChannelBuilderPtr(new detail::NTMultiChannelBuilder()); diff --git a/src/nt/ntmultiChannel.h b/src/nt/ntmultiChannel.h index 8d27b8c..b91b989 100644 --- a/src/nt/ntmultiChannel.h +++ b/src/nt/ntmultiChannel.h @@ -38,6 +38,7 @@ namespace detail { POINTER_DEFINITIONS(NTMultiChannelBuilder); /** * specify the union for the value field. + * If this is not called then a variantUnion is the default. * @return this instance of a {@code NTMultiChannelBuilder}. */ shared_pointer addValue(epics::pvData::UnionConstPtr valuePtr); @@ -104,6 +105,13 @@ namespace detail { * @return a new instance of a {@code NTMultiChannel} */ NTMultiChannelPtr create(); + /** + * Add extra {@code Field} to the type. + * @param name name of the field. + * @param field a field to add. + * @return this instance of a {@code NTMultiChannelBuilder}. + */ + shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field); private: NTMultiChannelBuilder(); @@ -121,6 +129,10 @@ namespace detail { bool nanoseconds; bool userTag; + // NOTE: this preserves order, however it does not handle duplicates + epics::pvData::StringArray extraFieldNames; + epics::pvData::FieldConstPtrArray extraFields; + friend class ::epics::nt::NTMultiChannel; }; @@ -151,14 +163,22 @@ public: * @return NTMultiChannel instance. */ static shared_pointer narrow_unsafe(epics::pvData::PVStructurePtr const & structure); - /** - * Is the pvStructure an NTMultiChannel. + * Is the Structure an NTMultiChannel. + * This method structure->getID() and checks if it is the same as the URI. * @param structure The structure to test. * @return (false,true) if (is not, is) an NTMultiChannel. */ static bool is_a( epics::pvData::StructureConstPtr const &structure); + /** + * Is the pvStructure compatible with NTMultiChannel. + * This method introspects the fields to see if they are compatible. + * @param pvStructure The pvStructure to test. + * @return (false,true) if (is not, is) an NTMultiChannel. + */ + static bool is_compatible( + epics::pvData::PVStructurePtr const &pvStructure); /** * Create a NTMultiChannelBuilder instance * @return builder instance. diff --git a/src/nt/ntnameValue.cpp b/src/nt/ntnameValue.cpp index 1ab39d7..ac5ae45 100644 --- a/src/nt/ntnameValue.cpp +++ b/src/nt/ntnameValue.cpp @@ -108,7 +108,7 @@ NTNameValueBuilder::shared_pointer NTNameValueBuilder::add(string const & name, } -const std::string NTNameValue::URI("uri:ev4:nt/2012/pwd:NTNameValue"); +const std::string NTNameValue::URI("uri:ev4:nt/2014/pwd:NTNameValue"); NTNameValue::shared_pointer NTNameValue::narrow(PVStructurePtr const & structure) { @@ -128,6 +128,15 @@ bool NTNameValue::is_a(StructureConstPtr const & structure) return structure->getID() == URI; } +bool NTNameValue::is_compatible(PVStructurePtr const & pvStructure) +{ + PVStringArrayPtr pvNames = pvStructure->getSubField("names"); + if(!pvNames) return false; + PVFieldPtr pvValues = pvStructure->getSubField("values"); + if(!pvValues) return false; + return true; +} + NTNameValueBuilderPtr NTNameValue::createBuilder() { return NTNameValueBuilderPtr(new detail::NTNameValueBuilder()); diff --git a/src/nt/ntnameValue.h b/src/nt/ntnameValue.h index 6430c1a..f9413af 100644 --- a/src/nt/ntnameValue.h +++ b/src/nt/ntnameValue.h @@ -140,7 +140,14 @@ public: * @return (false,true) if (is not, is) an NTNameValue. */ static bool is_a(epics::pvData::StructureConstPtr const & structure); - + /** + * Is the pvStructure compatible with NTNameValue.. + * This method introspects the fields to see if they are compatible. + * @param pvStructure The pvStructure to test. + * @return (false,true) if (is not, is) an NTMultiChannel. + */ + static bool is_compatible( + epics::pvData::PVStructurePtr const &pvStructure); /** * Create a NTNameValue builder instance. * @return builder instance. diff --git a/src/nt/ntndarray.cpp b/src/nt/ntndarray.cpp index 360b50d..0436f8f 100644 --- a/src/nt/ntndarray.cpp +++ b/src/nt/ntndarray.cpp @@ -16,7 +16,7 @@ namespace epics { namespace nt { namespace detail { -const std::string ntAttrStr("uri:ev4:nt/2012/pwd:NTAttribute"); +const std::string ntAttrStr("uri:ev4:nt/2014/pwd:NTAttribute"); static FieldCreatePtr fieldCreate = getFieldCreate(); static PVDataCreatePtr pvDataCreate = getPVDataCreate(); @@ -41,6 +41,7 @@ StructureConstPtr NTNDArrayBuilder::createStructure() static epics::pvData::StructureConstPtr attributeStruc; static Mutex mutex; + Lock xx(mutex); size_t index = 0; @@ -116,6 +117,11 @@ StructureConstPtr NTNDArrayBuilder::createStructure() if (display) fb->add("display", standardField->display()); + size_t extraCount = extraFieldNames.size(); + for (size_t i = 0; i< extraCount; i++) + fb->add(extraFieldNames[i], extraFields[i]); + + ntndarrayStruc[index] = fb->createStructure(); } @@ -167,12 +173,21 @@ void NTNDArrayBuilder::reset() timeStamp = false; alarm = false; display = false; + extraFieldNames.clear(); + extraFields.clear(); } +NTNDArrayBuilder::shared_pointer NTNDArrayBuilder::add(string const & name, FieldConstPtr const & field) +{ + extraFields.push_back(field); extraFieldNames.push_back(name); + return shared_from_this(); +} + + } -const std::string NTNDArray::URI("uri:ev4:nt/2012/pwd:NTNDArray"); -const std::string ntAttrStr("uri:ev4:nt/2012/pwd:NTAttribute"); +const std::string NTNDArray::URI("uri:ev4:nt/2014/pwd:NTNDArray"); +const std::string ntAttrStr("uri:ev4:nt/2014/pwd:NTAttribute"); static FieldCreatePtr fieldCreate = getFieldCreate(); static PVDataCreatePtr pvDataCreate = getPVDataCreate(); @@ -195,6 +210,12 @@ bool NTNDArray::is_a(StructureConstPtr const & structure) return structure->getID() == URI; } +bool NTNDArray::is_compatible(PVStructurePtr const & pvStructure) +{ + return true; +} + + NTNDArrayBuilderPtr NTNDArray::createBuilder() { return NTNDArrayBuilderPtr(new detail::NTNDArrayBuilder()); diff --git a/src/nt/ntndarray.h b/src/nt/ntndarray.h index 857eae2..0b75cfc 100644 --- a/src/nt/ntndarray.h +++ b/src/nt/ntndarray.h @@ -75,6 +75,13 @@ namespace detail { * @return a new instance of a {@code NTNDArray} */ NTNDArrayPtr create(); + /** + * Add extra {@code Field} to the type. + * @param name name of the field. + * @param field a field to add. + * @return this instance of a {@code NTArrayBuilder}. + */ + shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field); private: NTNDArrayBuilder(); @@ -86,6 +93,10 @@ namespace detail { bool alarm; bool display; + // NOTE: this preserves order, however it does not handle duplicates + epics::pvData::StringArray extraFieldNames; + epics::pvData::FieldConstPtrArray extraFields; + friend class ::epics::nt::NTNDArray; }; @@ -126,7 +137,14 @@ public: * @return (false,true) if (is not, is) an NTNDArray. */ static bool is_a(epics::pvData::StructureConstPtr const & structure); - + /** + * Is the pvStructure compatible with NTNDArray.. + * This method introspects the fields to see if they are compatible. + * @param pvStructure The pvStructure to test. + * @return (false,true) if (is not, is) an NTMultiChannel. + */ + static bool is_compatible( + epics::pvData::PVStructurePtr const &pvStructure); /** * Create a NTNDArrayBuilder instance * @return builder instance. @@ -237,6 +255,7 @@ public: private: NTNDArray(epics::pvData::PVStructurePtr const & pvStructure); epics::pvData::PVStructurePtr pvNTNDArray; + friend class detail::NTNDArrayBuilder; }; diff --git a/src/nt/ntscalar.cpp b/src/nt/ntscalar.cpp index 7f24ba2..d988361 100644 --- a/src/nt/ntscalar.cpp +++ b/src/nt/ntscalar.cpp @@ -51,6 +51,11 @@ StructureConstPtr NTScalarBuilder::createStructure() if (control) builder->add("control", ntField->createControl()); + size_t extraCount = extraFieldNames.size(); + for (size_t i = 0; i< extraCount; i++) + builder->add(extraFieldNames[i], extraFields[i]); + + StructureConstPtr s = builder->createStructure(); reset(); @@ -112,9 +117,16 @@ void NTScalarBuilder::reset() control = false; } +NTScalarBuilder::shared_pointer NTScalarBuilder::add(string const & name, FieldConstPtr const & field) +{ + extraFields.push_back(field); extraFieldNames.push_back(name); + return shared_from_this(); } -const std::string NTScalar::URI("uri:ev4:nt/2012/pwd:NTScalar"); + +} + +const std::string NTScalar::URI("uri:ev4:nt/2014/pwd:NTScalar"); NTScalar::shared_pointer NTScalar::narrow(PVStructurePtr const & structure) { @@ -134,6 +146,13 @@ bool NTScalar::is_a(StructureConstPtr const & structure) return structure->getID() == URI; } +bool NTScalar::is_compatible(PVStructurePtr const & pvStructure) +{ + PVScalarPtr pvValue = pvStructure->getSubField("value"); + if(!pvValue) return false; + return true; +} + NTScalarBuilderPtr NTScalar::createBuilder() { return NTScalarBuilderPtr(new detail::NTScalarBuilder()); diff --git a/src/nt/ntscalar.h b/src/nt/ntscalar.h index c40a942..d8f6c59 100644 --- a/src/nt/ntscalar.h +++ b/src/nt/ntscalar.h @@ -87,6 +87,13 @@ namespace detail { * @return a new instance of a {@code NTScalar} */ NTScalarPtr create(); + /** + * Add extra {@code Field} to the type. + * @param name name of the field. + * @param field a field to add. + * @return this instance of a {@code NTScalarBuilder}. + */ + shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field); private: NTScalarBuilder(); @@ -102,6 +109,10 @@ namespace detail { bool display; bool control; + // NOTE: this preserves order, however it does not handle duplicates + epics::pvData::StringArray extraFieldNames; + epics::pvData::FieldConstPtrArray extraFields; + friend class ::epics::nt::NTScalar; }; @@ -144,7 +155,14 @@ public: * @return (false,true) if (is not, is) an NTScalar. */ static bool is_a(epics::pvData::StructureConstPtr const & structure); - + /** + * Is the pvStructure compatible with NTScalar. + * This method introspects the fields to see if they are compatible. + * @param pvStructure The pvStructure to test. + * @return (false,true) if (is not, is) an NTMultiChannel. + */ + static bool is_compatible( + epics::pvData::PVStructurePtr const &pvStructure); /** * Create a NTScalar builder instance. * @return builder instance. @@ -244,6 +262,7 @@ private: NTScalar(epics::pvData::PVStructurePtr const & pvStructure); epics::pvData::PVStructurePtr pvNTScalar; epics::pvData::PVFieldPtr pvValue; + friend class detail::NTScalarBuilder; }; diff --git a/src/nt/ntscalarArray.cpp b/src/nt/ntscalarArray.cpp index 7e4cb55..18c2e9f 100644 --- a/src/nt/ntscalarArray.cpp +++ b/src/nt/ntscalarArray.cpp @@ -51,6 +51,11 @@ StructureConstPtr NTScalarArrayBuilder::createStructure() if (control) builder->add("control", ntField->createControl()); + size_t extraCount = extraFieldNames.size(); + for (size_t i = 0; i< extraCount; i++) + builder->add(extraFieldNames[i], extraFields[i]); + + StructureConstPtr s = builder->createStructure(); reset(); @@ -112,9 +117,16 @@ void NTScalarArrayBuilder::reset() control = false; } +NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::add(string const & name, FieldConstPtr const & field) +{ + extraFields.push_back(field); extraFieldNames.push_back(name); + return shared_from_this(); } -const std::string NTScalarArray::URI("uri:ev4:nt/2012/pwd:NTScalarArray"); + +} + +const std::string NTScalarArray::URI("uri:ev4:nt/2014/pwd:NTScalarArray"); NTScalarArray::shared_pointer NTScalarArray::narrow(PVStructurePtr const & structure) { @@ -134,6 +146,14 @@ bool NTScalarArray::is_a(StructureConstPtr const & structure) return structure->getID() == URI; } +bool NTScalarArray::is_compatible(PVStructurePtr const & pvStructure) +{ + PVScalarArrayPtr pvValue = pvStructure->getSubField("value"); + if(!pvValue) return false; + return true; +} + + NTScalarArrayBuilderPtr NTScalarArray::createBuilder() { return NTScalarArrayBuilderPtr(new detail::NTScalarArrayBuilder()); diff --git a/src/nt/ntscalarArray.h b/src/nt/ntscalarArray.h index 04d45ca..8a4b7a9 100644 --- a/src/nt/ntscalarArray.h +++ b/src/nt/ntscalarArray.h @@ -87,6 +87,13 @@ namespace detail { * @return a new instance of a {@code NTScalarArray} */ NTScalarArrayPtr create(); + /** + * Add extra {@code Field} to the type. + * @param name name of the field. + * @param field a field to add. + * @return this instance of a {@code NTScalarArrayBuilder}. + */ + shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field); private: NTScalarArrayBuilder(); @@ -102,6 +109,10 @@ namespace detail { bool display; bool control; + // NOTE: this preserves order, however it does not handle duplicates + epics::pvData::StringArray extraFieldNames; + epics::pvData::FieldConstPtrArray extraFields; + friend class ::epics::nt::NTScalarArray; }; @@ -145,6 +156,14 @@ public: * @return (false,true) if (is not, is) an NTScalarArray. */ static bool is_a(epics::pvData::StructureConstPtr const & structure); + /** + * Is the pvStructure compatible with NTScalarArray.. + * This method introspects the fields to see if they are compatible. + * @param pvStructure The pvStructure to test. + * @return (false,true) if (is not, is) an NTMultiChannel. + */ + static bool is_compatible( + epics::pvData::PVStructurePtr const &pvStructure); /** * Create a NTScalarArray builder instance. @@ -245,6 +264,7 @@ private: NTScalarArray(epics::pvData::PVStructurePtr const & pvStructure); epics::pvData::PVStructurePtr pvNTScalarArray; epics::pvData::PVFieldPtr pvValue; + friend class detail::NTScalarArrayBuilder; }; diff --git a/src/nt/nttable.cpp b/src/nt/nttable.cpp index 4643b1b..1c8f36d 100644 --- a/src/nt/nttable.cpp +++ b/src/nt/nttable.cpp @@ -58,6 +58,11 @@ StructureConstPtr NTTableBuilder::createStructure() StructureConstPtr s = builder->createStructure(); + size_t extraCount = extraFieldNames.size(); + for (size_t i = 0; i< extraCount; i++) + builder->add(extraFieldNames[i], extraFields[i]); + + reset(); return s; } @@ -111,9 +116,16 @@ void NTTableBuilder::reset() timeStamp = false; } +NTTableBuilder::shared_pointer NTTableBuilder::add(string const & name, FieldConstPtr const & field) +{ + extraFields.push_back(field); extraFieldNames.push_back(name); + return shared_from_this(); } -const std::string NTTable::URI("uri:ev4:nt/2012/pwd:NTTable"); + +} + +const std::string NTTable::URI("uri:ev4:nt/2014/pwd:NTTable"); NTTable::shared_pointer NTTable::narrow(PVStructurePtr const & structure) { @@ -133,6 +145,11 @@ bool NTTable::is_a(StructureConstPtr const & structure) return structure->getID() == URI; } +bool NTTable::is_compatible(PVStructurePtr const & pvStructure) +{ + return true; +} + NTTableBuilderPtr NTTable::createBuilder() { return NTTableBuilderPtr(new detail::NTTableBuilder()); diff --git a/src/nt/nttable.h b/src/nt/nttable.h index 7a3037e..aef1f76 100644 --- a/src/nt/nttable.h +++ b/src/nt/nttable.h @@ -77,6 +77,13 @@ namespace detail { * @return a new instance of a {@code NTTable} */ NTTablePtr create(); + /** + * Add extra {@code Field} to the type. + * @param name name of the field. + * @param field a field to add. + * @return this instance of a {@code NTTableBuilder}. + */ + shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field); private: NTTableBuilder(); @@ -90,6 +97,10 @@ namespace detail { bool alarm; bool timeStamp; + // NOTE: this preserves order, however it does not handle duplicates + epics::pvData::StringArray extraFieldNames; + epics::pvData::FieldConstPtrArray extraFields; + friend class ::epics::nt::NTTable; }; @@ -132,7 +143,14 @@ public: * @return (false,true) if (is not, is) an NTTable. */ static bool is_a(epics::pvData::StructureConstPtr const & structure); - + /** + * Is the pvStructure compatible with NTTable. + * This method introspects the fields to see if they are compatible. + * @param pvStructure The pvStructure to test. + * @return (false,true) if (is not, is) an NTMultiChannel. + */ + static bool is_compatible( + epics::pvData::PVStructurePtr const &pvStructure); /** * Create a NTTable builder instance. * @return builder instance. diff --git a/test/nt/ntmultiChannelTest.cpp b/test/nt/ntmultiChannelTest.cpp index d11afff..3748d0e 100644 --- a/test/nt/ntmultiChannelTest.cpp +++ b/test/nt/ntmultiChannelTest.cpp @@ -49,6 +49,8 @@ static void test() addAlarm()-> addTimeStamp()-> addSeverity() -> + add("extra1",fieldCreate->createScalar(pvString)) -> + add("extra2",fieldCreate->createScalarArray(pvString)) -> create(); testOk1(multiChannel.get() != 0); @@ -120,6 +122,7 @@ static void test() testOk1(multiChannel.get() != 0); pvStructure = multiChannel->getPVStructure(); if(debug) {cout << *pvStructure << endl;} + testOk1(NTMultiChannel::is_compatible(pvStructure)==true); PVStructurePtr pvTimeStamp = multiChannel->getTimeStamp(); testOk1(pvTimeStamp.get() !=0); PVStructurePtr pvAlarm = multiChannel->getAlarm(); @@ -180,7 +183,7 @@ void test_narrow() MAIN(testCreateRequest) { - testPlan(24); + testPlan(25); test(); test_narrow(); return testDone(); diff --git a/test/nt/ntnameValueTest.cpp b/test/nt/ntnameValueTest.cpp index fba6c96..cffe7ab 100644 --- a/test/nt/ntnameValueTest.cpp +++ b/test/nt/ntnameValueTest.cpp @@ -13,6 +13,8 @@ using namespace epics::nt; using namespace epics::pvData; using std::tr1::dynamic_pointer_cast; +static FieldCreatePtr fieldCreate = getFieldCreate(); + void test_builder() { testDiag("test_builder"); @@ -25,6 +27,8 @@ void test_builder() addDescriptor()-> addAlarm()-> addTimeStamp()-> + add("extra1",fieldCreate->createScalar(pvString)) -> + add("extra2",fieldCreate->createScalarArray(pvString)) -> createStructure(); testOk1(structure.get() != 0); if (!structure) @@ -32,7 +36,7 @@ void test_builder() testOk1(NTNameValue::is_a(structure)); testOk1(structure->getID() == NTNameValue::URI); - testOk1(structure->getNumberFields() == 5); + testOk1(structure->getNumberFields() == 7); testOk1(structure->getField("names").get() != 0); testOk1(structure->getField("values").get() != 0); testOk1(structure->getField("descriptor").get() != 0); @@ -51,6 +55,8 @@ void test_builder() addDescriptor()-> addAlarm()-> addTimeStamp()-> + add("extra1",fieldCreate->createScalar(pvString)) -> + add("extra2",fieldCreate->createScalarArray(pvString)) -> createStructure(); testFail("no value type set"); } catch (std::runtime_error &) { @@ -70,6 +76,8 @@ void test_ntnameValue() addDescriptor()-> addAlarm()-> addTimeStamp()-> + add("extra1",fieldCreate->createScalar(pvString)) -> + add("extra2",fieldCreate->createScalarArray(pvString)) -> create(); testOk1(ntNameValue.get() != 0); @@ -197,6 +205,7 @@ void test_narrow() if (!pvStructure) return; + testOk1(NTNameValue::is_compatible(pvStructure)==true); NTNameValuePtr ptr = NTNameValue::narrow(pvStructure); testOk(ptr.get() != 0, "narrow OK"); @@ -236,7 +245,7 @@ void test_extra() MAIN(testNTNameValue) { - testPlan(47); + testPlan(48); test_builder(); test_ntnameValue(); test_narrow(); diff --git a/test/nt/ntndarrayTest.cpp b/test/nt/ntndarrayTest.cpp index 7d7d0f0..a52bcb4 100644 --- a/test/nt/ntndarrayTest.cpp +++ b/test/nt/ntndarrayTest.cpp @@ -12,6 +12,7 @@ using namespace epics::nt; using namespace epics::pvData; using std::tr1::dynamic_pointer_cast; +static FieldCreatePtr fieldCreate = getFieldCreate(); void test_builder() { @@ -25,6 +26,8 @@ void test_builder() addTimeStamp()-> addAlarm()-> addDisplay()-> + add("extra1",fieldCreate->createScalar(pvString)) -> + add("extra2",fieldCreate->createScalarArray(pvString)) -> createStructure(); testOk1(structure.get() != 0); if (!structure) @@ -73,6 +76,7 @@ void test_narrow() if (!pvStructure) return; + testOk1(NTNDArray::is_compatible(pvStructure)==true); NTNDArrayPtr ptr = NTNDArray::narrow(pvStructure); testOk(ptr.get() != 0, "narrow OK"); @@ -81,7 +85,7 @@ void test_narrow() } MAIN(testNTNDArray) { - testPlan(22); + testPlan(23); test_builder(); test_narrow(); return testDone(); diff --git a/test/nt/ntscalarArrayTest.cpp b/test/nt/ntscalarArrayTest.cpp index 73122a0..11128b0 100644 --- a/test/nt/ntscalarArrayTest.cpp +++ b/test/nt/ntscalarArrayTest.cpp @@ -13,6 +13,8 @@ using namespace epics::nt; using namespace epics::pvData; using std::tr1::dynamic_pointer_cast; +static FieldCreatePtr fieldCreate = getFieldCreate(); + void test_builder() { testDiag("test_builder"); @@ -27,6 +29,8 @@ void test_builder() addTimeStamp()-> addDisplay()-> addControl()-> + add("extra1",fieldCreate->createScalar(pvString)) -> + add("extra2",fieldCreate->createScalarArray(pvString)) -> createStructure(); testOk1(structure.get() != 0); if (!structure) @@ -34,7 +38,7 @@ void test_builder() testOk1(NTScalarArray::is_a(structure)); testOk1(structure->getID() == NTScalarArray::URI); - testOk1(structure->getNumberFields() == 6); + testOk1(structure->getNumberFields() == 8); testOk1(structure->getField("value").get() != 0); testOk1(structure->getField("descriptor").get() != 0); testOk1(structure->getField("alarm").get() != 0); @@ -222,6 +226,7 @@ void test_narrow() if (!pvStructure) return; + testOk1(NTScalarArray::is_compatible(pvStructure)==true); NTScalarArrayPtr ptr = NTScalarArray::narrow(pvStructure); testOk(ptr.get() != 0, "narrow OK"); @@ -230,7 +235,7 @@ void test_narrow() } MAIN(testNTScalarArray) { - testPlan(37); + testPlan(38); test_builder(); test_ntscalarArray(); test_narrow(); diff --git a/test/nt/ntscalarTest.cpp b/test/nt/ntscalarTest.cpp index 076fd57..012e203 100644 --- a/test/nt/ntscalarTest.cpp +++ b/test/nt/ntscalarTest.cpp @@ -13,6 +13,7 @@ using namespace epics::nt; using namespace epics::pvData; using std::tr1::dynamic_pointer_cast; +static FieldCreatePtr fieldCreate = getFieldCreate(); void test_builder() { testDiag("test_builder"); @@ -27,6 +28,8 @@ void test_builder() addTimeStamp()-> addDisplay()-> addControl()-> + add("extra1",fieldCreate->createScalar(pvString)) -> + add("extra2",fieldCreate->createScalarArray(pvString)) -> createStructure(); testOk1(structure.get() != 0); if (!structure) @@ -34,7 +37,7 @@ void test_builder() testOk1(NTScalar::is_a(structure)); testOk1(structure->getID() == NTScalar::URI); - testOk1(structure->getNumberFields() == 6); + testOk1(structure->getNumberFields() == 8); testOk1(structure->getField("value").get() != 0); testOk1(structure->getField("descriptor").get() != 0); testOk1(structure->getField("alarm").get() != 0); @@ -211,6 +214,7 @@ void test_narrow() if (!pvStructure) return; + testOk1(NTScalar::is_compatible(pvStructure)==true); NTScalarPtr ptr = NTScalar::narrow(pvStructure); testOk(ptr.get() != 0, "narrow OK"); @@ -219,7 +223,7 @@ void test_narrow() } MAIN(testNTScalar) { - testPlan(34); + testPlan(35); test_builder(); test_ntscalar(); test_narrow(); diff --git a/test/nt/nttableTest.cpp b/test/nt/nttableTest.cpp index e43b9c2..8d48d28 100644 --- a/test/nt/nttableTest.cpp +++ b/test/nt/nttableTest.cpp @@ -12,6 +12,7 @@ using namespace epics::nt; using namespace epics::pvData; using std::tr1::dynamic_pointer_cast; +static FieldCreatePtr fieldCreate = getFieldCreate(); void test_builder() { @@ -27,6 +28,8 @@ void test_builder() addDescriptor()-> addAlarm()-> addTimeStamp()-> + add("extra1",fieldCreate->createScalar(pvString)) -> + add("extra2",fieldCreate->createScalarArray(pvString)) -> createStructure(); testOk1(structure.get() != 0); if (!structure) @@ -84,6 +87,7 @@ void test_labels() if (!pvStructure) return; + testOk1(NTTable::is_compatible(pvStructure)==true); std::cout << *pvStructure << std::endl; PVStringArrayPtr labels = pvStructure->getSubField("labels"); @@ -230,7 +234,7 @@ void test_narrow() } MAIN(testNTTable) { - testPlan(45); + testPlan(46); test_builder(); test_labels(); test_nttable();