Salome HOME
[Code coverage ModelHighAPI]: Improve coverage
authorazv <azv@opencascade.com>
Mon, 17 Dec 2018 10:00:02 +0000 (13:00 +0300)
committerazv <azv@opencascade.com>
Tue, 18 Dec 2018 04:24:16 +0000 (07:24 +0300)
src/ModelAPI/CMakeLists.txt
src/ModelAPI/Test/TestFolder_CustomName.py
src/ModelAPI/Test/TestFolder_Empty.py [new file with mode: 0644]
src/ModelHighAPI/CMakeLists.txt
src/ModelHighAPI/ModelHighAPI_Dumper.cpp
src/ModelHighAPI/ModelHighAPI_Dumper.h
src/ModelHighAPI/ModelHighAPI_Folder.cpp
src/ModelHighAPI/ModelHighAPI_Selection.cpp
src/ModelHighAPI/Test/TestUndoRedo.py [new file with mode: 0644]

index 55fc4a99f2fab896d7fda96eff836c2a430cdd50..49ffb66457bc414917f11c7d1e2a1d8de89f3615 100644 (file)
@@ -199,6 +199,7 @@ ADD_UNIT_TESTS(TestConstants.py
                TestFolder_Remove.py
                TestFolder_Stability.py
                TestFolder_CustomName.py
+               TestFolder_Empty.py
                Test2358_1.py
                Test2358_2.py
                Test2396.py
index 81386cd039b95d71d84283aca850579568a1b583..5dcf158deb3ad2270857893a2484b376445f45f4 100644 (file)
@@ -52,4 +52,5 @@ Folder_1.setName("Box")
 
 model.end()
 
+assert(Folder_1.name() == "Box")
 assert(model.checkPythonDump())
diff --git a/src/ModelAPI/Test/TestFolder_Empty.py b/src/ModelAPI/Test/TestFolder_Empty.py
new file mode 100644 (file)
index 0000000..7813998
--- /dev/null
@@ -0,0 +1,53 @@
+## Copyright (C) 2018-20xx  CEA/DEN, EDF R&D
+##
+## This library is free software; you can redistribute it and/or
+## modify it under the terms of the GNU Lesser General Public
+## License as published by the Free Software Foundation; either
+## version 2.1 of the License, or (at your option) any later version.
+##
+## This library is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+## Lesser General Public License for more details.
+##
+## You should have received a copy of the GNU Lesser General Public
+## License along with this library; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##
+## See http:##www.salome-platform.org/ or
+## email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_1.addLine(0, 0, 0, 50)
+SketchLine_2 = Sketch_1.addLine(0, 50, 50, 50)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchLine_2.startPoint())
+SketchLine_3 = Sketch_1.addLine(50, 50, 50, 0)
+SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint())
+SketchLine_4 = Sketch_1.addLine(50, 0, 0, 0)
+SketchConstraintCoincidence_3 = Sketch_1.setCoincident(SketchLine_3.endPoint(), SketchLine_4.startPoint())
+SketchConstraintCoincidence_4 = Sketch_1.setCoincident(SketchLine_4.endPoint(), SketchLine_1.startPoint())
+SketchConstraintRigid_1 = Sketch_1.setFixed(SketchLine_1.startPoint())
+SketchConstraintVertical_1 = Sketch_1.setVertical(SketchLine_1.result())
+SketchConstraintLength_1 = Sketch_1.setLength(SketchLine_4.result(), 50)
+SketchConstraintLength_2 = Sketch_1.setLength(SketchLine_1.result(), 50)
+SketchConstraintParallel_1 = Sketch_1.setParallel(SketchLine_1.result(), SketchLine_3.result())
+SketchConstraintParallel_2 = Sketch_1.setParallel(SketchLine_2.result(), SketchLine_4.result())
+SketchConstraintPerpendicular_1 = Sketch_1.setPerpendicular(SketchLine_1.result(), SketchLine_4.result())
+model.do()
+Extrusion_1 = model.addExtrusion(Part_1_doc, [model.selection("FACE", "Sketch_1/Face-SketchLine_4r-SketchLine_3r-SketchLine_2r-SketchLine_1r")], model.selection(), 50, 0)
+Fillet_1 = model.addFillet(Part_1_doc, [model.selection("EDGE", "[Extrusion_1_1/Generated_Face&Sketch_1/SketchLine_4][Extrusion_1_1/To_Face]")], 2)
+model.do()
+
+Folder_1 = model.addFolder(Part_1_doc)
+
+model.end()
+
+# empty folder is not dumped
+assert(model.checkPythonDump(model.ModelHighAPI.CHECK_NAMING) == False)
index 8f0607feb14e491a229afb4f629a3fe99c28b14f..1a6ea1ab78feec63c585bc4742012e141243a0b4 100644 (file)
@@ -120,5 +120,6 @@ ADD_UNIT_TESTS(
   TestRefAttr.py
   TestReference.py
   TestDeflectionDump.py
+  TestUndoRedo.py
   Test2488.py
 )
