Skip to content

Commit 065ca88

Browse files
mikeprosserniMike Prosser
andauthored
Validate Waveform Signals in Tests (#894)
* configure all CHAN_FOR_ALL_LINES tasks to use MSB instead of LSB * fix digital output tests * _validate_waveform_signals() * more _validate_waveform_signals() * cleanup * revert line order for test fixtures and use _get_waveform_port_data() instead * update output tests * import nidaqmx.system * update task output tests * update to latest nitypes and remove all TODO: AB#3178052 * poetry.lock hash * Poetry 2.1.4 --------- Co-authored-by: Mike Prosser <[email protected]>
1 parent f0444fb commit 065ca88

9 files changed

+188
-170
lines changed

poetry.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ click = ">=8.0.0"
6363
distro = { version = ">=1.9.0", platform = "linux" }
6464
requests = ">=2.25.0"
6565
typing_extensions = { version = ">=4.0.0" }
66-
nitypes = {version=">=1.0.0"}
66+
nitypes = {version=">=1.1.0.dev1"}
6767

6868
[tool.poetry.group.codegen.dependencies]
6969
Mako = "^1.2"

tests/component/_digital_utils.py

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from nitypes.waveform.typing import AnyDigitalState, TDigitalState
1111

1212
import nidaqmx
13+
import nidaqmx.system
1314

1415
_D = TypeVar("_D", bound=numpy.generic)
1516

@@ -119,17 +120,17 @@ def _get_digital_port_data_sample_major(task: nidaqmx.Task, num_samples: int) ->
119120
return numpy.transpose(result).tolist()
120121

121122

122-
def _bool_array_to_int(bool_array: numpy.typing.NDArray[numpy.bool_]) -> int:
123+
def _bool_array_to_int_lsb(bool_array: numpy.typing.NDArray[numpy.bool_]) -> int:
123124
result = 0
124-
# Simulated data is little-endian
125+
# Interpret data as little-endian
125126
for bit in bool_array[::-1]:
126127
result = (result << 1) | int(bit)
127128
return result
128129

129130

130131
def _bool_array_to_int_msb(bool_array: numpy.typing.NDArray[numpy.bool_]) -> int:
131132
result = 0
132-
# Data from ports is big-endian (see AB#3178052)
133+
# Interpret data as big-endian
133134
for bit in bool_array:
134135
result = (result << 1) | int(bit)
135136
return result
@@ -144,10 +145,10 @@ def _int_to_bool_array(num_lines: int, input: int) -> numpy.typing.NDArray[numpy
144145

145146
def _get_waveform_data(waveform: DigitalWaveform[Any]) -> list[int]:
146147
assert isinstance(waveform, DigitalWaveform)
147-
return [_bool_array_to_int(sample) for sample in waveform.data]
148+
return [_bool_array_to_int_lsb(sample) for sample in waveform.data]
148149

149150

150-
def _get_waveform_data_msb(waveform: DigitalWaveform[Any]) -> list[int]:
151+
def _get_waveform_port_data(waveform: DigitalWaveform[Any]) -> list[int]:
151152
assert isinstance(waveform, DigitalWaveform)
152153
return [_bool_array_to_int_msb(sample) for sample in waveform.data]
153154

@@ -232,3 +233,20 @@ def _read_and_copy(
232233
) -> numpy.typing.NDArray[_D]:
233234
read_func(array)
234235
return array.copy()
236+
237+
238+
def _validate_waveform_signals(
239+
device: nidaqmx.system.device.Device,
240+
waveform: DigitalWaveform[Any],
241+
lines: list[int] | range, # signal index to line index mapping
242+
) -> None:
243+
lines_list = list(lines)
244+
signal_count = waveform.signal_count
245+
sample_count = waveform.sample_count
246+
assert signal_count == len(lines_list)
247+
for signal_index in range(signal_count):
248+
line_index = lines_list[signal_index]
249+
signal = waveform.signals[signal_index]
250+
assert signal.signal_index == signal_index
251+
assert signal.name == device.di_lines[line_index].name
252+
assert signal.data.tolist() == _get_expected_data_for_line(sample_count, line_index)

tests/component/stream_readers/test_digital_multi_channel_reader.py

Lines changed: 40 additions & 45 deletions
Large diffs are not rendered by default.

tests/component/stream_readers/test_digital_single_channel_reader.py

Lines changed: 52 additions & 27 deletions
Large diffs are not rendered by default.

tests/component/stream_writers/test_digital_multi_channel_writer.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
_get_digital_port_data_sample_major,
2525
_get_num_do_lines_in_task,
2626
_get_waveform_data,
27-
_get_waveform_data_msb,
27+
_get_waveform_port_data,
2828
_int_to_bool_array,
2929
_start_do_task,
3030
)
@@ -369,9 +369,9 @@ def test___digital_multi_channel_writer___write_waveforms_ports___outputs_match_
369369
actual_value = di_multi_channel_port_loopback_task.read()
370370
assert actual_value[0] != actual_value[1]
371371
assert actual_value == [
372-
_get_waveform_data_msb(waveforms[0])[-1],
373-
_get_waveform_data_msb(waveforms[1])[-1],
374-
] # TODO: AB#3178052 - change to _get_waveform_data()
372+
_get_waveform_port_data(waveforms[0])[-1],
373+
_get_waveform_port_data(waveforms[1])[-1],
374+
]
375375

376376

377377
def test___digital_multi_channel_writer___write_waveforms_port_and_lines___outputs_match_final_values(
@@ -395,9 +395,9 @@ def test___digital_multi_channel_writer___write_waveforms_port_and_lines___outpu
395395
assert samples_written == num_samples
396396
actual_value = di_multi_channel_port_and_lines_loopback_task.read()
397397
assert actual_value == [
398-
_get_waveform_data_msb(waveforms[0])[-1],
398+
_get_waveform_port_data(waveforms[0])[-1],
399399
_get_waveform_data(waveforms[1])[-1],
400-
] # TODO: AB#3178052 - change to _get_waveform_data()
400+
]
401401

402402

403403
def test___digital_multi_channel_writer___write_waveforms_with_non_contiguous_data___outputs_match_final_values(

tests/component/stream_writers/test_digital_single_channel_writer.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
_get_digital_data,
1818
_get_num_do_lines_in_task,
1919
_get_waveform_data,
20-
_get_waveform_data_msb,
20+
_get_waveform_port_data,
2121
_int_to_bool_array,
2222
)
2323

@@ -426,9 +426,7 @@ def test___digital_single_channel_writer___write_waveform_port_uint8___outputs_m
426426
actual_value = di_port1_loopback_task.read()
427427
assert samples_written == num_samples
428428
assert waveform.signal_count == num_lines
429-
assert (
430-
actual_value == _get_waveform_data_msb(waveform)[i - 1]
431-
) # TODO: AB#3178052 - change to _get_waveform_data()
429+
assert actual_value == _get_waveform_port_data(waveform)[i - 1]
432430

433431

434432
def test___digital_single_channel_writer___write_waveform_port_uint32___outputs_match_final_values(
@@ -450,6 +448,4 @@ def test___digital_single_channel_writer___write_waveform_port_uint32___outputs_
450448
actual_value = di_port0_loopback_task.read()
451449
assert samples_written == num_samples
452450
assert waveform.signal_count == num_lines
453-
assert (
454-
actual_value == _get_waveform_data_msb(waveform)[i - 1]
455-
) # TODO: AB#3178052 - change to _get_waveform_data()
451+
assert actual_value == _get_waveform_port_data(waveform)[i - 1]

0 commit comments

Comments
 (0)