Enable enums in interface for zone controller

* Option to map TL generated enums to rte counterparts using
  'mapEnumsToRteCounterpart' in project config. This allows using enums
  directly in the interface.
* Added option to 'includeAllEnums' in project config. This adds all
  enums found in enumDefDir to header files, allowing projects to
  add their use in interfaces before they are added to model code.

Change-Id: I0cac83e3be3514cbc15e02de6d5f7ca519c3cea6
This commit is contained in:
olindgre 2024-11-11 13:38:21 +01:00
parent cee323b493
commit e95b0f0394
8 changed files with 281 additions and 60 deletions

@ -38,6 +38,7 @@ Example BaseConfig.json:
"prjUnitSrcDir": "../../Models/*/Vc*/pybuild_src",
"prjUnitCfgDir": "../../Models/*/Vc*/pybuild_cfg",
"prjUnitMdlDir": "../../Models/*/Vc*",
"enumDefDir": "../../Models/Common/VcEnumDefinitions",
"prjLocalDefs": "*_LocalDefs.h",
"prjCodeswitches": "SPM_Codeswitch_Setup*.csv",
"coreDummyFileName" : "VcCoreDummy",
@ -123,7 +124,9 @@ This key is used to set individual options to match the old ECU types, see examp
"generateRteCheckpointIds": false,
"generateYamlInterfaceFile": false,
"propagateTagName": true,
"useA2lSymbolLinks": true
"useA2lSymbolLinks": true,
"mapToRteEnums": false,
"includeAllEnums": false
}
}
}
@ -188,6 +191,16 @@ Default is False.
Use "SYMBOL_LINK" in the generated A2L file.
Default is False.
#### mapToRteEnums
Map TL generated enum values in source code (all caps) to RTE style enums (camel case enum members defined as ints) when
those are defined, instead of defining the enum class from its TL-counterpart. This overwrites how the enum members are
mapped to integers as defined in the project.
#### includeAllEnums
Include all enums found in the location pointed at by enumDefDir, even if the enums are not in use in the project.
## Rasters json File
### SampleTimes
@ -283,6 +296,10 @@ This file is a json file containing all the relevant meta data for the function.
E.g. input parameters, output parameters, calibration labels, local measurement variables, etc...
The unit definition file must match the filename pattern "config_*.json".
#### enumDefDir
Path to folder containing TL enum definition.
#### coreDummyFileName
Defines the file names of the dummy Core Identifier c code, which is generated by the build environment.

@ -904,7 +904,13 @@ def build(
zc_nvm = ZCNVMDef(build_cfg, unit_cfg, project_nvm_defintions)
axis_data = merged_a2l.get_characteristic_axis_data()
composition_yaml = CompositionYaml(
build_cfg, signal_if.composition_spec, unit_cfg, zc_core, zc_dids, zc_nvm, axis_data
build_cfg,
signal_if.composition_spec,
unit_cfg, zc_core,
zc_dids,
zc_nvm,
axis_data,
udt.get_enumerations()
)
LOG.info("******************************************************")
composition_yaml.generate_yaml()

@ -74,6 +74,8 @@ class BuildProjConfig:
'generateYamlInterfaceFile': False,
'propagateTagName': False,
'useA2lSymbolLinks': False,
'mapToRteEnums': False,
'includeAllEnums': False
}
def _get_code_generation_config(self):

