|
17 | 17 | import scipy |
18 | 18 |
|
19 | 19 | import control as ct |
20 | | - |
| 20 | +from control.tests.conftest import slycotonly |
21 | 21 |
|
22 | 22 | class TestIOSys: |
23 | 23 |
|
@@ -2284,3 +2284,54 @@ def test_signal_indexing(): |
2284 | 2284 | with pytest.raises(IndexError, match=r"signal name\(s\) not valid"): |
2285 | 2285 | resp.outputs['y[0]', 'u[0]'] |
2286 | 2286 |
|
| 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