index ca344ce987718519f9a7db4691c7f05b72dcb99f..b1bdf36e1babebb002dab5e67ea7d08fad921146 100644 (file)
@@ -441,20 +441,9 @@ bool ModelHighAPI_Dumper::exportTo(const std::string& theFileName)
 
   // standard header (encoding + imported modules)
   aFile << "# -*- coding: utf-8 -*-" << std::endl << std::endl;
-  for (ModulesMap::const_iterator aModIt = myModules.begin();
+  for (ModulesSet::const_iterator aModIt = myModules.begin();
        aModIt != myModules.end(); ++aModIt) {
-    aFile << "from " << aModIt->first << " import ";
-    if (aModIt->second.empty() ||
-        aModIt->second.find(std::string()) != aModIt->second.end())
-      aFile << "*"; // import whole module
-    else {
-      // import specific features
-      std::set<std::string>::const_iterator anObjIt = aModIt->second.begin();
-      aFile << *anObjIt;
-      for (++anObjIt; anObjIt != aModIt->second.end(); ++anObjIt)
-        aFile << ", " << *anObjIt;
-    }
-    aFile << std::endl;
+    aFile << "from " << *aModIt << " import *" << std::endl;
   }
   if (!myModules.empty())
     aFile << std::endl;
@@ -475,10 +464,9 @@ bool ModelHighAPI_Dumper::exportTo(const std::string& theFileName)
   return true;
 }
 
-void ModelHighAPI_Dumper::importModule(const std::string& theModuleName,
-                                       const std::string& theObject)
+void ModelHighAPI_Dumper::importModule(const std::string& theModuleName)
 {
-  myModules[theModuleName].insert(theObject);
+  myModules.insert(theModuleName);
 }
 
 void ModelHighAPI_Dumper::dumpEntitySetName()
