Skip to content

Commit 3991b93

Browse files
authored
tests: Add regression tests for unpickling nitypes 1.0.0 objects (#235)
* tests: Add regression tests for unpickling nitypes 1.0.0 objects * github: Exclude new test from oldest_deps workflow * github: Update comment about NumPy pickle compatibility * github: Update comment again
1 parent 4224783 commit 3991b93

14 files changed

+299
-3
lines changed

.github/workflows/run_unit_tests_oldest_deps.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ jobs:
4545
- name: Display installed dependency versions
4646
run: poetry run pip list
4747
- name: Run unit tests and code coverage
48-
run: poetry run pytest ./tests/unit -v --cov=nitypes --junitxml=test_results/nitypes-oldest-deps-${{ matrix.os }}-py${{ matrix.python-version }}.xml
48+
# Skip test___pickled_value___unpickle___is_compatible because this test's pickle data was saved with NumPy 2.x and cannot be loaded in NumPy 1.x.
49+
run: poetry run pytest ./tests/unit -v --cov=nitypes --junitxml=test_results/nitypes-oldest-deps-${{ matrix.os }}-py${{ matrix.python-version }}.xml -k "not test___pickled_value___unpickle___is_compatible"
4950
- name: Upload test results
5051
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
5152
with:

tests/unit/bintime/test_datetime.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,27 @@ def test___time_value___pickle___references_public_modules() -> None:
447447
assert b"nitypes.bintime._time_value" not in value_bytes
448448

449449

450+
@pytest.mark.parametrize(
451+
"pickled_value, expected",
452+
[
453+
# nitypes 1.0.0
454+
(
455+
b"\x80\x04\x95W\x00\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94\x8c\x0fnitypes.bintime\x94\x8c\x08DateTime\x94\x93\x94\x8c\nfrom_ticks\x94\x86\x94R\x94\x8a\tN\xca\xb9\xf4\xe9\xd3\x9a\x1f\xff\x85\x94R\x94.",
456+
DateTime(1903, 12, 31, 23, 59, 59, 123_456, 234_567_789, 345_567_890, dt.timezone.utc),
457+
),
458+
(
459+
b"\x80\x04\x95[\x00\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94\x8c\x0fnitypes.bintime\x94\x8c\x08DateTime\x94\x93\x94\x8c\nfrom_ticks\x94\x86\x94R\x94\x8a\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\x92\xb4\x00\x85\x94R\x94.",
460+
DateTime(2000, 1, 1, 0, 0, 0, 0, 0, 0, dt.timezone.utc),
461+
),
462+
],
463+
)
464+
def test___pickled_value___unpickle___is_compatible(
465+
pickled_value: bytes, expected: DateTime
466+
) -> None:
467+
new_value = pickle.loads(pickled_value)
468+
assert new_value == expected
469+
470+
450471
@pytest.mark.parametrize(
451472
"value, expected",
452473
[

tests/unit/bintime/test_datetime_array.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,6 +1322,29 @@ def test___datetime_array___pickle___references_public_modules() -> None:
13221322
assert b"nitypes.bintime._datetime_array" not in pickled
13231323

13241324

1325+
@pytest.mark.parametrize(
1326+
"pickled_value, expected",
1327+
[
1328+
# nitypes 1.0.0
1329+
(
1330+
b"\x80\x04\x95\xb1\x00\x00\x00\x00\x00\x00\x00\x8c\x0fnitypes.bintime\x94\x8c\rDateTimeArray\x94\x93\x94]\x94(\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94h\x00\x8c\x08DateTime\x94\x93\x94\x8c\nfrom_ticks\x94\x86\x94R\x94\x8a\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\x92\xb4\x00\x85\x94R\x94h\x06h\x08h\t\x86\x94R\x94\x8a\r\x00\x00\x00\x00\x00\x00\x00\x00\x00N\xc4\xa1\x00\x85\x94R\x94h\x06h\x08h\t\x86\x94R\x94\x8a\r\x00\x00\x00\x00\x00\x00\x00\x00\x006\x9a\xe3\x00\x85\x94R\x94e\x85\x94R\x94.",
1331+
DateTimeArray(
1332+
[
1333+
DateTime(2000, 1, 1, tzinfo=dt.timezone.utc),
1334+
DateTime(1990, 1, 1, tzinfo=dt.timezone.utc),
1335+
DateTime(2025, 1, 1, tzinfo=dt.timezone.utc),
1336+
]
1337+
),
1338+
),
1339+
],
1340+
)
1341+
def test___pickled_value___unpickle___is_compatible(
1342+
pickled_value: bytes, expected: DateTimeArray
1343+
) -> None:
1344+
new_value = pickle.loads(pickled_value)
1345+
assert new_value == expected
1346+
1347+
13251348
@pytest.mark.parametrize(
13261349
"value",
13271350
(

tests/unit/bintime/test_timedelta.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,6 +1200,27 @@ def test___timedelta___pickle___references_public_modules() -> None:
12001200
assert b"nitypes.bintime._timedelta" not in value_bytes
12011201

12021202

1203+
@pytest.mark.parametrize(
1204+
"pickled_value, expected",
1205+
[
1206+
# nitypes 1.0.0
1207+
(
1208+
b"\x80\x04\x95_\x00\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94\x8c\x0fnitypes.bintime\x94\x8c\tTimeDelta\x94\x93\x94\x8c\nfrom_ticks\x94\x86\x94R\x94\x8a\x10\x03\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x10\x85\x94R\x94.",
1209+
TimeDelta.from_ticks((1 << 124) + (2 << 64) + 3),
1210+
),
1211+
(
1212+
b"\x80\x04\x95_\x00\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94\x8c\x0fnitypes.bintime\x94\x8c\tTimeDelta\x94\x93\x94\x8c\nfrom_ticks\x94\x86\x94R\x94\x8a\x10\xfd\xff\xff\xff\xff\xff\xff\xff\xfd\xff\xff\xff\xff\xff\xff\xef\x85\x94R\x94.",
1213+
TimeDelta.from_ticks((-1 << 124) + (-2 << 64) + -3),
1214+
),
1215+
],
1216+
)
1217+
def test___pickled_value___unpickle___is_compatible(
1218+
pickled_value: bytes, expected: TimeDelta
1219+
) -> None:
1220+
new_value = pickle.loads(pickled_value)
1221+
assert new_value == expected
1222+
1223+
12031224
@pytest.mark.parametrize(
12041225
"value, expected",
12051226
[

tests/unit/bintime/test_timedelta_array.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88
import pytest
99
from typing_extensions import assert_type
1010

11-
from nitypes.bintime import TimeDelta
12-
from nitypes.bintime import TimeDeltaArray
11+
from nitypes.bintime import TimeDelta, TimeDeltaArray
1312

1413

1514
###############################################################################
@@ -920,6 +919,23 @@ def test___timedelta_array___pickle___references_public_modules() -> None:
920919
assert b"nitypes.bintime._timedelta_array" not in pickled
921920

922921

922+
@pytest.mark.parametrize(
923+
"pickled_value, expected",
924+
[
925+
# nitypes 1.0.0
926+
(
927+
b"\x80\x04\x95\xa8\x00\x00\x00\x00\x00\x00\x00\x8c\x0fnitypes.bintime\x94\x8c\x0eTimeDeltaArray\x94\x93\x94]\x94(\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94h\x00\x8c\tTimeDelta\x94\x93\x94\x8c\nfrom_ticks\x94\x86\x94R\x94\x8a\t\x00\x00\xc3\xf5(\\\x8fB\x14\x85\x94R\x94h\x06h\x08h\t\x86\x94R\x94\x8a\t\x00\x00\x00\x00\x00\x00\x00\x00\xff\x85\x94R\x94h\x06h\x08h\t\x86\x94R\x94\x8a\n\x00\x00\x00\x00\x00\x00\x00\x00\xf4\x01\x85\x94R\x94e\x85\x94R\x94.",
928+
TimeDeltaArray([TimeDelta(20.26), TimeDelta(-1), TimeDelta(500)]),
929+
),
930+
],
931+
)
932+
def test___pickled_value___unpickle___is_compatible(
933+
pickled_value: bytes, expected: TimeDeltaArray
934+
) -> None:
935+
new_value = pickle.loads(pickled_value)
936+
assert new_value == expected
937+
938+
923939
@pytest.mark.parametrize(
924940
"value",
925941
(

tests/unit/scalar/test_scalar.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,3 +302,20 @@ def test___scalar___pickle___references_public_modules() -> None:
302302

303303
assert b"nitypes.scalar" in value_bytes
304304
assert b"nitypes.scalar._scalar" not in value_bytes
305+
306+
307+
@pytest.mark.parametrize(
308+
"pickled_value, expected",
309+
[
310+
# nitypes 1.0.0
311+
(
312+
b"\x80\x04\x952\x00\x00\x00\x00\x00\x00\x00\x8c\x0enitypes.scalar\x94\x8c\x06Scalar\x94\x93\x94G@4\x00\x00\x00\x00\x00\x00\x8c\x05watts\x94\x86\x94R\x94.",
313+
Scalar(20.0, "watts"),
314+
),
315+
],
316+
)
317+
def test___pickled_value___unpickle___is_compatible(
318+
pickled_value: bytes, expected: Scalar[Any]
319+
) -> None:
320+
new_value = pickle.loads(pickled_value)
321+
assert new_value == expected

tests/unit/vector/test_vector.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,3 +417,20 @@ def test___vector___pickle___references_public_modules() -> None:
417417

418418
assert b"nitypes.vector" in value_bytes
419419
assert b"nitypes.vector._vector" not in value_bytes
420+
421+
422+
@pytest.mark.parametrize(
423+
"pickled_value, expected",
424+
[
425+
# nitypes 1.0.0
426+
(
427+
b"\x80\x04\x95?\x00\x00\x00\x00\x00\x00\x00\x8c\x0enitypes.vector\x94\x8c\x06Vector\x94\x93\x94]\x94(G@4\x00\x00\x00\x00\x00\x00G@4\x19\x99\x99\x99\x99\x9ae\x8c\x05watts\x94\x86\x94R\x94.",
428+
Vector([20.0, 20.1], "watts"),
429+
),
430+
],
431+
)
432+
def test___pickled_value___unpickle___is_compatible(
433+
pickled_value: bytes, expected: Vector[Any]
434+
) -> None:
435+
new_value = pickle.loads(pickled_value)
436+
assert new_value == expected

tests/unit/waveform/test_analog_waveform.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2003,3 +2003,25 @@ def test___waveform___pickle___references_public_modules() -> None:
20032003
assert b"nitypes.waveform._numeric" not in value_bytes
20042004
assert b"nitypes.waveform._timing" not in value_bytes
20052005
assert b"nitypes.waveform._scaling" not in value_bytes
2006+
2007+
2008+
@pytest.mark.parametrize(
2009+
"pickled_value, expected",
2010+
[
2011+
# nitypes 1.0.0
2012+
(
2013+
b"\x80\x04\x95n\x02\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94\x8c\x10nitypes.waveform\x94\x8c\x0eAnalogWaveform\x94\x93\x94\x8c\t_unpickle\x94\x86\x94R\x94K\x03\x8c\x05numpy\x94\x8c\x05dtype\x94\x93\x94\x8c\x02f8\x94\x89\x88\x87\x94R\x94(K\x03\x8c\x01<\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94b\x86\x94}\x94(\x8c\x08raw_data\x94\x8c\x16numpy._core.multiarray\x94\x8c\x0c_reconstruct\x94\x93\x94h\t\x8c\x07ndarray\x94\x93\x94K\x00\x85\x94C\x01b\x94\x87\x94R\x94(K\x01K\x03\x85\x94h\x0e\x89C\x18\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x08@\x94t\x94b\x8c\x13extended_properties\x94h\x03\x8c\x1aExtendedPropertyDictionary\x94\x93\x94)\x81\x94N}\x94\x8c\x0b_properties\x94}\x94(\x8c\x0eNI_ChannelName\x94\x8c\x08Dev1/ai0\x94\x8c\x12NI_UnitDescription\x94\x8c\x05Volts\x94us\x86\x94b\x8c\x18copy_extended_properties\x94\x89\x8c\x06timing\x94h\x02h\x03\x8c\x06Timing\x94\x93\x94h\x06\x86\x94R\x94(h\x03\x8c\x12SampleIntervalMode\x94\x93\x94K\x01\x85\x94R\x94NN\x8c\x08datetime\x94\x8c\ttimedelta\x94\x93\x94K\x00K\x00M\xe8\x03\x87\x94R\x94Nt\x94}\x94\x86\x94R\x94\x8c\nscale_mode\x94h\x03\x8c\x0fLinearScaleMode\x94\x93\x94)\x81\x94N}\x94(\x8c\x05_gain\x94G@\x00\x00\x00\x00\x00\x00\x00\x8c\x07_offset\x94G?\xf0\x00\x00\x00\x00\x00\x00u\x86\x94bu\x86\x94R\x94.",
2014+
AnalogWaveform(
2015+
raw_data=np.array([1, 2, 3], np.float64),
2016+
extended_properties={"NI_ChannelName": "Dev1/ai0", "NI_UnitDescription": "Volts"},
2017+
timing=Timing.create_with_regular_interval(dt.timedelta(milliseconds=1)),
2018+
scale_mode=LinearScaleMode(2.0, 1.0),
2019+
),
2020+
),
2021+
],
2022+
)
2023+
def test___pickled_value___unpickle___is_compatible(
2024+
pickled_value: bytes, expected: AnalogWaveform[Any]
2025+
) -> None:
2026+
new_value = pickle.loads(pickled_value)
2027+
assert new_value == expected

tests/unit/waveform/test_complex_waveform.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,3 +649,25 @@ def test___waveform___pickle___references_public_modules() -> None:
649649
assert b"nitypes.waveform._numeric" not in value_bytes
650650
assert b"nitypes.waveform._timing" not in value_bytes
651651
assert b"nitypes.waveform._scaling" not in value_bytes
652+
653+
654+
@pytest.mark.parametrize(
655+
"pickled_value, expected",
656+
[
657+
# nitypes 1.0.0
658+
(
659+
b"\x80\x04\x95\x88\x02\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94\x8c\x10nitypes.waveform\x94\x8c\x0fComplexWaveform\x94\x93\x94\x8c\t_unpickle\x94\x86\x94R\x94K\x03\x8c\x05numpy\x94\x8c\x05dtype\x94\x93\x94\x8c\x03c16\x94\x89\x88\x87\x94R\x94(K\x03\x8c\x01<\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94b\x86\x94}\x94(\x8c\x08raw_data\x94\x8c\x16numpy._core.multiarray\x94\x8c\x0c_reconstruct\x94\x93\x94h\t\x8c\x07ndarray\x94\x93\x94K\x00\x85\x94C\x01b\x94\x87\x94R\x94(K\x01K\x03\x85\x94h\x0e\x89C0\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00\x00\x00\x94t\x94b\x8c\x13extended_properties\x94h\x03\x8c\x1aExtendedPropertyDictionary\x94\x93\x94)\x81\x94N}\x94\x8c\x0b_properties\x94}\x94(\x8c\x0eNI_ChannelName\x94\x8c\x08Dev1/ai0\x94\x8c\x12NI_UnitDescription\x94\x8c\x05Volts\x94us\x86\x94b\x8c\x18copy_extended_properties\x94\x89\x8c\x06timing\x94h\x02h\x03\x8c\x06Timing\x94\x93\x94h\x06\x86\x94R\x94(h\x03\x8c\x12SampleIntervalMode\x94\x93\x94K\x01\x85\x94R\x94NN\x8c\x08datetime\x94\x8c\ttimedelta\x94\x93\x94K\x00K\x00M\xe8\x03\x87\x94R\x94Nt\x94}\x94\x86\x94R\x94\x8c\nscale_mode\x94h\x03\x8c\x0fLinearScaleMode\x94\x93\x94)\x81\x94N}\x94(\x8c\x05_gain\x94G@\x00\x00\x00\x00\x00\x00\x00\x8c\x07_offset\x94G?\xf0\x00\x00\x00\x00\x00\x00u\x86\x94bu\x86\x94R\x94.",
660+
ComplexWaveform(
661+
raw_data=np.array([1, 2, 3], np.complex128),
662+
extended_properties={"NI_ChannelName": "Dev1/ai0", "NI_UnitDescription": "Volts"},
663+
timing=Timing.create_with_regular_interval(dt.timedelta(milliseconds=1)),
664+
scale_mode=LinearScaleMode(2.0, 1.0),
665+
),
666+
),
667+
],
668+
)
669+
def test___pickled_value___unpickle___is_compatible(
670+
pickled_value: bytes, expected: ComplexWaveform[Any]
671+
) -> None:
672+
new_value = pickle.loads(pickled_value)
673+
assert new_value == expected

tests/unit/waveform/test_digital_waveform.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1965,6 +1965,40 @@ def test___waveform___pickle___references_public_modules() -> None:
19651965
assert b"nitypes.waveform._timing" not in value_bytes
19661966

19671967

1968+
@pytest.mark.parametrize(
1969+
"pickled_value, expected",
1970+
[
1971+
# nitypes 1.0.0
1972+
pytest.param(
1973+
b"\x80\x04\x95\x08\x02\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94\x8c\x10nitypes.waveform\x94\x8c\x0fDigitalWaveform\x94\x93\x94\x8c\t_unpickle\x94\x86\x94R\x94K\x03K\x01\x8c\x05numpy\x94\x8c\x05dtype\x94\x93\x94\x8c\x02b1\x94\x89\x88\x87\x94R\x94(K\x03\x8c\x01|\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94b\x87\x94}\x94(\x8c\x04data\x94\x8c\x16numpy._core.multiarray\x94\x8c\x0c_reconstruct\x94\x93\x94h\t\x8c\x07ndarray\x94\x93\x94K\x00\x85\x94C\x01b\x94\x87\x94R\x94(K\x01K\x03K\x01\x86\x94h\x0e\x89C\x03\x01\x01\x01\x94t\x94b\x8c\x13extended_properties\x94h\x03\x8c\x1aExtendedPropertyDictionary\x94\x93\x94)\x81\x94N}\x94\x8c\x0b_properties\x94}\x94(\x8c\x0eNI_ChannelName\x94\x8c\x08Dev1/ai0\x94\x8c\x12NI_UnitDescription\x94\x8c\x05Volts\x94us\x86\x94b\x8c\x18copy_extended_properties\x94\x89\x8c\x06timing\x94h\x02h\x03\x8c\x06Timing\x94\x93\x94h\x06\x86\x94R\x94(h\x03\x8c\x12SampleIntervalMode\x94\x93\x94K\x01\x85\x94R\x94NN\x8c\x08datetime\x94\x8c\ttimedelta\x94\x93\x94K\x00K\x00M\xe8\x03\x87\x94R\x94Nt\x94}\x94\x86\x94R\x94u\x86\x94R\x94.",
1974+
DigitalWaveform(
1975+
data=np.array([1, 2, 3], _np_bool),
1976+
extended_properties={"NI_ChannelName": "Dev1/ai0", "NI_UnitDescription": "Volts"},
1977+
timing=Timing.create_with_regular_interval(dt.timedelta(milliseconds=1)),
1978+
),
1979+
marks=pytest.mark.xfail(
1980+
raises=AttributeError,
1981+
reason="https://github.com/ni/nitypes-python/issues/234 - ExtendedPropertyDictionary._on_key_changed breaks pickle compatibility",
1982+
),
1983+
),
1984+
# nitypes 1.0.1
1985+
(
1986+
b"\x80\x04\x95\xf4\x01\x00\x00\x00\x00\x00\x00\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94\x8c\x10nitypes.waveform\x94\x8c\x0fDigitalWaveform\x94\x93\x94\x8c\t_unpickle\x94\x86\x94R\x94K\x03K\x01\x8c\x05numpy\x94\x8c\x05dtype\x94\x93\x94\x8c\x02b1\x94\x89\x88\x87\x94R\x94(K\x03\x8c\x01|\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94b\x87\x94}\x94(\x8c\x04data\x94\x8c\x16numpy._core.multiarray\x94\x8c\x0c_reconstruct\x94\x93\x94h\t\x8c\x07ndarray\x94\x93\x94K\x00\x85\x94C\x01b\x94\x87\x94R\x94(K\x01K\x03K\x01\x86\x94h\x0e\x89C\x03\x01\x01\x01\x94t\x94b\x8c\x13extended_properties\x94h\x03\x8c\x1aExtendedPropertyDictionary\x94\x93\x94}\x94(\x8c\x0eNI_ChannelName\x94\x8c\x08Dev1/ai0\x94\x8c\x12NI_UnitDescription\x94\x8c\x05Volts\x94u\x85\x94R\x94\x8c\x18copy_extended_properties\x94\x89\x8c\x06timing\x94h\x02h\x03\x8c\x06Timing\x94\x93\x94h\x06\x86\x94R\x94(h\x03\x8c\x12SampleIntervalMode\x94\x93\x94K\x01\x85\x94R\x94NN\x8c\x08datetime\x94\x8c\ttimedelta\x94\x93\x94K\x00K\x00M\xe8\x03\x87\x94R\x94Nt\x94}\x94\x86\x94R\x94u\x86\x94R\x94.",
1987+
DigitalWaveform(
1988+
data=np.array([1, 2, 3], _np_bool),
1989+
extended_properties={"NI_ChannelName": "Dev1/ai0", "NI_UnitDescription": "Volts"},
1990+
timing=Timing.create_with_regular_interval(dt.timedelta(milliseconds=1)),
1991+
),
1992+
),
1993+
],
1994+
)
1995+
def test___pickled_value___unpickle___is_compatible(
1996+
pickled_value: bytes, expected: DigitalWaveform[Any]
1997+
) -> None:
1998+
new_value = pickle.loads(pickled_value)
1999+
assert new_value == expected
2000+
2001+
19682002
def test___waveform_with_extended_properties___pickle_unpickle___valid_on_key_changed() -> None:
19692003
value = DigitalWaveform(
19702004
data=np.array([1, 2, 3], _np_bool),

0 commit comments

Comments
 (0)