diff --git a/fec_integration_tests/interface/interface_functions/test_database_interface.py b/fec_integration_tests/interface/interface_functions/test_database_interface.py index 4070e66e1..644596ebb 100644 --- a/fec_integration_tests/interface/interface_functions/test_database_interface.py +++ b/fec_integration_tests/interface/interface_functions/test_database_interface.py @@ -11,14 +11,15 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + from typing import Iterable, List, Sequence -from spinn_front_end_common.utility_models.live_packet_gather import \ - _LPGSplitter +from parameterized import parameterized + from spinn_utilities.config_holder import set_config from spinn_utilities.overrides import overrides -from spinn_machine.version.version_strings import VersionStrings +from spinn_machine.version import ALL_BOARD_TYPES from spinn_machine.tags.iptag import IPTag from pacman.model.graphs.application import ApplicationVertex, ApplicationEdge @@ -37,7 +38,8 @@ from spinn_front_end_common.data.fec_data_writer import FecDataWriter from spinn_front_end_common.interface.interface_functions import ( database_interface) - +from spinn_front_end_common.utility_models.live_packet_gather import \ + _LPGSplitter from spinn_front_end_common.utilities.utility_objs import ( LivePacketGatherParameters) from spinn_front_end_common.interface.config_setup import unittest_setup @@ -140,9 +142,10 @@ def _place_vertices(app_vertexes: List[ApplicationVertex], return placements -def test_database_interface() -> None: +@parameterized.expand(ALL_BOARD_TYPES) +def test_database_interface(_: str, ver_num: str) -> None: unittest_setup() - set_config("Machine", "versions", VersionStrings.ANY.text) + set_config("Machine", "version", ver_num) set_config("Database", "create_database", "True") set_config("Database", "create_routing_info_to_neuron_id_mapping", "True") diff --git a/fec_integration_tests/interface/interface_functions/test_front_end_common_insert_lpgs.py b/fec_integration_tests/interface/interface_functions/test_front_end_common_insert_lpgs.py index 7a17ff402..5c54bb97e 100644 --- a/fec_integration_tests/interface/interface_functions/test_front_end_common_insert_lpgs.py +++ b/fec_integration_tests/interface/interface_functions/test_front_end_common_insert_lpgs.py @@ -13,9 +13,14 @@ # limitations under the License. import unittest + +from parameterized import parameterized + from spinn_utilities.config_holder import set_config -from spinn_machine.version.version_strings import VersionStrings + +from spinn_machine.version import BIG_BOARD_TYPES from spinn_machine.virtual_machine import virtual_machine_by_boards + from spinnman.messages.eieio import EIEIOType from pacman.model.graphs.machine import MachineVertex from pacman.model.placements import Placements @@ -38,14 +43,13 @@ def number_of_atoms(self) -> int: class TestInsertLPGs(unittest.TestCase): - """ tests the LPG insert functions + """ tests the LPG insert functions """ - """ - def setUp(self) -> None: + @parameterized.expand(BIG_BOARD_TYPES) # Needs multiple boards + def test_that_3_lpgs_are_generated_on_3_board_app_graph( + self, _: str, ver_num: str) -> None: unittest_setup() - set_config("Machine", "versions", VersionStrings.BIG.text) - - def test_that_3_lpgs_are_generated_on_3_board_app_graph(self) -> None: + set_config("Machine", "version", ver_num) writer = FecDataWriter.mock() writer.set_machine(virtual_machine_by_boards(3)) diff --git a/pyproject.toml b/pyproject.toml index 3ba3430ec..533f6dd76 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,5 +17,5 @@ requires = ["setuptools"] build-backend = "setuptools.build_meta" [[tool.mypy.overrides]] -module = ["scipy"] +module = ["parameterized", "scipy"] ignore_missing_imports = true diff --git a/setup.cfg b/setup.cfg index 097ef94e9..fa57462d0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -69,6 +69,7 @@ test = pytest-cov testfixtures httpretty != 1.0.0 + parameterized types-jsonschema types-requests plotting = diff --git a/unittests/data/test_simulator_data.py b/unittests/data/test_simulator_data.py index 5ea3475b0..76b9dcd37 100644 --- a/unittests/data/test_simulator_data.py +++ b/unittests/data/test_simulator_data.py @@ -17,6 +17,8 @@ from typing import Dict, Tuple import unittest +from parameterized import parameterized + from spinn_utilities.config_holder import set_config # hack do not copy from spinn_utilities.data.data_status import DataStatus @@ -27,7 +29,7 @@ from spinn_utilities.typing.coords import XY from spinn_machine import Chip, CoreSubsets, RoutingEntry -from spinn_machine.version.version_strings import VersionStrings +from spinn_machine.version import FOUR_PLUS_BOARD_TYPES from spinnman.messages.scp.enums.signal import Signal from spinnman.model.enums import ExecutableType @@ -470,9 +472,10 @@ def test_executable_targets(self) -> None: with self.assertRaises(TypeError): writer.set_executable_targets([]) # type: ignore[arg-type] - def test_gatherer_map(self) -> None: + @parameterized.expand(FOUR_PLUS_BOARD_TYPES) + def test_gatherer_map(self, _: str, ver_num: str) -> None: writer = FecDataWriter.mock() - set_config("Machine", "versions", VersionStrings.FOUR_PLUS.text) + set_config("Machine", "version", ver_num) with self.assertRaises(DataNotYetAvialable): FecDataView.get_gatherer_by_xy(0, 0) with self.assertRaises(DataNotYetAvialable): @@ -519,9 +522,10 @@ def test_gatherer_map(self) -> None: map4[(0, "bacon")] = vertex writer.set_gatherer_map(map4) # type: ignore[arg-type] - def test_monitor_map(self) -> None: + @parameterized.expand(FOUR_PLUS_BOARD_TYPES) + def test_monitor_map(self, _: str, ver_num: str) -> None: writer = FecDataWriter.mock() - set_config("Machine", "versions", VersionStrings.FOUR_PLUS.text) + set_config("Machine", "version", ver_num) self.assertFalse(FecDataView.has_monitors()) with self.assertRaises(DataNotYetAvialable): FecDataView.get_monitor_by_xy(0, 0) diff --git a/unittests/interface/buffer_management/test_buffered_manager.py b/unittests/interface/buffer_management/test_buffered_manager.py index 1da0b49d4..0f2131360 100644 --- a/unittests/interface/buffer_management/test_buffered_manager.py +++ b/unittests/interface/buffer_management/test_buffered_manager.py @@ -12,14 +12,16 @@ # See the License for the specific language governing permissions and # limitations under the License. -import unittest import os from typing import Sequence, Tuple +import unittest + +from parameterized import parameterized from spinn_utilities.config_holder import set_config from spinn_utilities.overrides import overrides -from spinn_machine.version.version_strings import VersionStrings +from spinn_machine.version import MANY_BOARD_TYPES from pacman.model.graphs.machine import SimpleMachineVertex from pacman.model.placements import Placement, Placements @@ -61,8 +63,9 @@ class TestBufferedDatabase(unittest.TestCase): def setUp(self) -> None: unittest_setup() - def test_recording(self) -> None: - set_config("Machine", "versions", VersionStrings.ANY.text) + @parameterized.expand(MANY_BOARD_TYPES) + def test_recording(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) writer = FecDataWriter.mock() f = BufferDatabase.default_database_file() self.assertFalse(os.path.isfile(f), "no existing DB at first") @@ -142,8 +145,9 @@ def test_recording(self) -> None: self.assertTrue(os.path.isfile(f), "DB still exists") - def test_download(self) -> None: - set_config("Machine", "versions", VersionStrings.ANY.text) + @parameterized.expand(MANY_BOARD_TYPES) + def test_download(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) writer = FecDataWriter.mock() info = Placements([]) @@ -194,8 +198,9 @@ def test_download(self) -> None: self.assertTrue(missing, "data should be 'missing'") self.assertEqual(bytes(data), b"gh") - def test_clear(self) -> None: - set_config("Machine", "versions", VersionStrings.ANY.text) + @parameterized.expand(MANY_BOARD_TYPES) + def test_clear(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) writer = FecDataWriter.mock() info = Placements([]) diff --git a/unittests/interface/ds/test_ds.py b/unittests/interface/ds/test_ds.py index 5db73be23..df9b537c0 100644 --- a/unittests/interface/ds/test_ds.py +++ b/unittests/interface/ds/test_ds.py @@ -12,14 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. -from sqlite3 import IntegrityError import unittest +from parameterized import parameterized +from sqlite3 import IntegrityError + from spinn_utilities.config_holder import set_config from spinn_utilities.overrides import overrides from spinn_machine import Chip, Router -from spinn_machine.version.version_strings import VersionStrings +from spinn_machine.version import ( + BIG_BOARD_TYPES, FOUR_PLUS_BOARD_TYPES, MANY_BOARD_TYPES) from spinn_machine.virtual_machine import virtual_machine_by_min_size from spinnman.model.enums import ExecutableType @@ -67,24 +70,27 @@ class TestDataSpecification(unittest.TestCase): def setUp(self) -> None: unittest_setup() - def test_init(self) -> None: - set_config("Machine", "versions", VersionStrings.FOUR_PLUS.text) + @parameterized.expand(FOUR_PLUS_BOARD_TYPES) + def test_init(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) vertex1 = _TestVertexWithBinary( "off_board__system", ExecutableType.SYSTEM) with DsSqlliteDatabase() as db: DataSpecificationGenerator(0, 1, 2, vertex1, db) DataSpecificationReloader(0, 1, 2, db) - def test_none_ds_vertex(self) -> None: - set_config("Machine", "versions", VersionStrings.FOUR_PLUS.text) + @parameterized.expand(FOUR_PLUS_BOARD_TYPES) + def test_none_ds_vertex(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) vertex = SimpleMachineVertex(None) with DsSqlliteDatabase() as db: with self.assertRaises(AttributeError): DataSpecificationGenerator( 0, 1, 2, vertex, db) # type: ignore[arg-type] - def test_bad_x_y_ds_vertex(self) -> None: - set_config("Machine", "versions", VersionStrings.FOUR_PLUS.text) + @parameterized.expand(FOUR_PLUS_BOARD_TYPES) + def test_bad_x_y_ds_vertex(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) vertex = _TestVertexWithBinary( "off_board__system", ExecutableType.SYSTEM) width, height = FecDataView.get_machine_version().board_shape @@ -93,8 +99,9 @@ def test_bad_x_y_ds_vertex(self) -> None: # x, y to high DataSpecificationGenerator(width, height, 2, vertex, db) - def test_repeat_x_y_ds_vertex(self) -> None: - set_config("Machine", "versions", VersionStrings.FOUR_PLUS.text) + @parameterized.expand(FOUR_PLUS_BOARD_TYPES) + def test_repeat_x_y_ds_vertex(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) vertex1 = _TestVertexWithBinary( "v1", ExecutableType.SYSTEM) vertex2 = _TestVertexWithBinary( @@ -104,8 +111,9 @@ def test_repeat_x_y_ds_vertex(self) -> None: with self.assertRaises(IntegrityError): DataSpecificationGenerator(0, 1, 2, vertex2, db) - def test_core_infos(self) -> None: - set_config("Machine", "versions", VersionStrings.BIG.text) + @parameterized.expand(BIG_BOARD_TYPES) # Needs multiple boards + def test_core_infos(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) writer = FecDataWriter.mock() writer.set_machine(virtual_machine_by_min_size(9, 9)) with DsSqlliteDatabase() as db: @@ -128,8 +136,9 @@ def test_core_infos(self) -> None: app_infos = [(0, 0, 3, 0, 0), (0, 0, 4, 0, 0)] self.assertEqual(app_infos, db.get_core_infos(False)) - def test_bad_ethernet(self) -> None: - set_config("Machine", "versions", VersionStrings.ANY.text) + @parameterized.expand(MANY_BOARD_TYPES) + def test_bad_ethernet(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) router = Router([], 123) width, height = FecDataView.get_machine_version().board_shape bad = Chip(width, height, [0], range(1, 15), router, 100, 8, 8) @@ -140,8 +149,9 @@ def test_bad_ethernet(self) -> None: with self.assertRaises(IntegrityError): DataSpecificationGenerator(width, height, 2, vertex, db) - def test_reserve_memory_region(self) -> None: - set_config("Machine", "versions", VersionStrings.FOUR_PLUS.text) + @parameterized.expand(FOUR_PLUS_BOARD_TYPES) + def test_reserve_memory_region(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) vertex = _TestVertexWithBinary( "binary", ExecutableType.SYSTEM) with DsSqlliteDatabase() as db: @@ -182,8 +192,9 @@ def test_reserve_memory_region(self) -> None: self.assertEqual({}, db.get_region_sizes(0, 1, 3)) self.assertEqual(0, db.get_total_regions_size(0, 1, 3)) - def test_regions_content(self) -> None: - set_config("Machine", "versions", VersionStrings.FOUR_PLUS.text) + @parameterized.expand(FOUR_PLUS_BOARD_TYPES) + def test_regions_content(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) vertex = _TestVertexWithBinary( "binary", ExecutableType.SYSTEM) with DsSqlliteDatabase() as db: @@ -209,8 +220,9 @@ def test_regions_content(self) -> None: self.assertEqual(12, db.get_max_content_size(True)) self.assertEqual([(12, 1), (4, 1)], db.get_content_sizes(True)) - def test_switch_write_focus(self) -> None: - set_config("Machine", "versions", VersionStrings.ANY.text) + @parameterized.expand(MANY_BOARD_TYPES) + def test_switch_write_focus(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) vertex = _TestVertexWithBinary( "binary", ExecutableType.SYSTEM) with DsSqlliteDatabase() as db: @@ -223,8 +235,9 @@ def test_switch_write_focus(self) -> None: with self.assertRaises(DsDatabaseException): dsg.switch_write_focus(8) - def test_pointers(self) -> None: - set_config("Machine", "versions", VersionStrings.FOUR_PLUS.text) + @parameterized.expand(FOUR_PLUS_BOARD_TYPES) + def test_pointers(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) # You can use a reference before defining it vertex = _TestVertexWithBinary( "binary1", ExecutableType.SYSTEM) @@ -289,8 +302,9 @@ def test_pointers(self) -> None: with self.assertRaises(DsDatabaseException): db.get_region_pointer(1, 2, 3, 9) - def test_write(self) -> None: - set_config("Machine", "versions", VersionStrings.FOUR_PLUS.text) + @parameterized.expand(FOUR_PLUS_BOARD_TYPES) + def test_write(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) vertex = _TestVertexWithBinary( "binary", ExecutableType.SYSTEM) @@ -343,8 +357,9 @@ def test_write(self) -> None: db.set_region_content( 0, 1, 4, 5, bytearray(b'\x0c\x00\x00\x00'), "test") - def test_ds_cores(self) -> None: - set_config("Machine", "versions", VersionStrings.FOUR_PLUS.text) + @parameterized.expand(FOUR_PLUS_BOARD_TYPES) + def test_ds_cores(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) vertex = _TestVertexWithBinary( "binary", ExecutableType.SYSTEM) with DsSqlliteDatabase() as db: @@ -361,8 +376,9 @@ def test_ds_cores(self) -> None: self.assertIn((0, 1, 4), cores) self.assertIn((1, 0, 3), cores) - def test_memory_to_write(self) -> None: - set_config("Machine", "versions", VersionStrings.FOUR_PLUS.text) + @parameterized.expand(FOUR_PLUS_BOARD_TYPES) + def test_memory_to_write(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) vertex = _TestVertexWithBinary( "binary", ExecutableType.SYSTEM) with DsSqlliteDatabase() as db: diff --git a/unittests/interface/interface_functions/test_front_end_common_dsg_region_reloader.py b/unittests/interface/interface_functions/test_front_end_common_dsg_region_reloader.py index 392de1931..23296c324 100644 --- a/unittests/interface/interface_functions/test_front_end_common_dsg_region_reloader.py +++ b/unittests/interface/interface_functions/test_front_end_common_dsg_region_reloader.py @@ -13,13 +13,15 @@ # limitations under the License. import unittest -import numpy from typing import BinaryIO, Optional, List, Tuple, Union +import numpy +from parameterized import parameterized + from spinn_utilities.config_holder import set_config from spinn_utilities.overrides import overrides -from spinn_machine.version.version_strings import VersionStrings +from spinn_machine.version import MANY_BOARD_TYPES from spinnman.model.enums import ExecutableType @@ -122,12 +124,16 @@ class TestFrontEndCommonDSGRegionReloader(unittest.TestCase): def setUp(self) -> None: unittest_setup() - set_config("Machine", "versions", VersionStrings.ANY.text) set_config("Reports", "write_text_specs", "True") - def test_with_good_sizes(self) -> None: + @parameterized.expand(MANY_BOARD_TYPES) + def test_with_good_sizes(self, _: str, ver_num: str) -> None: """ Test that an application vertex's data is rewritten correctly """ + # reset the count as test called multiple times + global regenerate_call_count + regenerate_call_count = 0 + set_config("Machine", "version", ver_num) writer = FecDataWriter.mock() m_vertex_1 = _TestMachineVertex() @@ -148,7 +154,7 @@ def test_with_good_sizes(self) -> None: placement.x, placement.y, placement.p, vertex) base = placement.p * 1000 regions = reload_region_data[placement.p] - for (reg_num, size, _) in regions: + for (reg_num, size, __) in regions: ds.set_memory_region( placement.x, placement.y, placement.p, reg_num, size, None, None) @@ -174,7 +180,7 @@ def test_with_good_sizes(self) -> None: for placement in placements: regions = reload_region_data[placement.p] address = placement.p * 1000 - for (_, size, data) in regions: + for (___, size, data) in regions: data_ba = bytearray( numpy.array(data, dtype="uint32").tobytes()) # Check that the base address and data written is correct @@ -182,9 +188,11 @@ def test_with_good_sizes(self) -> None: pos += 1 address += size - def test_with_size_changed(self) -> None: + @parameterized.expand(MANY_BOARD_TYPES) + def test_with_size_changed(self, _: str, ver_num: str) -> None: """ Test that an application vertex's data is rewritten correctly """ + set_config("Machine", "version", ver_num) writer = FecDataWriter.mock() m_vertex_1 = _TestMachineVertex() @@ -205,7 +213,7 @@ def test_with_size_changed(self) -> None: placement.x, placement.y, placement.p, vertex) base = placement.p * 1000 regions = reload_region_data[placement.p] - for (reg_num, size, _) in regions: + for (reg_num, size, __) in regions: ds.set_memory_region( placement.x, placement.y, placement.p, reg_num, size-1, None, None) diff --git a/unittests/interface/interface_functions/test_load_data_specification.py b/unittests/interface/interface_functions/test_load_data_specification.py index 5442cb98d..5dce2cb6f 100644 --- a/unittests/interface/interface_functions/test_load_data_specification.py +++ b/unittests/interface/interface_functions/test_load_data_specification.py @@ -12,15 +12,18 @@ # See the License for the specific language governing permissions and # limitations under the License. -from sqlite3 import IntegrityError -import struct from typing import BinaryIO, List, Optional, Tuple, Union import unittest +from parameterized import parameterized +from sqlite3 import IntegrityError +import struct + + from spinn_utilities.config_holder import set_config from spinn_utilities.overrides import overrides -from spinn_machine.version.version_strings import VersionStrings +from spinn_machine.version import FOUR_PLUS_BOARD_TYPES, MANY_BOARD_TYPES from spinnman.transceiver.version5transceiver import Version5Transceiver from spinnman.model.enums import ExecutableType @@ -111,8 +114,9 @@ def setUp(self) -> None: unittest_setup() set_config("Machine", "enable_advanced_monitor_support", "False") - def test_call(self) -> None: - set_config("Machine", "versions", VersionStrings.ANY.text) + @parameterized.expand(MANY_BOARD_TYPES) + def test_call(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) writer = FecDataWriter.mock() transceiver = _MockTransceiver() writer.set_transceiver(transceiver) @@ -168,7 +172,7 @@ def test_call(self) -> None: with DsSqlliteDatabase() as db: pc = list(db.get_info_for_cores()) - _, _, memory_used, memory_written = pc[0] + __, __, memory_used, memory_written = pc[0] # We reserved 3 regions at 100 each self.assertEqual(memory_used, header_and_table_size + 300) self.assertEqual(header_and_table_size + 300, @@ -178,8 +182,9 @@ def test_call(self) -> None: self.assertEqual(db.get_memory_to_write(0, 0, 0), header_and_table_size + 16) - def test_multi_spec_with_references(self) -> None: - set_config("Machine", "versions", VersionStrings.ANY.text) + @parameterized.expand(MANY_BOARD_TYPES) + def test_multi_spec_with_references(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) writer = FecDataWriter.mock() transceiver = _MockTransceiver() writer.set_transceiver(transceiver) @@ -252,8 +257,10 @@ def test_multi_spec_with_references(self) -> None: self.assertEqual(header_data[0][2 * 3], header_data[1][2 * 3]) self.assertEqual(header_data[2][2 * 3], header_data[1][2 * 3]) - def test_multispec_with_reference_error(self) -> None: - set_config("Machine", "versions", VersionStrings.ANY.text) + @parameterized.expand(MANY_BOARD_TYPES) + def test_multispec_with_reference_error( + self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) writer = FecDataWriter.mock() transceiver = _MockTransceiver() writer.set_transceiver(transceiver) @@ -280,8 +287,10 @@ def test_multispec_with_reference_error(self) -> None: with self.assertRaises(DataSpecException): load_application_data_specs() - def test_multispec_with_double_reference(self) -> None: - set_config("Machine", "versions", VersionStrings.ANY.text) + @parameterized.expand(MANY_BOARD_TYPES) + def test_multispec_with_double_reference( + self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) writer = FecDataWriter.mock() transceiver = _MockTransceiver() writer.set_transceiver(transceiver) @@ -294,8 +303,10 @@ def test_multispec_with_double_reference(self) -> None: with self.assertRaises(IntegrityError): spec.reserve_memory_region(1, 12, reference=1) - def test_multispec_with_wrong_chip_reference(self) -> None: - set_config("Machine", "versions", VersionStrings.FOUR_PLUS.text) + @parameterized.expand(FOUR_PLUS_BOARD_TYPES) + def test_multispec_with_wrong_chip_reference( + self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) writer = FecDataWriter.mock() transceiver = _MockTransceiver() writer.set_transceiver(transceiver) diff --git a/unittests/utilities/test_json.py b/unittests/utilities/test_json.py index 2efee44b0..c17bbfc5e 100644 --- a/unittests/utilities/test_json.py +++ b/unittests/utilities/test_json.py @@ -13,9 +13,11 @@ # limitations under the License. import unittest +from parameterized import parameterized + from spinn_utilities.config_holder import set_config -from spinn_machine.version.version_strings import VersionStrings +from spinn_machine.version import MANY_BOARD_TYPES from pacman.model.graphs.machine import SimpleMachineVertex from pacman.model.placements import Placement, Placements @@ -49,7 +51,8 @@ def test_placements(self) -> None: # write and validate write_json_placements() - def test_machine(self) -> None: - set_config("Machine", "versions", VersionStrings.ANY.text) + @parameterized.expand(MANY_BOARD_TYPES) + def test_machine(self, _: str, ver_num: str) -> None: + set_config("Machine", "version", ver_num) # write and validate write_json_machine()