@@ -688,7 +676,7 @@ ModelHighAPI_Dumper& ModelHighAPI_Dumper::operator<<(const double theValue)
 
 ModelHighAPI_Dumper& ModelHighAPI_Dumper::operator<<(const std::shared_ptr<GeomAPI_Pnt>& thePoint)
 {
-  importModule("GeomAPI", "GeomAPI_Pnt");
+  importModule("GeomAPI");
   myDumpBuffer << "GeomAPI_Pnt(" << thePoint->x() << ", "
                << thePoint->y() << ", " << thePoint->z() << ")";
   return *this;
@@ -696,7 +684,7 @@ ModelHighAPI_Dumper& ModelHighAPI_Dumper::operator<<(const std::shared_ptr<GeomA
 
 ModelHighAPI_Dumper& ModelHighAPI_Dumper::operator<<(const std::shared_ptr<GeomAPI_Dir>& theDir)
 {
-  importModule("GeomAPI", "GeomAPI_Dir");
+  importModule("GeomAPI");
   myDumpBuffer << "GeomAPI_Dir(" << theDir->x() << ", "
                << theDir->y() << ", " << theDir->z() << ")";
   return *this;
index 5c854bab23b7f02a50a3ff674aca14397b270e11..593b1efabf8d6b0b50363794a1a460d4b046a8dd 100644 (file)
@@ -102,11 +102,8 @@ public:
 
   /// Add module to list of imported modules
   /// \param theModuleName  name of the module to be imported
-  /// \param theObject      name of the entity to be imported
-  ///                       from the module (if empty, while module will be imported)
   MODELHIGHAPI_EXPORT
-  void importModule(const std::string& theModuleName,
-                    const std::string& theObject = std::string());
+  void importModule(const std::string& theModuleName);
 
   /// Returns name of specified entity
   /// \param theEntity        [in] named entity
@@ -331,7 +328,7 @@ private:
   };
 
   typedef std::map<EntityPtr, EntityName>                                      EntityNameMap;
-  typedef std::map<std::string, std::set<std::string> >                        ModulesMap;
+  typedef std::set<std::string>                                                ModulesSet;
   typedef std::map<DocumentPtr, std::map<std::string, std::pair<int, int> > >  NbFeaturesMap;
 
   struct LastDumpedEntity {
@@ -352,7 +349,7 @@ private:
   std::ostringstream  myDumpBuffer;         ///< intermediate buffer to store dumping data
   std::ostringstream  myFullDump;           ///< full buffer of dumped data
 
-  ModulesMap          myModules;            ///< modules and entities to be imported
+  ModulesSet          myModules;            ///< modules and entities to be imported
   EntityNameMap       myNames;              ///< names of the entities
   DumpStack           myEntitiesStack;      ///< stack of dumped entities
 
index c6280ffd4e3b2c1481340a9061a0c67a5a5e743a..77d696723bf36619630e0e2e073ce6a2dfdf1436 100644 (file)
@@ -74,8 +74,8 @@ void ModelHighAPI_Folder::dump(ModelHighAPI_Dumper& theDumper) const
 {
   const std::string& aDocName = theDumper.name(myFolder->document());
 
-  AttributeReferencePtr aStartRef = myFolder->reference(ModelAPI_Folder::FIRST_FEATURE_ID());
-  AttributeReferencePtr aEndRef   = myFolder->reference(ModelAPI_Folder::LAST_FEATURE_ID());
+  AttributeReferencePtr aStartRef = firstFeature();
+  AttributeReferencePtr aEndRef   = lastFeature();
 
   // do not dump empty folders
   if (!aEndRef->value())
index 20e834a6335461bcd240109d1e94b69b90388662..b9a9f0be5479305cc4eb0eb2cba7994a96107591 100644 (file)
@@ -221,6 +221,7 @@ void ModelHighAPI_Selection::setDeflection(double theValue)
   aDeflectionAttr->setValue(theValue);
 }
 
+// LCOV_EXCL_START
 void ModelHighAPI_Selection::setTransparency(double theValue)
 {
   if (myVariantType != VT_ResultSubShapePair)
@@ -231,6 +232,7 @@ void ModelHighAPI_Selection::setTransparency(double theValue)
 
   aTransparencyAttr->setValue(theValue);
 }
+// LCOV_EXCL_STOP
 
 int ModelHighAPI_Selection::numberOfSubs() const
 {
diff --git a/src/ModelHighAPI/Test/TestUndoRedo.py b/src/ModelHighAPI/Test/TestUndoRedo.py
new file mode 100644 (file)
index 0000000..593cf56
--- /dev/null
@@ -0,0 +1,37 @@
+## Copyright (C) 2018-20xx  CEA/DEN, EDF R&D
+##
+## This library is free software; you can redistribute it and/or
+## modify it under the terms of the GNU Lesser General Public
+## License as published by the Free Software Foundation; either
+## version 2.1 of the License, or (at your option) any later version.
+##
+## This library is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+## Lesser General Public License for more details.
+##
+## You should have received a copy of the GNU Lesser General Public
+## License along with this library; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##
+## See http:##www.salome-platform.org/ or
+## email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+##
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = model.activeDocument()
+model.do()
+
+Point_2 = model.addPoint(Part_1_doc, 0, 0, 0)
+model.end()
+assert(Part_1_doc.size("Construction") == 1)
+
+model.undo()
+assert(Part_1_doc.size("Construction") == 0)
+
+model.redo()
+assert(Part_1_doc.size("Construction") == 1)