Skip to content

Commit c37a7eb

Browse files
committed
Enable support for runnables in SwcInternalBehavior
1 parent 10240a8 commit c37a7eb

File tree

4 files changed

+213
-22
lines changed

4 files changed

+213
-22
lines changed

src/autosar/xml/element.py

+48-22
Original file line numberDiff line numberDiff line change
@@ -5992,28 +5992,6 @@ def __init__(self,
59925992
self._assign_optional("scope", scope, ar_enum.VariableAccessScope)
59935993

59945994

5995-
class SwcInternalBehavior(Identifiable):
5996-
"""
5997-
Complex type AR:SWC-INTERNAL-BEHAVIOR
5998-
Tag variants: 'SWC-INTERNAL-BEHAVIOR'
5999-
6000-
This is just a placeholder. Will be implemented later.
6001-
"""
6002-
6003-
def __init__(self,
6004-
name: str,
6005-
**kwargs) -> None:
6006-
super().__init__(name, **kwargs)
6007-
6008-
def ref(self) -> SwcInternalBehaviorRef | None:
6009-
"""
6010-
Returns a reference to this element or
6011-
None if the element is not yet part of a package
6012-
"""
6013-
ref_str = self._calc_ref_string()
6014-
return None if ref_str is None else SwcInternalBehaviorRef(ref_str)
6015-
6016-
60175995
class SwcImplementation(Implementation):
60185996
"""
60195997
Complex type AR:SWC-IMPLEMENTATION
@@ -6212,3 +6190,51 @@ class RTEEvent(Identifiable):
62126190
"""
62136191
Group AR:RTE-EVENT
62146192
"""
6193+
6194+
6195+
class InternalBehavior(Identifiable):
6196+
"""
6197+
Group AR:INTERNAL-BEHAVIOR
6198+
This is just a placeholder. Will be implemented later.
6199+
"""
6200+
6201+
6202+
class SwcInternalBehavior(InternalBehavior):
6203+
"""
6204+
Complex type AR:SWC-INTERNAL-BEHAVIOR
6205+
Tag variants: 'SWC-INTERNAL-BEHAVIOR'
6206+
6207+
Implementation is very limited for now
6208+
"""
6209+
6210+
def __init__(self,
6211+
name: str,
6212+
runnables: RunnableEntity | list[RunnableEntity] | None = None,
6213+
**kwargs) -> None:
6214+
super().__init__(name, **kwargs)
6215+
6216+
self.runnables: list[RunnableEntity] = [] # .RUNNABLES
6217+
6218+
if runnables is not None:
6219+
if isinstance(runnables, list):
6220+
for runnable in runnables:
6221+
self.append_runnable(runnable)
6222+
else:
6223+
self.append_runnable(runnables)
6224+
6225+
def ref(self) -> SwcInternalBehaviorRef | None:
6226+
"""
6227+
Returns a reference to this element or
6228+
None if the element is not yet part of a package
6229+
"""
6230+
ref_str = self._calc_ref_string()
6231+
return None if ref_str is None else SwcInternalBehaviorRef(ref_str)
6232+
6233+
def append_runnable(self, runnable: RunnableEntity) -> None:
6234+
"""
6235+
Appends runnable to internal list of runnables
6236+
"""
6237+
if isinstance(runnable, RunnableEntity):
6238+
self.runnables.append(runnable)
6239+
else:
6240+
raise TypeError(f"runnable must be of type RunnableEntity. Got {str(type(runnable))}")

src/autosar/xml/reader.py

+42
Original file line numberDiff line numberDiff line change
@@ -4514,5 +4514,47 @@ def _read_swc_internal_behavior(self, xml_element: ElementTree.Element) -> ar_el
45144514
self._read_referrable(child_elements, data)
45154515
self._read_multi_language_referrable(child_elements, data)
45164516
self._read_identifiable(child_elements, xml_element.attrib, data)
4517+
self._read_internal_behavior_group(child_elements, data)
4518+
self._read_swc_internal_behavior_group(child_elements, data)
45174519
self._report_unprocessed_elements(child_elements)
45184520
return ar_element.SwcInternalBehavior(**data)
4521+
4522+
def _read_internal_behavior_group(self, child_elements: ChildElementMap, data: dict) -> None:
4523+
"""
4524+
Reads group AR:INTERNAL-BEHAVIOR
4525+
Will be implemented in a future version
4526+
"""
4527+
child_elements.skip("CONSTANT-MEMORYS")
4528+
child_elements.skip("CONSTANT-VALUE-MAPPING-REFS")
4529+
child_elements.skip("DATA-TYPE-MAPPING-REFS")
4530+
child_elements.skip("EXCLUSIVE-AREAS")
4531+
child_elements.skip("EXCLUSIVE-AREA-NESTING-ORDERS")
4532+
child_elements.skip("STATIC-MEMORYS")
4533+
4534+
def _read_swc_internal_behavior_group(self, child_elements: ChildElementMap, data: dict) -> None:
4535+
"""
4536+
Reads group AR:SWC-INTERNAL-BEHAVIOR
4537+
Most of it will be implemented in a future version
4538+
"""
4539+
child_elements.skip("AR-TYPED-PER-INSTANCE-MEMORYS")
4540+
child_elements.skip("EVENTS")
4541+
child_elements.skip("EXCLUSIVE-AREA-POLICYS")
4542+
child_elements.skip("EXPLICIT-INTER-RUNNABLE-VARIABLES")
4543+
child_elements.skip("HANDLE-TERMINATION-AND-RESTART")
4544+
child_elements.skip("INCLUDED-DATA-TYPE-SETS")
4545+
child_elements.skip("INCLUDED-MODE-DECLARATION-GROUP-SETS")
4546+
child_elements.skip("INSTANTIATION-DATA-DEF-PROPSS")
4547+
child_elements.skip("PER-INSTANCE-MEMORYS")
4548+
child_elements.skip("PER-INSTANCE-PARAMETERS")
4549+
child_elements.skip("PORT-API-OPTIONS")
4550+
xml_child = child_elements.get("RUNNABLES")
4551+
if xml_child is not None:
4552+
runnables = []
4553+
for xml_grand_child in xml_child.findall("./RUNNABLE-ENTITY"):
4554+
runnables.append(self._read_runnable_entity(xml_grand_child))
4555+
data["runnables"] = runnables
4556+
child_elements.skip("SERVICE-DEPENDENCYS")
4557+
child_elements.skip("SHARED-PARAMETERS")
4558+
child_elements.skip("SUPPORTS-MULTIPLE-INSTANTIATION")
4559+
child_elements.skip("VARIATION-POINT-PROXYS")
4560+
child_elements.skip("VARIATION-POINT")

src/autosar/xml/writer.py

+19
Original file line numberDiff line numberDiff line change
@@ -3869,4 +3869,23 @@ def _write_swc_internal_behavior(self, elem: ar_element.SwcInternalBehavior) ->
38693869
self._write_referrable(elem)
38703870
self._write_multilanguage_referrable(elem)
38713871
self._write_identifiable(elem)
3872+
self._write_internal_behavior_group(elem)
3873+
self._write_swc_internal_behavior_group(elem)
38723874
self._leave_child()
3875+
3876+
def _write_internal_behavior_group(self, elem: ar_element.InternalBehavior) -> None:
3877+
"""
3878+
Writes group AR:INTERNAL-BEHAVIOR
3879+
This is just a placeholder. Will be implemented later.
3880+
"""
3881+
3882+
def _write_swc_internal_behavior_group(self, elem: ar_element.SwcInternalBehavior) -> None:
3883+
"""
3884+
Writes group AR:SWC-INTERNAL-BEHAVIOR
3885+
Most of it will be implemented in a future version
3886+
"""
3887+
if elem.runnables:
3888+
self._add_child("RUNNABLES")
3889+
for runnable in elem.runnables:
3890+
self._write_runnable_entity(runnable)
3891+
self._leave_child()

tests/xml/test_swc_internal_behavior.py

+104
Original file line numberDiff line numberDiff line change
@@ -711,5 +711,109 @@ def test_create_sw_addr_method_from_string(self):
711711
self.assertEqual(ref.dest, ar_enum.IdentifiableSubTypes.SW_ADDR_METHOD)
712712

713713

714+
class TestSwcInternalBehavior(unittest.TestCase):
715+
"""
716+
Most elements are not implemented yet
717+
"""
718+
719+
def test_name_only(self):
720+
writer = autosar.xml.Writer()
721+
element = ar_element.SwcInternalBehavior('MyName')
722+
xml = '''<SWC-INTERNAL-BEHAVIOR>
723+
<SHORT-NAME>MyName</SHORT-NAME>
724+
</SWC-INTERNAL-BEHAVIOR>'''
725+
self.assertEqual(writer.write_str_elem(element), xml)
726+
reader = autosar.xml.Reader()
727+
elem: ar_element.SwcInternalBehavior = reader.read_str_elem(xml)
728+
self.assertIsInstance(elem, ar_element.SwcInternalBehavior)
729+
self.assertEqual(elem.name, 'MyName')
730+
self.assertEqual(elem.short_name, 'MyName')
731+
732+
# Base class elements
733+
# IMPLEMENT LATER: CONSTANT-MEMORYS
734+
# IMPLEMENT LATER: CONSTANT-VALUE-MAPPING-REFS
735+
# IMPLEMENT LATER: DATA-TYPE-MAPPING-REFS
736+
# IMPLEMENT LATER: EXCLUSIVE-AREAS
737+
# IMPLEMENT LATER: EXCLUSIVE-AREA-NESTING-ORDERS
738+
# IMPLEMENT LATER: STATIC-MEMORYS
739+
# Class elements
740+
# IMPLEMENT LATER: AR-TYPED-PER-INSTANCE-MEMORYS
741+
# IMPLEMENT LATER: EVENTS
742+
# IMPLEMENT LATER: EXCLUSIVE-AREA-POLICYS
743+
# IMPLEMENT LATER: EXPLICIT-INTER-RUNNABLE-VARIABLES
744+
# IMPLEMENT LATER: HANDLE-TERMINATION-AND-RESTART
745+
# IMPLEMENT LATER: IMPLICIT-INTER-RUNNABLE-VARIABLES
746+
# IMPLEMENT LATER: INCLUDED-DATA-TYPE-SETS
747+
# IMPLEMENT LATER: INCLUDED-MODE-DECLARATION-GROUP-SETS
748+
# IMPLEMENT LATER: INSTANTIATION-DATA-DEF-PROPSS
749+
# IMPLEMENT LATER: PER-INSTANCE-MEMORYS
750+
# IMPLEMENT LATER: PER-INSTANCE-PARAMETERS
751+
# IMPLEMENT LATER: PORT-API-OPTIONS
752+
753+
# RUNNABLES
754+
755+
def test_runnables_from_element(self):
756+
writer = autosar.xml.Writer()
757+
element = ar_element.SwcInternalBehavior('MyName', runnables=ar_element.RunnableEntity("MyRunnable"))
758+
xml = '''<SWC-INTERNAL-BEHAVIOR>
759+
<SHORT-NAME>MyName</SHORT-NAME>
760+
<RUNNABLES>
761+
<RUNNABLE-ENTITY>
762+
<SHORT-NAME>MyRunnable</SHORT-NAME>
763+
</RUNNABLE-ENTITY>
764+
</RUNNABLES>
765+
</SWC-INTERNAL-BEHAVIOR>'''
766+
self.assertEqual(writer.write_str_elem(element), xml)
767+
reader = autosar.xml.Reader()
768+
elem: ar_element.SwcInternalBehavior = reader.read_str_elem(xml)
769+
self.assertIsInstance(elem, ar_element.SwcInternalBehavior)
770+
self.assertEqual(len(elem.runnables), 1)
771+
runnable = elem.runnables[0]
772+
self.assertIsInstance(runnable, ar_element.RunnableEntity)
773+
774+
def test_runnables_from_list(self):
775+
writer = autosar.xml.Writer()
776+
runnable1 = ar_element.RunnableEntity("MyRunnable1")
777+
runnable2 = ar_element.RunnableEntity("MyRunnable2")
778+
runnable3 = ar_element.RunnableEntity("MyRunnable3")
779+
element = ar_element.SwcInternalBehavior('MyName', runnables=[runnable1,
780+
runnable2,
781+
runnable3])
782+
xml = '''<SWC-INTERNAL-BEHAVIOR>
783+
<SHORT-NAME>MyName</SHORT-NAME>
784+
<RUNNABLES>
785+
<RUNNABLE-ENTITY>
786+
<SHORT-NAME>MyRunnable1</SHORT-NAME>
787+
</RUNNABLE-ENTITY>
788+
<RUNNABLE-ENTITY>
789+
<SHORT-NAME>MyRunnable2</SHORT-NAME>
790+
</RUNNABLE-ENTITY>
791+
<RUNNABLE-ENTITY>
792+
<SHORT-NAME>MyRunnable3</SHORT-NAME>
793+
</RUNNABLE-ENTITY>
794+
</RUNNABLES>
795+
</SWC-INTERNAL-BEHAVIOR>'''
796+
self.assertEqual(writer.write_str_elem(element), xml)
797+
reader = autosar.xml.Reader()
798+
elem: ar_element.SwcInternalBehavior = reader.read_str_elem(xml)
799+
self.assertIsInstance(elem, ar_element.SwcInternalBehavior)
800+
self.assertEqual(len(elem.runnables), 3)
801+
runnable = elem.runnables[0]
802+
self.assertIsInstance(runnable, ar_element.RunnableEntity)
803+
self.assertEqual(runnable.name, "MyRunnable1")
804+
runnable = elem.runnables[1]
805+
self.assertIsInstance(runnable, ar_element.RunnableEntity)
806+
self.assertEqual(runnable.name, "MyRunnable2")
807+
runnable = elem.runnables[2]
808+
self.assertIsInstance(runnable, ar_element.RunnableEntity)
809+
self.assertEqual(runnable.name, "MyRunnable3")
810+
811+
# IMPLEMENT LATER: SERVICE-DEPENDENCYS"
812+
# IMPLEMENT LATER: SHARED-PARAMETERS
813+
# IMPLEMENT LATER: SUPPORTS-MULTIPLE-INSTANTIATION
814+
# NOT SUPPORTED: VARIATION-POINT-PROXYS
815+
# NOT SUPPORTED: VARIATION-POINT
816+
817+
714818
if __name__ == '__main__':
715819
unittest.main()

0 commit comments

Comments
 (0)