Skip to content
Merged
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
3 changes: 2 additions & 1 deletion .github/workflows/run_unit_tests_oldest_deps.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ jobs:
- name: Display installed dependency versions
run: poetry run pip list
- name: Run unit tests and code coverage
run: poetry run pytest ./tests/unit -v --cov=nitypes --junitxml=test_results/nitypes-oldest-deps-${{ matrix.os }}-py${{ matrix.python-version }}.xml
# 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.
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"
- name: Upload test results
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
Expand Down
21 changes: 21 additions & 0 deletions tests/unit/bintime/test_datetime.py
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,27 @@ def test___time_value___pickle___references_public_modules() -> None:
assert b"nitypes.bintime._time_value" not in value_bytes


@pytest.mark.parametrize(
"pickled_value, expected",
[
# nitypes 1.0.0
(
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.",
DateTime(1903, 12, 31, 23, 59, 59, 123_456, 234_567_789, 345_567_890, dt.timezone.utc),
),
(
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.",
DateTime(2000, 1, 1, 0, 0, 0, 0, 0, 0, dt.timezone.utc),
),
],
)
def test___pickled_value___unpickle___is_compatible(
pickled_value: bytes, expected: DateTime
) -> None:
new_value = pickle.loads(pickled_value)
assert new_value == expected


