From f3154641cbc7e5855402cde1dffafe4d871baa35 Mon Sep 17 00:00:00 2001 From: azv Date: Mon, 17 Dec 2018 13:00:02 +0300 Subject: [PATCH] [Code coverage ModelHighAPI]: Improve coverage --- src/ModelAPI/CMakeLists.txt | 1 + src/ModelAPI/Test/TestFolder_CustomName.py | 1 + src/ModelAPI/Test/TestFolder_Empty.py | 53 +++++++++++++++++++++ src/ModelHighAPI/CMakeLists.txt | 1 + src/ModelHighAPI/ModelHighAPI_Dumper.cpp | 24 +++------- src/ModelHighAPI/ModelHighAPI_Dumper.h | 9 ++-- src/ModelHighAPI/ModelHighAPI_Folder.cpp | 4 +- src/ModelHighAPI/ModelHighAPI_Selection.cpp | 2 + src/ModelHighAPI/Test/TestUndoRedo.py | 37 ++++++++++++++ 9 files changed, 106 insertions(+), 26 deletions(-) create mode 100644 src/ModelAPI/Test/TestFolder_Empty.py create mode 100644 src/ModelHighAPI/Test/TestUndoRedo.py diff --git a/src/ModelAPI/CMakeLists.txt b/src/ModelAPI/CMakeLists.txt index 55fc4a99f..49ffb6645 100644 --- a/src/ModelAPI/CMakeLists.txt +++ b/src/ModelAPI/CMakeLists.txt @@ -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 diff --git a/src/ModelAPI/Test/TestFolder_CustomName.py b/src/ModelAPI/Test/TestFolder_CustomName.py index 81386cd03..5dcf158de 100644 --- a/src/ModelAPI/Test/TestFolder_CustomName.py +++ b/src/ModelAPI/Test/TestFolder_CustomName.py @@ -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 index 000000000..7813998bb --- /dev/null +++ b/src/ModelAPI/Test/TestFolder_Empty.py @@ -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 +## + +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) diff --git a/src/ModelHighAPI/CMakeLists.txt b/src/ModelHighAPI/CMakeLists.txt index 8f0607feb..1a6ea1ab7 100644 --- a/src/ModelHighAPI/CMakeLists.txt +++ b/src/ModelHighAPI/CMakeLists.txt @@ -120,5 +120,6 @@ ADD_UNIT_TESTS( TestRefAttr.py TestReference.py TestDeflectionDump.py + TestUndoRedo.py Test2488.py ) diff --git a/src/ModelHighAPI/ModelHighAPI_Dumper.cpp b/src/ModelHighAPI/ModelHighAPI_Dumper.cpp index ca344ce98..b1bdf36e1 100644 --- a/src/ModelHighAPI/ModelHighAPI_Dumper.cpp +++ b/src/ModelHighAPI/ModelHighAPI_Dumper.cpp @@ -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::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& 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& theDir) { - importModule("GeomAPI", "GeomAPI_Dir"); + importModule("GeomAPI"); myDumpBuffer << "GeomAPI_Dir(" << theDir->x() << ", " << theDir->y() << ", " << theDir->z() << ")"; return *this; diff --git a/src/ModelHighAPI/ModelHighAPI_Dumper.h b/src/ModelHighAPI/ModelHighAPI_Dumper.h index 5c854bab2..593b1efab 100644 --- a/src/ModelHighAPI/ModelHighAPI_Dumper.h +++ b/src/ModelHighAPI/ModelHighAPI_Dumper.h @@ -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 EntityNameMap; - typedef std::map > ModulesMap; + typedef std::set ModulesSet; typedef std::map > > 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 diff --git a/src/ModelHighAPI/ModelHighAPI_Folder.cpp b/src/ModelHighAPI/ModelHighAPI_Folder.cpp index c6280ffd4..77d696723 100644 --- a/src/ModelHighAPI/ModelHighAPI_Folder.cpp +++ b/src/ModelHighAPI/ModelHighAPI_Folder.cpp @@ -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()) diff --git a/src/ModelHighAPI/ModelHighAPI_Selection.cpp b/src/ModelHighAPI/ModelHighAPI_Selection.cpp index 20e834a63..b9a9f0be5 100644 --- a/src/ModelHighAPI/ModelHighAPI_Selection.cpp +++ b/src/ModelHighAPI/ModelHighAPI_Selection.cpp @@ -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 index 000000000..593cf5689 --- /dev/null +++ b/src/ModelHighAPI/Test/TestUndoRedo.py @@ -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 +## + +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) -- 2.39.2