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

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 

15 

16 

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 """ 

22 

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) 

32 

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 """ 

48 

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 

52 

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) 

60 

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] 

63 

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] 

71 

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) 

76 

77 summary_writer = SummaryWriter(force_extractor, force_extractor.output_folder) 

78 summary_writer.add_header() 

79 summary_writer.add_mpc_lines() 

80 

81 lines = [line.strip() for line in summary_writer.lines] 

82 for line in lines: 

83 print(line) 

84 

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) 

89 

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 """ 

97 

98 mock_read_lines_fem.return_value = get_simple_model_fem() 

99 

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) 

107 

108 assert len(Subcase.subcases) == 0 

109 

110 summary_writer = SummaryWriter(force_extractor, force_extractor.output_folder) 

111 summary_writer.add_header() 

112 summary_writer.add_mpc_lines() 

113 

114 lines = [line.strip() for line in summary_writer.lines] 

115 for line in lines: 

116 print(line) 

117 

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): 

125 

126 mock_read_lines_fem.return_value = get_simple_model_fem() 

127 

128 reader = FemFileReader(None, 8) 

129 reader.create_entities() 

130 

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) 

135 

136 visualizer = VisualizerConnectedParts(None) 

137 visualizer.output_tcl_lines_for_part_vis() 

138 

139 commands = visualizer.commands 

140 self.assertTrue(len(commands) == 6) 

141 

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"') 

149 

150 for _, command in enumerate(commands): 

151 self.assertTrue(command in commands_expected) 

152 

153 

154if __name__ == "__main__": 

155 unittest.main()