armodel 1.8.0__py3-none-any.whl → 1.8.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. armodel/models/M2/AUTOSARTemplates/AutosarTopLevelStructure.py +0 -1
  2. armodel/models/M2/AUTOSARTemplates/BswModuleTemplate/BswBehavior.py +14 -14
  3. armodel/models/M2/AUTOSARTemplates/CommonStructure/FlatMap.py +2 -3
  4. armodel/models/M2/AUTOSARTemplates/CommonStructure/Implementation.py +1 -1
  5. armodel/models/M2/AUTOSARTemplates/CommonStructure/ImplementationDataTypes.py +7 -7
  6. armodel/models/M2/AUTOSARTemplates/CommonStructure/InternalBehavior.py +1 -1
  7. armodel/models/M2/AUTOSARTemplates/CommonStructure/ModeDeclaration.py +4 -4
  8. armodel/models/M2/AUTOSARTemplates/CommonStructure/ResourceConsumption/__init__.py +3 -3
  9. armodel/models/M2/AUTOSARTemplates/CommonStructure/Timing/TimingConstraint/ExecutionOrderConstraint.py +3 -3
  10. armodel/models/M2/AUTOSARTemplates/CommonStructure/Timing/TimingConstraint/TimingExtensions.py +3 -3
  11. armodel/models/M2/AUTOSARTemplates/ECUCDescriptionTemplate.py +86 -9
  12. armodel/models/M2/AUTOSARTemplates/ECUCParameterDefTemplate.py +1249 -0
  13. armodel/models/M2/AUTOSARTemplates/GenericStructure/AbstractStructure.py +13 -10
  14. armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/ARPackage.py +238 -225
  15. armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/ArObject.py +5 -4
  16. armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/Identifiable.py +46 -25
  17. armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/PrimitiveTypes.py +33 -3
  18. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Components/__init__.py +18 -20
  19. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Datatype/Datatypes.py +23 -19
  20. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/EndToEndProtection.py +4 -4
  21. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/PortInterface/__init__.py +71 -27
  22. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/ServiceMapping.py +9 -9
  23. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/__init__.py +172 -128
  24. armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/FibexCore/CoreCommunication.py +11 -11
  25. armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/FibexCore/CoreTopology.py +8 -8
  26. armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/FibexCore/EcuInstance.py +2 -2
  27. armodel/models/M2/AUTOSARTemplates/SystemTemplate/NetworkManagement.py +6 -6
  28. armodel/models/M2/AUTOSARTemplates/SystemTemplate/__init__.py +6 -6
  29. armodel/models/M2/MSR/AsamHdo/AdminData.py +101 -8
  30. armodel/parser/abstract_arxml_parser.py +8 -5
  31. armodel/parser/arxml_parser.py +332 -16
  32. armodel/tests/test_armodel/models/test_ECUCParameterDefTemplate.py +116 -0
  33. armodel/tests/test_armodel/models/test_Identifiable.py +85 -0
  34. armodel/tests/test_armodel/models/test_ar_object.py +85 -86
  35. armodel/tests/test_armodel/models/test_ar_package.py +70 -70
  36. armodel/tests/test_armodel/models/test_ar_ref.py +36 -36
  37. armodel/tests/test_armodel/models/test_common_structure.py +37 -35
  38. armodel/tests/test_armodel/models/test_datatype.py +4 -4
  39. armodel/tests/test_armodel/models/test_general_structure.py +19 -18
  40. armodel/tests/test_armodel/models/test_port_interface.py +2 -6
  41. armodel/tests/test_armodel/parser/test_arxml_parser.py +8 -8
  42. armodel/writer/abstract_arxml_writer.py +6 -2
  43. armodel/writer/arxml_writer.py +376 -29
  44. {armodel-1.8.0.dist-info → armodel-1.8.1.dist-info}/METADATA +17 -1
  45. {armodel-1.8.0.dist-info → armodel-1.8.1.dist-info}/RECORD +49 -46
  46. {armodel-1.8.0.dist-info → armodel-1.8.1.dist-info}/LICENSE +0 -0
  47. {armodel-1.8.0.dist-info → armodel-1.8.1.dist-info}/WHEEL +0 -0
  48. {armodel-1.8.0.dist-info → armodel-1.8.1.dist-info}/entry_points.txt +0 -0
  49. {armodel-1.8.0.dist-info → armodel-1.8.1.dist-info}/top_level.txt +0 -0
@@ -2,9 +2,7 @@ from typing import List
2
2
  import xml.etree.ElementTree as ET
3
3
  import os
4
4
 
5
- from armodel.models.M2.MSR.Documentation.TextModel.BlockElements.PaginationAndView import DocumentViewSelectable, Paginateable
6
-
7
- from ..models.M2.MSR.AsamHdo.AdminData import AdminData
5
+ from ..models.M2.MSR.AsamHdo.AdminData import AdminData, DocRevision, Modification
8
6
  from ..models.M2.MSR.AsamHdo.BaseTypes import BaseTypeDirectDefinition, SwBaseType
9
7
  from ..models.M2.MSR.AsamHdo.Constraints.GlobalConstraints import DataConstrRule, InternalConstrs, PhysConstrs, DataConstr
10
8
  from ..models.M2.MSR.AsamHdo.ComputationMethod import CompuConstContent, CompuConstFormulaContent, CompuConstNumericContent, CompuMethod, Compu
@@ -29,6 +27,7 @@ from ..models.M2.MSR.Documentation.TextModel.BlockElements.ListElements import A
29
27
  from ..models.M2.MSR.Documentation.TextModel.LanguageDataModel import LLongName, LOverviewParagraph, LParagraph, LanguageSpecific
30
28
  from ..models.M2.MSR.Documentation.TextModel.MultilanguageData import MultiLanguageOverviewParagraph, MultiLanguageParagraph, MultiLanguagePlainText
31
29
  from ..models.M2.MSR.Documentation.TextModel.MultilanguageData import MultilanguageLongName
30
+ from ..models.M2.MSR.Documentation.TextModel.BlockElements.PaginationAndView import DocumentViewSelectable, Paginateable
32
31
 
33
32
  from ..models.M2.AUTOSARTemplates.AutosarTopLevelStructure import AUTOSAR
34
33
  from ..models.M2.AUTOSARTemplates.BswModuleTemplate.BswBehavior import BswApiOptions, BswAsynchronousServerCallPoint, BswBackgroundEvent
@@ -48,7 +47,8 @@ from ..models.M2.AUTOSARTemplates.CommonStructure.Filter import DataFilter
48
47
  from ..models.M2.AUTOSARTemplates.CommonStructure.FlatMap import FlatInstanceDescriptor, FlatMap
