diff --git a/test/nt/Makefile b/test/nt/Makefile index 9aa0587..d948e0d 100644 --- a/test/nt/Makefile +++ b/test/nt/Makefile @@ -24,6 +24,10 @@ TESTPROD_HOST += ntmultiChannelTest ntmultiChannelTest_SRCS += ntmultiChannelTest.cpp TESTS += ntmultiChannelTest +TESTPROD_HOST += ntscalarMultiChannelTest +ntscalarMultiChannelTest_SRCS += ntscalarMultiChannelTest.cpp +TESTS += ntscalarMultiChannelTest + TESTPROD_HOST += nttableTest nttableTest_SRCS = nttableTest.cpp TESTS += nttableTest diff --git a/test/nt/ntscalarMultiChannelTest.cpp b/test/nt/ntscalarMultiChannelTest.cpp new file mode 100644 index 0000000..97bd199 --- /dev/null +++ b/test/nt/ntscalarMultiChannelTest.cpp @@ -0,0 +1,179 @@ +/** + * Copyright - See the COPYRIGHT that is included with this distribution. + * EPICS pvDataCPP is distributed subject to a Software License Agreement found + * in file LICENSE that is included with this distribution. + */ +/* + * ntscalarMultiChannelTest.cpp + * + * Created on: 2015.08 + * Authors: Marty Kraimer, Dave Hickin + */ + +#include +#include +#include +#include +#include +#include + +#include +#include + + +#include +#include +#include + +using namespace epics::pvData; +using namespace epics::nt; +using std::string; +using std::cout; +using std::endl; +using std::vector; + +static bool debug = false; + +static FieldCreatePtr fieldCreate = getFieldCreate(); +static PVDataCreatePtr pvDataCreate = getPVDataCreate(); +static NTFieldPtr ntField = NTField::get(); +static PVNTFieldPtr pvntField = PVNTField::get(); + +static void test() +{ + NTScalarMultiChannelBuilderPtr builder = NTScalarMultiChannel::createBuilder(); + testOk(builder.get() != 0, "Got builder"); + + NTScalarMultiChannelPtr multiChannel = builder-> + addDescriptor()-> + addAlarm()-> + addTimeStamp()-> + addSeverity() -> + add("extra1",fieldCreate->createScalar(pvString)) -> + add("extra2",fieldCreate->createScalarArray(pvString)) -> + create(); + testOk1(multiChannel.get() != 0); + + PVStructurePtr pvStructure = multiChannel->getPVStructure(); + testOk1(pvStructure.get()!=NULL); + testOk1(NTScalarMultiChannel::is_a(pvStructure->getStructure())); + size_t nchan = 3; + shared_vector names(nchan); + names[0] = "channel 0"; + names[1] = "channel 1"; + names[2] = "channel 2"; + shared_vector channelNames(freeze(names)); + PVStringArrayPtr pvChannelName = multiChannel->getChannelName(); + pvChannelName->replace(channelNames); + if(debug) {cout << *pvStructure << endl;} + multiChannel = builder-> + value(pvDouble) -> + addDescriptor()-> + addAlarm()-> + addTimeStamp()-> + addSeverity() -> + create(); + testOk1(multiChannel.get() != 0); + pvStructure = multiChannel->getPVStructure(); + if(debug) {cout << *pvStructure << endl;} + pvChannelName = multiChannel->getChannelName(); + pvChannelName->replace(channelNames); + PVDoubleArrayPtr pvValue = multiChannel->getValue(); + PVDoubleArray::svector doubles(nchan); + doubles.resize(nchan); + doubles[0] = 3.14159; + doubles[1] = 2.71828; + doubles[2] = 137.036; + pvValue->replace(freeze(doubles)); + shared_vector severities(nchan); + severities[0] = 0; + severities[1] = 1; + severities[2] = 2; + PVIntArrayPtr pvSeverity = multiChannel->getSeverity(); + pvSeverity->replace(freeze(severities)); + if(debug) {cout << *pvStructure << endl;} + PVBooleanArrayPtr pvIsConnected = multiChannel->getIsConnected(); + shared_vector isConnected = pvIsConnected->view(); + multiChannel = builder-> + value(pvDouble) -> + addDescriptor()-> + addAlarm()-> + addTimeStamp()-> + addSeverity() -> + addStatus() -> + addMessage() -> + addSecondsPastEpoch() -> + addNanoseconds() -> + addUserTag() -> + create(); + testOk1(multiChannel.get() != 0); + pvStructure = multiChannel->getPVStructure(); + if(debug) {cout << *pvStructure << endl;} + testOk1(NTScalarMultiChannel::isCompatible(pvStructure)==true); + PVStructurePtr pvTimeStamp = multiChannel->getTimeStamp(); + testOk1(pvTimeStamp.get() !=0); + PVStructurePtr pvAlarm = multiChannel->getAlarm(); + testOk1(pvAlarm.get() !=0); + pvValue = multiChannel->getValue(); + testOk1(pvValue.get() !=0); + pvChannelName = multiChannel->getChannelName(); + testOk1(pvChannelName.get() !=0); + pvIsConnected = multiChannel->getIsConnected(); + testOk1(pvIsConnected.get() !=0); + pvSeverity = multiChannel->getSeverity(); + testOk1(pvSeverity.get() !=0); + PVIntArrayPtr pvStatus = multiChannel->getStatus(); + testOk1(pvStatus.get() !=0); + PVStringArrayPtr pvMessage = multiChannel->getMessage(); + testOk1(pvMessage.get() !=0); + PVLongArrayPtr pvSecondsPastEpoch = multiChannel->getSecondsPastEpoch(); + testOk1(pvSecondsPastEpoch.get() !=0); + PVIntArrayPtr pvNanoseconds = multiChannel->getNanoseconds(); + testOk1(pvNanoseconds.get() !=0); + PVIntArrayPtr pvUserTag = multiChannel->getUserTag(); + testOk1(pvUserTag.get() !=0); + PVStringPtr pvDescriptor = multiChannel->getDescriptor(); + testOk1(pvDescriptor.get() !=0); +} + + +void test_wrap() +{ + testDiag("test_wrap"); + + NTScalarMultiChannelPtr nullPtr = NTScalarMultiChannel::wrap(PVStructurePtr()); + testOk(nullPtr.get() == 0, "nullptr wrap"); + + nullPtr = NTScalarMultiChannel::wrap( + getPVDataCreate()->createPVStructure( + NTField::get()->createTimeStamp() + ) + ); + testOk(nullPtr.get() == 0, "wrong type wrap"); + + + NTScalarMultiChannelBuilderPtr builder = NTScalarMultiChannel::createBuilder(); + testOk(builder.get() != 0, "Got builder"); + + PVStructurePtr pvStructure = builder-> + createPVStructure(); + testOk1(pvStructure.get() != 0); + if (!pvStructure) + return; + + NTScalarMultiChannelPtr ptr = NTScalarMultiChannel::wrap(pvStructure); + testOk(ptr.get() != 0, "wrap OK"); + + builder = NTScalarMultiChannel::createBuilder(); + ptr = NTScalarMultiChannel::wrapUnsafe(pvStructure); + testOk(ptr.get() != 0, "wrapUnsafe OK"); +} + +MAIN(testCreateRequest) +{ + testPlan(25); + test(); + test_wrap(); + return testDone(); +} +