fix bug in renameField; Add check for zero length fieldNames in Structure.
This commit is contained in:
@@ -184,6 +184,9 @@ Structure::Structure (StringArray const & fieldNames,FieldConstPtrArray const &
|
||||
size_t number = fields.size();
|
||||
for(size_t i=0; i<number; i++) {
|
||||
String name = fieldNames[i];
|
||||
if(name.size()<1) {
|
||||
throw std::invalid_argument("fieldNames has a zero length string");
|
||||
}
|
||||
// look for duplicates
|
||||
for(size_t j=i+1; j<number; j++) {
|
||||
String otherName = fieldNames[j];
|
||||
|
||||
@@ -139,9 +139,9 @@ void PVField::renameField(String newName)
|
||||
}
|
||||
std::tr1::shared_ptr<Structure> parentStructure = const_pointer_cast<Structure>(
|
||||
parent->getStructure());
|
||||
FieldConstPtrArray const &fields = parentStructure->getFields();
|
||||
for(size_t i=0; i<fields.size(); i++) {
|
||||
if(fields[i].get()==field.get()) {
|
||||
PVFieldPtrArray pvFields = parent->getPVFields();
|
||||
for(size_t i=0; i<pvFields.size(); i++) {
|
||||
if(pvFields[i].get()==this) {
|
||||
parentStructure->renameField(i,newName);
|
||||
fieldName = newName;
|
||||
return;
|
||||
|
||||
@@ -66,18 +66,18 @@ static void checkNameAndParent(
|
||||
|
||||
static void testAppendSimple(FILE * fd)
|
||||
{
|
||||
printf("\ntestAppendSimple\n");
|
||||
fprintf(fd,"\ntestAppendSimple\n");
|
||||
PVFieldPtrArray fields;
|
||||
StringArray names;
|
||||
PVStructurePtr pvParent = pvDataCreate->createPVStructure(names,fields);
|
||||
PVStringPtr pvStringField = static_pointer_cast<PVString>(
|
||||
pvDataCreate->createPVScalar(pvString));
|
||||
pvStringField->put(String("value,timeStamp"));
|
||||
pvStringField->put("value,timeStamp");
|
||||
PVFieldPtr pvField = pvStringField;
|
||||
pvParent->appendPVField("fieldlist",pvField);
|
||||
pvStringField = static_pointer_cast<PVString>(
|
||||
pvDataCreate->createPVScalar(pvString));
|
||||
pvStringField->put(String("junk"));
|
||||
pvStringField->put("junk");
|
||||
pvField = pvStringField;
|
||||
pvParent->appendPVField("extra",pvField);
|
||||
builder.clear();
|
||||
@@ -87,7 +87,7 @@ static void testAppendSimple(FILE * fd)
|
||||
|
||||
static void testAppendMore(FILE * fd)
|
||||
{
|
||||
printf("\ntestAppendMore\n");
|
||||
fprintf(fd,"\ntestAppendMore\n");
|
||||
PVFieldPtrArray fields;
|
||||
StringArray names;
|
||||
PVStructurePtr pvStructure = pvDataCreate->createPVStructure(names,fields);
|
||||
@@ -135,7 +135,7 @@ static void append2(PVStructurePtr &pvStructure,
|
||||
}
|
||||
static void testAppends(FILE * fd)
|
||||
{
|
||||
printf("\ntestAppends\n");
|
||||
fprintf(fd,"\ntestAppends\n");
|
||||
PVFieldPtrArray emptyPVFields;
|
||||
StringArray emptyNames;
|
||||
PVFieldPtrArray pvFields;
|
||||
|
||||
@@ -89,12 +89,13 @@ static void testPVScalarWithProperties(
|
||||
{
|
||||
PVStructurePtr pvStructure;
|
||||
bool hasValueAlarm = false;
|
||||
bool hasBooleanAlarm = false;
|
||||
bool hasDisplayControl = false;
|
||||
switch(stype) {
|
||||
case pvBoolean: {
|
||||
pvStructure = standardPVField->scalar(
|
||||
stype,alarmTimeStampValueAlarm);
|
||||
hasValueAlarm = true;
|
||||
hasBooleanAlarm = true;
|
||||
PVBooleanPtr pvField = pvStructure->getBooleanField("value");
|
||||
pvField->put(true);
|
||||
break;
|
||||
@@ -245,7 +246,13 @@ static void testPVScalarWithProperties(
|
||||
String("control.limitHigh"));
|
||||
assert(limit!=0);
|
||||
limit->put(9.0);
|
||||
}
|
||||
if(hasValueAlarm) {
|
||||
PVFieldPtr pvField = pvStructure->getSubField(
|
||||
String("valueAlarm.active"));
|
||||
PVBooleanPtr pvBoolean = static_pointer_cast<PVBoolean>(pvField);
|
||||
pvBoolean->put(true);
|
||||
pvField = pvStructure->getSubField(
|
||||
String("valueAlarm.lowAlarmLimit"));
|
||||
PVScalarPtr pvtemp = static_pointer_cast<PVScalar>(pvField);
|
||||
assert(pvtemp.get()!=0);
|
||||
@@ -268,6 +275,24 @@ static void testPVScalarWithProperties(
|
||||
assert(active!=0);
|
||||
active->put(true);
|
||||
}
|
||||
if(hasBooleanAlarm) {
|
||||
PVFieldPtr pvField = pvStructure->getSubField(
|
||||
String("valueAlarm.active"));
|
||||
PVBooleanPtr pvBoolean = static_pointer_cast<PVBoolean>(pvField);
|
||||
pvBoolean->put(true);
|
||||
severity = pvStructure->getIntField(
|
||||
String("valueAlarm.falseSeverity"));
|
||||
assert(severity!=0);
|
||||
severity->put(0);
|
||||
severity = pvStructure->getIntField(
|
||||
String("valueAlarm.trueSeverity"));
|
||||
assert(severity!=0);
|
||||
severity->put(2);
|
||||
severity = pvStructure->getIntField(
|
||||
String("valueAlarm.changeStateSeverity"));
|
||||
assert(severity!=0);
|
||||
severity->put(1);
|
||||
}
|
||||
builder.clear();
|
||||
pvStructure->toString(&builder);
|
||||
fprintf(fd,"%s\n",builder.c_str());
|
||||
|
||||
Reference in New Issue
Block a user