Salome HOME
[Code coverage FeaturesPlugin]: Minor improvements to increase coverage
[modules/shaper.git] / src / PythonAPI / model / tests / tests.py
index ff7ce4dddedba4ee5d7a50b337c0b9d754370673..f888453dd67830271a9915d73aa2fac00386f9b1 100644 (file)
@@ -42,14 +42,14 @@ def generateTests(theFeature, theFeatureName, theTestsList = []):
   """
   if "testNbResults" in theTestsList or len(theTestsList) == 0:
     aNbResults = len(theFeature.results())
-    print "model.testNbResults({}, {})".format(theFeatureName, aNbResults)
+    print("model.testNbResults({}, {})".format(theFeatureName, aNbResults))
 
   if "testNbSubResults" in theTestsList or len(theTestsList) == 0:
     aNbResults = len(theFeature.results())
     aNbSubResults = []
     for anIndex in range(0, aNbResults):
       aNbSubResults.append(theFeature.results()[anIndex].numberOfSubs())
-    print "model.testNbSubResults({}, {})".format(theFeatureName, aNbSubResults)
+    print("model.testNbSubResults({}, {})".format(theFeatureName, aNbSubResults))
 
   if "testNbSubShapes" in theTestsList or len(theTestsList) == 0:
     aNbResults = len(theFeature.results())
@@ -61,16 +61,16 @@ def generateTests(theFeature, theFeatureName, theTestsList = []):
         aShapeExplorer = GeomAPI_ShapeExplorer(aShape, aShapeType)
         while aShapeExplorer.more():
           aNbResultSubShapes += 1
-          aShapeExplorer.next();
+          aShapeExplorer.next()
         aNbSubShapes.append(aNbResultSubShapes)
-      print "model.testNbSubShapes({}, {}, {})".format(theFeatureName, aShapeTypes[aShapeType], aNbSubShapes)
+      print("model.testNbSubShapes({}, {}, {})".format(theFeatureName, aShapeTypes[aShapeType], aNbSubShapes))
 
   if "testResultsVolumes" in theTestsList or len(theTestsList) == 0:
     aNbResults = len(theFeature.results())
     aResultsVolumes = []
     for anIndex in range(0, aNbResults):
       aResultsVolumes.append(GeomAlgoAPI_ShapeTools_volume(theFeature.results()[anIndex].resultSubShapePair()[0].shape()))
-    print "model.testResultsVolumes({}, [{}])".format(theFeatureName, ", ".join("{:0.27f}".format(i) for i in aResultsVolumes))
+    print("model.testResultsVolumes({}, [{}])".format(theFeatureName, ", ".join("{:0.27f}".format(i) for i in aResultsVolumes)))
 
 
 def testNbResults(theFeature, theExpectedNbResults):
@@ -112,7 +112,7 @@ def testNbSubShapes(theFeature, theShapeType, theExpectedNbSubShapes):
     aShapeExplorer = GeomAPI_ShapeExplorer(aShape, theShapeType)
     while aShapeExplorer.more():
       aNbResultSubShapes += 1
-      aShapeExplorer.next();
+      aShapeExplorer.next()
     assert (aNbResultSubShapes == anExpectedNbSubShapes), "Number of sub-shapes of type {} for result[{}]: {}. Expected: {}.".format(aShapeTypes[theShapeType], anIndex, aNbResultSubShapes, anExpectedNbSubShapes)
 
 
@@ -130,7 +130,7 @@ def testResultsVolumes(theFeature, theExpectedResultsVolumes, theNbSignificantDi
     aResultVolumeStr = "{:0.27f}".format(aResultVolume).lstrip("0").lstrip(".").lstrip("0")
     anExpectedResultVolume = theExpectedResultsVolumes[anIndex]
     anExpectedResultVolumeStr = "{:0.27f}".format(anExpectedResultVolume).lstrip("0").lstrip(".").lstrip("0")
-    assert math.fabs(aResultVolume - anExpectedResultVolume) < aTolerance * anExpectedResultVolume, "Volume of result[{}]: {:0.27f}. Expected: {:0.27f}. The first {} significant digits not equal.".format(anIndex, aResultVolume, anExpectedResultVolume, theNbSignificantDigits)
+    assert math.fabs(aResultVolume - anExpectedResultVolume) < aTolerance * math.fabs(anExpectedResultVolume), "Volume of result[{}]: {:0.27f}. Expected: {:0.27f}. The first {} significant digits not equal.".format(anIndex, aResultVolume, anExpectedResultVolume, theNbSignificantDigits)
 
 def testHaveNamingFaces(theFeature, theModel, thePartDoc) :
   """ Tests if all faces of result have a name
@@ -198,43 +198,52 @@ def testHaveNamingEdges(theFeature, theModel, thePartDoc) :
     assert(shape.isEdge())
     assert(name != ""), "String empty"
 
