Skip to content

Commit e18245d

Browse files
committed
Add module docstring and type hints
1 parent 5ec341c commit e18245d

File tree

1 file changed

+35
-29
lines changed

1 file changed

+35
-29
lines changed

tests/test_waveform_generator.py

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,63 @@
1-
#!/usr/bin/env python3
2-
# -*- coding: utf-8 -*-
3-
"""
4-
Created on Fri Oct 23 13:55:56 2020
5-
6-
@author: alexander
1+
"""Tests for PSL.waveform_generator.
2+
3+
When integration testing, connect:
4+
SQ1 -> LA1
5+
SQ2 -> LA2
6+
SQ3 -> LA3
7+
SQ4 -> LA4
8+
SI1 -> CH1
9+
SI2 -> CH2
710
"""
811
import time
912

1013
import numpy as np
11-
1214
import pytest
15+
from scipy.optimize import curve_fit
16+
from _pytest.logging import LogCaptureFixture
17+
1318
from PSL.logic_analyzer import LogicAnalyzer
1419
from PSL.oscilloscope import Oscilloscope
20+
from PSL.packet_handler import Handler
1521
from PSL.waveform_generator import PWMGenerator, WaveformGenerator
16-
from scipy.optimize import curve_fit
22+
1723

1824
MICROSECONDS = 1e-6
1925
RELTOL = 0.05
2026
GOOD_FIT = 0.99
2127

2228

23-
def r_squared(y, y_fit):
29+
def r_squared(y: np.ndarray, y_fit: np.ndarray) -> float:
2430
"""Calculate the coefficient of determination."""
2531
ss_res = np.sum((y - y_fit) ** 2) # Residual sum of squares.
2632
ss_tot = np.sum((y - y.mean()) ** 2) # Total sum of squares.
2733
return 1 - (ss_res / ss_tot)
2834

2935

3036
@pytest.fixture
31-
def pwm(handler):
37+
def pwm(handler: Handler) -> PWMGenerator:
3238
handler._logging = True
3339
return PWMGenerator(handler)
3440

3541

3642
@pytest.fixture
37-
def wave(handler):
43+
def wave(handler: Handler) -> WaveformGenerator:
3844
handler._logging = True
3945
return WaveformGenerator(handler)
4046

4147

4248
@pytest.fixture
43-
def la(handler):
49+
def la(handler: Handler) -> LogicAnalyzer:
4450
handler._logging = True
4551
return LogicAnalyzer(handler)
4652

4753

4854
@pytest.fixture
49-
def scope(handler):
55+
def scope(handler: Handler) -> Oscilloscope:
5056
handler._logging = True
5157
return Oscilloscope(handler)
5258

5359

54-
def test_sine_wave(wave, scope):
60+
def test_sine_wave(wave: WaveformGenerator, scope: Oscilloscope):
5561
frequency = 500
5662
wave.load_equation("SI1", "sine")
5763
wave.generate("SI1", frequency)
@@ -78,7 +84,7 @@ def expected_f(x, amplitude, frequency, phase):
7884
assert coeff_of_det >= GOOD_FIT
7985

8086

81-
def test_triangle_wave(wave, scope):
87+
def test_triangle_wave(wave: WaveformGenerator, scope: Oscilloscope):
8288
frequency = 2000
8389
wave.load_equation("SI1", "tria")
8490
wave.generate("SI1", frequency)
@@ -107,7 +113,7 @@ def expected_f(x, amplitude, frequency, phase):
107113
assert coeff_of_det >= GOOD_FIT
108114

109115

110-
def test_superposition(wave, scope):
116+
def test_superposition(wave: WaveformGenerator, scope: Oscilloscope):
111117
frequency = 1000
112118
amplitude1 = 2
113119
amplitude2 = 1
@@ -147,7 +153,7 @@ def expected_f(x, amplitude1, amplitude2, frequency, phase):
147153
assert coeff_of_det >= GOOD_FIT
148154

149155

150-
def test_sine_phase(wave, scope):
156+
def test_sine_phase(wave: WaveformGenerator, scope: Oscilloscope):
151157
frequency = 500
152158
phase = 90
153159
wave.load_equation("SI1", "sine")
@@ -168,27 +174,27 @@ def expected_f(x, amplitude, frequency, phase):
168174
assert phase2_est - phase1_est == pytest.approx(phase * np.pi / 180, rel=RELTOL)
169175

170176

171-
def test_low_frequency_warning(caplog, wave):
177+
def test_low_frequency_warning(caplog: LogCaptureFixture, wave: WaveformGenerator):
172178
wave.generate("SI1", 1)
173179
assert "AC coupling" in caplog.text
174180

175181

176-
def test_low_frequency_error(wave):
182+
def test_low_frequency_error(wave: WaveformGenerator):
177183
with pytest.raises(ValueError):
178184
wave.generate("SI1", 0.05)
179185

180186

181-
def test_high_frequency_warning(caplog, wave):
187+
def test_high_frequency_warning(caplog: LogCaptureFixture, wave: WaveformGenerator):
182188
wave.generate("SI1", 1e4)
183189
assert "Frequencies above"
184190

185191

186-
def test_dimension_mismatch(wave):
192+
def test_dimension_mismatch(wave: WaveformGenerator):
187193
with pytest.raises(ValueError):
188194
wave.generate("SI2", [500, 1000])
189195

190196

191-
def test_pwm(pwm, la):
197+
def test_pwm(pwm: PWMGenerator, la: LogicAnalyzer):
192198
frequency = 5e4
193199
duty_cycle = 0.4
194200
pwm.generate("SQ1", frequency, duty_cycle)
@@ -198,7 +204,7 @@ def test_pwm(pwm, la):
198204
assert la.measure_duty_cycle("LA1")[1] == pytest.approx(duty_cycle, rel=RELTOL)
199205

200206

201-
def test_pwm_phase(pwm, la):
207+
def test_pwm_phase(pwm: PWMGenerator, la: LogicAnalyzer):
202208
frequency = 1e4
203209
duty_cycle = 0.5
204210
phase = 0.25
@@ -212,14 +218,14 @@ def test_pwm_phase(pwm, la):
212218
assert interval * MICROSECONDS == pytest.approx(frequency ** -1 * phase, rel=RELTOL)
213219

214220

215-
def test_set_state(pwm, la):
221+
def test_set_state(pwm: PWMGenerator, la: LogicAnalyzer):
216222
states = [True, False, True, True]
217223
pwm.set_state(*states)
218224
time.sleep(0.1)
219225
assert list(la.get_states().values()) == states
220226

221227

222-
def test_unchanged_state(pwm, la):
228+
def test_unchanged_state(pwm: PWMGenerator, la: LogicAnalyzer):
223229
frequency = 2.5e3
224230
duty_cycle = 0.9
225231
pwm.generate(["SQ1", "SQ4"], frequency, duty_cycle)
@@ -234,25 +240,25 @@ def test_unchanged_state(pwm, la):
234240
assert la.measure_duty_cycle("LA4")[1] == pytest.approx(duty_cycle, rel=RELTOL)
235241

236242

237-
def test_map_reference_clock(pwm, la):
243+
def test_map_reference_clock(pwm: PWMGenerator, la: LogicAnalyzer):
238244
prescaler = 5
239245
pwm.map_reference_clock(["SQ3"], prescaler)
240246
assert la.measure_frequency("LA3") == pytest.approx(
241247
128e6 / (1 << prescaler), rel=RELTOL
242248
)
243249

244250

245-
def test_pwm_high_frequency_error(pwm):
251+
def test_pwm_high_frequency_error(pwm: PWMGenerator):
246252
with pytest.raises(ValueError):
247253
pwm.generate("SQ1", 2e7, 0.5)
248254

249255

250-
def test_pwm_get_frequency(pwm):
256+
def test_pwm_get_frequency(pwm: PWMGenerator):
251257
frequency = 1500
252258
pwm.generate("SQ2", frequency, 0.1)
253259
assert pwm.frequency == pytest.approx(frequency, rel=RELTOL)
254260

255261

256-
def test_pwm_set_negative_frequency(pwm):
262+
def test_pwm_set_negative_frequency(pwm: PWMGenerator):
257263
with pytest.raises(ValueError):
258264
pwm.generate("SQ1", -1, 0.5)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy