mirror of
https://github.com/naruxde/revpimodio2.git
synced 2025-11-08 22:03:53 +01:00
164 lines
6.7 KiB
Python
164 lines
6.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Tests for replace io file."""
|
|
__author__ = "Sven Sager"
|
|
__copyright__ = "Copyright (C) 2024 Sven Sager"
|
|
__license__ = "GPLv2"
|
|
|
|
from os.path import join, dirname
|
|
|
|
from revpimodio2.io import IntIOReplaceable
|
|
from .. import TestRevPiModIO
|
|
|
|
|
|
class TestReplaceIO(TestRevPiModIO):
|
|
|
|
data_dir = dirname(__file__)
|
|
|
|
def test_replacing(self):
|
|
"""Test replacing IOs."""
|
|
rpi = self.modio()
|
|
|
|
# Test type of IOs on an virtual device
|
|
for io in rpi.device.virt01:
|
|
self.assertIsInstance(io, IntIOReplaceable)
|
|
|
|
# Try to replace hardware IO
|
|
with self.assertRaises(AttributeError):
|
|
rpi.io.v_druck.replace_io("test2", frm="?")
|
|
|
|
rpi.io.pbit0_7.replace_io("test4", frm="?", bit=4)
|
|
rpi.io.pbit0_7.replace_io("test5", frm="?", bit=5, byteorder="big")
|
|
self.assertFalse(rpi.io.test4())
|
|
self.assertFalse(rpi.io.test4.value)
|
|
with self.assertRaises(MemoryError):
|
|
rpi.io.pbit0_7.replace_io("test4_2", frm="?", bit=4)
|
|
|
|
with self.assertRaises(ValueError):
|
|
rpi.io.meldung0_7.replace_io("outtest", "?", bit=100)
|
|
with self.assertRaises(ValueError):
|
|
rpi.io.meldung0_7.replace_io("outtest", "?", byteorder="test")
|
|
|
|
# Work with default values
|
|
rpi.io.meldung0_7.replace_io("outtest", "?", defaultvalue=True)
|
|
self.assertTrue(rpi.io.outtest.defaultvalue)
|
|
self.assertFalse(rpi.io.outtest.value)
|
|
rpi.io.outtest.value = True
|
|
self.assertTrue(rpi.io.outtest.value)
|
|
rpi.io.outtest.value = False
|
|
|
|
# Apply given default values
|
|
rpi.setdefaultvalues()
|
|
self.assertTrue(rpi.io.outtest.value)
|
|
|
|
with self.assertRaises(ValueError):
|
|
rpi.io.pbit8_15.replace_io("test2", frm="hf")
|
|
|
|
rpi.io.pbit8_15.replace_io("test2", frm="h")
|
|
rpi.io.meldung8_15.replace_io(
|
|
"testmeldung1",
|
|
frm="h",
|
|
byteorder="big",
|
|
event=lambda io_name, io_value: None,
|
|
)
|
|
with self.assertRaises(MemoryError):
|
|
rpi.io.meldung0_7.replace_io("testmeldung2", frm="h", byteorder="big")
|
|
with self.assertRaises(TypeError):
|
|
rpi.io._private_register_new_io_object(None)
|
|
with self.assertRaises(AttributeError):
|
|
rpi.io.testmeldung1.replace_io("testx", frm="?")
|
|
|
|
self.assertEqual(rpi.io.testmeldung1.defaultvalue, 0)
|
|
self.assertEqual(rpi.io.testmeldung1.frm, "h")
|
|
self.assertTrue(rpi.io.testmeldung1.signed)
|
|
self.assertEqual(rpi.io.testmeldung1.value, 0)
|
|
|
|
# Set value
|
|
rpi.io.testmeldung1.value = 200
|
|
self.assertEqual(rpi.io.testmeldung1(), 200)
|
|
rpi.io.testmeldung1(100)
|
|
self.assertEqual(rpi.io.testmeldung1.value, 100)
|
|
|
|
with self.assertRaises(BufferError):
|
|
rpi.io.Output_32.replace_io("test", "h")
|
|
|
|
# Byte value with default value
|
|
with self.assertRaises(ValueError):
|
|
rpi.io.Output_9.replace_io("drehzahl", "H", defaultvalue=b"\x00\x00\x00")
|
|
with self.assertRaises(ValueError):
|
|
rpi.io.Output_9.replace_io("drehzahl", "H", defaultvalue=b"\x00")
|
|
rpi.io.Output_9.replace_io("drehzahl", "H", defaultvalue=b"\xff\xff")
|
|
self.assertEqual(rpi.io.drehzahl.frm, "H")
|
|
self.assertFalse(rpi.io.drehzahl.signed)
|
|
self.assertEqual(rpi.io.drehzahl.defaultvalue, 65535)
|
|
self.assertEqual(rpi.io.drehzahl.value, 0)
|
|
rpi.setdefaultvalues()
|
|
self.assertEqual(rpi.io.drehzahl.value, 65535)
|
|
|
|
# Bit value with defaultvalue
|
|
rpi.io.Output_11._defaultvalue = b"\x02"
|
|
rpi.io.Output_11.replace_io("bitwert0", "?", bit=0)
|
|
rpi.io.Output_11.replace_io("bitwert1", "?", bit=1)
|
|
self.assertFalse(rpi.io.bitwert0.defaultvalue)
|
|
self.assertTrue(rpi.io.bitwert1.defaultvalue)
|
|
|
|
# Multi bytes
|
|
with self.assertRaises(ValueError):
|
|
rpi.io.Output_11.replace_io("mehrbyte", "ss")
|
|
rpi.io.Output_11.replace_io("mehrbyte", "4s")
|
|
self.assertEqual(rpi.io.mehrbyte.length, 4)
|
|
self.assertEqual(rpi.io.mehrbyte.frm, "4s")
|
|
self.assertEqual(rpi.io.mehrbyte.value, b"\x00\x00\x00\x00")
|
|
rpi.io.mehrbyte.value = b"\xff\xff\xff\xff"
|
|
self.assertEqual(rpi.io.mehrbyte.value, b"\xff\xff\xff\xff")
|
|
|
|
# String defaultvalue (Encoding erros are filled with \x00)
|
|
rpi.io.Output_15.replace_io("string", "4s", defaultvalue="t\xffst")
|
|
self.assertEqual(rpi.io.string.value, b"\x00\x00\x00\x00")
|
|
|
|
def test_replace_io_file(self):
|
|
replace_io_file = join(self.data_dir, "replace_io.conf")
|
|
rpi = self.modio(replace_io_file=replace_io_file)
|
|
self.assertEqual(rpi.replace_io_file, replace_io_file)
|
|
rpi.setdefaultvalues()
|
|
self.assertEqual(rpi.io.test1.value, -1)
|
|
self.assertFalse(rpi.io.r_bit0.value)
|
|
self.assertTrue(rpi.io.r_bit1.value)
|
|
self.assertFalse(rpi.io.r_bit5.value)
|
|
self.assertFalse("Output_19" in rpi.io)
|
|
|
|
self.assertEqual(rpi.io.test1.byteorder, "big")
|
|
self.assertEqual(rpi.io.r_bit0.byteorder, "little")
|
|
|
|
self.assertEqual(rpi.io.r_bit0.bmk, "EinBit")
|
|
|
|
with self.assertRaises(RuntimeError):
|
|
rpi.export_replaced_ios("/gehtnich/replace_io.conf")
|
|
|
|
with self.assertRaises(ValueError):
|
|
rpi.io.test1.export = 1
|
|
rpi.io.test1.export = True
|
|
rpi.io.Input_20.replace_io("byte_test", "3s", defaultvalue=b"\xff\x00\x80", export=True)
|
|
rpi.export_replaced_ios("/tmp/replace_io.conf")
|
|
del rpi
|
|
|
|
rpi = self.modio(replace_io_file="/tmp/replace_io.conf")
|
|
self.assertTrue(rpi.io.test1.export)
|
|
self.assertTrue(rpi.io.byte_test.export)
|
|
self.assertEqual(rpi.io.byte_test.defaultvalue, b"\xff\x00\x80")
|
|
|
|
def test_replace_io_file_fail(self):
|
|
with self.assertRaises(RuntimeError):
|
|
self.modio(replace_io_file=join(self.data_dir, "replace_io_fail.conf"))
|
|
with self.assertRaises(RuntimeError):
|
|
self.modio(replace_io_file="no_file_nonono")
|
|
with self.assertRaises(RuntimeError):
|
|
self.modio(replace_io_file=join(self.data_dir, "replace_io_failformat.conf"))
|
|
with self.assertRaises(ValueError):
|
|
self.modio(replace_io_file=join(self.data_dir, "replace_io_faildefaultvalue_bool.conf"))
|
|
with self.assertRaises(ValueError):
|
|
self.modio(replace_io_file=join(self.data_dir, "replace_io_faildefaultvalue_int.conf"))
|
|
with self.assertRaises(ValueError):
|
|
self.modio(replace_io_file=join(self.data_dir, "replace_io_failbit_int.conf"))
|
|
with self.assertRaisesRegex(ValueError, r"defaultvalue to bytes"):
|
|
self.modio(replace_io_file=join(self.data_dir, "replace_io_bytes_fail.conf"))
|