11 from builtins
import str
12 from builtins
import object
61 import xml.etree.cElementTree
as etree
65 from random
import shuffle
66 from datetime
import datetime
83 __fieldValueTestCaseSet =
None
100 def __init__ (self, ctx, filename, testRunName=None, randomOrder=False):
109 self.
__testRunName__testRunName = testRunName
if testRunName
else str(datetime.now())
166 def next (self, verbose=False, saveEachCase = True):
168 if not self.
__running__running
or not self.
__testCase__testCase.verifyExpectedResults(failedFieldList=failedFieldList, findAll=
True, verbose=verbose):
169 return False, failedFieldList
191 print(
"finishing run")
201 def prev (self, verbose = False):
205 print(
"going to prev test case")
217 print(
"going to case with id ", id)
225 def __setTestCase (self):
259 __fieldValueTestCaseDict =
None
268 self.
__ctx__ctx = context
270 self.
__xmlRoot__xmlRoot = etree.Element(
'FieldValueTestCaseSet')
283 mevis.MLAB.logError(
"There are already field-value test cases in this set. Loading not supported in this case!")
286 elif not os.path.isfile(filename):
287 mevis.MLAB.logError(
"File %s does not exist." % (filename))
291 xmlTree = etree.parse(filename)
292 xmlRoot = xmlTree.getroot()
293 if not self.
__verify__verify(xmlRoot):
299 for node
in self.
__xmlRoot__xmlRoot.findall(
'FieldValueTestCase'):
300 testCaseName = node.get(
'name')
309 for node
in self.
__xmlRoot__xmlRoot.findall(
'FieldValueTestCase'):
310 name = node.get(
'name')
329 def add (self, fieldValueTestCase):
331 name = fieldValueTestCase.getName()
333 mevis.MLAB.logError(
"Test with name %s already known!" % (name))
337 self.
__xmlRoot__xmlRoot.append(fieldValueTestCase.save())
348 def copy (self, source, destination):
351 mevis.MLAB.logError(
"FieldValueTestCase with name %s not known!" % (source))
376 mevis.MLAB.logError(
"FieldValueTestCase with name %s not known!" % (name))
399 mevis.MLAB.logError(
"FieldValueTestCase with name %s not known!" % (name))
402 mevis.MLAB.logError(
"FieldValueTestCase with name %s already exists!" % (newName))
411 node.set(
'name', newName)
415 if not fieldValueTestCase
is None:
416 fieldValueTestCase.setName(newName)
428 fieldValueTestCase =
None
430 mevis.MLAB.logError(
"FieldValueTestCase with name %s not found!" % (name))
438 return fieldValueTestCase
442 def __verify (self, xmlRoot):
443 if not xmlRoot.tag ==
"FieldValueTestCaseSet":
446 for fieldValueTestCaseNode
in xmlRoot:
447 if not fieldValueTestCaseNode.tag ==
"FieldValueTestCase":
448 mevis.MLAB.logError(
"Only FieldValueTestCase nodes allowed.")
450 settingsNode = fieldValueTestCaseNode.find(
"Settings")
451 resultsNode = fieldValueTestCaseNode.find(
"Results")
452 if settingsNode
is None or resultsNode
is None:
453 mevis.MLAB.logError(
"Settings and Results node must be defined.")
455 if len(fieldValueTestCaseNode) != 2:
456 mevis.MLAB.logError(
"Wrong number of children (%d instead of 2)." % (len(fieldValueTestCaseNode)))
458 flList = [
False,
False,
False]
459 for fieldListNode
in settingsNode:
460 if fieldListNode.tag ==
"FieldValueList":
461 name = fieldListNode.get(
"name")
462 if name ==
"Parameterization" and not flList[0]:
464 elif name ==
"ExpectedResults" and not flList[1]:
467 mevis.MLAB.logError(
"Only FieldValueLists with name Parameterization or ExpectedResults allowed here.")
469 elif fieldListNode.tag ==
"FieldList":
470 name = fieldListNode.get(
"name")
471 if name ==
"ResultsToSave" and not flList[2]:
474 mevis.MLAB.logError(
"Only FieldLists with name ResultsToSave allowed here (not %s)." % (name))
477 mevis.MLAB.logError(
"Only FieldValueList and FieldList allowed here (not %s)." % (fieldListNode.tag))
479 for child
in fieldListNode:
480 if child.tag !=
"Field":
481 mevis.MLAB.logError(
"There must only be nodes of type Field.")
483 if not (child.get(
"module") !=
None and child.get(
"field") !=
None and child.get(
"type") !=
None):
484 mevis.MLAB.logError(
"Each field must have information on the module, field and type.")
486 if not flList[0]
or not flList[1]
or not flList[2]:
487 mevis.MLAB.logError(
"There must be FieldValueLists (with name Parameterization and ExpectedResults) and a FieldList (with name ResultsToSave).")
489 for fieldListNode
in resultsNode:
503 def __getFieldValueTestCaseNode (self, name):
504 for node
in self.
__xmlRoot__xmlRoot.findall(
'FieldValueTestCase'):
505 if node.get(
'name') == name:
507 mevis.MLAB.logError(
"FieldValueTestCase %s not found in XML data-structure!" % (name))
527 __fieldValueListDict =
None
554 def add (self, fieldInfo, index=None):
556 if not index
is None:
559 if index > len(self):
563 return self._add(index, fieldInfo)
572 if index >= 0
and index < len(self):
584 def swap (self, indexA, indexB):
586 if indexA>=0
and indexA<len(self)
and indexB>=0
and indexB<len(self)
and indexA!=indexB:
588 self[indexA] = self[indexB]
599 for fieldNode
in xmlNode.findall(
'Field'):
600 self.append(self._loadField(fieldNode))
607 xmlNode = etree.Element(self.
_type_type, name=self.
__name__name)
608 for fieldInfo
in self:
609 self._saveField(fieldInfo, xmlNode)
622 FieldValueTestCase.FieldListBase.__init__(self, name)
637 def _add (self, index, fieldInfo):
638 self.insert(index, fieldInfo[0:3])
645 def _loadField (self, xmlNode):
646 return (xmlNode.get(
"module"), xmlNode.get(
"field"), xmlNode.get(
"type"))
653 def _saveField (self, fieldInfo, xmlNode):
654 etree.SubElement(xmlNode,
'Field', module=fieldInfo[0], field=fieldInfo[1], type=fieldInfo[2])
664 FieldValueTestCase.FieldListBase.__init__(self, name)
672 fieldType = fieldInfo[2]
673 fieldValue = self.
__convertValue__convertValue(fieldInfo[3], fieldType)
674 self[index] = (fieldInfo[0], fieldInfo[1], fieldType, fieldValue)
681 def _add (self, index, fieldInfo):
682 self.insert(index, fieldInfo)
689 def _loadField (self, xmlNode):
690 fieldType = xmlNode.get(
"type")
691 fieldValue = self.
__convertValue__convertValue(xmlNode.text, fieldType)
692 return (xmlNode.get(
"module"), xmlNode.get(
"field"), fieldType, fieldValue)
699 def _saveField (self, fieldInfo, xmlNode):
700 if fieldInfo[2]
not in (
'Trigger'):
701 etree.SubElement(xmlNode,
'Field', module=fieldInfo[0], field=fieldInfo[1], type=fieldInfo[2]).text = str(fieldInfo[3])
703 etree.SubElement(xmlNode,
'Field', module=fieldInfo[0], field=fieldInfo[1], type=fieldInfo[2])
711 def __convertValue (self, value, type):
712 if type ==
"Integer":
714 elif type
in (
'Float',
'Double'):
716 elif 'Vector' in type:
717 value = tuple([float(x)
for x
in value[1:-1].split(
',')])
719 value = value==
"True"
720 elif type ==
'Trigger':
723 if type
not in (
'Enum',
'String'):
724 mevis.MLAB.log(
"Maybe type %s should be supported?!" % (type))
738 self.
__ctx__ctx = ctx
746 self.
__load__load(xmlNode)
772 xmlNode = etree.Element(
'FieldValueTestCase', name=self.
__name__name)
773 settingsNode = etree.SubElement(xmlNode,
'Settings')
774 resultsNode = etree.SubElement(xmlNode,
'Results')
776 settingsNode = xmlNode.find(
'Settings')
777 resultsNode = xmlNode.find(
'Results')
806 fieldName =
"%s.%s" % (item[0], item[1])
807 if item[2]
in (
"Trigger"):
810 changeSet.setFieldValue(fieldName, item[3], verbose=verbose)
831 fieldName =
"%s.%s" % (item[0], item[1])
832 field = self.
__ctx__ctx.field(fieldName)
835 mevis.MLAB.logError(
"Unknown field: %s." % (fieldName))
838 if field.type
in (
"Float",
"Double"):
840 match = abs(field.value-item[3]) < 0.0001
842 match = field.value == item[3]
844 failedFieldList.append(fieldName)
846 mevis.MLAB.logError(
"Field %s: Value %s does not match expected value %s!" % (fieldName, field.value, item[3]))
869 mevis.MLAB.logError(
"Result with name %s available already." % (name))
874 fldName =
"%s.%s" % (item[0], item[1])
875 if item[2] ==
"Trigger":
879 fldValue = self.
__ctx__ctx.field(fldName).value
880 resList.append(tuple((item[0], item[1], item[2], fldValue)))
897 mevis.MLAB.logError(
"Result with name %s available already." % (name))
903 resToSaveList.append(
"%s.%s" % (item[0], item[1]))
904 for item
in resultList:
905 field =
"%s.%s" % (item[0], item[1])
906 if not field
in resToSaveList:
907 mevis.MLAB.logError(
"Field %s not in list of results to save. Ignoring it." % (field))
919 mevis.MLAB.logError(
'No result with name %s available.' % (name))
927 def __load (self, xmlNode):
928 node = xmlNode.find(
'Settings')
929 for fieldValueListNode
in node.findall(
'FieldValueList'):
930 self.
__fieldValueListDict__fieldValueListDict[fieldValueListNode.get(
'name')].load(fieldValueListNode)
931 for fieldListNode
in node.findall(
'FieldList'):
933 for resultNode
in xmlNode.findall(
'Results/FieldValueList'):
934 name = resultNode.get(
'name')
Class to handle field changes and make them revertable.
A class to iterate over the list of field-value test cases of a given set.
def finish(self, verbose=False)
Finish the current test run.
def isFinished(self)
Are there any test cases left to iterate?
def getCurrentCaseName(self)
Return the index of the current case.
def next(self, verbose=False, saveEachCase=True)
Change to the next field-value test case.
def __init__(self, ctx, filename, testRunName=None, randomOrder=False)
The default constructor.
def getNumCases(self)
Return the number of cases of the loaded test case set.
def goToCaseWithId(self, id, verbose=False)
Go to test case with specified id.
def getCurrentIndex(self)
Return the index of the current case.
def getStatusString(self)
Return a string containing the current case id, current case name and number of cases.
def prev(self, verbose=False)
Go back to the previous test case.
A class collecting a set of field-value test cases.
def getList(self)
Return the list of names of the existing field-value test cases.
def remove(self, name)
Remove the field-value test case with the given name.
def __verify(self, xmlRoot)
def save(self, filename)
Save the XML data structure.
def rename(self, name, newName)
Rename a given field-value test case.
def __getFieldValueTestCaseNode(self, name)
def __init__(self, context)
The default constructor.
def load(self, filename)
Try to load the field-value test case set from the given XML file.
def add(self, fieldValueTestCase)
Add the given field-value test case to the FieldValueTestCaseSet.
def copy(self, source, destination)
Create a copy of the given field-value test case with the given new name.
def get(self, name)
Return the field-value test case with the given name.
Superclass for the field lists used in the field-value test case.
def remove(self, index)
Remove the element at the given index.
def __init__(self, name)
Default constructor.
def add(self, fieldInfo, index=None)
Add the field with given info to the list.
def swap(self, indexA, indexB)
Swap the given two elements.
def save(self)
Save the field information to XML.
def load(self, xmlNode)
Load the given xmlNode.
List of field information.
def __init__(self, name)
Default constructor.
def update(self, index, fieldInfo)
Update the values of the given fields.
List of field information including field values.
def update(self, index, fieldInfo)
Update the values of the given fields.
def __init__(self, name)
Default constructor.
def __convertValue(self, value, type)
A class implementing the field-value test cases.
def addSavedResultList(self, name, resultList)
Add saved results.
def getName(self)
Return the name of the field-value test case.
def getSavedResultList(self)
Get a sorted list of names of the saved results.
def saveResults(self, name, overwrite=False)
Save the given field values to the xml data structure.
def __load(self, xmlNode)
def getSavedResult(self, name)
Get the field-value list saved under the given name.
def getExpectedResults(self)
Getter for the list of expected results.
def __init__(self, name, ctx, xmlNode=None)
The default constructor.
def getParameterization(self)
Return the parameterization set.
def save(self, xmlNode=None)
Save the settings of this field-value test case to an XML node.
def applyParameterization(self, changeSet, verbose=False)
Apply the parameterization to the context given in the constructor.
def getResultsToSave(self)
Return the results to save.
def verifyExpectedResults(self, failedFieldList=[], findAll=False, verbose=False)
Return the expected result set.
def setName(self, name)
Set the name of the field-value test case.
def touch(fieldName, verbose=True)
Touch the given field.