Skip to content

Commit 7d853da

Browse files
committed
add unit tests for consistent systems repr() processing
1 parent 3397e5b commit 7d853da

File tree

1 file changed

+52
-1
lines changed

1 file changed

+52
-1
lines changed

control/tests/iosys_test.py

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import scipy
1818

1919
import control as ct
20-
20+
from control.tests.conftest import slycotonly
2121

2222
class TestIOSys:
2323

@@ -2284,3 +2284,54 @@ def test_signal_indexing():
22842284
with pytest.raises(IndexError, match=r"signal name\(s\) not valid"):
22852285
resp.outputs['y[0]', 'u[0]']
22862286

2287+
2288+
@slycotonly
2289+
@pytest.mark.parametrize("fcn, spec, expected, missing", [
2290+
(ct.ss, {}, "\nstates=4, outputs=3, inputs=2", r"dt|name"),
2291+
(ct.tf, {}, "\noutputs=3, inputs=2", r"dt|name|states"),
2292+
(ct.frd, {}, "\noutputs=3, inputs=2", r"dt|states|name"),
2293+
(ct.ss, {'dt': 0.1}, ".*\ndt=0.1,\nstates=4, outputs=3, inputs=2", r"name"),
2294+
(ct.tf, {'dt': 0.1}, ".*\ndt=0.1,\noutputs=3, inputs=2", r"name|states"),
2295+
(ct.frd, {'dt': 0.1},
2296+
".*\ndt=0.1,\noutputs=3, inputs=2", r"name|states"),
2297+
(ct.ss, {'dt': True}, "\ndt=True,\nstates=4, outputs=3, inputs=2", r"name"),
2298+
(ct.ss, {'dt': None}, "\ndt=None,\nstates=4, outputs=3, inputs=2", r"name"),
2299+
(ct.ss, {'dt': 0}, "\nstates=4, outputs=3, inputs=2", r"dt|name"),
2300+
(ct.ss, {'name': 'mysys'}, "\nname='mysys',", r"dt"),
2301+
(ct.tf, {'name': 'mysys'}, "\nname='mysys',", r"dt|states"),
2302+
(ct.frd, {'name': 'mysys'}, "\nname='mysys',", r"dt|states"),
2303+
(ct.ss, {'inputs': ['u1']},
2304+
r"[\n]states=4, outputs=3, inputs=\['u1'\]", r"dt|name"),
2305+
(ct.tf, {'inputs': ['u1']},
2306+
r"[\n]outputs=3, inputs=\['u1'\]", r"dt|name"),
2307+
(ct.frd, {'inputs': ['u1'], 'name': 'sampled'},
2308+
r"[\n]name='sampled', outputs=3, inputs=\['u1'\]", r"dt"),
2309+
(ct.ss, {'outputs': ['y1']},
2310+
r"[\n]states=4, outputs=\['y1'\], inputs=2", r"dt|name"),
2311+
(ct.ss, {'name': 'mysys', 'inputs': ['u1']},
2312+
r"[\n]name='mysys', states=4, outputs=3, inputs=\['u1'\]", r"dt"),
2313+
(ct.ss, {'name': 'mysys', 'states': [
2314+
'long_state_1', 'long_state_2', 'long_state_3']},
2315+
r"[\n]name='.*', states=\[.*\],[\n]outputs=3, inputs=2\)", r"dt"),
2316+
])
2317+
def test_system_repr(fcn, spec, expected, missing):
2318+
spec['outputs'] = spec.get('outputs', 3)
2319+
spec['inputs'] = spec.get('inputs', 2)
2320+
if fcn is ct.ss:
2321+
spec['states'] = spec.get('states', 4)
2322+
2323+
sys = ct.rss(**spec)
2324+
match fcn:
2325+
case ct.frd:
2326+
omega = np.logspace(-1, 1)
2327+
sys = fcn(sys, omega, name=spec.get('name'))
2328+
case ct.tf:
2329+
sys = fcn(sys, name=spec.get('name'))
2330+
2331+
assert sys.shape == (sys.noutputs, sys.ninputs)
2332+
2333+
out = repr(sys)
2334+
assert re.search(expected, out) != None
2335+
2336+
if missing is not None:
2337+
assert re.search(missing, out) is None

0 commit comments

Comments
 (0)