コード例 #1
0
    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')
コード例 #2
0
    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));'])
コード例 #3
0
    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));'])
コード例 #4
0
    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));'])
コード例 #5
0
    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);'])
コード例 #6
0
    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)
コード例 #7
0
    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));'
        ])
コード例 #8
0
    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));'])
コード例 #9
0
    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;'])
コード例 #10
0
    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);'])
コード例 #11
0
    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)
コード例 #12
0
    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'])
コード例 #13
0
    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'])
コード例 #14
0
    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);'])
コード例 #15
0
    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'])
コード例 #16
0
    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);'])
コード例 #17
0
    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);'])
コード例 #18
0
    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'])
コード例 #19
0
    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);'])
コード例 #20
0
    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";'
        ])
コード例 #21
0
    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)
コード例 #22
0
    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);'])
コード例 #23
0
    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)
コード例 #24
0
    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'])
コード例 #25
0
    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)
コード例 #26
0
    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)
コード例 #27
0
    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'])
コード例 #28
0
    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);'])
コード例 #29
0
    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)
コード例 #30
0
    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)