49
48
  from ..models.M2.AUTOSARTemplates.CommonStructure.Implementation import ImplementationProps, Code
50
49
  from ..models.M2.AUTOSARTemplates.CommonStructure.InternalBehavior import ExecutableEntity, InternalBehavior
51
- from ..models.M2.AUTOSARTemplates.CommonStructure.ModeDeclaration import ModeDeclarationGroup, ModeRequestTypeMap, ModeDeclarationGroupPrototype
50
+ from ..models.M2.AUTOSARTemplates.CommonStructure.ModeDeclaration import ModeDeclarationGroup, ModeDeclarationGroupPrototypeMapping
51
+ from ..models.M2.AUTOSARTemplates.CommonStructure.ModeDeclaration import ModeRequestTypeMap, ModeDeclarationGroupPrototype
52
52
  from ..models.M2.AUTOSARTemplates.CommonStructure.ResourceConsumption import ResourceConsumption
53
53
  from ..models.M2.AUTOSARTemplates.CommonStructure.ResourceConsumption.MemorySectionUsage import MemorySection
54
54
  from ..models.M2.AUTOSARTemplates.CommonStructure.ResourceConsumption.StackUsage import RoughEstimateStackUsage, StackUsage
@@ -67,11 +67,22 @@ from ..models.M2.AUTOSARTemplates.CommonStructure.Timing.TimingConstraint.Execut
67
67
  from ..models.M2.AUTOSARTemplates.CommonStructure.Timing.TimingConstraint.TimingExtensions import SwcTiming, TimingExtension
68
68
  from ..models.M2.AUTOSARTemplates.CommonStructure.TriggerDeclaration import Trigger
69
69
  from ..models.M2.AUTOSARTemplates.DiagnosticExtract.DiagnosticContribution import DiagnosticServiceTable
70
- from ..models.M2.AUTOSARTemplates.ECUCDescriptionTemplate import EcucAbstractReferenceValue, EcucContainerValue, EcucInstanceReferenceValue
70
+ from ..models.M2.AUTOSARTemplates.ECUCDescriptionTemplate import EcucAbstractReferenceValue, EcucContainerValue, EcucDefinitionElement
71
+ from ..models.M2.AUTOSARTemplates.ECUCDescriptionTemplate import EcucModuleDef, EcucInstanceReferenceValue
71
72
  from ..models.M2.AUTOSARTemplates.ECUCDescriptionTemplate import EcucModuleConfigurationValues, EcucNumericalParamValue, EcucParameterValue
72
73
  from ..models.M2.AUTOSARTemplates.ECUCDescriptionTemplate import EcucReferenceValue, EcucTextualParamValue, EcucValueCollection
73
74
  from ..models.M2.AUTOSARTemplates.EcuResourceTemplate import HwDescriptionEntity, HwElement, HwPinGroup
74
75
  from ..models.M2.AUTOSARTemplates.EcuResourceTemplate.HwElementCategory import HwAttributeDef, HwCategory, HwType
76
+ from ..models.M2.AUTOSARTemplates.ECUCParameterDefTemplate import EcucAbstractConfigurationClass, EcucAbstractInternalReferenceDef
77
+ from ..models.M2.AUTOSARTemplates.ECUCParameterDefTemplate import EcucFunctionNameDef, EcucReferenceDef
78
+ from ..models.M2.AUTOSARTemplates.ECUCParameterDefTemplate import EcucAbstractReferenceDef, EcucSymbolicNameReferenceDef
79
+ from ..models.M2.AUTOSARTemplates.ECUCParameterDefTemplate import EcucAbstractStringParamDef, EcucBooleanParamDef
80
+ from ..models.M2.AUTOSARTemplates.ECUCParameterDefTemplate import EcucValueConfigurationClass
81
+ from ..models.M2.AUTOSARTemplates.ECUCParameterDefTemplate import EcucCommonAttributes, EcucEnumerationLiteralDef, EcucEnumerationParamDef
82
+ from ..models.M2.AUTOSARTemplates.ECUCParameterDefTemplate import EcucFloatParamDef, EcucIntegerParamDef
83
+ from ..models.M2.AUTOSARTemplates.ECUCParameterDefTemplate import EcucChoiceContainerDef, EcucStringParamDef
84
+ from ..models.M2.AUTOSARTemplates.ECUCParameterDefTemplate import EcucContainerDef, EcucParameterDef
85
+ from ..models.M2.AUTOSARTemplates.ECUCParameterDefTemplate import EcucMultiplicityConfigurationClass, EcucParamConfContainerDef
75
86
  from ..models.M2.AUTOSARTemplates.GenericStructure.AbstractStructure import AnyInstanceRef
76
87
  from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.ElementCollection import Collection
77
88
  from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.Identifiable import ARElement, Describable, Identifiable
@@ -112,6 +123,8 @@ from ..models.M2.AUTOSARTemplates.SWComponentTemplate.Datatype.DataPrototypes im
112
123
  from ..models.M2.AUTOSARTemplates.SWComponentTemplate.Datatype.DataPrototypes import ApplicationRecordElement, AutosarDataPrototype
113
124
  from ..models.M2.AUTOSARTemplates.SWComponentTemplate.Datatype.DataPrototypes import DataPrototype, ParameterDataPrototype, VariableDataPrototype
114
125
  from ..models.M2.AUTOSARTemplates.SWComponentTemplate.PortInterface import ArgumentDataPrototype, ClientServerInterface, ClientServerInterfaceMapping
126
+ from ..models.M2.AUTOSARTemplates.SWComponentTemplate.PortInterface import ModeDeclarationMapping
127
+ from ..models.M2.AUTOSARTemplates.SWComponentTemplate.PortInterface import ModeDeclarationMappingSet, ModeInterfaceMapping
115
128
  from ..models.M2.AUTOSARTemplates.SWComponentTemplate.PortInterface import ClientServerOperation, ClientServerOperationMapping
116
129
  from ..models.M2.AUTOSARTemplates.SWComponentTemplate.PortInterface import DataPrototypeMapping, InvalidationPolicy, ModeSwitchInterface
117
130
  from ..models.M2.AUTOSARTemplates.SWComponentTemplate.PortInterface import ParameterInterface, PortInterface, PortInterfaceMappingSet
@@ -248,13 +261,45 @@ class ARXMLParser(AbstractARXMLParser):
248
261
  self.readSdgSdxRefs(element, sdg)
249
262
  return sdg
250
263
 
