1919
2020instruments = ['FakeDevice1' , 'FakeDevice2' ]
2121# TODO(sbethur): Use `get_channel_names` when #1402 is fixed
22- test_channels = 'FakeDevice2/0,FakeDevice1/1'
22+ test_channels_1 = 'FakeDevice2/0,FakeDevice1/1'
23+ test_channels_1_expanded = test_channels_1
24+ # TODO(jfitzger): Use the commented values, once #1770 is fixed
25+ test_channels_2 = 'FakeDevice2/0' # 'FakeDevice2/0:1'
26+ test_channels_2_expanded = 'FakeDevice2/0' # 'FakeDevice2/0,FakeDevice2/1'
2327
2428
2529# There are system tests below that need either a PXI-5124 or a PXI-5142 instead of the PXIe-5164 we use everywhere else
3741daqmx_sim_5142_lock = fasteners .InterProcessLock (daqmx_sim_5142_lock_file )
3842
3943
44+ def check_fetched_data (
45+ data , # either waveforms or measurement_stats
46+ test_channels_expanded ,
47+ test_record_length ,
48+ test_num_records_to_fetch ,
49+ test_starting_record_number = 0
50+ ):
51+ test_num_channels = len (test_channels_expanded .split (',' ))
52+
53+ # Ordering: rec 0: ch 0, rec 0: ch 1, rec 1: ch 0, rec 1: ch 1, etc.
54+ expected_channels = test_channels_expanded .split (',' ) * test_num_records_to_fetch
55+ expected_records = []
56+ for i in range (test_starting_record_number , test_starting_record_number + test_num_records_to_fetch ):
57+ expected_records += [i ] * test_num_channels
58+
59+ assert len (data ) == test_num_channels * test_num_records_to_fetch
60+ for i in range (len (data )):
61+ if isinstance (data [i ], niscope .WaveformInfo ):
62+ assert len (data [i ].samples ) == test_record_length
63+ elif isinstance (data [i ], niscope .MeasurementStats ):
64+ assert data [i ].result == 0.0
65+ else :
66+ raise TypeError (f"data is unsupported type { type (data [i ])} " )
67+ assert data [i ].channel == expected_channels [i ]
68+ assert data [i ].record == expected_records [i ]
69+
70+
4071class SystemTests :
4172 @pytest .fixture (scope = 'function' )
4273 def single_instrument_session (self , session_creation_kwargs ):
@@ -72,22 +103,32 @@ def test_vi_string_attribute(self, multi_instrument_session):
72103 assert trigger_source == multi_instrument_session .acq_arm_source
73104
74105 # Basic usability tests
75- def test_read (self , multi_instrument_session ):
106+ @pytest .mark .parametrize (
107+ "test_channels,test_channels_expanded" ,
108+ [
109+ (test_channels_1 , test_channels_1_expanded ),
110+ (test_channels_2 , test_channels_2_expanded ),
111+ ],
112+ )
113+ def test_read (self , multi_instrument_session , test_channels , test_channels_expanded ):
76114 test_voltage = 1.0
77115 test_record_length = 2000
78- test_num_channels = 2
79116 test_num_records = 3
80117 multi_instrument_session .configure_vertical (test_voltage , niscope .VerticalCoupling .AC )
81118 multi_instrument_session .configure_horizontal_timing (50000000 , test_record_length , 50.0 , test_num_records , True )
82119 waveforms = multi_instrument_session .channels [test_channels ].read (num_samples = test_record_length , num_records = test_num_records )
83- assert len (waveforms ) == test_num_channels * test_num_records
84- for i in range (len (waveforms )):
85- assert len (waveforms [i ].samples ) == test_record_length
120+ check_fetched_data (waveforms , test_channels_expanded , test_record_length , test_num_records )
86121
87- def test_fetch (self , multi_instrument_session ):
122+ @pytest .mark .parametrize (
123+ "test_channels,test_channels_expanded" ,
124+ [
125+ (test_channels_1 , test_channels_1_expanded ),
126+ (test_channels_2 , test_channels_2_expanded ),
127+ ],
128+ )
129+ def test_fetch (self , multi_instrument_session , test_channels , test_channels_expanded ):
88130 test_voltage = 1.0
89131 test_record_length = 2000
90- test_num_channels = 2
91132 test_starting_record_number = 2
92133 test_num_records_to_acquire = 5
93134 test_num_records_to_fetch = test_num_records_to_acquire - test_starting_record_number
@@ -98,13 +139,13 @@ def test_fetch(self, multi_instrument_session):
98139 num_samples = test_record_length ,
99140 record_number = test_starting_record_number ,
100141 num_records = test_num_records_to_fetch )
101- assert len ( waveforms ) == test_num_channels * test_num_records_to_fetch
102- expected_channels = test_channels . split ( ',' ) * test_num_records_to_fetch
103- expected_records = [ 2 , 2 , 3 , 3 , 4 , 4 ]
104- for i in range ( len ( waveforms )):
105- assert len ( waveforms [ i ]. samples ) == test_record_length
106- assert waveforms [ i ]. channel == expected_channels [ i ]
107- assert waveforms [ i ]. record == expected_records [ i ]
142+ check_fetched_data (
143+ waveforms ,
144+ test_channels_expanded ,
145+ test_record_length ,
146+ test_num_records_to_fetch ,
147+ test_starting_record_number ,
148+ )
108149
109150 def test_fetch_defaults (self , multi_instrument_session ):
110151 test_voltage = 1.0
@@ -113,7 +154,7 @@ def test_fetch_defaults(self, multi_instrument_session):
113154 multi_instrument_session .configure_vertical (test_voltage , niscope .VerticalCoupling .AC )
114155 multi_instrument_session .configure_horizontal_timing (50000000 , test_record_length , 50.0 , 1 , True )
115156 with multi_instrument_session .initiate ():
116- waveforms = multi_instrument_session .channels [test_channels ].fetch ()
157+ waveforms = multi_instrument_session .channels [test_channels_1 ].fetch ()
117158 assert len (waveforms ) == test_num_channels
118159 for i in range (len (waveforms )):
119160 assert len (waveforms [i ].samples ) == test_record_length
@@ -123,10 +164,22 @@ def measurement_wfm_length(self, request):
123164 MeasWfmLength = collections .namedtuple ('MeasurementWaveformLength' , ['passed_in' , 'expected' ])
124165 return MeasWfmLength (passed_in = request .param [0 ], expected = request .param [1 ])
125166
126- def test_fetch_array_measurement (self , multi_instrument_session , measurement_wfm_length ):
167+ @pytest .mark .parametrize (
168+ "test_channels,test_channels_expanded" ,
169+ [
170+ (test_channels_1 , test_channels_1_expanded ),
171+ (test_channels_2 , test_channels_2_expanded ),
172+ ],
173+ )
174+ def test_fetch_array_measurement (
175+ self ,
176+ multi_instrument_session ,
177+ measurement_wfm_length ,
178+ test_channels ,
179+ test_channels_expanded ,
180+ ):
127181 test_voltage = 1.0
128182 test_record_length = 1000
129- test_num_channels = 2
130183 test_meas_wfm_length = measurement_wfm_length .passed_in
131184 test_array_meas_function = niscope .ArrayMeasurement .ARRAY_GAIN
132185 test_starting_record_number = 2
@@ -146,13 +199,13 @@ def test_fetch_array_measurement(self, multi_instrument_session, measurement_wfm
146199 meas_num_samples = 2000 ,
147200 timeout = hightime .timedelta (seconds = 4 ))
148201
149- assert len ( waveforms ) == test_num_channels * test_num_records_to_fetch
150- expected_channels = test_channels . split ( ',' ) * test_num_records_to_fetch
151- expected_records = [ 2 , 2 , 3 , 3 , 4 , 4 ]
152- for i in range ( len ( waveforms )):
153- assert len ( waveforms [ i ]. samples ) == measurement_wfm_length . expected
154- assert waveforms [ i ]. channel == expected_channels [ i ]
155- assert waveforms [ i ]. record == expected_records [ i ]
202+ check_fetched_data (
203+ waveforms ,
204+ test_channels_expanded ,
205+ measurement_wfm_length . expected ,
206+ test_num_records_to_fetch ,
207+ test_starting_record_number ,
208+ )
156209
157210 def test_fetch_array_measurement_defaults (self , multi_instrument_session ):
158211 test_voltage = 1.0
@@ -165,18 +218,28 @@ def test_fetch_array_measurement_defaults(self, multi_instrument_session):
165218 multi_instrument_session .configure_horizontal_timing (50000000 , test_record_length , 50.0 , test_num_records , True )
166219
167220 with multi_instrument_session .initiate ():
168- waveforms = multi_instrument_session .channels [test_channels ].fetch_array_measurement (
221+ waveforms = multi_instrument_session .channels [test_channels_1 ].fetch_array_measurement (
169222 array_meas_function = test_array_meas_function )
170223
171224 assert len (waveforms ) == test_num_channels * test_num_records
172225 for i in range (len (waveforms )):
173226 assert len (waveforms [i ].samples ) == test_record_length
174227
175- def test_fetch_measurement_stats (self , multi_instrument_session ):
228+ @pytest .mark .parametrize (
229+ "test_channels,test_channels_expanded" ,
230+ [
231+ (test_channels_1 , test_channels_1_expanded ),
232+ (test_channels_2 , test_channels_2_expanded ),
233+ ],
234+ )
235+ def test_fetch_measurement_stats (
236+ self ,
237+ multi_instrument_session ,
238+ test_channels ,
239+ test_channels_expanded ,
240+ ):
176241 test_voltage = 1.0
177242 test_record_length = 1000
178- test_num_channels = 2
179- test_num_records = 3
180243 test_starting_record_number = 2
181244 test_num_records_to_acquire = 5
182245 test_num_records_to_fetch = test_num_records_to_acquire - test_starting_record_number
@@ -191,13 +254,13 @@ def test_fetch_measurement_stats(self, multi_instrument_session):
191254 num_records = test_num_records_to_fetch ,
192255 timeout = hightime .timedelta (seconds = 4 ))
193256
194- assert len ( measurement_stats ) == test_num_channels * test_num_records
195- expected_channels = test_channels . split ( ',' ) * test_num_records_to_fetch
196- expected_records = [ 2 , 2 , 3 , 3 , 4 , 4 ]
197- for i in range ( len ( measurement_stats )):
198- assert measurement_stats [ i ]. result == 0.0
199- assert measurement_stats [ i ]. channel == expected_channels [ i ]
200- assert measurement_stats [ i ]. record == expected_records [ i ]
257+ check_fetched_data (
258+ measurement_stats ,
259+ test_channels_expanded ,
260+ None , # pass None for test_record_length, because we shouldn't need it
261+ test_num_records_to_fetch ,
262+ test_starting_record_number
263+ )
201264
202265 def test_fetch_measurement_stats_defaults (self , multi_instrument_session ):
203266 test_voltage = 1.0
@@ -207,7 +270,7 @@ def test_fetch_measurement_stats_defaults(self, multi_instrument_session):
207270 multi_instrument_session .configure_vertical (test_voltage , niscope .VerticalCoupling .AC )
208271 multi_instrument_session .configure_horizontal_timing (50000000 , test_record_length , 50.0 , test_num_records , True )
209272 with multi_instrument_session .initiate ():
210- measurement_stats = multi_instrument_session .channels [test_channels ].fetch_measurement_stats (niscope .enums .ScalarMeasurement .NO_MEASUREMENT )
273+ measurement_stats = multi_instrument_session .channels [test_channels_1 ].fetch_measurement_stats (niscope .enums .ScalarMeasurement .NO_MEASUREMENT )
211274
212275 assert len (measurement_stats ) == test_num_channels * test_num_records
213276 for stat in measurement_stats :
@@ -220,10 +283,10 @@ def test_clear_waveform_measurement_stats(self, multi_instrument_session):
220283 multi_instrument_session .configure_vertical (test_voltage , niscope .VerticalCoupling .AC )
221284 multi_instrument_session .configure_horizontal_timing (50000000 , test_record_length , 50.0 , test_num_records , True )
222285 with multi_instrument_session .initiate ():
223- uncleared_stats = multi_instrument_session .channels [test_channels ].fetch_measurement_stats (niscope .enums .ScalarMeasurement .FREQUENCY )
224- uncleared_stats_2 = multi_instrument_session .channels [test_channels ].fetch_measurement_stats (niscope .enums .ScalarMeasurement .FREQUENCY )
225- multi_instrument_session .channels [test_channels ].clear_waveform_measurement_stats (niscope .enums .ClearableMeasurement .FREQUENCY )
226- cleared_stats = multi_instrument_session .channels [test_channels ].fetch_measurement_stats (niscope .enums .ScalarMeasurement .FREQUENCY )
286+ uncleared_stats = multi_instrument_session .channels [test_channels_1 ].fetch_measurement_stats (niscope .enums .ScalarMeasurement .FREQUENCY )
287+ uncleared_stats_2 = multi_instrument_session .channels [test_channels_1 ].fetch_measurement_stats (niscope .enums .ScalarMeasurement .FREQUENCY )
288+ multi_instrument_session .channels [test_channels_1 ].clear_waveform_measurement_stats (niscope .enums .ClearableMeasurement .FREQUENCY )
289+ cleared_stats = multi_instrument_session .channels [test_channels_1 ].fetch_measurement_stats (niscope .enums .ScalarMeasurement .FREQUENCY )
227290
228291 # The principle here is using consistent behavior (i.e. if stats are fetched twice on a single record/channel measurement in a row, it will always be the same)
229292 # to demonstrate that clearing the stats does in fact cause a measurable change.
@@ -244,9 +307,9 @@ def test_waveform_processing(self, multi_instrument_session):
244307 multi_instrument_session .configure_horizontal_timing (50000000 , test_record_length , 50.0 , test_num_records , True )
245308 with multi_instrument_session .initiate ():
246309 multi_instrument_session .add_waveform_processing (niscope .enums .ArrayMeasurement .DERIVATIVE )
247- processed_waveforms = multi_instrument_session .channels [test_channels ].fetch_measurement_stats (niscope .enums .ScalarMeasurement .MID_REF_VOLTS )
310+ processed_waveforms = multi_instrument_session .channels [test_channels_1 ].fetch_measurement_stats (niscope .enums .ScalarMeasurement .MID_REF_VOLTS )
248311 multi_instrument_session .clear_waveform_processing ()
249- unprocessed_waveforms = multi_instrument_session .channels [test_channels ].fetch_measurement_stats (niscope .enums .ScalarMeasurement .MID_REF_VOLTS )
312+ unprocessed_waveforms = multi_instrument_session .channels [test_channels_1 ].fetch_measurement_stats (niscope .enums .ScalarMeasurement .MID_REF_VOLTS )
250313
251314 assert len (processed_waveforms ) == test_num_channels * test_num_records
252315 assert len (unprocessed_waveforms ) == test_num_channels * test_num_records
@@ -264,7 +327,7 @@ def test_measurement_stats_str(self, multi_instrument_session):
264327 multi_instrument_session .configure_vertical (test_voltage , niscope .VerticalCoupling .AC )
265328 multi_instrument_session .configure_horizontal_timing (50000000 , test_record_length , 50.0 , test_num_records , True )
266329 with multi_instrument_session .initiate ():
267- measurement_stat = multi_instrument_session .channels [test_channels ].fetch_measurement_stats (niscope .enums .ScalarMeasurement .NO_MEASUREMENT )
330+ measurement_stat = multi_instrument_session .channels [test_channels_1 ].fetch_measurement_stats (niscope .enums .ScalarMeasurement .NO_MEASUREMENT )
268331
269332 assert isinstance (measurement_stat [0 ].__str__ (), str )
270333 assert isinstance (measurement_stat [0 ].__repr__ (), str )
@@ -457,18 +520,29 @@ def session_creation_kwargs(self):
457520
458521 # not supported by grpc due to numpy usage
459522 @pytest .mark .parametrize (
460- "fetch_waveform_type,type_min_value" ,
523+ "fetch_waveform_type,type_min_value,test_channels,test_channels_expanded " ,
461524 [
462- (numpy .int8 , numpy .iinfo (numpy .int8 ).min ),
463- (numpy .int16 , numpy .iinfo (numpy .int16 ).min ),
464- (numpy .int32 , numpy .iinfo (numpy .int32 ).min ),
465- (numpy .float64 , numpy .finfo (numpy .float64 ).min ),
525+ (numpy .int8 , numpy .iinfo (numpy .int8 ).min , test_channels_1 , test_channels_1_expanded ),
526+ (numpy .int16 , numpy .iinfo (numpy .int16 ).min , test_channels_1 , test_channels_1_expanded ),
527+ (numpy .int32 , numpy .iinfo (numpy .int32 ).min , test_channels_1 , test_channels_1_expanded ),
528+ (numpy .float64 , numpy .finfo (numpy .float64 ).min , test_channels_1 , test_channels_1_expanded ),
529+ (numpy .int8 , numpy .iinfo (numpy .int8 ).min , test_channels_2 , test_channels_2_expanded ),
530+ (numpy .int16 , numpy .iinfo (numpy .int16 ).min , test_channels_2 , test_channels_2_expanded ),
531+ (numpy .int32 , numpy .iinfo (numpy .int32 ).min , test_channels_2 , test_channels_2_expanded ),
532+ (numpy .float64 , numpy .finfo (numpy .float64 ).min , test_channels_2 , test_channels_2_expanded ),
466533 ],
467534 )
468- def test_fetch_into (self , multi_instrument_session , fetch_waveform_type , type_min_value ):
535+ def test_fetch_into (
536+ self ,
537+ multi_instrument_session ,
538+ fetch_waveform_type ,
539+ type_min_value ,
540+ test_channels ,
541+ test_channels_expanded ,
542+ ):
469543 test_voltage = 1.0
470544 test_record_length = 2000
471- test_num_channels = 2
545+ test_num_channels = len ( test_channels_expanded . split ( ',' ))
472546 test_starting_record_number = 2
473547 test_num_records_to_acquire = 5
474548 test_num_records_to_fetch = test_num_records_to_acquire - test_starting_record_number
@@ -486,17 +560,18 @@ def test_fetch_into(self, multi_instrument_session, fetch_waveform_type, type_mi
486560
487561 for index , sample in enumerate (waveform ):
488562 assert sample != init_waveform [index ]
489- assert len (waveforms ) == test_num_channels * test_num_records_to_fetch
490563
491- expected_channels = test_channels .split (',' ) * test_num_records_to_fetch
492- expected_records = [2 , 2 , 3 , 3 , 4 , 4 ]
564+ check_fetched_data (
565+ waveforms ,
566+ test_channels_expanded ,
567+ test_record_length ,
568+ test_num_records_to_fetch ,
569+ test_starting_record_number ,
570+ )
493571 for i in range (len (waveforms )):
494572 record_wfm = waveforms [i ].samples
495- assert len (record_wfm ) == test_record_length
496573 for j in range (len (record_wfm )):
497574 assert record_wfm [j ] == waveform [i * test_record_length + j ]
498- assert waveforms [i ].channel == expected_channels [i ]
499- assert waveforms [i ].record == expected_records [i ]
500575
501576 def test_configure_ref_levels (self , single_instrument_session ):
502577 single_instrument_session ._configure_ref_levels ()
0 commit comments