Skip to content

Commit cd7a2c9

Browse files
add test for has_jaw_width_calibration
1 parent 322f51d commit cd7a2c9

File tree

2 files changed

+82
-15
lines changed

2 files changed

+82
-15
lines changed

api/src/opentrons/hardware_control/instruments/ot3/gripper.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
save_gripper_jaw_width_data,
2323
load_gripper_jaw_width,
2424
)
25+
2526
from ..instrument_abc import AbstractInstrument
2627
from opentrons.hardware_control.dev_types import AttachedGripper, GripperDict
2728
from opentrons_shared_data.errors.exceptions import (
@@ -196,6 +197,7 @@ def update_jaw_open_position_from_closed_position(
196197
"""
197198
if jaw_at_closed is None:
198199
self._encoder_position_at_jaw_closed = jaw_at_closed
200+
self._jaw_max_offset = None
199201
return
200202
jaw_min = self._config.geometry.jaw_width["min"]
201203
jaw_nominal_max = self._config.geometry.jaw_width["max"]

api/tests/opentrons/hardware_control/test_gripper.py

Lines changed: 80 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
from typing import Optional, Callable, TYPE_CHECKING
1+
from typing import Optional, Callable
22
import pytest
3+
from unittest import mock
4+
from datetime import datetime
35

46
from opentrons.types import Point
57
from opentrons.calibration_storage import types as cal_types
@@ -9,26 +11,29 @@
911
from opentrons_shared_data.gripper import GripperModel
1012
from opentrons_shared_data.errors.exceptions import MotionFailedError
1113

12-
if TYPE_CHECKING:
13-
from opentrons.hardware_control.instruments.ot3.instrument_calibration import (
14-
GripperCalibrationOffset,
15-
)
14+
from opentrons.hardware_control.instruments.ot3.instrument_calibration import (
15+
GripperCalibrationOffset,
16+
GripperJawWidthData,
17+
)
1618

1719
fake_gripper_conf = gripper_config.load(GripperModel.v1)
1820

1921

2022
@pytest.mark.ot3_only
2123
@pytest.fixture
22-
def fake_offset() -> "GripperCalibrationOffset":
23-
from opentrons.hardware_control.instruments.ot3.instrument_calibration import (
24-
load_gripper_calibration_offset,
25-
)
24+
def fake_offset() -> GripperCalibrationOffset:
2625

27-
return load_gripper_calibration_offset("fakeid123")
26+
return instrument_calibration.load_gripper_calibration_offset("fakeid123")
2827

2928

3029
@pytest.mark.ot3_only
31-
def test_id_get_added_to_dict(fake_offset: "GripperCalibrationOffset") -> None:
30+
@pytest.fixture
31+
def fake_jaw_cal() -> GripperJawWidthData:
32+
return instrument_calibration.load_gripper_jaw_width("fakeid123")
33+
34+
35+
@pytest.mark.ot3_only
36+
def test_id_get_added_to_dict(fake_offset: GripperCalibrationOffset) -> None:
3237
gripr = gripper.Gripper(fake_gripper_conf, fake_offset, "fakeid123")
3338
assert gripr.as_dict()["gripper_id"] == "fakeid123"
3439

@@ -53,23 +58,83 @@ def test_id_get_added_to_dict(fake_offset: "GripperCalibrationOffset") -> None:
5358
def test_critical_point(
5459
override: Optional[CriticalPoint],
5560
result_accessor: Callable[[gripper.Gripper], Point],
56-
fake_offset: "GripperCalibrationOffset",
61+
fake_offset: GripperCalibrationOffset,
5762
) -> None:
5863
gripr = gripper.Gripper(fake_gripper_conf, fake_offset, "fakeid123")
5964
assert gripr.critical_point(override) == result_accessor(gripr)
6065

6166

6267
@pytest.mark.ot3_only
63-
def test_load_gripper_cal_offset(fake_offset: "GripperCalibrationOffset") -> None:
68+
def test_load_gripper_cal_offset(fake_offset: GripperCalibrationOffset) -> None:
6469
gripr = gripper.Gripper(fake_gripper_conf, fake_offset, "fakeid123")
6570
# if offset data do not exist, loaded values should match DEFAULT
6671
assert gripr._calibration_offset.offset == Point(
6772
*gripper_config.DEFAULT_GRIPPER_CALIBRATION_OFFSET
6873
)
6974

7075

76+
# need a test for update_open_position_from_closed_position
77+
78+
79+
@pytest.mark.ot3_only
80+
def test_gripper_default_jaw_width_calibration(
81+
fake_jaw_cal: GripperJawWidthData,
82+
fake_offset: GripperCalibrationOffset,
83+
) -> None:
84+
gripr = gripper.Gripper(fake_gripper_conf, fake_offset, "fakeid123")
85+
assert gripr._jaw_max_offset is None
86+
assert gripr._encoder_position_at_jaw_closed is None
87+
88+
89+
@pytest.mark.parametrize("loaded_encoder_pos", [24.4, None])
90+
@pytest.mark.parametrize("existing_encoder_pos", [24.4, None])
91+
@pytest.mark.ot3_only
92+
def test_gripper_has_jaw_width_calibration(
93+
fake_jaw_cal: GripperJawWidthData,
94+
fake_offset: GripperCalibrationOffset,
95+
loaded_encoder_pos: float,
96+
existing_encoder_pos: float,
97+
) -> None:
98+
99+
gripr = gripper.Gripper(fake_gripper_conf, fake_offset, "fakeid123")
100+
gripr._encoder_position_at_jaw_closed = existing_encoder_pos
101+
with mock.patch(
102+
"opentrons.hardware_control.instruments.ot3.gripper.load_gripper_jaw_width",
103+
return_value=GripperJawWidthData(
104+
source=fake_jaw_cal.source,
105+
status=fake_jaw_cal.status,
106+
encoder_position_at_jaw_closed=loaded_encoder_pos,
107+
last_modified=datetime.now(),
108+
),
109+
autospec=True,
110+
) as fake_load_jaw_width:
111+
has_cal = gripr.has_jaw_width_calibration
112+
mock_save_gripper_jaw_width_data = mock.Mock()
113+
mock.patch(
114+
"opentrons.hardware_control.instruments.ot3.gripper.save_gripper_jaw_width_data",
115+
return_value=mock_save_gripper_jaw_width_data(),
116+
)
117+
# if gripper._encoder_position_at_jaw_closed has no value:
118+
if existing_encoder_pos is None:
119+
# gripper should try to load jaw width from the robot fs
120+
fake_load_jaw_width.assert_called_once()
121+
if loaded_encoder_pos is None:
122+
assert has_cal is False
123+
else:
124+
# if robot fs has gripper jaw width data,
125+
# it should get saved to the gripper object and has_cal return true
126+
mock_save_gripper_jaw_width_data.assert_called_once()
127+
assert has_cal is True
128+
# if gripper._encoder_position_at_jaw_closed has a value:
129+
else:
130+
# gripper doesn't try to load from the robot and returns true
131+
fake_load_jaw_width.assert_not_called()
132+
assert has_cal is True
133+
mock_save_gripper_jaw_width_data.assert_called_once()
134+
135+
71136
@pytest.mark.ot3_only
72-
def test_reload_instrument_cal_ot3(fake_offset: "GripperCalibrationOffset") -> None:
137+
def test_reload_instrument_cal_ot3(fake_offset: GripperCalibrationOffset) -> None:
73138
old_gripper = gripper.Gripper(
74139
fake_gripper_conf,
75140
fake_offset,
@@ -96,7 +161,7 @@ def test_reload_instrument_cal_ot3(fake_offset: "GripperCalibrationOffset") -> N
96161

97162
@pytest.mark.ot3_only
98163
def test_reload_instrument_cal_ot3_conf_changed(
99-
fake_offset: "GripperCalibrationOffset",
164+
fake_offset: GripperCalibrationOffset,
100165
) -> None:
101166
old_gripper = gripper.Gripper(
102167
fake_gripper_conf,

0 commit comments

Comments
 (0)