251
- def readSdgs(self, element: ET.Element, admin_data: AdminData):
264
+ def readAdminDataSdgs(self, element: ET.Element, admin_data: AdminData):
252
265
  for child_element in self.findall(element, "SDGS/*"):
253
266
  tag_name = self.getTagName(child_element)
254
267
  if tag_name == "SDG":
255
268
  admin_data.addSdg(self.getSdg(child_element))
256
269
  else:
257
270
  self.notImplemented("Unsupported SDG <%s>" % tag_name)
271
+
272
+ def readModification(self, element: ET.Element, modification: Modification):
273
+ modification.setChange(self.getMultiLanguageOverviewParagraph(element, "CHANGE")) \
274
+ .setReason(self.getMultiLanguageOverviewParagraph(element, "REASON"))
275
+
276
+ def readDocRevisionModifications(self, element: ET.Element, revision: DocRevision):
277
+ for child_element in self.findall(element, "MODIFICATIONS/*"):
278
+ tag_name = self.getTagName(child_element)
279
+ if tag_name == "MODIFICATION":
280
+ modification = Modification()
281
+ self.readModification(child_element, modification)
282
+ revision.addModification(modification)
283
+ else:
284
+ self.notImplemented("Unsupported Modification <%s>" % tag_name)
285
+
286
+ def readDocRevision(self, element: ET.Element, revision: DocRevision):
287
+ revision.setDate(self.getChildElementOptionalDataTime(element, "DATE")) \
288
+ .setIssuedBy(self.getChildElementOptionalLiteral(element, "ISSUED-BY")) \
289
+ .setRevisionLabel(self.getChildElementOptionalRevisionLabelString(element, "REVISION-LABEL")) \
290
+ .setState(self.getChildElementOptionalLiteral(element, "STATE"))
291
+
292
+ self.readDocRevisionModifications(element, revision)
293
+
294
+ def readAdminDataDocRevisions(self, element: ET.Element, admin_data: AdminData):
295
+ for child_element in self.findall(element, "DOC-REVISIONS/*"):
296
+ tag_name = self.getTagName(child_element)
297
+ if tag_name == "DOC-REVISION":
298
+ revision = DocRevision()
299
+ self.readDocRevision(child_element, revision)
300
+ admin_data.addDocRevision(revision)
301
+ else:
302
+ self.notImplemented("Unsupported DocRevision <%s>" % tag_name)
258
303
 
259
304
  def getAdminData(self, element: ET.Element, key: str) -> AdminData:
260
305
  admin_data = None
@@ -265,7 +310,8 @@ class ARXMLParser(AbstractARXMLParser):
265
310
  admin_data.setLanguage(self.getChildElementOptionalLiteral(child_element, "LANGUAGE")) \
266
311
  .setUsedLanguages(self.getMultiLanguagePlainText(child_element, "USED-LANGUAGES"))
267
312
 
268
- self.readSdgs(child_element, admin_data)
313
+ self.readAdminDataSdgs(child_element, admin_data)
314
+ self.readAdminDataDocRevisions(child_element, admin_data)
269
315
  return admin_data
270
316
 
271
317
  def readReferrable(self, element: ET.Element, referrable: Referrable):
@@ -4247,6 +4293,253 @@ class ARXMLParser(AbstractARXMLParser):
4247
4293
  self.readARElement(element, blueprint)
4248
4294
  blueprint.setInterfaceRef(self.getChildElementOptionalRefType(element, "INTERFACE-REF"))
4249
4295
 
