def test_model_update_annotation_and_add_connect(self): """Model annotation should always the last statement for the model""" # Setup mo_file = """ model Test equation end Test;""" source_file = self.create_tmp_file(mo_file) model = Model(source_file) # Act # make an insert before and after annotation model.add_connect('port_a', 'port_b') model.update_model_annotation({'rootModification': 100}) model.add_connect('port_c', 'port_d') self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, [ 'annotation(rootModification=100)', 'connect(port_a, port_b)', 'connect(port_c, port_d)', ]) self.assertNoDeletions(source_file, self.result) # make sure the annotation was inserted at the end self.assertIn('annotation(rootModification=100);\nend Test;', self.result, 'Annotation should be at the END of the model')
def test_model_update_component_modifications_can_update_and_insert(self): # Setup mo_file = """ model Test Resistor R(modA=100, modB(modC=200)); equation end Test;""" source_file = self.create_tmp_file(mo_file) model = Model(source_file) # Act model.update_component_modifications('Resistor', 'R', { 'modA': 123, 'modB': { 'modD': 321, }, 'modZ': 555 }) self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, [ 'Resistor R(modA=123, modB(modC=200, modD=321), modZ=555);', ]) self.assertHasDeletions(source_file, self.result, ['Resistor R(modA=100, modB(modC=200));'])
def test_model_update_annotation_can_overwrite_existing_nested_modifications( self): """Annotation should always be at the end of the model""" # Setup mo_file = """ model Test equation annotation(rootModification=321, modA(hello=100)); end Test;""" source_file = self.create_tmp_file(mo_file) model = Model(source_file) # Act model.update_model_annotation({ 'rootModification': 100, 'modA': { 'world': 555, 'OVERWRITE_MODIFICATIONS': True } }) self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, [ 'annotation(rootModification=100, modA(world=555))', ]) self.assertHasDeletions( source_file, self.result, ['annotation(rootModification=321, modA(hello=100));'])
def test_model_update_component_modifications_can_overwrite_nested_modifications( self): # Setup mo_file = """ model Test Resistor R(modA=100, modB(modC=200, modD=300)); equation end Test;""" source_file = self.create_tmp_file(mo_file) model = Model(source_file) # Act model.update_component_modifications( 'Resistor', 'R', { 'modB': { 'modZ': 555, 'OVERWRITE_MODIFICATIONS': True }, }, ) self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, [ 'Resistor R(modA=100, modB(modZ=555));', ]) self.assertHasDeletions( source_file, self.result, ['Resistor R(modA=100, modB(modC=200, modD=300));'])
def test_model_update_component_modifications_adds_newlines_correctly( self): # Setup # NOTE: changing the indentation settings config.INDENT_INSERTED_COMPONENT_ARGS = True mo_file = """ model Test Resistor R(R=1); equation end Test;""" source_file = self.create_tmp_file(mo_file) model = Model(source_file) # Act model.update_component_modifications( 'Resistor', 'R', { 'modB': { 'modZ': 555, }, 'inserted': '321' }, ) self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, [ 'Resistor R(R=1,', 'modB(', 'modZ=555),', 'inserted=321);', ]) self.assertHasDeletions(source_file, self.result, ['Resistor R(R=1);'])
def test_model_insert_equation_for_loop_multiline_body(self): # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act identifier = 'i' expression = 'range(n_ports)' loop_body_list = [ 'if i == 1 then', ' connect(conArr[i], conArr[i-1]);', 'end if;', ] model.insert_equation_for_loop( index_identifier=identifier, expression_raw=expression, loop_body_raw_list=loop_body_list, ) self.result = model.execute() # Assert # Remove the leading/training whitespace of the body lines for comparison # If we didn't the assert would fail (expectations are strict about whitespace) expected_body_additions = [line.strip() for line in loop_body_list] self.assertHasAdditions( source_file, self.result, expected_body_additions + [f'for {identifier} in {expression} loop', 'end for;']) self.assertNoDeletions(source_file, self.result)
def test_model_update_annotation_can_update_and_insert(self): # Setup mo_file = """ model Test equation annotation(rootModification=321, rootModification2(childA=0, childB=1)); end Test;""" source_file = self.create_tmp_file(mo_file) model = Model(source_file) # Act model.update_model_annotation({ 'rootModification': 100, 'insertedModification': 555, 'rootModification2': { 'childB': 123, 'childC': 'abc' } }) self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, [ 'annotation(rootModification=100, rootModification2(childA=0, childB=123, childC=abc), insertedModification=555);' ]) self.assertHasDeletions(source_file, self.result, [ 'annotation(rootModification=321, rootModification2(childA=0, childB=1));' ])
def test_model_update_annotation_when_modification_exists_and_has_own_modifications( self): # Setup mo_file = """ model Test equation annotation(rootModification(childModification=321)); end Test;""" source_file = self.create_tmp_file(mo_file) model = Model(source_file) # Act model.update_model_annotation( {'rootModification': { 'childModification': 100 }}) self.result = model.execute() # Assert self.assertHasAdditions( source_file, self.result, ['annotation(rootModification(childModification=100));']) self.assertHasDeletions( source_file, self.result, ['annotation(rootModification(childModification=321));'])
def test_set_within_statement(self): # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act model.set_within_statement('A.B.C') self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, ['within A.B.C;']) self.assertHasDeletions(source_file, self.result, ['within models;'])
def test_model_remove_component(self): # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act model.remove_component('Resistor', 'R') self.result = model.execute() # Assert self.assertNoAdditions(source_file, self.result) self.assertHasDeletions(source_file, self.result, ['Resistor R(R=100);'])
def test_model_add_connect(self): # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act model.add_connect('PortA', 'PortB') self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, ['connect(PortA, PortB);']) self.assertNoDeletions(source_file, self.result)
def test_model_remove_component_argument_all(self): """Should remove an argument in an existing component.""" # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act model.remove_component_argument('VsourceDC', 'DC', 'f') self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, [' VsourceDC DC();']) self.assertHasDeletions(source_file, self.result, ['f=10'])
def test_model_rename_argument(self): source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) model.rename_component_argument('ElectroMechanicalElement', 'EM', 'k', 'new_arg_name') self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, [ 'new_arg_name=10', ]) self.assertHasDeletions(source_file, self.result, ['k=10'])
def test_model_remove_connect_specific(self): # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act model.remove_connect('DC.p', 'R.n') self.result = model.execute() # Assert self.assertNoAdditions(source_file, self.result) self.assertHasDeletions(source_file, self.result, ['connect(DC.p, R.n);'])
def test_model_remove_component_argument_last(self): """Should remove an argument in an existing component.""" # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act model.remove_component_argument('ElectroMechanicalElement', 'EM', 'b') self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, ['ElectroMechanicalElement EM(k=10, J=10 );']) self.assertHasDeletions(source_file, self.result, ['b=2'])
def test_model_edit_connect_match_star(self): # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act model.edit_connect('*', 'R.n', new_port_b='PortB') self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, ['connect(DC.p, PortB);']) self.assertHasDeletions(source_file, self.result, ['connect(DC.p, R.n);'])
def test_model_update_component_modification(self): # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act model.update_component_modification('Resistor', 'R', 'R', '54321') self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, ['Resistor R(R=54321);']) self.assertHasDeletions(source_file, self.result, ['Resistor R(R=100);'])
def test_set_name(self): # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act model.set_name('NewModelName') self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, ['model NewModelName', 'end NewModelName']) self.assertHasDeletions(source_file, self.result, ['model DCMotor', 'end DCMotor'])
def test_model_edit_connect_negated_match(self): # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act # replace connections where port a is fake_port_a and port b is not fake_port_b model.edit_connect('fake_port_a', '!fake_port_b', new_port_b='PortC') self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, ['connect(fake_port_a, PortC);']) self.assertHasDeletions(source_file, self.result, ['connect(fake_port_a, fake_port_c);'])
def test_model_remove_constant(self): """Test to remove an entire component that is flagged as a constant type""" # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act model.remove_component('Integer', 'notUsed') self.result = model.execute() # Assert self.assertNoAdditions(source_file, self.result) self.assertHasDeletions(source_file, self.result, [ 'constant Integer notUsed=5 "unused constant that needs to be deleted";' ])
def test_model_update_component_modification_conditional_false(self): # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act model.update_component_modification('Resistor', 'R', 'R', '54321', if_value='bogus_value') self.result = model.execute() # Assert self.assertNoAdditions(source_file, self.result) self.assertNoDeletions(source_file, self.result)
def test_model_update_annotation_when_no_model_annotation_exists(self): # Setup mo_file = ''' model Test equation end Test;''' source_file = self.create_tmp_file(mo_file) model = Model(source_file) # Act model.update_model_annotation({'rootModification': 100}) self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, ['annotation(rootModification=100);'])
def test_model_add_param_type_real(self): # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act model.add_parameter('Real', 'myParam', string_comment='a comment', assigned_value=1.25) self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, ['parameter Real myParam=1.25 "a comment"']) self.assertNoDeletions(source_file, self.result)
def test_model_rename_argument_more_than_one_char(self): mo_file = """ model Test Resistor R(Resistance=100); equation end Test;""" source_file = self.create_tmp_file(mo_file) model = Model(source_file) model.rename_component_argument('Resistor', 'R', 'Resistance', 'R') self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, [ 'R=100', ]) self.assertHasDeletions(source_file, self.result, ['Resistance=10'])
def test_model_add_param_type_string(self): # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act model.add_parameter( 'String', 'myParam', string_comment='a comment', assigned_value='"supercalifragilisticexpialidocious"') self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, [ 'parameter String myParam="supercalifragilisticexpialidocious" "a comment"' ]) self.assertNoDeletions(source_file, self.result)
def test_model_insert_component(self): # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act model.insert_component('FancyClass', 'myInstance', modifications={'arg1': '1234'}, string_comment='my comment', annotations=['my annotation'], insert_index=0) self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, [ 'FancyClass myInstance(arg1=1234) "my comment" annotation(my annotation);' ]) self.assertNoDeletions(source_file, self.result)
def test_model_reclaration_string_replacement(self): """Should update redeclaration of a component""" # Setup source_file = os.path.join(self.data_dir, 'Office.mo') model = Model(source_file) # Act model.overwrite_component_redeclaration( 'Buildings.ThermalZones.ReducedOrder.RC.TwoElements', 'thermalZoneTwoElements', 'Medium = Buildings.Media.Air') self.result = model.execute() # Assert self.assertHasAdditions( source_file, self.result, ['redeclare package Medium = Buildings.Media.Air']) self.assertHasDeletions(source_file, self.result, ['Modelica.Media.Air.DryAirNasa'])
def test_model_update_component_modifications_simple(self): # Setup mo_file = """ model Test Resistor R(R=100); equation end Test;""" source_file = self.create_tmp_file(mo_file) model = Model(source_file) # Act model.update_component_modifications('Resistor', 'R', {'R': 123}) self.result = model.execute() # Assert self.assertHasAdditions(source_file, self.result, [ 'Resistor R(R=123);', ]) self.assertHasDeletions(source_file, self.result, ['Resistor R(R=100);'])
def test_model_edit_connect_both_ports(self): # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act model.edit_connect('DC.p', 'R.n', new_port_a='PortA', new_port_b='PortB') self.result = model.execute() # Assert expected_additions = [ 'connect(PortA, PortB);', ] self.assertHasAdditions(source_file, self.result, expected_additions) expected_deletions = ['connect(DC.p, R.n);'] self.assertHasDeletions(source_file, self.result, expected_deletions)
def test_model_insert_equation_for_loop_simple(self): # Setup source_file = os.path.join(self.data_dir, 'DCMotor.mo') model = Model(source_file) # Act identifier = 'i' expression = 'range(n_ports)' loop_body_list = ['connect(conArr[i], conArr[i+1]);'] model.insert_equation_for_loop( index_identifier=identifier, expression_raw=expression, loop_body_raw_list=loop_body_list, ) self.result = model.execute() # Assert self.assertHasAdditions( source_file, self.result, loop_body_list + [f'for {identifier} in {expression} loop', 'end for;']) self.assertNoDeletions(source_file, self.result)