frappy/test/test_io.py
Markus Zolliker 158477792f add StringIO.writeline, improve StringIO.multicomm
- StringIO.writeline sends a command and does not expect a reply
- StringIO.multicomm and BytesIO.multicomm is improved in order
  to insert individual delays in between lines and individual
  noreply flags

+ fix a bug in tutorial_t_control
+ improve readability of frappy.lib.classdoc.indent_description

Change-Id: I9dea113e19147684ec41aca5267a79816bbf202c
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/32267
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
2024-01-29 13:34:45 +01:00

99 lines
2.8 KiB
Python

# *****************************************************************************
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Module authors:
# Markus Zolliker <markus.zolliker@psi.ch>
#
# *****************************************************************************
import time
import pytest
from frappy.io import StringIO
class Time:
def __init__(self, items):
self.items = items
def sleep(self, seconds):
self.items.append(seconds)
class IO(StringIO):
def __init__(self):
self.items = []
self.propertyValues = {}
self.earlyInit()
def communicate(self, command, noreply=False):
self.items.append(command)
return command.upper()
class AppendedIO(IO):
def communicate(self, command, noreply=False):
self.items.append(command)
if noreply:
assert not '?' in command
return None
assert '?' in command
return '1'
def writeline(self, command):
assert self.communicate(command + ';*OPC?') == '1'
class CompositeIO(AppendedIO):
def writeline(self, command):
# the following is not possible, as multicomm is recursively calling writeline:
# self.multicomm([(command, False, 0), ('*OPC?', True, 0)])
# anyway, above code is less nice
with self._lock:
self.communicate(command, noreply=True)
self.communicate('*OPC?')
def test_writeline_pure():
io = IO()
assert io.writeline('noreply') is None
assert io.items == ['noreply']
@pytest.mark.parametrize(
'ioclass, cmds', [
(AppendedIO, ['SETP 1,1;*OPC?']),
(CompositeIO, ['SETP 1,1', '*OPC?']),
])
def test_writeline_extended(ioclass, cmds):
io = ioclass()
io.writeline('SETP 1,1')
assert io.items == cmds
def test_multicomm_simple():
io = IO()
assert io.multicomm(['first', 'second']) == ['FIRST', 'SECOND']
assert io.items == ['first', 'second']
def test_multicomm_with_delay(monkeypatch):
io = IO()
tm = Time(io.items)
monkeypatch.setattr(time, 'sleep', tm.sleep)
assert io.multicomm([('noreply', False, 1), ('reply', True, 2)]) == ['REPLY']
assert io.items == ['noreply', 1, 'reply', 2]