4296
+ def readModeDeclarationMappingFirstModeRefs(self, element: ET.Element, mapping: ModeDeclarationMapping):
4297
+ for ref_link in self.getChildElementRefTypeList(element, "FIRST-MODE-REFS/FIRST-MODE-REF"):
4298
+ mapping.addFirstModeRef(ref_link)
4299
+
4300
+ def readModeDeclarationMapping(self, element: ET.Element, mapping: ModeDeclarationMapping):
4301
+ # self.logger.debug("Read ModeDeclarationMapping <%s>" % mapping.getShortName())
4302
+ self.readIdentifiable(element, mapping)
4303
+ self.readModeDeclarationMappingFirstModeRefs(element, mapping)
4304
+ mapping.setSecondModeRef(self.getChildElementOptionalRefType(element, "SECOND-MODE-REF"))
4305
+
4306
+ def readModeDeclarationMappingSetModeDeclarationMappings(self, element: ET.Element, mapping_set: ModeDeclarationMappingSet):
4307
+ for child_element in self.findall(element, "MODE-DECLARATION-MAPPINGS/*"):
4308
+ tag_name = self.getTagName(child_element)
4309
+ if tag_name == "MODE-DECLARATION-MAPPING":
4310
+ mapping = mapping_set.createModeDeclarationMapping(self.getShortName(child_element))
4311
+ self.readModeDeclarationMapping(child_element, mapping)
4312
+ else:
4313
+ self.notImplemented("Unsupported ModeDeclarationMapping <%s>" % tag_name)
4314
+
4315
+ def readModeDeclarationMappingSet(self, element: ET.Element, mapping_set: ModeDeclarationMappingSet):
4316
+ self.logger.debug("Read ModeDeclarationMappingSet <%s>" % mapping_set.getShortName())
4317
+ self.readARElement(element, mapping_set)
4318
+ self.readModeDeclarationMappingSetModeDeclarationMappings(element, mapping_set)
4319
+
4320
+ def readEcucDefinitionElement(self, element: ET.Element, def_element: EcucDefinitionElement):
4321
+ self.readIdentifiable(element, def_element)
4322
+ def_element.setLowerMultiplicity(self.getChildElementOptionalPositiveInteger(element, "LOWER-MULTIPLICITY"))
4323
+ def_element.setUpperMultiplicity(self.getChildElementOptionalPositiveInteger(element, "UPPER-MULTIPLICITY"))
4324
+ def_element.setScope(self.getChildElementOptionalLiteral(element, "SCOPE"))
4325
+
4326
+ def readEcucModuleDefSupportedConfigVariants(self, element: ET.Element, module_def: EcucModuleDef):
4327
+ for variant in self.getChildElementLiteralValueList(element, "SUPPORTED-CONFIG-VARIANTS/SUPPORTED-CONFIG-VARIANT"):
4328
+ module_def.addSupportedConfigVariant(variant)
4329
+
4330
+ def readEcucAbstractConfigurationClass(self, element: ET.Element, cfg_class: EcucAbstractConfigurationClass):
4331
+ self.readARObjectAttributes(element, cfg_class)
4332
+ cfg_class.setConfigClass(self.getChildElementOptionalLiteral(element, "CONFIG-CLASS"))
4333
+ cfg_class.setConfigVariant(self.getChildElementOptionalLiteral(element, "CONFIG-VARIANT"))
4334
+
4335
+ def readEcucMultiplicityConfigurationClass(self, element: ET.Element, cfg_class: EcucMultiplicityConfigurationClass):
4336
+ self.readEcucAbstractConfigurationClass(element, cfg_class)
4337
+
4338
+ def getEcucMultiplicityConfigurationClasses(self, element: ET.Element) -> List[EcucMultiplicityConfigurationClass]:
4339
+ cfg_classes = []
4340
+ for child_element in self.findall(element, "MULTIPLICITY-CONFIG-CLASSES/*"):
4341
+ tag_name = self.getTagName(child_element)
4342
+ if tag_name == "ECUC-MULTIPLICITY-CONFIGURATION-CLASS":
4343
+ cfg_class = EcucMultiplicityConfigurationClass()
4344
+ self.readEcucMultiplicityConfigurationClass(child_element, cfg_class)
4345
+ cfg_classes.append(cfg_class)
4346
+ else:
4347
+ self.notImplemented("Unsupported MultiplicityConfigClass <%s>" % tag_name)
4348
+ return cfg_classes
4349
+
4350
+ def readEcucContainerDef(self, element: ET.Element, container_def: EcucContainerDef):
4351
+ self.readEcucDefinitionElement(element, container_def)
4352
+ for cfg_class in self.getEcucMultiplicityConfigurationClasses(element):
4353
+ container_def.addMultiplicityConfigClass(cfg_class)
4354
+ container_def.setPostBuildVariantMultiplicity(self.getChildElementOptionalBooleanValue(element, "POST-BUILD-VARIANT-MULTIPLICITY"))
4355
+ container_def.setRequiresIndex(self.getChildElementOptionalBooleanValue(element, "REQUIRES-INDEX"))
4356
+ container_def.setMultipleConfigurationContainer(self.getChildElementOptionalBooleanValue(element, "MULTIPLE-CONFIGURATION-CONTAINER"))
4357
+
4358
+ def readEcucValueConfigurationClass(self, element: ET.Element, cfg_class: EcucValueConfigurationClass):
4359
+ self.readEcucAbstractConfigurationClass(element, cfg_class)
4360
+
4361
+ def getEcucValueConfigurationClasses(self, element: ET.Element) -> List[EcucValueConfigurationClass]:
4362
+ cfg_classes = []
4363
+ for child_element in self.findall(element, "VALUE-CONFIG-CLASSES/*"):
4364
+ tag_name = self.getTagName(child_element)
4365
+ if tag_name == "ECUC-VALUE-CONFIGURATION-CLASS":
4366
+ cfg_class = EcucValueConfigurationClass()
4367
+ self.readEcucValueConfigurationClass(child_element, cfg_class)
4368
+ cfg_classes.append(cfg_class)
4369
+ else:
4370
+ self.notImplemented("Unsupported ValueConfigClass <%s>" % tag_name)
4371
+ return cfg_classes
4372
+
4373
+ def readEcucCommonAttributes(self, element: ET.Element, common_attrs: EcucCommonAttributes):
4374
+ self.readEcucDefinitionElement(element, common_attrs)
4375
+ for cfg_class in self.getEcucMultiplicityConfigurationClasses(element):
4376
+ common_attrs.addMultiplicityConfigClass(cfg_class)
4377
+ common_attrs.setOrigin(self.getChildElementOptionalLiteral(element, "ORIGIN"))
4378
+ common_attrs.setPostBuildVariantMultiplicity(self.getChildElementOptionalBooleanValue(element, "POST-BUILD-VARIANT-MULTIPLICITY"))
4379
+ common_attrs.setPostBuildVariantValue(self.getChildElementOptionalBooleanValue(element, "POST-BUILD-VARIANT-VALUE"))
4380
+ common_attrs.setRequiresIndex(self.getChildElementOptionalBooleanValue(element, "REQUIRES-INDEX"))
4381
+ for cfg_class in self.getEcucValueConfigurationClasses(element):
4382
+ common_attrs.addValueConfigClass(cfg_class)
4383
+
4384
+ def readEcucParameterDef(self, element: ET.Element, param_def: EcucParameterDef):
4385
+ self.readEcucCommonAttributes(element, param_def)
4386
+ param_def.setDerivation(self.getChildElementOptionalLiteral(element, "DERIVATION"))
4387
+ param_def.setSymbolicNameValue(self.getChildElementOptionalBooleanValue(element, "SYMBOLIC-NAME-VALUE"))
4388
+ param_def.setWithAuto(self.getChildElementOptionalBooleanValue(element, "WITH-AUTO"))
4389
+
4390
+ def readEcucBooleanParamDef(self, element: ET.Element, param_def: EcucBooleanParamDef):
4391
+ self.readEcucParameterDef(element, param_def)
4392
+ param_def.setDefaultValue(self.getChildElementOptionalBooleanValue(element, "DEFAULT-VALUE"))
4393
+
4394
+ def readEcucAbstractStringParamDef(self, element: ET.Element, param_def: EcucAbstractStringParamDef):
4395
+ self.readEcucParameterDef(element, param_def)
4396
+ param_def.setDefaultValue(self.getChildElementOptionalLiteral(element, "DEFAULT-VALUE"))
4397
+ param_def.setMaxLength(self.getChildElementOptionalIntegerValue(element, "MAX-LENGTH"))
4398
+ param_def.setMinLength(self.getChildElementOptionalIntegerValue(element, "MIN-LENGTH"))
4399
+ param_def.setRegularExpression(self.getChildElementOptionalLiteral(element, "REGULAR-EXPRESSION"))
4400
+
4401
+ def readEcucStringParamDef(self, element: ET.Element, param_def: EcucStringParamDef):
4402
+ self.readEcucAbstractStringParamDef(element, param_def)
4403
+
4404
+ def readEcucIntegerParamDef(self, element: ET.Element, param_def: EcucIntegerParamDef):
4405
+ self.readEcucParameterDef(element, param_def)
4406
+ param_def.setDefaultValue(self.getChildElementOptionalIntegerValue(element, "DEFAULT-VALUE"))
4407
+ param_def.setMax(self.getChildElementOptionalIntegerValue(element, "MAX"))
4408
+ param_def.setMin(self.getChildElementOptionalIntegerValue(element, "MIN"))
4409
+
4410
+ def readEcucFloatParamDef(self, element: ET.Element, param_def: EcucFloatParamDef):
4411
+ self.readEcucParameterDef(element, param_def)
4412
+ param_def.setDefaultValue(self.getChildElementOptionalFloatValue(element, "DEFAULT-VALUE"))
4413
+ param_def.setMax(self.getChildLimitElement(element, "MAX"))
4414
+ param_def.setMin(self.getChildLimitElement(element, "MIN"))
4415
+
4416
+ def readEcucEnumerationLiteral(self, element: ET.Element, literal: EcucEnumerationLiteralDef):
4417
+ self.readIdentifiable(element, literal)
4418
+ literal.setOrigin(self.getChildElementOptionalLiteral(element, "ORIGIN"))
4419
+
4420
+ def readEcucEnumerationParamDefLiterals(self, element: ET.Element, literal_def: EcucEnumerationParamDef):
4421
+ for child_element in self.findall(element, "LITERALS/*"):
4422
+ tag_name = self.getTagName(child_element)
4423
+ if tag_name == "ECUC-ENUMERATION-LITERAL-DEF":
4424
+ literal = literal_def.createLiteral(self.getShortName(child_element))
4425
+ self.readEcucEnumerationLiteral(child_element, literal)
4426
+ else:
4427
+ self.notImplemented("Unsupported EnumerationLiteral <%s>" % tag_name)
4428
+
4429
+ def readEcucEnumerationParamDef(self, element: ET.Element, param_def: EcucEnumerationParamDef):
4430
+ self.readEcucParameterDef(element, param_def)
4431
+ param_def.setDefaultValue(self.getChildElementOptionalLiteral(element, "DEFAULT-VALUE"))
4432
+ self.readEcucEnumerationParamDefLiterals(element, param_def)
4433
+
4434
+ def readEcucFunctionNameDef(self, element: ET.Element, ref_def: EcucFunctionNameDef):
4435
+ self.readEcucAbstractStringParamDef(element, ref_def)
4436
+ child_element = self.find(element, "ECUC-FUNCTION-NAME-DEF-VARIANTS/ECUC-FUNCTION-NAME-DEF-CONDITIONAL")
4437
+ if child_element is not None:
4438
+ ref_def.setDefaultValue(self.getChildElementOptionalLiteral(child_element, "DEFAULT-VALUE"))
4439
+ ref_def.setMinLength(self.getChildElementOptionalIntegerValue(child_element, "MIN-LENGTH"))
4440
+ ref_def.setMaxLength(self.getChildElementOptionalIntegerValue(child_element, "MAX-LENGTH"))
4441
+
4442
+ def readEcucContainerDefParameters(self, element: ET.Element, container_def: EcucParamConfContainerDef):
4443
+ for child_element in self.findall(element, "PARAMETERS/*"):
4444
+ tag_name = self.getTagName(child_element)
4445
+ if tag_name == "ECUC-BOOLEAN-PARAM-DEF":
4446
+ param_def = container_def.createEcucBooleanParamDef(self.getShortName(child_element))
4447
+ self.readEcucBooleanParamDef(child_element, param_def)
4448
+ elif tag_name == "ECUC-STRING-PARAM-DEF":
4449
+ param_def = container_def.createEcucStringParamDef(self.getShortName(child_element))
4450
+ self.readEcucStringParamDef(child_element, param_def)
4451
+ elif tag_name == "ECUC-INTEGER-PARAM-DEF":
4452
+ param_def = container_def.createEcucIntegerParamDef(self.getShortName(child_element))
4453
+ self.readEcucIntegerParamDef(child_element, param_def)
4454
+ elif tag_name == "ECUC-FLOAT-PARAM-DEF":
4455
+ param_def = container_def.createEcucFloatParamDef(self.getShortName(child_element))
4456
+ self.readEcucFloatParamDef(child_element, param_def)
4457
+ elif tag_name == "ECUC-ENUMERATION-PARAM-DEF":
4458
+ param_def = container_def.createEcucEnumerationParamDef(self.getShortName(child_element))
4459
+ self.readEcucEnumerationParamDef(child_element, param_def)
4460
+ elif tag_name == "ECUC-FUNCTION-NAME-DEF":
4461
+ param_def = container_def.createEcucFunctionNameDef(self.getShortName(child_element))
4462
+ self.readEcucFunctionNameDef(child_element, param_def)
4463
+ else:
4464
+ self.notImplemented("Unsupported Parameter <%s>" % tag_name)
4465
+
4466
+ def readEcucAbstractReferenceDef(self, element: ET.Element, ref_def: EcucAbstractReferenceDef):
4467
+ self.readEcucCommonAttributes(element, ref_def)
4468
+ ref_def.setWithAuto(self.getChildElementOptionalBooleanValue(element, "WITH-AUTO"))
4469
+
4470
+ def readEcucAbstractInternalReferenceDef(self, element: ET.Element, ref_def: EcucAbstractInternalReferenceDef):
4471
+ self.readEcucAbstractReferenceDef(element, ref_def)
4472
+
4473
+ def readEcucSymbolicNameReferenceDef(self, element: ET.Element, ref_def: EcucSymbolicNameReferenceDef):
4474
+ self.readEcucAbstractInternalReferenceDef(element, ref_def)
4475
+ ref_def.setDestinationRef(self.getChildElementOptionalRefType(element, "DESTINATION-REF"))
4476
+
4477
+ def readEcucReferenceDef(self, element: ET.Element, ref_def: EcucReferenceDef):
4478
+ self.readEcucAbstractInternalReferenceDef(element, ref_def)
4479
+ ref_def.setDestinationRef(self.getChildElementOptionalRefType(element, "DESTINATION-REF"))
4480
+
4481
+ def readEcucContainerDefReferences(self, element: ET.Element, container_def: EcucParamConfContainerDef):
4482
+ for child_element in self.findall(element, "REFERENCES/*"):
4483
+ tag_name = self.getTagName(child_element)
4484
+ if tag_name == "ECUC-SYMBOLIC-NAME-REFERENCE-DEF":
4485
+ ref_def = container_def.createEcucSymbolicNameReferenceDef(self.getShortName(child_element))
4486
+ self.readEcucSymbolicNameReferenceDef(child_element, ref_def)
4487
+ elif tag_name == "ECUC-REFERENCE-DEF":
4488
+ ref_def = container_def.createEcucReferenceDef(self.getShortName(child_element))
4489
+ self.readEcucReferenceDef(child_element, ref_def)
4490
+ else:
4491
+ self.notImplemented("Unsupported EcucReferenceDef <%s>" % tag_name)
4492
+
4493
+ def readEcucContainerDefSubContainers(self, element: ET.Element, container_def: EcucParamConfContainerDef):
4494
+ for child_element in self.findall(element, "SUB-CONTAINERS/*"):
4495
+ tag_name = self.getTagName(child_element)
4496
+ if tag_name == "ECUC-PARAM-CONF-CONTAINER-DEF":
4497
+ sub_container_def = container_def.createEcucParamConfContainerDef(self.getShortName(child_element))
4498
+ self.readEcucParamConfContainerDef(child_element, sub_container_def)
4499
+ elif tag_name == "ECUC-CHOICE-CONTAINER-DEF":
4500
+ sub_container_def = container_def.createEcucChoiceContainerDef(self.getShortName(child_element))
4501
+ self.readEcucChoiceContainerDef(child_element, sub_container_def)
4502
+ else:
4503
+ self.notImplemented("Unsupported SubContainer <%s>" % tag_name)
4504
+
4505
+ def readEcucParamConfContainerDef(self, element: ET.Element, container_def: EcucParamConfContainerDef):
4506
+ self.readEcucContainerDef(element, container_def)
4507
+ self.readEcucContainerDefParameters(element, container_def)
4508
+ self.readEcucContainerDefReferences(element, container_def)
4509
+ self.readEcucContainerDefSubContainers(element, container_def)
4510
+
4511
+ def readEcucChoiceContainerDefChoices(self, element: ET.Element, container_def: EcucChoiceContainerDef):
4512
+ for child_element in self.findall(element, "CHOICES/*"):
4513
+ tag_name = self.getTagName(child_element)
4514
+ if tag_name == "ECUC-PARAM-CONF-CONTAINER-DEF":
4515
+ ref_def = container_def.createEcucParamConfContainerDef(self.getShortName(child_element))
4516
+ self.readEcucParamConfContainerDef(child_element, ref_def)
4517
+ else:
4518
+ self.notImplemented("Unsupported Choice <%s>" % tag_name)
4519
+
4520
+ def readEcucChoiceContainerDef(self, element: ET.Element, container_def: EcucChoiceContainerDef):
4521
+ self.readEcucContainerDef(element, container_def)
4522
+ self.readEcucChoiceContainerDefChoices(element, container_def)
4523
+
4524
+ def readEcucModuleDefContainers(self, element: ET.Element, module_def: EcucModuleDef):
4525
+ for child_element in self.findall(element, "CONTAINERS/*"):
4526
+ tag_name = self.getTagName(child_element)
4527
+ if tag_name == "ECUC-PARAM-CONF-CONTAINER-DEF":
4528
+ container_def = module_def.createEcucParamConfContainerDef(self.getShortName(child_element))
4529
+ self.readEcucParamConfContainerDef(child_element, container_def)
4530
+ elif tag_name == "ECUC-CHOICE-CONTAINER-DEF":
4531
+ container_def = module_def.createEcucChoiceContainerDef(self.getShortName(child_element))
4532
+ self.readEcucChoiceContainerDef(child_element, container_def)
4533
+ else:
4534
+ self.notImplemented("Unsupported Container <%s>" % tag_name)
4535
+
4536
+ def readEcucModuleDef(self, element: ET.Element, module_def: EcucModuleDef):
4537
+ self.logger.debug("Read EcucModuleDef <%s>" % module_def.getShortName())
4538
+ self.readEcucDefinitionElement(element, module_def)
4539
+ module_def.setPostBuildVariantSupport(self.getChildElementOptionalBooleanValue(element, "POST-BUILD-VARIANT-SUPPORT"))
4540
+ self.readEcucModuleDefSupportedConfigVariants(element, module_def)
4541
+ self.readEcucModuleDefContainers(element, module_def)
4542
+
4250
4543
  def readCommunicationController(self, element: ET.Element, controller: CommunicationController):
