1
- from typing import Optional , Callable , TYPE_CHECKING
1
+ from typing import Optional , Callable
2
2
import pytest
3
+ from unittest import mock
4
+ from datetime import datetime
3
5
4
6
from opentrons .types import Point
5
7
from opentrons .calibration_storage import types as cal_types
9
11
from opentrons_shared_data .gripper import GripperModel
10
12
from opentrons_shared_data .errors .exceptions import MotionFailedError
11
13
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
+ )
16
18
17
19
fake_gripper_conf = gripper_config .load (GripperModel .v1 )
18
20
19
21
20
22
@pytest .mark .ot3_only
21
23
@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 :
26
25
27
- return load_gripper_calibration_offset ("fakeid123" )
26
+ return instrument_calibration . load_gripper_calibration_offset ("fakeid123" )
28
27
29
28
30
29
@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 :
32
37
gripr = gripper .Gripper (fake_gripper_conf , fake_offset , "fakeid123" )
33
38
assert gripr .as_dict ()["gripper_id" ] == "fakeid123"
34
39
@@ -53,23 +58,83 @@ def test_id_get_added_to_dict(fake_offset: "GripperCalibrationOffset") -> None:
53
58
def test_critical_point (
54
59
override : Optional [CriticalPoint ],
55
60
result_accessor : Callable [[gripper .Gripper ], Point ],
56
- fake_offset : " GripperCalibrationOffset" ,
61
+ fake_offset : GripperCalibrationOffset ,
57
62
) -> None :
58
63
gripr = gripper .Gripper (fake_gripper_conf , fake_offset , "fakeid123" )
59
64
assert gripr .critical_point (override ) == result_accessor (gripr )
60
65
61
66
62
67
@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 :
64
69
gripr = gripper .Gripper (fake_gripper_conf , fake_offset , "fakeid123" )
65
70
# if offset data do not exist, loaded values should match DEFAULT
66
71
assert gripr ._calibration_offset .offset == Point (
67
72
* gripper_config .DEFAULT_GRIPPER_CALIBRATION_OFFSET
68
73
)
69
74
70
75
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
+
71
136
@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 :
73
138
old_gripper = gripper .Gripper (
74
139
fake_gripper_conf ,
75
140
fake_offset ,
@@ -96,7 +161,7 @@ def test_reload_instrument_cal_ot3(fake_offset: "GripperCalibrationOffset") -> N
96
161
97
162
@pytest .mark .ot3_only
98
163
def test_reload_instrument_cal_ot3_conf_changed (
99
- fake_offset : " GripperCalibrationOffset" ,
164
+ fake_offset : GripperCalibrationOffset ,
100
165
) -> None :
101
166
old_gripper = gripper .Gripper (
102
167
fake_gripper_conf ,
0 commit comments