/* testPVScalarArray.cpp */ /** * Copyright - See the COPYRIGHT that is included with this distribution. * EPICS pvData is distributed subject to a Software License Agreement found * in file LICENSE that is included with this distribution. */ /* Author: Marty Kraimer Date: 2010.11 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace epics::pvData; using std::tr1::static_pointer_cast; namespace { static void testFactory() { testDiag("Check array creation"); for(ScalarType e=pvBoolean; e<=pvString; e=(ScalarType)(1+(int)e)) { testDiag("Check type %s", ScalarTypeFunc::name(e)); PVScalarArrayPtr arr = getPVDataCreate()->createPVScalarArray(e); testOk1(arr.get()!=NULL); if(!arr.get()) continue; testOk1(arr->getScalarArray()->getElementType()==e); testOk1(arr->getLength()==0); arr->setLength(10); testOk1(arr->getLength()==10); testOk1(arr->getCapacity()>=10); arr->setLength(0); testOk1(arr->getLength()==0); } } template struct basicTestData { static inline void fill(typename PVT::svector& data) { data.resize(100); for(typename PVT::value_type i=0; (size_t)i struct basicTestData { static inline void fill(PVStringArray::svector& data) { PVIntArray::svector idata; basicTestData::fill(idata); data.resize(idata.size()); castUnsafeV(data.size(), pvString, data.data(), pvInt, idata.data()); } }; template static void testBasic() { testDiag("Check basic array operations for %s", typeid(PVT).name()); typename PVT::shared_pointer arr1 = static_pointer_cast(getPVDataCreate()->createPVScalarArray(PVT::typeCode)); typename PVT::shared_pointer arr2 = static_pointer_cast(getPVDataCreate()->createPVScalarArray(PVT::typeCode)); testOk1(*arr1==*arr2); testOk1(*arr1==*arr1); testOk1(*arr1->getScalarArray()==*arr2->getScalarArray()); typename PVT::svector data; data.reserve(200); basicTestData::fill(data); testOk1(data.unique()); arr1->replace(data); testOk1(!data.unique()); testOk1(arr1->getLength()==data.size()); testOk1(*arr1!=*arr2); data.clear(); testOk1(arr1->viewUnsafe().unique()); arr2->assign(*arr1); testOk1(*arr1==*arr2); testOk1(!arr1->viewUnsafe().unique()); arr2->swap(data); testOk1(arr2->getLength()==0); testOk1(data.size()==arr1->getLength()); PVIntArray::svector idata; arr1->PVScalarArray::getAs(idata); testOk1(idata[1]==10); idata.make_unique(); idata[1] = 42; arr1->PVScalarArray::putFrom(idata); testOk1(castUnsafe(arr1->viewUnsafe()[1])==42); } static void testShare() { testDiag("Check array data sharing"); PVIntArrayPtr iarr = static_pointer_cast(getPVDataCreate()->createPVScalarArray(pvInt)); PVStringArrayPtr sarr = static_pointer_cast(getPVDataCreate()->createPVScalarArray(pvString)); PVIntArray::svector idata(4, 1); sarr->PVScalarArray::putFrom(idata); // copy and convert testOk1(idata.unique()); iarr->PVScalarArray::putFrom(idata); // take a reference testOk1(!idata.unique()); idata.clear(); sarr->PVScalarArray::getAs(idata); // copy and convert testOk1(idata.unique()); iarr->PVScalarArray::getAs(idata); // take a reference testOk1(!idata.unique()); } } // end namespace MAIN(testPVScalarArray) { testPlan(146); testFactory(); testBasic(); testBasic(); testBasic(); testBasic(); testBasic(); testShare(); return testDone(); }