@ -52,6 +52,7 @@ class UserDefinedTypes(ProblemLogger):
self._build_prj_cfg = build_prj_config
self._unit_configs = unit_configs
self.enums_per_unit = {}
self.common_enums = self._read_enums_from_definitions()
self.structs_per_unit = {}
self._parse_all_user_defined_types()
self.common_header_files = []
@ -369,47 +370,59 @@ class UserDefinedTypes(ProblemLogger):
return underlying_data_type
def _get_default_enum_value_tmp(self, enum_name):
"""Get default value of given enumeration name.
Requires "enumDefDir" in the ProjectCfg.json file.
def _read_enums_from_definitions(self):
""" Reads all enums from .m files where they are defined. Requires projectInfo.enumDefDir in
ProjectCfg.json file.
Files defining simulink class enumerations are expected to follow a template.
TODO: Remove this function when there is a default enum value in every config_*.json file.
Args:
enum_name (str): Name of an enumeration.
Returns:
default_value_str (str): Default value (string) for the given enumeration name.
None if value could not be extracted.
common_enums (dict): Dictionary containing all enums defined in the enum definition directory.
"""
common_enums = {}
if self._build_prj_cfg.get_enum_def_dir() is None:
self.warning(
'Cannot extract default enumeration value for %s. Missing "enumDefDir" in ProjectCfg.json.',
enum_name
'Cannot parse enumerations from .m files. Missing "enumDefDir" in project config.'
)
return None
return {}
enum_def_file = Path(self._build_prj_cfg.get_enum_def_dir(), f'{enum_name}.m')
if not enum_def_file.is_file():
self.warning('Cannot extract default enumeration value. File not found: %s', str(enum_def_file))
return None
with enum_def_file.open(mode='r', encoding='ISO-8859-1') as fh:
enum_def_content = fh.read()
get_default_value = re.search(
r'function ([A-Za-z0-9]+) = getDefaultValue\(\)[\s\n]*'
r'\1 = [A-Za-z0-9]+\.([A-Za-z0-9]+);[\s\n]*'
r'end',
enum_def_content,
flags=re.MULTILINE
)
if get_default_value is None:
self.warning('Cannot extract default enumeration values in: %s', str(enum_def_file))
return None
_unused, default_value = get_default_value.groups()
return f'{enum_name.upper()}_{default_value.upper()}'
enum_files = Path(self._build_prj_cfg.get_enum_def_dir()).rglob('*.m')
for enum_file in enum_files:
with enum_file.open(mode='r', encoding='ISO-8859-1') as fh:
enum_file_content = fh.read()
enum_name = enum_file.stem
members_part = re.search(
r'\s+enumeration\n'
r'(\s*\w+\(\d+\)\n)+'
r'\s+end',
enum_file_content,
flags=re.MULTILINE
)
if not members_part:
self.warning('Cannot extract enumeration members from %s', str(enum_file))
continue
members = re.findall(r'(\w+)\((\d+)\)', members_part.group(0))
member_dict = {enum_name + '_' + member[0]: int(member[1]) for member in members}
get_default_value = re.search(
r'function ([A-Za-z0-9]+) = getDefaultValue\(\)[\s\n]*'
r'\1 = [A-Za-z0-9]+\.([A-Za-z0-9]+);[\s\n]*'
r'end',
enum_file_content,
flags=re.MULTILINE
)
if get_default_value is None:
self.warning('Cannot extract default enumeration values in: %s', str(enum_file))
return None
default_value = get_default_value.groups()[1]
default_member = f'{enum_name}_{default_value}'
enum_members = [(member_name, member_value) for member_name, member_value in member_dict.items()]
underlying_data_type = self._calculate_underlying_data_type('target_link', enum_name, enum_members)
common_enums[enum_name] = {
"underlying_data_type": underlying_data_type,
"default_value": default_member,
"members": member_dict
}
return common_enums
def get_default_enum_value(self, unit, enum_name):
"""Get default value of given enumeration name by searching in the unit configuration.
@ -441,12 +454,14 @@ class UserDefinedTypes(ProblemLogger):
self.warning(
'Cannot extract default enumeration value for %s in %s. '
'Either the enumeration or its default value is missing in the unit configuration file. '
'Trying to parse simulink enumeration definition files.',
'Either the enumeration or its default value is missing in the unit configuration file. ',
enum_name,
unit
)
return self._get_default_enum_value_tmp(enum_name)
common_default = self.common_enums.get(enum_name, {}).get('default', None)
if common_default is not None:
return common_default.upper()
return None
def get_enumerations(self):
"""Get all enumeration defined in the project, together with unit usage.
@ -464,6 +479,15 @@ class UserDefinedTypes(ProblemLogger):
else:
enumerations[enum_name] = deepcopy(enum_data)
enumerations[enum_name]['units'] = [unit]
if self._build_prj_cfg.get_code_generation_config("includeAllEnums"):
for enum_name, enum_data in self.common_enums.items():
if enum_name not in enumerations:
self.warning(
"Enumeration %s is not used in any unit. Included since 'includeAllEnums' is set in config.",
enum_name
)
enumerations[enum_name] = deepcopy(enum_data)
enumerations[enum_name]['units'] = []
return enumerations
def get_interface_data_types(self):
@ -529,18 +553,43 @@ class UserDefinedTypes(ProblemLogger):
file_path (Path): Path to file to generate.
"""
enumerations = self.get_enumerations()
rte_interface_enums = self._build_prj_cfg.get_code_generation_config("mapToRteEnums")
if not self._build_prj_cfg.get_enum_def_dir() and rte_interface_enums:
self.warning(
"No enum definition directory specified. Cannot generate all enums in decinition directory."
)
rte_interface_enums = False
guard = f"{file_path.stem.upper()}_H"
with file_path.open('w') as fh:
fh.write(self._get_header_file_header(guard))
if rte_interface_enums:
composition_name = self._build_prj_cfg.get_composition_config("softwareComponentName")
fh.write(f'#include "Rte_{ composition_name }_Type.h"\n')
fh.write('/* VCC Enumerations */\n')
for enum_name, enum_data in enumerations.items():
fh.write('\n')
fh.write(f'typedef enum {enum_name}_tag {{\n')
nr_of_enum_members = len(enum_data['members'])
for idx, enum_member_name in enumerate(enum_data['members']):
ending = ', ' if idx < nr_of_enum_members - 1 else ' '
fh.write(f" {enum_member_name} = {enum_data['members'][enum_member_name]}{ending}\n")
fh.write(f'}} {enum_name};\n')
members = enum_data['members']
member_strs = ', \n'.join([f" {member.upper()} = {value}" for member, value in members.items()])
enum_definition = (
f'\n'
f'typedef enum {enum_name}_tag {{\n'
f'{member_strs} \n'
f'}} {enum_name};\n'
)
if rte_interface_enums:
enum = self.common_enums[enum_name]
enum_member_0 = [member for member, value in enum["members"].items() if value == 0][0]
rte_translation = '\n'.join(
f"#define {member.upper()} {member}" for member in enum["members"].keys()
)
enum_definition = (
f'\n'
f'#ifndef {enum_member_0}\n'
f'{enum_definition}\n'
f'#else\n'
f'{rte_translation}\n'
f'#endif /* {enum_member_0} */\n'
)
fh.write(enum_definition)
fh.write(f'#endif /* {guard} */\n')
def generate_common_header_files(self):