4251
4544
  controller.setWakeUpByControllerSupported(self.getChildElementOptionalBooleanValue(element, "WAKE-UP-BY-CONTROLLER-SUPPORTED"))
4252
4545
 
@@ -4696,13 +4989,13 @@ class ARXMLParser(AbstractARXMLParser):
4696
4989
  def readPhysicalDimension(self, element: ET.Element, dimension: PhysicalDimension):
4697
4990
  self.logger.debug("Read PhysicalDimension <%s>" % dimension.getShortName())
4698
4991
  self.readIdentifiable(element, dimension)
4699
- dimension.setLengthExp(self.getChildElementOptionalNumericalValue(element, "LENGTH-EXP")) \
4700
- .setLuminousIntensityExp(self.getChildElementOptionalNumericalValue(element, "LUMINOUS-INTENSITY-EXP")) \
4701
- .setMassExp(self.getChildElementOptionalNumericalValue(element, "MASS-EXP")) \
4702
- .setMolarAmountExp(self.getChildElementOptionalNumericalValue(element, "MOLAR-AMOUNT-EXP")) \
4703
- .setTemperatureExp(self.getChildElementOptionalNumericalValue(element, "TEMPERATURE-EXP")) \
4704
- .setTimeExp(self.getChildElementOptionalNumericalValue(element, "TIME-EXP")) \
4705
- .setCurrentExp(self.getChildElementOptionalNumericalValue(element, "CURRENT-EXP"))
4992
+ dimension.setLengthExp(self.getChildElementOptionalNumericalValue(element, "LENGTH-EXP"))
4993
+ dimension.setLuminousIntensityExp(self.getChildElementOptionalNumericalValue(element, "LUMINOUS-INTENSITY-EXP"))
4994
+ dimension.setMassExp(self.getChildElementOptionalNumericalValue(element, "MASS-EXP"))
4995
+ dimension.setMolarAmountExp(self.getChildElementOptionalNumericalValue(element, "MOLAR-AMOUNT-EXP"))
4996
+ dimension.setTemperatureExp(self.getChildElementOptionalNumericalValue(element, "TEMPERATURE-EXP"))
4997
+ dimension.setTimeExp(self.getChildElementOptionalNumericalValue(element, "TIME-EXP"))
4998
+ dimension.setCurrentExp(self.getChildElementOptionalNumericalValue(element, "CURRENT-EXP"))
4706
4999
 
