Files
pvData/testApp/pv/testPVStructureArray.cpp
2013-07-25 17:30:33 -04:00

160 lines
4.0 KiB
C++

/* testPVStructureArray.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.10 */
#include <cstddef>
#include <cstdlib>
#include <cstddef>
#include <string>
#include <cstdio>
#include <epicsAssert.h>
#include <epicsExit.h>
#include <pv/requester.h>
#include <pv/pvIntrospect.h>
#include <pv/pvData.h>
#include <pv/convert.h>
#include <pv/standardField.h>
#include <pv/standardPVField.h>
#include <epicsUnitTest.h>
#include <testMain.h>
using namespace epics::pvData;
static FieldCreatePtr fieldCreate;
static PVDataCreatePtr pvDataCreate;
static StandardFieldPtr standardField;
static StandardPVFieldPtr standardPVField;
static ConvertPtr convert;
static void testBasic()
{
testDiag("Basic structure array ops");
StructureArrayConstPtr alarmtype(
fieldCreate->createStructureArray(standardField->alarm()));
PVStructureArrayPtr alarmarr(pvDataCreate->createPVStructureArray(alarmtype));
testOk1(alarmarr->getLength()==0);
alarmarr->setLength(5);
testOk1(alarmarr->getLength()==5);
PVStructureArray::const_svector aview = alarmarr->view();
testOk1(aview.size()==5);
testOk1(aview[4].get()==NULL);
alarmarr->append(2);
testOk1(alarmarr->getLength()==7);
aview = alarmarr->view();
testOk1(aview[4].get()==NULL);
testOk1(aview[5].get()!=NULL);
testOk1(aview[6].get()!=NULL);
}
static void testCompress()
{
testDiag("Test structure array compress");
StructureArrayConstPtr alarmtype(
fieldCreate->createStructureArray(standardField->alarm()));
PVStructureArrayPtr alarmarr(pvDataCreate->createPVStructureArray(alarmtype));
alarmarr->setLength(5);
testOk1(alarmarr->getLength()==5);
alarmarr->compress();
testOk1(alarmarr->getLength()==0);
alarmarr->setLength(4);
testOk1(alarmarr->getLength()==4);
PVStructureArray::svector contents(10);
contents[2] = pvDataCreate->createPVStructure(standardField->alarm());
contents[4] = pvDataCreate->createPVStructure(standardField->alarm());
contents[5] = pvDataCreate->createPVStructure(standardField->alarm());
contents[8] = pvDataCreate->createPVStructure(standardField->alarm());
PVStructureArray::const_svector scont(freeze(contents));
alarmarr->replace(scont);
testOk1(!scont.unique());
testOk1(alarmarr->getLength()==10);
alarmarr->compress();
testOk1(scont.unique()); // a realloc happened
testOk1(alarmarr->getLength()==4);
PVStructureArray::svector compressed(alarmarr->reuse());
testOk1(scont[2]==compressed[0]);
testOk1(scont[4]==compressed[1]);
testOk1(scont[5]==compressed[2]);
testOk1(scont[8]==compressed[3]);
}
static void testRemove()
{
testDiag("Test structure array remove");
PVStructureArray::svector contents(10);
for(size_t i=0; i<contents.size(); i++)
contents[i] = pvDataCreate->createPVStructure(standardField->alarm());
StructureArrayConstPtr alarmtype(
fieldCreate->createStructureArray(standardField->alarm()));
PVStructureArrayPtr alarmarr(pvDataCreate->createPVStructureArray(alarmtype));
PVStructureArray::const_svector scont(freeze(contents));
alarmarr->replace(scont);
alarmarr->remove(0, 10); // all
testOk1(alarmarr->getLength()==0);
alarmarr->replace(scont);
alarmarr->remove(1, 1);
PVStructureArray::const_svector check(alarmarr->view());
testOk1(scont[0]==check[0]);
testOk1(scont[2]==check[1]);
testOk1(scont[3]==check[2]);
}
MAIN(testPVStructureArray)
{
testPlan(0);
testDiag("Testing structure array handling");
fieldCreate = getFieldCreate();
pvDataCreate = getPVDataCreate();
standardField = getStandardField();
standardPVField = getStandardPVField();
testBasic();
testCompress();
testRemove();
return testDone();
}