@ -15,7 +15,7 @@ from powertrain_build.zone_controller.calibration import ZoneControllerCalibrati
class CompositionYaml(ProblemLogger):
"""Class for handling ZoneController composition yaml generation."""
def __init__(self, build_cfg, composition_spec, unit_cfg, zc_core, zc_dids, zc_nvm, a2l_axis_data):
def __init__(self, build_cfg, composition_spec, unit_cfg, zc_core, zc_dids, zc_nvm, a2l_axis_data, enums):
"""Init.
Args:
@ -26,6 +26,7 @@ class CompositionYaml(ProblemLogger):
zc_dids (ZCDIDs): Object with zone controller diagnostic DID information.
zc_nvm (ZCNVMDef): Object with NVM definition information.
a2l_axis_data (dict): Dict with characteristic axis data from A2L file.
enums (dict): Dict with enum data.
"""
self.tl_to_autosar_base_types = {
"Bool": "boolean",
@ -44,6 +45,7 @@ class CompositionYaml(ProblemLogger):
self.zc_core = zc_core
self.zc_dids = zc_dids
self.zc_nvm = zc_nvm
self.enums = enums
self.a2l_axis_data = a2l_axis_data
base_data_types = self.get_base_data_types() # Might not be necessary in the long run
self.data_types = {
@ -188,6 +190,10 @@ class CompositionYaml(ProblemLogger):
re.compile(r"^\s*CVC_CAL[A-Z_]*\s+\w+\s+(?P<name>\w+)\[(?P<rows>[\d]+)\]\[(?P<cols>[\d]+)\]\s*=\s*"),
self._get_matrix_init_values,
),
(
re.compile(r"^\s*CVC_CAL[A-Z_]*\s+\w+\s+(?P<name>\w+)\s*=\s*(?P<enum>[a-zA-Z_$][\w_]*?)*;"),
lambda regex_match, _: regex_match.group("enum"),
),
]
init_values = {}
@ -592,9 +598,12 @@ class CompositionYaml(ProblemLogger):
signal_name (string): Name of signal to process.
info (dict): signal data.
Returns:
class_info (dict): Updated dictionary with variables.
data_types (dict): Updated dictionary with data types.
"""
if info["type"] in self.enums.keys():
return class_info, data_types
if "Bool" in info["type"]:
upper = 1
lower = 0

@ -166,8 +166,10 @@ class TestUserDefinedTypes(unittest.TestCase):
def setUp(self):
"""Set-up common data structures for all tests in the test case."""
self.build_cfg = MagicMock(spec_set=BuildProjConfig)
self.build_cfg.get_enum_def_dir = MagicMock(return_value='.')
self.build_cfg.get_root_dir = MagicMock(return_value='.')
self.build_cfg.get_enum_def_dir = MagicMock(return_value='../../reference_files/enums/')
self.build_cfg.get_code_generation_config = MagicMock(return_value=False)
self.unit_cfg = MagicMock(spec_set=UnitConfigs)
self.unit_cfg.get_unit_code_generator.return_value = 'target_link'
UserDefinedTypes.clear_log()
@ -183,6 +185,8 @@ class TestUserDefinedTypes(unittest.TestCase):
'VcTestModel1': str(Path(REF_DIR, 'SS1', 'test_model1'))
}
)
codegen_config = {'mapToRteEnums': False, 'includeAllEnums': False}
self.build_cfg.get_code_generation_config = MagicMock(side_effect=(lambda x: codegen_config.get(x, {})))
udt = UserDefinedTypes(self.build_cfg, self.unit_cfg)
expected_enums = {
'VcTestModel': {
@ -626,7 +630,122 @@ class TestUserDefinedTypes(unittest.TestCase):
'} EnumTestThree;\n',
'#endif /* VCENUMERATIONS_H */\n'
]
self.assertEqual("".join(result), "".join(expected))
def test_map_to_rte_enums(self):
"""Test the _generate_target_link_enum_header_file method, mapping enums to rte headers.
NOTE: This method is part of UserDefinedTypes.generate_common_header_files, which is not tested on its own.
"""
codegen_config = {'mapToRteEnums': True, 'includeAllEnums': True}
self.build_cfg.get_code_generation_config = MagicMock(side_effect=(lambda x: codegen_config.get(x, {})))
composition_config = {'softwareComponentName': 'SWCName'}
self.build_cfg.get_composition_config = MagicMock(side_effect=(lambda x: composition_config.get(x, '')))
self.build_cfg.get_unit_src_dirs = MagicMock(
return_value={'VcTestModel2': str(Path(REF_DIR, 'SS1', 'test_model2'))}
)
unit_cfg = self.unit_cfg
type(unit_cfg).base_types_headers = '#include "basetypes.h"\n'
udt = UserDefinedTypes(self.build_cfg, unit_cfg)
udt.common_enums = {
'EnumTest': {
'underlying_data_type': 'UInt8',
'members': {
'EnumTest_ClimaOff': 0,
'EnumTest_ClimaHeatgToHvacAndHvBatt': 1,
'EnumTest_ClimaHeatgToHvBatt': 2,
'EnumTest_ClimaHeatgToHvac': 3,
'EnumTest_ClimaFlow': 4,
'EnumTest_Degas': 5,
'EnumTest_FailSafe': 6
},
'default_value': 'EnumTest_ClimaOff'
},
'EnumTestThree': {
'underlying_data_type': 'UInt8',
'members': {
'ENUMTESTTHREE_DTELECCOOLG': 0,
'ENUMTESTTHREE_DTELECPASCOOLG': 1,
'ENUMTESTTHREE_DTELECHEATG': 2,
'ENUMTESTTHREE_DTELECPASHEATG': 3,
'ENUMTESTTHREE_DTELECACTVHEATG': 4,
'ENUMTESTTHREE_DTELECPASACTVHEATG': 5,
'ENUMTESTTHREE_DTELECPAS': 6,
'ENUMTESTTHREE_DEGAS': 7,
'ENUMTESTTHREE_FAILSAFE': 8,
'ENUMTESTTHREE_EXTRAVERSUSUNITONE': 9
},
'default_value': None,
'units': ['VcTestModel2']
}
}
result = []
m_open = mock_open()
m_open.return_value.write = result.append
with patch.object(Path, 'open', m_open, create=True):
udt._generate_enum_header_file(Path("VcEnumerations.h"))
self.maxDiff = None
expected = [
'#ifndef VCENUMERATIONS_H\n',
'#define VCENUMERATIONS_H\n',
'#include "basetypes.h"\n',
'#include "Rte_SWCName_Type.h"\n',
'/* VCC Enumerations */\n',
'\n',
'#ifndef EnumTest_ClimaOff\n',
'\n',
'typedef enum EnumTest_tag {\n',
" ENUMTEST_CLIMAOFF = 0, \n",
" ENUMTEST_CLIMAHEATGTOHVACANDHVBATT = 1, \n",
" ENUMTEST_CLIMAHEATGTOHVBATT = 2, \n",
" ENUMTEST_CLIMAHEATGTOHVAC = 3, \n",
" ENUMTEST_CLIMAFLOW = 4, \n",
" ENUMTEST_DEGAS = 5, \n",
" ENUMTEST_FAILSAFE = 6 \n",
'} EnumTest;\n',
'\n',
'#else\n',
'#define ENUMTEST_CLIMAOFF EnumTest_ClimaOff\n',
'#define ENUMTEST_CLIMAHEATGTOHVACANDHVBATT EnumTest_ClimaHeatgToHvacAndHvBatt\n',
'#define ENUMTEST_CLIMAHEATGTOHVBATT EnumTest_ClimaHeatgToHvBatt\n',
'#define ENUMTEST_CLIMAHEATGTOHVAC EnumTest_ClimaHeatgToHvac\n',
'#define ENUMTEST_CLIMAFLOW EnumTest_ClimaFlow\n',
'#define ENUMTEST_DEGAS EnumTest_Degas\n',
'#define ENUMTEST_FAILSAFE EnumTest_FailSafe\n',
'#endif /* EnumTest_ClimaOff */\n',
'\n',
'#ifndef ENUMTESTTHREE_DTELECCOOLG\n',
'\n',
'typedef enum EnumTestThree_tag {\n',
" ENUMTESTTHREE_DTELECCOOLG = 0, \n",
" ENUMTESTTHREE_DTELECPASCOOLG = 1, \n",
" ENUMTESTTHREE_DTELECHEATG = 2, \n",
" ENUMTESTTHREE_DTELECPASHEATG = 3, \n",
" ENUMTESTTHREE_DTELECACTVHEATG = 4, \n",
" ENUMTESTTHREE_DTELECPASACTVHEATG = 5, \n",
" ENUMTESTTHREE_DTELECPAS = 6, \n",
" ENUMTESTTHREE_DEGAS = 7, \n",
" ENUMTESTTHREE_FAILSAFE = 8, \n",
" ENUMTESTTHREE_EXTRAVERSUSUNITONE = 9 \n",
'} EnumTestThree;\n',
'\n',
'#else\n',
'#define ENUMTESTTHREE_DTELECCOOLG ENUMTESTTHREE_DTELECCOOLG\n',
'#define ENUMTESTTHREE_DTELECPASCOOLG ENUMTESTTHREE_DTELECPASCOOLG\n',
'#define ENUMTESTTHREE_DTELECHEATG ENUMTESTTHREE_DTELECHEATG\n',
'#define ENUMTESTTHREE_DTELECPASHEATG ENUMTESTTHREE_DTELECPASHEATG\n',
'#define ENUMTESTTHREE_DTELECACTVHEATG ENUMTESTTHREE_DTELECACTVHEATG\n',
'#define ENUMTESTTHREE_DTELECPASACTVHEATG ENUMTESTTHREE_DTELECPASACTVHEATG\n',
'#define ENUMTESTTHREE_DTELECPAS ENUMTESTTHREE_DTELECPAS\n',
'#define ENUMTESTTHREE_DEGAS ENUMTESTTHREE_DEGAS\n',
'#define ENUMTESTTHREE_FAILSAFE ENUMTESTTHREE_FAILSAFE\n',
'#define ENUMTESTTHREE_EXTRAVERSUSUNITONE ENUMTESTTHREE_EXTRAVERSUSUNITONE\n',
'#endif /* ENUMTESTTHREE_DTELECCOOLG */\n',
'#endif /* VCENUMERATIONS_H */\n'
]
self.assertEqual("".join(result), "".join(expected))
def test_generate_enum_header_file_ec(self):
@ -727,7 +846,6 @@ class TestUserDefinedTypes(unittest.TestCase):
'} EnumTestThree;\n',
'#endif /* VCENUMERATIONS_H */\n'
]
self.assertEqual("".join(result), "".join(expected))
def test_generate_struct_header_file_tl(self):
@ -766,7 +884,6 @@ class TestUserDefinedTypes(unittest.TestCase):
'};\n',
'#endif /* VCSTRUCTS_H */\n'
]
self.assertEqual("".join(result), "".join(expected))
def test_get_enumerations(self):
@ -901,8 +1018,8 @@ class TestUserDefinedTypes(unittest.TestCase):
result = udt.get_default_enum_value(unit, 'SimulinkEnumTwo')
self.assertIsNone(result)
# interface_data_types.yml "not found" and real warnings (not in config and no m-file)
self.assertDictEqual({'critical': 0, 'warning': 3}, udt.get_nbr_problems())
# interface_data_types.yml "not found" and real warning (no m-file)
self.assertDictEqual({'critical': 0, 'warning': 2}, udt.get_nbr_problems())
def test_convert_interface_enum_to_simulink(self):
"""Test the convert_interface_enum_to_simulink method."""
@ -922,3 +1039,24 @@ class TestUserDefinedTypes(unittest.TestCase):
}
result = udt.convert_interface_enum_to_simulink(INTERFACE_ENUM['EnumTest'])
self.assertDictEqual(expected, result)
def test_read_enums_from_definitions(self):
"""Test the read_enums_from_definitions method."""
udt = UserDefinedTypes(self.build_cfg, self.unit_cfg)
expected = {
'EnumTest': {
'underlying_data_type': 'UInt8',
'members': {
'EnumTest_ClimaOff': 0,
'EnumTest_ClimaHeatgToHvacAndHvBatt': 1,
'EnumTest_ClimaHeatgToHvBatt': 2,
'EnumTest_ClimaHeatgToHvac': 3,
'EnumTest_ClimaFlow': 4,
'EnumTest_Degas': 5,
'EnumTest_FailSafe': 6
},
'default_value': 'EnumTest_ClimaOff'
}
}
result = udt._read_enums_from_definitions()
self.assertDictEqual(expected, result)

@ -111,7 +111,7 @@ class TestCompositionYaml(unittest.TestCase):
return_value=self.calibration_definitions
):
self.composition_yaml = CompositionYaml(
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}, {}
)
def test_check_unsupported_fields(self):
@ -140,7 +140,7 @@ class TestCompositionYaml(unittest.TestCase):
"""Checking that the dict is generated correctly with custom names."""
self.build_cfg.get_composition_config.side_effect = mock_get_composition_config_custom_names
self.composition_yaml = CompositionYaml(
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}, {}
)
result = self.composition_yaml.gather_yaml_info()
self.assertDictEqual(composition_yaml.expected_custom_names_result, result)
@ -155,7 +155,7 @@ class TestCompositionYaml(unittest.TestCase):
return_value=self.calibration_definitions
):
self.composition_yaml = CompositionYaml(
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}, {}
)
result = self.composition_yaml.gather_yaml_info()
self.assertDictEqual(composition_yaml.expected_cal_result, result)
@ -169,7 +169,7 @@ class TestCompositionYaml(unittest.TestCase):
self.calibration_definitions + composition_yaml_with_a2l_axis_data.calibration_definitions
with patch.object(CompositionYaml, "_get_all_calibration_definitions", return_value=calibration_definitions):
self.composition_yaml = CompositionYaml(
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, a2l_axis_data
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, a2l_axis_data, {}
)
result = self.composition_yaml.gather_yaml_info()
@ -191,7 +191,7 @@ class TestCompositionYaml(unittest.TestCase):
return_value=self.calibration_definitions
):
self.composition_yaml = CompositionYaml(
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}, {}
)
result = self.composition_yaml.gather_yaml_info()
self.assertDictEqual(composition_yaml_with_calls_all_fields.expected_result, result)
@ -210,7 +210,7 @@ class TestCompositionYaml(unittest.TestCase):
return_value=self.calibration_definitions
):
self.composition_yaml = CompositionYaml(
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}, {}
)
result = self.composition_yaml.gather_yaml_info()
self.assertDictEqual(composition_yaml_with_calls_no_optional_fields.expected_result, result)
@ -225,7 +225,7 @@ class TestCompositionYaml(unittest.TestCase):
return_value=self.calibration_definitions
):
self.composition_yaml = CompositionYaml(
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}, {}
)
result = self.composition_yaml.gather_yaml_info()
self.assertDictEqual(composition_yaml_with_dids.expected_result, result)
@ -240,7 +240,7 @@ class TestCompositionYaml(unittest.TestCase):
return_value=self.calibration_definitions
):
self.composition_yaml = CompositionYaml(
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}, {}
)
result = self.composition_yaml.gather_yaml_info()
self.assertDictEqual(composition_yaml_with_dtcs.expected_result, result)
@ -258,7 +258,7 @@ class TestCompositionYaml(unittest.TestCase):
return_value=self.calibration_definitions
):
self.composition_yaml = CompositionYaml(
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}, {}
)
result = self.composition_yaml.gather_yaml_info()
self.assertDictEqual(composition_yaml_with_nvm.expected_result, result)