4707
5000
  def readISignalGroupISignalRef(self, element: ET.Element, group: ISignalGroup):
4708
5001
  for ref_type in self.getChildElementRefTypeList(element, "I-SIGNAL-REFS/I-SIGNAL-REF"):
@@ -5111,6 +5404,20 @@ class ARXMLParser(AbstractARXMLParser):
5111
5404
  self.readIdentifiable(element, mapping)
5112
5405
  self.readClientServerInterfaceMappingOperationMappings(element, mapping)
5113
5406
 
5407
+ def readModeInterfaceMappingModeMapping(self, element: ET.Element, mapping: ModeInterfaceMapping):
5408
+ child_element = self.find(element, "MODE-MAPPING")
5409
+ if child_element is not None:
5410
+ mode_mapping = ModeDeclarationGroupPrototypeMapping()
5411
+ mode_mapping.setFirstModeGroupRef(self.getChildElementOptionalRefType(child_element, "FIRST-MODE-GROUP-REF")) \
5412
+ .setModeDeclarationMappingSetRef(self.getChildElementOptionalRefType(child_element, "MODE-DECLARATION-MAPPING-SET-REF")) \
5413
+ .setSecondModeGroupRef(self.getChildElementOptionalRefType(child_element, "SECOND-MODE-GROUP-REF"))
5414
+ mapping.setModeMapping(mode_mapping)
5415
+
5416
+ def readModeInterfaceMapping(self, element: ET.Element, mapping: ModeInterfaceMapping):
5417
+ # self.logger.debug("Read ModeInterfaceMapping %s" % mapping.getShortName())
5418
+ self.readIdentifiable(element, mapping)
5419
+ self.readModeInterfaceMappingModeMapping(element, mapping)
5420
+
5114
5421
  def readPortInterfaceMappings(self, element: ET.Element, mapping_set: PortInterfaceMappingSet):
