Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down Expand Up @@ -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 = {
Expand Down Expand Up @@ -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 = {
Expand Down
79 changes: 79 additions & 0 deletions tests/unit/test_probing_required_axes.py
Original file line number Diff line number Diff line change
@@ -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
Loading