fix bug in renameField; Add check for zero length fieldNames in Structure.

This commit is contained in:
Marty Kraimer
2012-06-22 14:04:05 -04:00
parent 3991a51fd6
commit 12d13bc2c0
4 changed files with 37 additions and 9 deletions

View File

@@ -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];

View File

@@ -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;

View File

@@ -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;

View File

@@ -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());