5115
5422
  for child_element in self.findall(element, "PORT-INTERFACE-MAPPINGS/*"):
5116
5423
  tag_name = self.getTagName(child_element)
@@ -5120,6 +5427,9 @@ class ARXMLParser(AbstractARXMLParser):
5120
5427
  elif tag_name == "CLIENT-SERVER-INTERFACE-MAPPING":
5121
5428
  mapping = mapping_set.createClientServerInterfaceMapping(self.getShortName(child_element))
5122
5429
  self.readClientServerInterfaceMapping(child_element, mapping)
5430
+ elif tag_name == "MODE-INTERFACE-MAPPING":
5431
+ mapping = mapping_set.createModeInterfaceMapping(self.getShortName(child_element))
5432
+ self.readModeInterfaceMapping(child_element, mapping)
5123
5433
  else:
5124
5434
  self.notImplemented("Unsupported PortInterfaceMapping <%s>" % tag_name)
5125
5435
 
@@ -5363,8 +5673,14 @@ class ARXMLParser(AbstractARXMLParser):
5363
5673
  keyword_set = parent.createKeywordSet(self.getShortName(child_element))
5364
5674
  self.readKeywordSet(child_element, keyword_set)
5365
5675
  elif tag_name == "PORT-PROTOTYPE-BLUEPRINT":
5366
- keyword_set = parent.createPortPrototypeBlueprint(self.getShortName(child_element))
5367
- self.readPortPrototypeBlueprint(child_element, keyword_set)
5676
+ blueprint = parent.createPortPrototypeBlueprint(self.getShortName(child_element))
5677
+ self.readPortPrototypeBlueprint(child_element, blueprint)
5678
+ elif tag_name == "MODE-DECLARATION-MAPPING-SET":
5679
+ mapping_set = parent.createModeDeclarationMappingSet(self.getShortName(child_element))
5680
+ self.readModeDeclarationMappingSet(child_element, mapping_set)
5681
+ elif tag_name == "ECUC-MODULE-DEF":
5682
+ module_def = parent.createEcucModuleDef(self.getShortName(child_element))
5683
+ self.readEcucModuleDef(child_element, module_def)
5368
5684
  else:
5369
5685
  self.notImplemented("Unsupported Element type of ARPackage <%s>" % tag_name)
5370
5686
 
