diff --git a/CHANGELOG.md b/CHANGELOG.md index 603ca7b9..22223ea6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- Fixed: Treat blank conditionally required X/Y probing inputs as missing - Enhancement: Add multi-select to the remote file browser - Enhancement: Display error message in halt popup. Requires halt errors to start with "ERROR: " in the firmware - Enhancement: Add popup notice when using stock firmware instead of the Community Firmware diff --git a/carveracontroller/addons/probing/operations/Angle/AngleOperation.py b/carveracontroller/addons/probing/operations/Angle/AngleOperation.py index 81968765..c45b03b6 100644 --- a/carveracontroller/addons/probing/operations/Angle/AngleOperation.py +++ b/carveracontroller/addons/probing/operations/Angle/AngleOperation.py @@ -32,11 +32,11 @@ def generate(self, input_config: dict[str, float]): def get_missing_config(self, config: dict[str, float]): if self.requires_x: definition = AngleParameterDefinitions.XAxisDistance - if not definition.code in config: + if definition.code not in config or not config[definition.code].strip(): return definition if self.requires_y: definition = AngleParameterDefinitions.YAxisDistance - if not definition.code in config: + if definition.code not in config or not config[definition.code].strip(): return definition definition = AngleParameterDefinitions.ProbeDepth if not definition.code in config: diff --git a/carveracontroller/addons/probing/operations/Bore/BoreOperation.py b/carveracontroller/addons/probing/operations/Bore/BoreOperation.py index ff5a39e8..24de6a70 100644 --- a/carveracontroller/addons/probing/operations/Bore/BoreOperation.py +++ b/carveracontroller/addons/probing/operations/Bore/BoreOperation.py @@ -29,11 +29,11 @@ def generate(self, input_config: dict[str, float]): def get_missing_config(self, config: dict[str, float]): if self.requires_x: definition = BoreParameterDefinitions.XAxisDistance - if not definition.code in config: + if definition.code not in config or not config[definition.code].strip(): return definition if self.requires_y: definition = BoreParameterDefinitions.YAxisDistance - if not definition.code in config: + if definition.code not in config or not config[definition.code].strip(): return definition required_definitions = { diff --git a/carveracontroller/addons/probing/operations/Boss/BossOperation.py b/carveracontroller/addons/probing/operations/Boss/BossOperation.py index a38a70ad..092e7961 100644 --- a/carveracontroller/addons/probing/operations/Boss/BossOperation.py +++ b/carveracontroller/addons/probing/operations/Boss/BossOperation.py @@ -29,11 +29,11 @@ def generate(self, input_config: dict[str, float]): def get_missing_config(self, config: dict[str, float]): if self.requires_x: definition = BossParameterDefinitions.XAxisDistance - if not definition.code in config: + if definition.code not in config or not config[definition.code].strip(): return definition if self.requires_y: definition = BossParameterDefinitions.YAxisDistance - if not definition.code in config: + if definition.code not in config or not config[definition.code].strip(): return definition required_definitions = { name: value diff --git a/carveracontroller/addons/probing/operations/ProbeTip/ProbeTipOperation.py b/carveracontroller/addons/probing/operations/ProbeTip/ProbeTipOperation.py index ed64830a..5e100398 100644 --- a/carveracontroller/addons/probing/operations/ProbeTip/ProbeTipOperation.py +++ b/carveracontroller/addons/probing/operations/ProbeTip/ProbeTipOperation.py @@ -34,11 +34,11 @@ def generate(self, input_config: dict[str, float]): def get_missing_config(self, config: dict[str, float]): if self.requires_x: definition = ProbeTipParameterDefinitions.XAxisDistance - if not definition.code in config: + if definition.code not in config or not config[definition.code].strip(): return definition if self.requires_y: definition = ProbeTipParameterDefinitions.YAxisDistance - if not definition.code in config: + if definition.code not in config or not config[definition.code].strip(): return definition required_definitions = { @@ -75,11 +75,11 @@ def generate(self, input_config: dict[str, float]): def get_missing_config(self, config: dict[str, float]): if self.requires_x: definition = ProbeTipParameterDefinitions.XAxisDistance - if not definition.code in config: + if definition.code not in config or not config[definition.code].strip(): return definition if self.requires_y: definition = ProbeTipParameterDefinitions.YAxisDistance - if not definition.code in config: + if definition.code not in config or not config[definition.code].strip(): return definition required_definitions = { @@ -116,11 +116,11 @@ def generate(self, input_config: dict[str, float]): def get_missing_config(self, config: dict[str, float]): if self.requires_x: definition = ProbeTipParameterDefinitions.XAxisDistance - if not definition.code in config: + if definition.code not in config or not config[definition.code].strip(): return definition if self.requires_y: definition = ProbeTipParameterDefinitions.YAxisDistance - if not definition.code in config: + if definition.code not in config or not config[definition.code].strip(): return definition required_definitions = { diff --git a/tests/unit/test_probing_required_axes.py b/tests/unit/test_probing_required_axes.py new file mode 100644 index 00000000..0ccdab6b --- /dev/null +++ b/tests/unit/test_probing_required_axes.py @@ -0,0 +1,79 @@ +"""Tests for conditionally required probing axes.""" + +import pytest + +from carveracontroller.addons.probing.operations.Angle.AngleOperation import AngleOperation +from carveracontroller.addons.probing.operations.Angle.AngleParameterDefinitions import AngleParameterDefinitions +from carveracontroller.addons.probing.operations.Bore.BoreOperation import BoreOperation +from carveracontroller.addons.probing.operations.Bore.BoreParameterDefinitions import BoreParameterDefinitions +from carveracontroller.addons.probing.operations.Boss.BossOperation import BossOperation +from carveracontroller.addons.probing.operations.Boss.BossParameterDefinitions import BossParameterDefinitions +from carveracontroller.addons.probing.operations.ProbeTip.ProbeTipOperation import ( + ProbeTipOperationAnchor, + ProbeTipOperationBore, + ProbeTipOperationBoss, +) +from carveracontroller.addons.probing.operations.ProbeTip.ProbeTipParameterDefinitions import ( + ProbeTipParameterDefinitions, +) + +OPERATION_TYPES = ( + (BoreOperation, ("",), BoreParameterDefinitions), + (BossOperation, ("",), BossParameterDefinitions), + (AngleOperation, (False, ""), AngleParameterDefinitions), + (ProbeTipOperationBore, (False, ""), ProbeTipParameterDefinitions), + (ProbeTipOperationBoss, (False, ""), ProbeTipParameterDefinitions), + (ProbeTipOperationAnchor, (False, ""), ProbeTipParameterDefinitions), +) + + +@pytest.mark.parametrize("blank_value", ["", " "]) +@pytest.mark.parametrize(("operation_type", "extra_args", "definitions"), OPERATION_TYPES) +@pytest.mark.parametrize( + ("requires_x", "requires_y", "axis_name"), + [ + (True, False, "XAxisDistance"), + (False, True, "YAxisDistance"), + ], +) +def test_conditionally_required_axis_rejects_blank_value( + operation_type, + extra_args, + definitions, + requires_x, + requires_y, + axis_name, + blank_value, +): + operation = operation_type("Test", requires_x, requires_y, *extra_args) + definition = getattr(definitions, axis_name) + + missing = operation.get_missing_config({definition.code: blank_value}) + + assert missing is definition + + +@pytest.mark.parametrize("configured_value", ["0", "12.5"]) +@pytest.mark.parametrize(("operation_type", "extra_args", "definitions"), OPERATION_TYPES) +@pytest.mark.parametrize( + ("requires_x", "requires_y", "axis_name"), + [ + (True, False, "XAxisDistance"), + (False, True, "YAxisDistance"), + ], +) +def test_conditionally_required_axis_accepts_numeric_string( + operation_type, + extra_args, + definitions, + requires_x, + requires_y, + axis_name, + configured_value, +): + operation = operation_type("Test", requires_x, requires_y, *extra_args) + definition = getattr(definitions, axis_name) + + missing = operation.get_missing_config({definition.code: configured_value}) + + assert missing is not definition