Coverage for mpcforces_extractor\test_force_extractor.py: 99%
83 statements
« prev ^ index » next coverage.py v7.6.4, created at 2024-11-13 12:05 +0100
« prev ^ index » next coverage.py v7.6.4, created at 2024-11-13 12:05 +0100
1import unittest
2from unittest.mock import patch, mock_open
3from mpcforces_extractor.force_extractor import MPCForceExtractor
4from mpcforces_extractor.reader.modelreaders import FemFileReader
5from mpcforces_extractor.datastructure.entities import Element
6from mpcforces_extractor.visualization.tcl_visualize import VisualizerConnectedParts
7from mpcforces_extractor.writer.summary_writer import SummaryWriter
8from mpcforces_extractor.datastructure.subcases import Subcase
9from mpcforces_extractor.datastructure.rigids import MPC
10from mpcforces_extractor.test_ressources.simple_model import (
11 get_simple_model_fem,
12 get_simple_model_mpc,
13)
14from mpcforces_extractor.datastructure.rigids import MPC_CONFIG
17class TestFMPCForceExtractor(unittest.TestCase):
18 def test_init(self):
19 """
20 Test the init method. Make sure all variables are set correctly (correct type)
21 """
23 # Test the init method
24 force_extractor = MPCForceExtractor(
25 fem_file_path="test.fem",
26 mpcf_file_path="test.mpcf",
27 output_folder=None,
28 )
29 self.assertEqual(force_extractor.fem_file_path, "test.fem")
30 self.assertEqual(force_extractor.mpcf_file_path, "test.mpcf")
31 self.assertEqual(force_extractor.output_folder, None)
33 @patch(
34 "mpcforces_extractor.force_extractor.MPCForceExtractor._MPCForceExtractor__mpcf_file_exists"
35 )
36 @patch(
37 "mpcforces_extractor.reader.modelreaders.FemFileReader._FemFileReader__read_lines"
38 )
39 @patch(
40 "mpcforces_extractor.reader.mpcforces_reader.MPCForcesReader._MPCForcesReader__read_lines"
41 )
42 def test_extract_forces_and_summary(
43 self, mock_read_lines_mpc, mock_read_lines_fem, mock_mpcf_file_exists
44 ):
45 """
46 Test the extract_forces method. Make sure the forces are extracted correctly
47 """
49 mock_read_lines_fem.return_value = get_simple_model_fem()
50 mock_read_lines_mpc.return_value = get_simple_model_mpc()
51 mock_mpcf_file_exists.return_value = True
53 # Test the extract_forces method
54 force_extractor = MPCForceExtractor(
55 fem_file_path="test.fem",
56 mpcf_file_path="test.mpcf",
57 output_folder=None,
58 )
59 force_extractor.build_fem_and_subcase_data(8)
61 force_1 = [0.00, 0.00, -1.00, -0.91, 0.00, 0.00]
62 force_2 = [0.00, 0.00, 1.00, 1.32, 5.84, 1.94]
64 for subcase in Subcase.subcases:
65 RBE2CONFIG = MPC_CONFIG.RBE2.value
66 part_id2forces = list(MPC.config_2_id_2_instance[RBE2CONFIG].values())[
67 0
68 ].get_part_id2force(subcase)
69 force_calc_1 = part_id2forces[1]
70 force_calc_2 = part_id2forces[2]
72 diff_1 = sum([abs(a_i - b_i) for a_i, b_i in zip(force_1, force_calc_1)])
73 diff_2 = sum([abs(a_i - b_i) for a_i, b_i in zip(force_2, force_calc_2)])
74 print(diff_1, diff_2)
75 self.assertTrue(diff_1 < 0.01 or diff_2 < 0.01)
77 summary_writer = SummaryWriter(force_extractor, force_extractor.output_folder)
78 summary_writer.add_header()
79 summary_writer.add_mpc_lines()
81 lines = [line.strip() for line in summary_writer.lines]
82 for line in lines:
83 print(line)
85 self.assertTrue("FZ: -1.000" in lines)
86 self.assertTrue("MX: -0.907" in lines)
87 self.assertTrue("FZ: 1.000" in lines)
88 self.assertTrue("MX: 1.319" in lines)
90 @patch(
91 "mpcforces_extractor.reader.modelreaders.FemFileReader._FemFileReader__read_lines"
92 )
93 def test_extract_forces_non_mpcf_file(self, mock_read_lines_fem):
94 """
95 Test the extract_forces method. Make sure the forces are extracted correctly
96 """
98 mock_read_lines_fem.return_value = get_simple_model_fem()
100 # Test the extract_forces method
101 force_extractor = MPCForceExtractor(
102 fem_file_path="test.fem",
103 mpcf_file_path="none",
104 output_folder=None,
105 )
106 force_extractor.build_fem_and_subcase_data(8)
108 assert len(Subcase.subcases) == 0
110 summary_writer = SummaryWriter(force_extractor, force_extractor.output_folder)
111 summary_writer.add_header()
112 summary_writer.add_mpc_lines()
114 lines = [line.strip() for line in summary_writer.lines]
115 for line in lines:
116 print(line)
118 @patch(
119 "mpcforces_extractor.visualization.tcl_visualize.open", new_callable=mock_open
120 )
121 @patch(
122 "mpcforces_extractor.reader.modelreaders.FemFileReader._FemFileReader__read_lines"
123 )
124 def test_visualize_tcl_commands(self, mock_read_lines_fem, mock_write):
126 mock_read_lines_fem.return_value = get_simple_model_fem()
128 reader = FemFileReader(None, 8)
129 reader.create_entities()
131 # Visualize
132 part_id2connected_node_ids = Element.get_part_id2node_ids_graph()
133 self.assertTrue(part_id2connected_node_ids is not None)
134 self.assertTrue(len(part_id2connected_node_ids) == 2)
136 visualizer = VisualizerConnectedParts(None)
137 visualizer.output_tcl_lines_for_part_vis()
139 commands = visualizer.commands
140 self.assertTrue(len(commands) == 6)
142 commands_expected = []
143 commands_expected.append("*createentity comps name=part1")
144 commands_expected.append("*createmark elements 1 1 2 3 4")
145 commands_expected.append('*movemark elements 1 "part1"')
146 commands_expected.append("*createentity comps name=part2")
147 commands_expected.append("*createmark elements 1 5 6 7 8")
148 commands_expected.append('*movemark elements 1 "part2"')
150 for _, command in enumerate(commands):
151 self.assertTrue(command in commands_expected)
154if __name__ == "__main__":
155 unittest.main()