From 0944b5994772f063747cf5939ee09d81f47fde17 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Fri, 22 May 2020 01:08:18 +0200 Subject: [PATCH] FEM: unit tests, add test class to read old document objects --- src/Mod/Fem/CMakeLists.txt | 7 + src/Mod/Fem/TestFem.py | 8 + src/Mod/Fem/femtest/app/test_open.py | 200 ++++++++++-------- src/Mod/Fem/femtest/data/open/__init__.py | 0 .../data/open/all_objects_de9b3fb438.FCStd | Bin 0 -> 26349 bytes 5 files changed, 130 insertions(+), 85 deletions(-) create mode 100644 src/Mod/Fem/femtest/data/open/__init__.py create mode 100644 src/Mod/Fem/femtest/data/open/all_objects_de9b3fb438.FCStd diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index 02c044bbef..b7d81784df 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -222,6 +222,11 @@ SET(FemTestsMesh_SRCS femtest/data/mesh/tetra10_mesh.z88 ) +SET(FemTestsOpen_SRCS + femtest/data/open/__init__.py + femtest/data/open/all_objects_de9b3fb438.FCStd +) + SET(FemTools_SRCS femtools/__init__.py femtools/ccxtools.py @@ -281,6 +286,7 @@ SET(FemAllScripts ${FemTestsCcx_SRCS} ${FemTestsElmer_SRCS} ${FemTestsMesh_SRCS} + ${FemTestsOpen_SRCS} ${FemTools_SRCS} ${FemObjectsScripts_SRCS} ) @@ -313,6 +319,7 @@ INSTALL(FILES ${FemTestsFiles_SRCS} DESTINATION Mod/Fem/femtest/data) INSTALL(FILES ${FemTestsCcx_SRCS} DESTINATION Mod/Fem/femtest/data/ccx) INSTALL(FILES ${FemTestsElmer_SRCS} DESTINATION Mod/Fem/femtest/data/elmer) INSTALL(FILES ${FemTestsMesh_SRCS} DESTINATION Mod/Fem/femtest/data/mesh) +INSTALL(FILES ${FemTestsOpen_SRCS} DESTINATION Mod/Fem/femtest/data/open) INSTALL(FILES ${FemTools_SRCS} DESTINATION Mod/Fem/femtools) INSTALL(FILES ${FemObjectsScripts_SRCS} DESTINATION Mod/Fem/femobjects) diff --git a/src/Mod/Fem/TestFem.py b/src/Mod/Fem/TestFem.py index a21d924c33..8ef3fba33b 100644 --- a/src/Mod/Fem/TestFem.py +++ b/src/Mod/Fem/TestFem.py @@ -162,6 +162,7 @@ gf() ./bin/FreeCADCmd --run-test "femtest.app.test_object.TestObjectType.test_femobjects_derivedfromfem" ./bin/FreeCADCmd --run-test "femtest.app.test_object.TestObjectType.test_femobjects_derivedfromstd" ./bin/FreeCADCmd --run-test "femtest.app.test_open.TestObjectOpen.test_femobjects_open_head" +./bin/FreeCADCmd --run-test "femtest.app.test_open.TestObjectOpen.test_femobjects_open_de9b3fb438" ./bin/FreeCADCmd --run-test "femtest.app.test_result.TestResult.test_read_frd_massflow_networkpressure" ./bin/FreeCADCmd --run-test "femtest.app.test_result.TestResult.test_stress_von_mises" ./bin/FreeCADCmd --run-test "femtest.app.test_result.TestResult.test_stress_principal_std" @@ -270,6 +271,9 @@ unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromName("femtest.a import unittest unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromName("femtest.app.test_open.TestObjectOpen.test_femobjects_open_head)) +import unittest +unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromName("femtest.app.test_open.TestObjectOpen.test_femobjects_open_de9b3fb438)) + import unittest unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromName("femtest.app.test_result.TestResult.test_read_frd_massflow_networkpressure")) @@ -323,4 +327,8 @@ doc = FreeCAD.open(app_home + "data/examples/FemCalculixCantilever3D_newSolver.F doc = FreeCAD.open(app_home + "data/examples/Fem.FCStd") doc = FreeCAD.open(app_home + "data/examples/Fem2.FCStd") +# load all documents files +app_home = FreeCAD.ConfigGet("AppHomePath") +doc = FreeCAD.open(FreeCAD.ConfigGet("AppHomePath") + 'Mod/Fem/femtest/data/open/all_objects_de9b3fb438.FCStd') + """ diff --git a/src/Mod/Fem/femtest/app/test_open.py b/src/Mod/Fem/femtest/app/test_open.py index 1f99e84f54..c5bd9f23ed 100644 --- a/src/Mod/Fem/femtest/app/test_open.py +++ b/src/Mod/Fem/femtest/app/test_open.py @@ -35,6 +35,17 @@ from . import support_utils as testtools from .support_utils import fcc_print +""" +FIXME TODO HACK +Important note! +Delete build directory (at least in fem the objects and vpobjects directories) +if not migrate will not be used because the old modules might still be in the +build directory, thus the test will fail +rm -rf Mod/Fem/ +FIXME TODO HACK +""" + + """ # TODO: separate unit test: # std document name of object == obj type @@ -78,7 +89,7 @@ class TestObjectOpen(unittest.TestCase): self ): fcc_print("load master head document objects") - + # get a document with all FEM objects from .test_object import create_all_fem_objects_doc doc = create_all_fem_objects_doc(self.document) @@ -95,6 +106,25 @@ class TestObjectOpen(unittest.TestCase): # FeaturePythons view provider self.compare_feature_pythons_class_gui(doc) + # ******************************************************************************************** + def test_femobjects_open_de9b3fb438( + self + ): + # the number in method name is the FreeCAD commit the document was created with + # https://github.com/FreeCAD/FreeCAD/commit/de9b3fb438 + # the document was created by running the object create unit test + # FreeCAD --run-test "femtest.app.test_object.TestObjectCreate.test_femobjects_make" + fcc_print("load old document objects") + self.document = FreeCAD.open(join(self.test_file_dir, "all_objects_de9b3fb438.FCStd")) + doc = self.document + + # C++ objects + self.compare_cpp_objs(doc) + # FeaturePythons objects + self.compare_feature_pythons_class_app(doc) + # FeaturePythons view provider + self.compare_feature_pythons_class_gui(doc) + # ******************************************************************************************** def compare_cpp_objs( self, @@ -124,129 +154,129 @@ class TestObjectOpen(unittest.TestCase): str(doc.ConstraintBodyHeatSource.Proxy.__class__) ) """ - from femobjects._FemConstraintBodyHeatSource import Proxy + from femobjects.constraint_bodyheatsource import ConstraintBodyHeatSource self.assertEqual( - Proxy, + ConstraintBodyHeatSource, doc.ConstraintBodyHeatSource.Proxy.__class__ ) - from femobjects._FemConstraintElectrostaticPotential import Proxy + from femobjects.constraint_electrostaticpotential import ConstraintElectrostaticPotential self.assertEqual( - Proxy, + ConstraintElectrostaticPotential, doc.ConstraintElectrostaticPotential.Proxy.__class__ ) - from femobjects._FemConstraintFlowVelocity import Proxy + from femobjects.constraint_flowvelocity import ConstraintFlowVelocity self.assertEqual( - Proxy, + ConstraintFlowVelocity, doc.ConstraintFlowVelocity.Proxy.__class__ ) - from femobjects._FemConstraintInitialFlowVelocity import Proxy + from femobjects.constraint_initialflowvelocity import ConstraintInitialFlowVelocity self.assertEqual( - Proxy, + ConstraintInitialFlowVelocity, doc.ConstraintInitialFlowVelocity.Proxy.__class__ ) - from femobjects._FemConstraintSelfWeight import _FemConstraintSelfWeight + from femobjects.constraint_selfweight import ConstraintSelfWeight self.assertEqual( - _FemConstraintSelfWeight, + ConstraintSelfWeight, doc.ConstraintSelfWeight.Proxy.__class__ ) - from femobjects._FemConstraintTie import _FemConstraintTie + from femobjects.constraint_tie import ConstraintTie self.assertEqual( - _FemConstraintTie, + ConstraintTie, doc.ConstraintTie.Proxy.__class__ ) - from femobjects._FemElementFluid1D import _FemElementFluid1D + from femobjects.element_fluid1D import ElementFluid1D self.assertEqual( - _FemElementFluid1D, + ElementFluid1D, doc.ElementFluid1D.Proxy.__class__ ) - from femobjects._FemElementGeometry1D import _FemElementGeometry1D + from femobjects.element_geometry1D import ElementGeometry1D self.assertEqual( - _FemElementGeometry1D, + ElementGeometry1D, doc.ElementGeometry1D.Proxy.__class__ ) - from femobjects._FemElementGeometry2D import _FemElementGeometry2D + from femobjects.element_geometry2D import ElementGeometry2D self.assertEqual( - _FemElementGeometry2D, + ElementGeometry2D, doc.ElementGeometry2D.Proxy.__class__ ) - from femobjects._FemElementRotation1D import _FemElementRotation1D + from femobjects.element_rotation1D import ElementRotation1D self.assertEqual( - _FemElementRotation1D, + ElementRotation1D, doc.ElementRotation1D.Proxy.__class__ ) - from femobjects._FemMaterial import _FemMaterial + from femobjects.material_common import MaterialCommon self.assertEqual( - _FemMaterial, + MaterialCommon, doc.MaterialFluid.Proxy.__class__ ) - from femobjects._FemMaterial import _FemMaterial + from femobjects.material_common import MaterialCommon self.assertEqual( - _FemMaterial, + MaterialCommon, doc.MaterialSolid.Proxy.__class__ ) - from femobjects._FemMaterialMechanicalNonlinear import _FemMaterialMechanicalNonlinear + from femobjects.material_mechanicalnonlinear import MaterialMechanicalNonlinear self.assertEqual( - _FemMaterialMechanicalNonlinear, + MaterialMechanicalNonlinear, doc.MaterialMechanicalNonlinear.Proxy.__class__ ) - from femobjects._FemMaterialReinforced import _FemMaterialReinforced + from femobjects.material_reinforced import MaterialReinforced self.assertEqual( - _FemMaterialReinforced, + MaterialReinforced, doc.MaterialReinforced.Proxy.__class__ ) - from femobjects._FemMeshGmsh import _FemMeshGmsh + from femobjects.mesh_gmsh import MeshGmsh self.assertEqual( - _FemMeshGmsh, + MeshGmsh, doc.MeshGmsh.Proxy.__class__ ) - from femobjects._FemMeshBoundaryLayer import _FemMeshBoundaryLayer + from femobjects.mesh_boundarylayer import MeshBoundaryLayer self.assertEqual( - _FemMeshBoundaryLayer, + MeshBoundaryLayer, doc.MeshBoundaryLayer.Proxy.__class__ ) - from femobjects._FemMeshGroup import _FemMeshGroup + from femobjects.mesh_group import MeshGroup self.assertEqual( - _FemMeshGroup, + MeshGroup, doc.MeshGroup.Proxy.__class__ ) - from femobjects._FemMeshRegion import _FemMeshRegion + from femobjects.mesh_region import MeshRegion self.assertEqual( - _FemMeshRegion, + MeshRegion, doc.MeshRegion.Proxy.__class__ ) - from femobjects._FemMeshResult import _FemMeshResult + from femobjects.mesh_result import MeshResult self.assertEqual( - _FemMeshResult, + MeshResult, doc.MeshResult.Proxy.__class__ ) - from femobjects._FemResultMechanical import _FemResultMechanical + from femobjects.result_mechanical import ResultMechanical self.assertEqual( - _FemResultMechanical, + ResultMechanical, doc.ResultMechanical.Proxy.__class__ ) - from femobjects._FemSolverCalculix import _FemSolverCalculix + from femobjects.solver_ccxtools import SolverCcxTools self.assertEqual( - _FemSolverCalculix, + SolverCcxTools, doc.SolverCcxTools.Proxy.__class__ ) @@ -308,129 +338,129 @@ class TestObjectOpen(unittest.TestCase): FreeCAD.closeDocument(doc.Name) return - from femguiobjects._ViewProviderFemConstraintBodyHeatSource import ViewProxy + from femviewprovider.view_constraint_bodyheatsource import VPConstraintBodyHeatSource self.assertEqual( - ViewProxy, + VPConstraintBodyHeatSource, doc.ConstraintBodyHeatSource.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemConstraintElectrostaticPotential import ViewProxy + from femviewprovider.view_constraint_electrostaticpotential import VPConstraintElectroStaticPotential self.assertEqual( - ViewProxy, + VPConstraintElectroStaticPotential, doc.ConstraintElectrostaticPotential.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemConstraintFlowVelocity import ViewProxy + from femviewprovider.view_constraint_flowvelocity import VPConstraintFlowVelocity self.assertEqual( - ViewProxy, + VPConstraintFlowVelocity, doc.ConstraintFlowVelocity.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemConstraintInitialFlowVelocity import ViewProxy + from femviewprovider.view_constraint_initialflowvelocity import VPConstraintInitialFlowVelocity self.assertEqual( - ViewProxy, + VPConstraintInitialFlowVelocity, doc.ConstraintInitialFlowVelocity.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemConstraintSelfWeight import _ViewProviderFemConstraintSelfWeight + from femviewprovider.view_constraint_selfweight import VPConstraintSelfWeight self.assertEqual( - _ViewProviderFemConstraintSelfWeight, + VPConstraintSelfWeight, doc.ConstraintSelfWeight.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemConstraintTie import _ViewProviderFemConstraintTie + from femviewprovider.view_constraint_tie import VPConstraintTie self.assertEqual( - _ViewProviderFemConstraintTie, + VPConstraintTie, doc.ConstraintTie.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemElementFluid1D import _ViewProviderFemElementFluid1D + from femviewprovider.view_element_fluid1D import VPElementFluid1D self.assertEqual( - _ViewProviderFemElementFluid1D, + VPElementFluid1D, doc.ElementFluid1D.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemElementGeometry1D import _ViewProviderFemElementGeometry1D + from femviewprovider.view_element_geometry1D import VPElementGeometry1D self.assertEqual( - _ViewProviderFemElementGeometry1D, + VPElementGeometry1D, doc.ElementGeometry1D.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemElementGeometry2D import _ViewProviderFemElementGeometry2D + from femviewprovider.view_element_geometry2D import VPElementGeometry2D self.assertEqual( - _ViewProviderFemElementGeometry2D, + VPElementGeometry2D, doc.ElementGeometry2D.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemElementRotation1D import _ViewProviderFemElementRotation1D + from femviewprovider.view_element_rotation1D import VPElementRotation1D self.assertEqual( - _ViewProviderFemElementRotation1D, + VPElementRotation1D, doc.ElementRotation1D.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemMaterial import _ViewProviderFemMaterial + from femviewprovider.view_material_common import VPMaterialCommon self.assertEqual( - _ViewProviderFemMaterial, + VPMaterialCommon, doc.MaterialFluid.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemMaterial import _ViewProviderFemMaterial + from femviewprovider.view_material_common import VPMaterialCommon self.assertEqual( - _ViewProviderFemMaterial, + VPMaterialCommon, doc.MaterialSolid.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemMaterialMechanicalNonlinear import _ViewProviderFemMaterialMechanicalNonlinear + from femviewprovider.view_material_mechanicalnonlinear import VPMaterialMechanicalNonlinear self.assertEqual( - _ViewProviderFemMaterialMechanicalNonlinear, + VPMaterialMechanicalNonlinear, doc.MaterialMechanicalNonlinear.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemMaterialReinforced import _ViewProviderFemMaterialReinforced + from femviewprovider.view_material_reinforced import VPMaterialReinforced self.assertEqual( - _ViewProviderFemMaterialReinforced, + VPMaterialReinforced, doc.MaterialReinforced.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemMeshGmsh import _ViewProviderFemMeshGmsh + from femviewprovider.view_mesh_gmsh import VPMeshGmsh self.assertEqual( - _ViewProviderFemMeshGmsh, + VPMeshGmsh, doc.MeshGmsh.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemMeshBoundaryLayer import _ViewProviderFemMeshBoundaryLayer + from femviewprovider.view_mesh_boundarylayer import VPMeshBoundaryLayer self.assertEqual( - _ViewProviderFemMeshBoundaryLayer, + VPMeshBoundaryLayer, doc.MeshBoundaryLayer.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemMeshGroup import _ViewProviderFemMeshGroup + from femviewprovider.view_mesh_group import VPMeshGroup self.assertEqual( - _ViewProviderFemMeshGroup, + VPMeshGroup, doc.MeshGroup.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemMeshRegion import _ViewProviderFemMeshRegion + from femviewprovider.view_mesh_region import VPMeshRegion self.assertEqual( - _ViewProviderFemMeshRegion, + VPMeshRegion, doc.MeshRegion.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemMeshResult import _ViewProviderFemMeshResult + from femviewprovider.view_mesh_result import VPFemMeshResult self.assertEqual( - _ViewProviderFemMeshResult, + VPFemMeshResult, doc.MeshResult.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemResultMechanical import _ViewProviderFemResultMechanical + from femviewprovider.view_result_mechanical import VPResultMechanical self.assertEqual( - _ViewProviderFemResultMechanical, + VPResultMechanical, doc.ResultMechanical.ViewObject.Proxy.__class__ ) - from femguiobjects._ViewProviderFemSolverCalculix import _ViewProviderFemSolverCalculix + from femviewprovider.view_solver_ccxtools import VPSolverCcxTools self.assertEqual( - _ViewProviderFemSolverCalculix, + VPSolverCcxTools, doc.SolverCcxTools.ViewObject.Proxy.__class__ ) diff --git a/src/Mod/Fem/femtest/data/open/__init__.py b/src/Mod/Fem/femtest/data/open/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/Mod/Fem/femtest/data/open/all_objects_de9b3fb438.FCStd b/src/Mod/Fem/femtest/data/open/all_objects_de9b3fb438.FCStd new file mode 100644 index 0000000000000000000000000000000000000000..83ae73293e9d768a9ab377a3229c0d65e23286f0 GIT binary patch literal 26349 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%0AbROaz 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