@@ -0,0 +1,116 @@
1
+ import pytest
2
+
3
+ from ....models.M2.AUTOSARTemplates.AutosarTopLevelStructure import AUTOSAR
4
+ from ....models.M2.AUTOSARTemplates.ECUCParameterDefTemplate import EcucChoiceContainerDef, EcucFloatParamDef, EcucParamConfContainerDef
5
+ from ....models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.ArObject import ARObject
6
+
7
+ # filepath: src/armodel/models/M2/AUTOSARTemplates/test_ECUCParameterDefTemplate.py
8
+
9
+
10
+ class TestEcucChoiceContainerDef:
11
+ def test_initialization(self):
12
+ document = AUTOSAR.getInstance()
13
+ parent = document.createARPackage("AUTOSAR")
14
+ short_name = "TestChoiceContainer"
15
+ choice_container = EcucChoiceContainerDef(parent, short_name)
16
+
17
+ assert choice_container.getShortName() == short_name
18
+ assert choice_container.getChoices() == []
19
+
20
+ def test_createEcucParamConfContainerDef(self):
21
+ document = AUTOSAR.getInstance()
22
+ parent = document.createARPackage("AUTOSAR")
23
+ short_name = "TestChoiceContainer"
24
+ choice_container = EcucChoiceContainerDef(parent, short_name)
25
+
26
+ param_conf_container = choice_container.createEcucParamConfContainerDef("TestParamConfContainer")
27
+ assert param_conf_container.getShortName() == "TestParamConfContainer"
28
+ assert isinstance(param_conf_container, EcucParamConfContainerDef)
29
+ assert param_conf_container in choice_container.getChoices()
30
+
31
+ def test_createEcucParamConfContainerDef_duplicate(self):
32
+ document = AUTOSAR.getInstance()
33
+ parent = document.createARPackage("AUTOSAR")
34
+ short_name = "TestChoiceContainer"
35
+ choice_container = EcucChoiceContainerDef(parent, short_name)
36
+
37
+ choice_container.createEcucParamConfContainerDef("TestParamConfContainer")
38
+ param_conf_container_duplicate = choice_container.createEcucParamConfContainerDef("TestParamConfContainer")
39
+
40
+ assert len(choice_container.getChoices()) == 1
41
+ assert param_conf_container_duplicate.getShortName() == "TestParamConfContainer"
42
+
43
+ def test_getChoices(self):
44
+ document = AUTOSAR.getInstance()
45
+ parent = document.createARPackage("AUTOSAR")
46
+ short_name = "TestChoiceContainer"
47
+ choice_container = EcucChoiceContainerDef(parent, short_name)
48
+
49
+ choice_container.createEcucParamConfContainerDef("Choice1")
50
+ choice_container.createEcucParamConfContainerDef("Choice2")
51
+
52
+ choices = choice_container.getChoices()
53
+ assert len(choices) == 2
54
+ assert choices[0].getShortName() == "Choice1"
55
+ assert choices[1].getShortName() == "Choice2"
56
+
57
+
58
+ class TestEcucFloatParamDef:
59
+ def test_initialization(self):
60
+ document = AUTOSAR.getInstance()
61
+ parent = document.createARPackage("AUTOSAR")
62
+ short_name = "TestFloatParam"
63
+ float_param = EcucFloatParamDef(parent, short_name)
64
+
65
+ assert float_param.getShortName() == short_name
66
+ assert float_param.getDefaultValue() is None
67
+ assert float_param.getMax() is None
68
+ assert float_param.getMin() is None
69
+
70
+ def test_set_and_get_default_value(self):
71
+ document = AUTOSAR.getInstance()
72
+ parent = document.createARPackage("AUTOSAR")
73
+ float_param = EcucFloatParamDef(parent, "TestFloatParam")
74
+
75
+ default_value = 3.14
76
+ float_param.setDefaultValue(default_value)
77
+
78
+ assert float_param.getDefaultValue() == default_value
79
+
80
+ def test_set_and_get_max_value(self):
81
+ document = AUTOSAR.getInstance()
82
+ parent = document.createARPackage("AUTOSAR")
83
+ float_param = EcucFloatParamDef(parent, "TestFloatParam")
84
+
85
+ max_value = 100.0
86
+ float_param.setMax(max_value)
87
+
88
+ assert float_param.getMax() == max_value
89
+
90
+ def test_set_and_get_min_value(self):
91
+ document = AUTOSAR.getInstance()
92
+ parent = document.createARPackage("AUTOSAR")
93
+ float_param = EcucFloatParamDef(parent, "TestFloatParam")
94
+
95
+ min_value = 0.0
96
+ float_param.setMin(min_value)
97
+
98
+ assert float_param.getMin() == min_value
99
+
100
+ def test_set_max_to_none(self):
101
+ document = AUTOSAR.getInstance()
102
+ parent = document.createARPackage("AUTOSAR")
103
+ float_param = EcucFloatParamDef(parent, "TestFloatParam")
104
+
105
+ float_param.setMax(None)
106
+
107
+ assert float_param.getMax() is None
108
+
109
+ def test_set_min_to_none(self):
110
+ document = AUTOSAR.getInstance()
111
+ parent = document.createARPackage("AUTOSAR")
112
+ float_param = EcucFloatParamDef(parent, "TestFloatParam")
113
+
114
+ float_param.setMin(None)
115
+
116
+ assert float_param.getMin() is None
@@ -0,0 +1,85 @@
1
+ import pytest
2
+
3
+ from ....models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.Identifiable import CollectableElement, Referrable
4
+
5
+
6
+ class MockReferrable1(Referrable):
7
+ def __init__(self, parent, short_name):
8
+ super().__init__(parent, short_name)
9
+
10
+
11
+ class MockReferrable2(Referrable):
12
+ def __init__(self, parent, short_name):
13
+ super().__init__(parent, short_name)
14
+
15
+
16
+ class MockCollectableElement(CollectableElement):
17
+ def __init__(self):
18
+ super().__init__()
19
+
20
+
21
+ class TestCollectableElement:
22
+
23
+ def setup_method(self):
24
+ '''
25
+ CollectableElement instance for testing.
26
+ '''
27
+ self.collectable_element = MockCollectableElement()
28
+ self.mock_referrable1 = MockReferrable1(None, "referrable")
29
+ self.mock_referrable2 = MockReferrable2(None, "referrable")
30
+
31
+ def test_getTotalElement(self):
32
+ assert self.collectable_element.getTotalElement() == 0
33
+ self.collectable_element.addElement(self.mock_referrable1)
34
+ assert self.collectable_element.getTotalElement() == 1
35
+
36
+ def test_addElement(self):
37
+ self.collectable_element.addElement(self.mock_referrable1)
38
+ assert self.collectable_element.getTotalElement() == 1
39
+ assert self.collectable_element.getElement("referrable", MockReferrable1) == self.mock_referrable1
40
+ self.collectable_element.addElement(self.mock_referrable2)
41
+ assert self.collectable_element.getTotalElement() == 2
42
+ assert self.collectable_element.getElement("referrable", MockReferrable2) == self.mock_referrable2
43
+
44
+ def test_removeElement(self):
45
+ self.collectable_element.addElement(self.mock_referrable1)
46
+ assert self.collectable_element.getTotalElement() == 1
47
+ self.collectable_element.addElement(self.mock_referrable2)
48
+ assert self.collectable_element.getTotalElement() == 2
49
+ self.collectable_element.removeElement("referrable", MockReferrable2)
50
+ assert self.collectable_element.getTotalElement() == 1
51
+ self.collectable_element.removeElement("referrable", MockReferrable1)
52
+ assert self.collectable_element.getTotalElement() == 0
53
+
54
+ def test_removeElement_non_existent_key(self):
55
+ self.collectable_element.addElement(self.mock_referrable1)
56
+ assert self.collectable_element.getTotalElement() == 1
57
+ try:
58
+ self.collectable_element.removeElement("non_existent", MockReferrable1)
59
+ except KeyError as ex:
60
+ assert str(ex) == "'Invalid key <non_existent> for removing element'"
61
+ assert self.collectable_element.getTotalElement() == 1
62
+
63
+ def test_getElements(self):
64
+ self.collectable_element.addElement(self.mock_referrable1)
65
+ self.collectable_element.addElement(self.mock_referrable1)
66
+ self.collectable_element.addElement(self.mock_referrable2)
67
+ elements = list(self.collectable_element.getElements())
68
+ assert len(elements) == 2
69
+ assert elements[0] == self.mock_referrable1
70
+ assert elements[1] == self.mock_referrable2
71
+
72
+ def test_getElement(self):
73
+ self.collectable_element.addElement(self.mock_referrable1)
74
+ element = self.collectable_element.getElement("referrable", MockReferrable1)
75
+ assert element == self.mock_referrable1
76
+ assert self.collectable_element.getElement("referrable", MockReferrable2) is None
77
+ assert self.collectable_element.getElement("non_existent", MockReferrable1) is None
78
+
79
+ def test_IsElementExists(self):
80
+ assert not self.collectable_element.IsElementExists("test_element")
81
+ self.collectable_element.addElement(self.mock_referrable1)
82
+ assert not self.collectable_element.IsElementExists("test_element")
83
+ assert self.collectable_element.IsElementExists("referrable")
84
+ assert self.collectable_element.IsElementExists("referrable", MockReferrable1)
85
+ assert not self.collectable_element.IsElementExists("referrable", MockReferrable2)