@pytest.mark.parametrize(
"value, expected",
[
Expand Down
23 changes: 23 additions & 0 deletions tests/unit/bintime/test_datetime_array.py
Original file line number Diff line number Diff line change
Expand Up @@ -1322,6 +1322,29 @@ def test___datetime_array___pickle___references_public_modules() -> None:
assert b"nitypes.bintime._datetime_array" not in pickled


@pytest.mark.parametrize(
"pickled_value, expected",
[
# nitypes 1.0.0
(
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.",
DateTimeArray(
[
DateTime(2000, 1, 1, tzinfo=dt.timezone.utc),
DateTime(1990, 1, 1, tzinfo=dt.timezone.utc),
DateTime(2025, 1, 1, tzinfo=dt.timezone.utc),
]
),
),
],
)
def test___pickled_value___unpickle___is_compatible(
pickled_value: bytes, expected: DateTimeArray
) -> None:
new_value = pickle.loads(pickled_value)
assert new_value == expected


@pytest.mark.parametrize(
"value",
(
Expand Down
21 changes: 21 additions & 0 deletions tests/unit/bintime/test_timedelta.py
Original file line number Diff line number Diff line change
Expand Up @@ -1200,6 +1200,27 @@ def test___timedelta___pickle___references_public_modules() -> None:
assert b"nitypes.bintime._timedelta" not in value_bytes


@pytest.mark.parametrize(
"pickled_value, expected",
[
# nitypes 1.0.0
(
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.",
TimeDelta.from_ticks((1 << 124) + (2 << 64) + 3),
),
(
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.",
TimeDelta.from_ticks((-1 << 124) + (-2 << 64) + -3),
),
],
)
def test___pickled_value___unpickle___is_compatible(
pickled_value: bytes, expected: TimeDelta
) -> None:
new_value = pickle.loads(pickled_value)
assert new_value == expected


@pytest.mark.parametrize(
"value, expected",
[
Expand Down
20 changes: 18 additions & 2 deletions tests/unit/bintime/test_timedelta_array.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@
import pytest
from typing_extensions import assert_type

from nitypes.bintime import TimeDelta
from nitypes.bintime import TimeDeltaArray
from nitypes.bintime import TimeDelta, TimeDeltaArray


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


@pytest.mark.parametrize(
"pickled_value, expected",
[
# nitypes 1.0.0
(
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.",
TimeDeltaArray([TimeDelta(20.26), TimeDelta(-1), TimeDelta(500)]),
),
],
)
def test___pickled_value___unpickle___is_compatible(
pickled_value: bytes, expected: TimeDeltaArray
) -> None:
new_value = pickle.loads(pickled_value)
assert new_value == expected


@pytest.mark.parametrize(
"value",
(
Expand Down
17 changes: 17 additions & 0 deletions tests/unit/scalar/test_scalar.py
Original file line number Diff line number Diff line change
Expand Up @@ -302,3 +302,20 @@ def test___scalar___pickle___references_public_modules() -> None:

assert b"nitypes.scalar" in value_bytes
assert b"nitypes.scalar._scalar" not in value_bytes


@pytest.mark.parametrize(
"pickled_value, expected",
[
# nitypes 1.0.0
(
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.",
Scalar(20.0, "watts"),
),
],
)
def test___pickled_value___unpickle___is_compatible(
pickled_value: bytes, expected: Scalar[Any]
) -> None:
new_value = pickle.loads(pickled_value)
assert new_value == expected
17 changes: 17 additions & 0 deletions tests/unit/vector/test_vector.py
Original file line number Diff line number Diff line change
Expand Up @@ -417,3 +417,20 @@ def test___vector___pickle___references_public_modules() -> None:

assert b"nitypes.vector" in value_bytes
assert b"nitypes.vector._vector" not in value_bytes


@pytest.mark.parametrize(
"pickled_value, expected",
[
# nitypes 1.0.0
(
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.",
Vector([20.0, 20.1], "watts"),
),
],
)
def test___pickled_value___unpickle___is_compatible(
pickled_value: bytes, expected: Vector[Any]
) -> None:
new_value = pickle.loads(pickled_value)
assert new_value == expected
22 changes: 22 additions & 0 deletions tests/unit/waveform/test_analog_waveform.py
Original file line number Diff line number Diff line change
Expand Up @@ -2003,3 +2003,25 @@ def test___waveform___pickle___references_public_modules() -> None:
assert b"nitypes.waveform._numeric" not in value_bytes
assert b"nitypes.waveform._timing" not in value_bytes
assert b"nitypes.waveform._scaling" not in value_bytes


@pytest.mark.parametrize(
"pickled_value, expected",
[
# nitypes 1.0.0
(
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.",
AnalogWaveform(
raw_data=np.array([1, 2, 3], np.float64),
extended_properties={"NI_ChannelName": "Dev1/ai0", "NI_UnitDescription": "Volts"},
timing=Timing.create_with_regular_interval(dt.timedelta(milliseconds=1)),
scale_mode=LinearScaleMode(2.0, 1.0),
),
),
],
)
def test___pickled_value___unpickle___is_compatible(
pickled_value: bytes, expected: AnalogWaveform[Any]
) -> None:
new_value = pickle.loads(pickled_value)
assert new_value == expected
22 changes: 22 additions & 0 deletions tests/unit/waveform/test_complex_waveform.py
Original file line number Diff line number Diff line change
Expand Up @@ -649,3 +649,25 @@ def test___waveform___pickle___references_public_modules() -> None:
assert b"nitypes.waveform._numeric" not in value_bytes
assert b"nitypes.waveform._timing" not in value_bytes
assert b"nitypes.waveform._scaling" not in value_bytes


@pytest.mark.parametrize(
"pickled_value, expected",
[
# nitypes 1.0.0
(
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.",
ComplexWaveform(
raw_data=np.array([1, 2, 3], np.complex128),
extended_properties={"NI_ChannelName": "Dev1/ai0", "NI_UnitDescription": "Volts"},
timing=Timing.create_with_regular_interval(dt.timedelta(milliseconds=1)),
scale_mode=LinearScaleMode(2.0, 1.0),
),
),
],
)
def test___pickled_value___unpickle___is_compatible(
pickled_value: bytes, expected: ComplexWaveform[Any]
) -> None:
new_value = pickle.loads(pickled_value)
assert new_value == expected
34 changes: 34 additions & 0 deletions tests/unit/waveform/test_digital_waveform.py
Original file line number Diff line number Diff line change
Expand Up @@ -1965,6 +1965,40 @@ def test___waveform___pickle___references_public_modules() -> None:
assert b"nitypes.waveform._timing" not in value_bytes


@pytest.mark.parametrize(
"pickled_value, expected",
[
# nitypes 1.0.0
pytest.param(
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.",
DigitalWaveform(
data=np.array([1, 2, 3], _np_bool),
extended_properties={"NI_ChannelName": "Dev1/ai0", "NI_UnitDescription": "Volts"},
timing=Timing.create_with_regular_interval(dt.timedelta(milliseconds=1)),
),
marks=pytest.mark.xfail(
raises=AttributeError,
reason="https://github.com/ni/nitypes-python/issues/234 - ExtendedPropertyDictionary._on_key_changed breaks pickle compatibility",
),
),
# nitypes 1.0.1
(
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.",
DigitalWaveform(
data=np.array([1, 2, 3], _np_bool),
extended_properties={"NI_ChannelName": "Dev1/ai0", "NI_UnitDescription": "Volts"},
timing=Timing.create_with_regular_interval(dt.timedelta(milliseconds=1)),
),
),
],
)
def test___pickled_value___unpickle___is_compatible(
pickled_value: bytes, expected: DigitalWaveform[Any]
) -> None:
new_value = pickle.loads(pickled_value)
assert new_value == expected


def test___waveform_with_extended_properties___pickle_unpickle___valid_on_key_changed() -> None:
value = DigitalWaveform(
data=np.array([1, 2, 3], _np_bool),
Expand Down
30 changes: 30 additions & 0 deletions tests/unit/waveform/test_digital_waveform_signal.py
Original file line number Diff line number Diff line change
Expand Up @@ -367,3 +367,33 @@ def test___waveform___pickle___references_public_modules() -> None:

assert b"nitypes.waveform" in value_bytes
assert b"nitypes.waveform._digital" not in value_bytes


@pytest.mark.parametrize(
"pickled_value, expected",
[
# nitypes 1.0.0
pytest.param(
b"\x80\x04\x95\xfa\x01\x00\x00\x00\x00\x00\x00\x8c\x10nitypes.waveform\x94\x8c\x15DigitalWaveformSignal\x94\x93\x94\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94h\x00\x8c\x0fDigitalWaveform\x94\x93\x94\x8c\t_unpickle\x94\x86\x94R\x94K\x03K\x02\x8c\x05numpy\x94\x8c\x05dtype\x94\x93\x94\x8c\x02u1\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\x0b\x8c\x07ndarray\x94\x93\x94K\x00\x85\x94C\x01b\x94\x87\x94R\x94(K\x01K\x03K\x02\x86\x94h\x10\x89C\x06\x00\x00\x00\x00\x00\x00\x94t\x94b\x8c\x13extended_properties\x94h\x00\x8c\x1aExtendedPropertyDictionary\x94\x93\x94)\x81\x94N}\x94\x8c\x0b_properties\x94}\x94\x8c\x0cNI_LineNames\x94\x8c\x18port0/line1, port0/line0\x94ss\x86\x94b\x8c\x18copy_extended_properties\x94\x89\x8c\x06timing\x94h\x05h\x00\x8c\x06Timing\x94\x93\x94h\x08\x86\x94R\x94(h\x00\x8c\x12SampleIntervalMode\x94\x93\x94K\x00\x85\x94R\x94NNNNt\x94}\x94\x86\x94R\x94u\x86\x94R\x94K\x01\x86\x94R\x94.",
DigitalWaveform(
3, 2, extended_properties={"NI_LineNames": "port0/line1, port0/line0"}
).signals[1],
marks=pytest.mark.xfail(
raises=AttributeError,
reason="https://github.com/ni/nitypes-python/issues/234 - ExtendedPropertyDictionary._on_key_changed breaks pickle compatibility",
),
),
# nitypes 1.0.1
(
b"\x80\x04\x95\xe8\x01\x00\x00\x00\x00\x00\x00\x8c\x10nitypes.waveform\x94\x8c\x15DigitalWaveformSignal\x94\x93\x94\x8c\x08builtins\x94\x8c\x07getattr\x94\x93\x94h\x00\x8c\x0fDigitalWaveform\x94\x93\x94\x8c\t_unpickle\x94\x86\x94R\x94K\x03K\x02\x8c\x05numpy\x94\x8c\x05dtype\x94\x93\x94\x8c\x02u1\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\x0b\x8c\x07ndarray\x94\x93\x94K\x00\x85\x94C\x01b\x94\x87\x94R\x94(K\x01K\x03K\x02\x86\x94h\x10\x89C\x06\x00\x00\x00\x00\x00\x00\x94t\x94b\x8c\x13extended_properties\x94h\x00\x8c\x1aExtendedPropertyDictionary\x94\x93\x94}\x94\x8c\x0cNI_LineNames\x94\x8c\x18port0/line1, port0/line0\x94s\x85\x94R\x94\x8c\x18copy_extended_properties\x94\x89\x8c\x06timing\x94h\x05h\x00\x8c\x06Timing\x94\x93\x94h\x08\x86\x94R\x94(h\x00\x8c\x12SampleIntervalMode\x94\x93\x94K\x00\x85\x94R\x94NNNNt\x94}\x94\x86\x94R\x94u\x86\x94R\x94K\x01K\x00\x87\x94R\x94.",
DigitalWaveform(
3, 2, extended_properties={"NI_LineNames": "port0/line1, port0/line0"}
).signals[1],
),
],
)
def test___pickled_value___unpickle___is_compatible(
pickled_value: bytes, expected: DigitalWaveformSignal[Any]
) -> None:
new_value = pickle.loads(pickled_value)
assert new_value == expected
Loading