+def lowerLevelSubResults(theResult, theList):
+  """ Collects in a list all lover level sub-results (without children).
+  Auxiliary method for context correct definition.
+  """
+  nbSubs = theResult.numberOfSubs()
+  if nbSubs == 0:
+    theList.append(theResult)
+  else:
+    for sub in range(0, nbSubs):
+      lowerLevelSubResults(theResult.subResult(sub), theList)
+
 def testHaveNamingByType(theFeature, theModel, thePartDoc, theSubshapeType) :
   """ Tests if all sub-shapes of result have a unique name
   :param theFeature: feature to test.
   :param theSubshapeType: type of sub-shape
   """
+  if not theFeature.results():
+    return
   aFirstRes = theFeature.results()[0]
-  # Get number of sub-results
-  hasSubs = True
-  nbSubs = aFirstRes.numberOfSubs()
-  if nbSubs == 0:
-    # no sub-results => treat current result as a sub
-    hasSubs = False
-    nbSubs = 1
+  aResList = []
+  lowerLevelSubResults(aFirstRes, aResList)
 
   selectionList = []
   shapesList = [] # to append only unique shapes (not isSame)
-  for sub in range(0, nbSubs):
+  for aR in aResList:
     # Get feature result/sub-result
-    if hasSubs:
-      aResult = aFirstRes.subResult(sub).resultSubShapePair()[0]
-    else:
-      aResult = aFirstRes.resultSubShapePair()[0]
+    aResult = aR.resultSubShapePair()[0]
     # Get result/sub-result shape
     shape = aResult.shape()
     # Create shape explorer with desired shape type
     shapeExplorer = GeomAPI_ShapeExplorer(shape, theSubshapeType)
     # Create list, and store selections in it
     while shapeExplorer.more():
+      current = shapeExplorer.current()
+      if current.isEdge() and GeomAPI.GeomAPI_Edge(current).isDegenerated(): # skip degenerative edges because they are not selected
+        shapeExplorer.next()
+        continue
       aDuplicate = False
       for alreadyThere in shapesList:
-        if alreadyThere.isSame(shapeExplorer.current()):
+        if alreadyThere.isSame(current):
           aDuplicate = True
       if aDuplicate:
         shapeExplorer.next()
         continue
-      shapesList.append(shapeExplorer.current())
-      selection = theModel.selection(aResult, shapeExplorer.current()) # First argument should be result/sub-result, second is sub-shape on this result/sub-result
+      shapesList.append(current)
+      selection = theModel.selection(aResult, current) # First argument should be result/sub-result, second is sub-shape on this result/sub-result
       selectionList.append(selection)
       shapeExplorer.next()
   # Create group with this selection list
@@ -254,6 +263,7 @@ def testHaveNamingSubshapes(theFeature, theModel, thePartDoc) :
   """ Tests if all vertices/edges/faces of result have a unique name
   :param theFeature: feature to test.
   """
+  assert(len(theFeature.results()) > 0)
   testHaveNamingByType(theFeature, theModel, thePartDoc, GeomAPI_Shape.VERTEX)
   testHaveNamingByType(theFeature, theModel, thePartDoc, GeomAPI_Shape.EDGE)
   testHaveNamingByType(theFeature, theModel, thePartDoc, GeomAPI_Shape.FACE)
@@ -283,8 +293,8 @@ def assertSketchArc(theArcFeature):
   assert math.fabs(aDistCS - aDistCE) < TOLERANCE, "Wrong arc: center-start distance {}, center-end distance {}".format(aDistCS, aDistCE)
   assert math.fabs(aRadius.value() -aDistCS) < TOLERANCE, "Wrong arc: radius is {0}, expected {1}".format(aRadius.value(), aDistCS)
 
-def checkBooleansResult(theFeature,theModel,NbRes,NbSubRes,NbSolid,NbFace,NbEdge,NbVertex):
-  """ Tests numbers of sub-shapes in results (used in Boolean operations tests)
+def checkResult(theFeature,theModel,NbRes,NbSubRes,NbSolid,NbFace,NbEdge,NbVertex):
+  """ Tests numbers of sub-shapes in results
   """
   theModel.testNbResults(theFeature, NbRes)
   theModel.testNbSubResults(theFeature, NbSubRes)
@@ -293,15 +303,6 @@ def checkBooleansResult(theFeature,theModel,NbRes,NbSubRes,NbSolid,NbFace,NbEdge
   theModel.testNbSubShapes(theFeature, GeomAPI_Shape.EDGE, NbEdge)
   theModel.testNbSubShapes(theFeature, GeomAPI_Shape.VERTEX, NbVertex)
 
-def checkSketch(theSketch, theDOF = -1):
-  """ Tests the sketch is valid and DoF is equal to the given
-  """
-  assert(theSketch.feature().error() == ""), "Sketch failed: {}".format(theSketch.feature().error())
-  assert(theSketch.solverError().value() == ""), "Sketch solver failed: {}".format(theSketch.solverError().value())
-  if theDOF != -1:
-    aDOF = sketcher.tools.dof(theSketch)
-    assert(aDOF == theDOF), "Sketch DoF {} is wrong. Expected {}".format(aDOF, theDOF)
-
 def checkGroup(theGroup, theShapeType):
   """ Check that all selected shapes in group have correct shape type and unique name
   """