From c10f0a2d056f5cc0467b7f739038ff4d8eac7db0 Mon Sep 17 00:00:00 2001 From: Sven Sager Date: Mon, 28 Oct 2024 14:44:55 +0100 Subject: [PATCH] test: Common device functions --- tests/common/config_new_base.rsc | 1 + tests/common/test_devices.py | 116 +++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 tests/common/config_new_base.rsc create mode 100644 tests/common/test_devices.py diff --git a/tests/common/config_new_base.rsc b/tests/common/config_new_base.rsc new file mode 100644 index 0000000..a7923f3 --- /dev/null +++ b/tests/common/config_new_base.rsc @@ -0,0 +1 @@ +{"App":{"name": "PiCtory", "version": "1.2.5","saveTS": "20171108151243","language": "en","layout": {"north":{"size":70,"initClosed":false,"initHidden":false},"south":{"size":325,"initClosed":false,"initHidden":false,"children":{"layout1":{"east":{"size":500,"initClosed":false,"initHidden":false}}}},"east":{"size":0,"initClosed":true,"initHidden":false,"children":{}},"west":{"size":313,"initClosed":false,"initHidden":false,"children":{"layout1":{}}}}},"Summary":{"inpTotal": 618,"outTotal": 567},"Devices":[{"catalogNr": "RevPiCore","GUID": "ae718ac0-90ba-69fb-1a35-06850c1a920e","id": "device_RevPiCore_20170210_1_1_001","type": "BASE","productType": "5","position": "0","name": "revpicore","bmk": "RevPi Core V1.1","inpVariant": 0,"outVariant": 0,"comment": "This is a RevPiCore Device","offset": 0,"inp": {"0": ["RevPiStatus","0","8","0",true,"0000", "",""],"1": ["RevPiIOCycle","0","8","1",true,"0001", "",""],"2": ["RS485ErrorCnt","0","16","2",false,"0002", "",""]},"out": {"0": ["RevPiLED","0","8","4",true,"0003", "",""],"1": ["RS485ErrorLimit1","10","16","5",false,"0004", "",""],"2": ["RS485ErrorLimit2","1000","16","7",false,"0005", "",""]},"mem": {},"extend": {}},{"catalogNr": "RevPiDIO","GUID": "d5f2dbc8-05d9-0a85-4c19-b9cd5d3517a9","id": "device_RevPiDIO_20160818_1_0_001","type": "LEFT_RIGHT","productType": "96","position": "32","name": "dio01","bmk": "RevPi DIO","inpVariant": 0,"outVariant": 0,"comment": "","offset": 9,"inp": {"0": ["t_aus","0","1","0",true,"0000", "","0"],"1": ["t_an","0","1","0",true,"0001", "","1"],"2": ["t_links","0","1","0",true,"0002", "","2"],"3": ["t_rechts","0","1","0",true,"0003", "","3"],"4": ["t_hoch","0","1","0",true,"0004", "","4"],"5": ["t_runter","0","1","0",true,"0005", "","5"],"6": ["t_blau","0","1","0",true,"0006", "","6"],"7": ["t_rot","0","1","0",true,"0007", "","7"],"8": ["I_9","0","1","0",true,"0008", "","8"],"9": ["I_10","0","1","0",true,"0009", "","9"],"10": ["I_11","0","1","0",true,"0010", "","10"],"11": ["I_12","0","1","0",true,"0011", "","11"],"12": ["I_13","0","1","0",true,"0012", "","12"],"13": ["I_14","0","1","0",true,"0013", "","13"],"14": ["I_15","0","1","0",true,"0014", "","14"],"15": ["I_16","0","1","0",true,"0015", "","15"],"16": ["Output_Status","0","16","2",false,"0016", "",""],"17": ["Status","0","16","4",false,"0017", "",""],"18": ["Counter_1","0","32","6",false,"0018", "",""],"19": ["Counter_2","0","32","10",false,"0019", "",""],"20": ["Counter_3","0","32","14",false,"0020", "",""],"21": ["Counter_4","0","32","18",false,"0021", "",""],"22": ["Counter_5","0","32","22",false,"0022", "",""],"23": ["Counter_6","0","32","26",false,"0023", "",""],"24": ["Counter_7","0","32","30",false,"0024", "",""],"25": ["Counter_8","0","32","34",false,"0025", "",""],"26": ["Counter_9","0","32","38",false,"0026", "",""],"27": ["Counter_10","0","32","42",false,"0027", "",""],"28": ["Counter_11","0","32","46",false,"0028", "",""],"29": ["Counter_12","0","32","50",false,"0029", "",""],"30": ["Counter_13","0","32","54",false,"0030", "",""],"31": ["Counter_14","0","32","58",false,"0031", "",""],"32": ["Counter_15","0","32","62",false,"0032", "",""],"33": ["Counter_16","0","32","66",false,"0033", "",""]},"out": {"0": ["h_an","0","1","70",true,"0034", "","0"],"1": ["h_richtung","0","1","70",true,"0035", "","1"],"2": ["h_hoch","0","1","70",true,"0036", "","2"],"3": ["h_runter","0","1","70",true,"0037", "","3"],"4": ["h_blau","0","1","70",true,"0038", "","4"],"5": ["h_rot","0","1","70",true,"0039", "","5"],"6": ["O_7","0","1","70",true,"0040", "","6"],"7": ["O_8","0","1","70",true,"0041", "","7"],"8": ["O_9","0","1","70",true,"0042", "","8"],"9": ["O_10","0","1","70",true,"0043", "","9"],"10": ["O_11","0","1","70",true,"0044", "","10"],"11": ["O_12","0","1","70",true,"0045", "","11"],"12": ["O_13","0","1","70",true,"0046", "","12"],"13": ["O_14","0","1","70",true,"0047", "","13"],"14": ["O_15","0","1","70",true,"0048", "","14"],"15": ["O_16","0","1","70",true,"0049", "","15"],"16": ["PWM_1","0","8","72",false,"0050", "",""],"17": ["PWM_2","0","8","73",false,"0051", "",""],"18": ["PWM_3","0","8","74",false,"0052", "",""],"19": ["PWM_4","0","8","75",false,"0053", "",""],"20": ["PWM_5","0","8","76",false,"0054", "",""],"21": ["PWM_6","0","8","77",false,"0055", "",""],"22": ["PWM_7","0","8","78",false,"0056", "",""],"23": ["PWM_8","0","8","79",false,"0057", "",""],"24": ["PWM_9","0","8","80",false,"0058", "",""],"25": ["PWM_10","0","8","81",false,"0059", "",""],"26": ["PWM_11","0","8","82",false,"0060", "",""],"27": ["PWM_12","0","8","83",false,"0061", "",""],"28": ["PWM_13","0","8","84",false,"0062", "",""],"29": ["PWM_14","0","8","85",false,"0063", "",""],"30": ["PWM_15","0","8","86",false,"0064", "",""],"31": ["PWM_16","0","8","87",false,"0065", "",""]},"mem": {"0": ["InputMode_1","0","8","88",false,"0066", "",""],"1": ["InputMode_2","0","8","89",false,"0067", "",""],"2": ["InputMode_3","0","8","90",false,"0068", "",""],"3": ["InputMode_4","0","8","91",false,"0069", "",""],"4": ["InputMode_5","0","8","92",false,"0070", "",""],"5": ["InputMode_6","0","8","93",false,"0071", "",""],"6": ["InputMode_7","0","8","94",false,"0072", "",""],"7": ["InputMode_8","0","8","95",false,"0073", "",""],"8": ["InputMode_9","0","8","96",false,"0074", "",""],"9": ["InputMode_10","0","8","97",false,"0075", "",""],"10": ["InputMode_11","0","8","98",false,"0076", "",""],"11": ["InputMode_12","0","8","99",false,"0077", "",""],"12": ["InputMode_13","0","8","100",false,"0078", "",""],"13": ["InputMode_14","0","8","101",false,"0079", "",""],"14": ["InputMode_15","0","8","102",false,"0080", "",""],"15": ["InputMode_16","0","8","103",false,"0081", "",""],"16": ["InputDebounce","0","16","104",false,"0082", "",""],"17": ["OutputPushPull","0","16","106",false,"0083", "",""],"18": ["OutputOpenLoadDetect","0","16","108",false,"0084", "",""],"19": ["OutputPWMActive","0","16","110",false,"0085", "",""],"20": ["OutputPWMFrequency","1","8","112",false,"0086", "",""]},"extend": {}},{"catalogNr": "RevPiGateProfinet","GUID": "30558b90-40a4-7eaa-2a50-c7aaa2a8639b","id": "device_RevPiGateProfinet_20160916_1_0_001","type": "EDGE","productType": "79","position": "33","name": "profinet01","bmk": "Gateway Profinet IRT","inpVariant": 0,"outVariant": 0,"comment": "","offset": 122,"inp": {"0": ["Input_1_i06","0","8","0",false,"0000", "",""],"1": ["Input_2_i06","0","8","1",false,"0001", "",""],"2": ["Input_3_i06","0","8","2",false,"0002", "",""],"3": ["Input_4_i06","0","8","3",false,"0003", "",""],"4": ["Input_5_i06","0","8","4",false,"0004", "",""],"5": ["Input_6_i06","0","8","5",false,"0005", "",""],"6": ["Input_7_i06","0","8","6",false,"0006", "",""],"7": ["Input_8_i06","0","8","7",false,"0007", "",""],"8": ["Input_9_i06","0","8","8",false,"0008", "",""],"9": ["Input_10_i06","0","8","9",false,"0009", "",""],"10": ["Input_11_i06","0","8","10",false,"0010", "",""],"11": ["Input_12_i06","0","8","11",false,"0011", "",""],"12": ["Input_13_i06","0","8","12",false,"0012", "",""],"13": ["Input_14_i06","0","8","13",false,"0013", "",""],"14": ["Input_15_i06","0","8","14",false,"0014", "",""],"15": ["Input_16_i06","0","8","15",false,"0015", "",""],"16": ["Input_17_i06","0","8","16",false,"0016", "",""],"17": ["Input_18_i06","0","8","17",false,"0017", "",""],"18": ["Input_19_i06","0","8","18",false,"0018", "",""],"19": ["Input_20_i06","0","8","19",false,"0019", "",""],"20": ["Dummy_in","not used","3936","20",false,"0040", "",""]},"out": {"0": ["Output_1_i06","0","8","512",false,"0020", "",""],"1": ["Output_2_i06","0","8","513",false,"0021", "",""],"2": ["Output_3_i06","0","8","514",false,"0022", "",""],"3": ["Output_4_i06","0","8","515",false,"0023", "",""],"4": ["Output_5_i06","0","8","516",false,"0024", "",""],"5": ["Output_6_i06","0","8","517",false,"0025", "",""],"6": ["Output_7_i06","0","8","518",false,"0026", "",""],"7": ["Output_8_i06","0","8","519",false,"0027", "",""],"8": ["Output_9_i06","0","8","520",false,"0028", "",""],"9": ["Output_10_i06","0","8","521",false,"0029", "",""],"10": ["Output_11_i06","0","8","522",false,"0030", "",""],"11": ["Output_12_i06","0","8","523",false,"0031", "",""],"12": ["Output_13_i06","0","8","524",false,"0032", "",""],"13": ["Output_14_i06","0","8","525",false,"0033", "",""],"14": ["Output_15_i06","0","8","526",false,"0034", "",""],"15": ["Output_16_i06","0","8","527",false,"0035", "",""],"16": ["Output_17_i06","0","8","528",false,"0036", "",""],"17": ["Output_18_i06","0","8","529",false,"0037", "",""],"18": ["Output_19_i06","0","8","530",false,"0038", "",""],"19": ["Output_20_i06","0","8","531",false,"0039", "",""],"20": ["Dummy_out","not used","3936","532",false,"0041", "",""]},"mem": {},"extend": {}},{"catalogNr": "Virtual01","GUID": "18c193b5-b10c-cb9a-39f6-2ae74e294501","id": "device_Virtual01_20160818_1_0_001","type": "VIRTUAL","productType": "32768","position": "64","name": "virt01","bmk": "Virtual Device 32 Byte","inpVariant": 0,"outVariant": 0,"comment": "Virtual Device to reserve space in process image for user applications","offset": 1146,"inp": {"0": ["Input_1","0","8","0",false,"0000", "",""],"1": ["Input_2","0","8","1",false,"0001", "",""],"2": ["Input_3","0","8","2",false,"0002", "",""],"3": ["Input_4","0","8","3",false,"0003", "",""],"4": ["Input_5","0","8","4",false,"0004", "",""],"5": ["Input_6","0","8","5",false,"0005", "",""],"6": ["Input_7","0","8","6",false,"0006", "",""],"7": ["Input_8","0","8","7",false,"0007", "",""],"8": ["Input_9","0","8","8",false,"0008", "",""],"9": ["Input_10","0","8","9",false,"0009", "",""],"10": ["Input_11","0","8","10",false,"0010", "",""],"11": ["Input_12","0","8","11",false,"0011", "",""],"12": ["Input_13","0","8","12",false,"0012", "",""],"13": ["Input_14","0","8","13",false,"0013", "",""],"14": ["Input_15","0","8","14",false,"0014", "",""],"15": ["Input_16","0","8","15",false,"0015", "",""],"16": ["Input_17","0","8","16",false,"0016", "",""],"17": ["Input_18","0","8","17",false,"0017", "",""],"18": ["Input_19","0","8","18",false,"0018", "",""],"19": ["Input_20","0","8","19",false,"0019", "",""],"20": ["Input_21","0","8","20",false,"0020", "",""],"21": ["Input_22","0","8","21",false,"0021", "",""],"22": ["Input_23","0","8","22",false,"0022", "",""],"23": ["Input_24","0","8","23",false,"0023", "",""],"24": ["Input_25","0","8","24",false,"0024", "",""],"25": ["Input_26","0","8","25",false,"0025", "",""],"26": ["Input_27","0","8","26",false,"0026", "",""],"27": ["Input_28","0","8","27",false,"0027", "",""],"28": ["Input_29","0","8","28",false,"0028", "",""],"29": ["Input_30","0","8","29",false,"0029", "",""],"30": ["Input_31","0","8","30",false,"0030", "",""],"31": ["Input_32","0","8","31",false,"0031", "",""]},"out": {"0": ["Output_1","0","8","32",false,"0032", "",""],"1": ["Output_2","0","8","33",false,"0033", "",""],"2": ["Output_3","0","8","34",false,"0034", "",""],"3": ["Output_4","0","8","35",false,"0035", "",""],"4": ["Output_5","0","8","36",false,"0036", "",""],"5": ["Output_6","0","8","37",false,"0037", "",""],"6": ["Output_7","0","8","38",false,"0038", "",""],"7": ["Output_8","0","8","39",false,"0039", "",""],"8": ["Output_9","0","8","40",false,"0040", "",""],"9": ["Output_10","0","8","41",false,"0041", "",""],"10": ["Output_11","0","8","42",false,"0042", "",""],"11": ["Output_12","0","8","43",false,"0043", "",""],"12": ["Output_13","0","8","44",false,"0044", "",""],"13": ["Output_14","0","8","45",false,"0045", "",""],"14": ["Output_15","0","8","46",false,"0046", "",""],"15": ["Output_16","0","8","47",false,"0047", "",""],"16": ["Output_17","0","8","48",false,"0048", "",""],"17": ["Output_18","0","8","49",false,"0049", "",""],"18": ["Output_19","0","8","50",false,"0050", "",""],"19": ["Output_20","0","8","51",false,"0051", "",""],"20": ["Output_21","0","8","52",false,"0052", "",""],"21": ["Output_22","0","8","53",false,"0053", "",""],"22": ["Output_23","0","8","54",false,"0054", "",""],"23": ["Output_24","0","8","55",false,"0055", "",""],"24": ["Output_25","0","8","56",false,"0056", "",""],"25": ["Output_26","0","8","57",false,"0057", "",""],"26": ["Output_27","0","8","58",false,"0058", "",""],"27": ["Output_28","0","8","59",false,"0059", "",""],"28": ["Output_29","0","8","60",false,"0060", "",""],"29": ["Output_30","0","8","61",false,"0061", "",""],"30": ["Output_31","0","8","62",false,"0062", "",""],"31": ["Output_32","0","8","63",false,"0063", "",""]},"mem": {},"extend": {}}],"Connections":[]} diff --git a/tests/common/test_devices.py b/tests/common/test_devices.py new file mode 100644 index 0000000..9bcccc9 --- /dev/null +++ b/tests/common/test_devices.py @@ -0,0 +1,116 @@ +# -*- coding: utf-8 -*- +"""Tests instantiation all local classes.""" +__author__ = "Sven Sager" +__copyright__ = "Copyright (C) 2024 Sven Sager" +__license__ = "GPLv2" + +from os.path import dirname + +from revpimodio2 import OUT, MEM, INP +from revpimodio2.device import Virtual, Base +from tests import TestRevPiModIO + + +class TestDevicesModule(TestRevPiModIO): + data_dir = dirname(__file__) + + def test_device(self): + """Test device attributes.""" + rpi = self.modio() + + self.assertEqual(rpi.device[64].name, "virt01") + self.assertEqual(rpi.device.virt01.length, 64) + self.assertEqual(rpi.device.virt01.name, "virt01") + self.assertIsInstance(rpi.device.virt01.offset, int) + self.assertEqual(rpi.device.virt01.position, 64) + self.assertEqual(rpi.device.virt01.producttype, 32768) + + # Magic + self.assertEqual("virt01" in rpi.device, True) + self.assertEqual("nixnix" in rpi.device, False) + self.assertEqual(64 in rpi.device, True) + self.assertEqual(128 in rpi.device, False) + self.assertEqual(rpi.device.virt01 in rpi.device, True) + self.assertIsInstance(bytes(rpi.device.virt01), bytes) + + # We have 7 devices in config.rsc file + self.assertEqual(len(rpi.device), 7) + + def test_devs_and_ios(self): + """Test IO grouping of devices.""" + rpi = self.modio() + + self.assertEqual(len(rpi.device.virt01), 64) + + # getIOs + self.assertIsInstance(rpi.device.aio01.get_inputs(), list) + self.assertIsInstance(rpi.device.aio01.get_outputs(), list) + self.assertIsInstance(rpi.device.aio01.get_memories(), list) + int_inputs = len(rpi.device.aio01.get_inputs()) + int_output = len(rpi.device.aio01.get_outputs()) + + self.assertIsInstance(rpi.device.aio01.get_allios(), list) + self.assertEqual(len(rpi.device.aio01.get_allios()), int_inputs + int_output) + + # IO Byte vergleichen + int_byte = 0 + for devio in [rpi.device.aio01.get_allios(), rpi.device.aio01.get_memories()]: + for io in devio: + int_byte += io.length + self.assertEqual(len(rpi.device.aio01), int_byte) + + # Test the types of IOs + len_end = 0 + len_start = len_end + for io in rpi.device.aio01.get_inputs(): + self.assertEqual(io.type, INP) + len_end += io.length + self.assertEqual(len_start, rpi.device.aio01._slc_inp.start) + self.assertEqual(len_end, rpi.device.aio01._slc_inp.stop) + + len_start = len_end + for io in rpi.device.aio01.get_outputs(): + self.assertEqual(io.type, OUT) + len_end += io.length + self.assertEqual(len_start, rpi.device.aio01._slc_out.start) + self.assertEqual(len_end, rpi.device.aio01._slc_out.stop) + + len_start = len_end + for io in rpi.device.aio01.get_memories(): + self.assertEqual(io.type, MEM) + len_end += io.length + self.assertEqual(len_start, rpi.device.aio01._slc_mem.start) + self.assertEqual(len_end, rpi.device.aio01._slc_mem.stop) + + def test_device_modifications(self): + """Test device modifications.""" + rpi = self.modio() + + # Zugriffe + self.assertIsInstance(rpi.device.virt01, Virtual) + self.assertIsInstance(rpi.device["virt01"], Virtual) + + # IO-Abfragen + self.assertEqual("pbit0_7" in rpi.device.virt01, True) + self.assertEqual(rpi.io.pbit0_7 in rpi.device.virt01, True) + self.assertEqual(33 in rpi.device.virt01, False) + self.assertEqual(552 in rpi.device.virt01, True) + + # Löschen + del rpi.device.virt01 + with self.assertRaises(AttributeError): + rpi.device.virt01 + self.assertEqual(rpi.device[0].name, "picore01") + del rpi.device[0] + with self.assertRaises(IndexError): + rpi.device[0] + with self.assertRaises(AttributeError): + rpi.device.picore01 + + del rpi.device[rpi.device.di01] + + def test_new_basedevice(self): + """Test unknown (new) base device.""" + rpi = self.modio(configrsc="config_new_base.rsc") + self.assertEqual(type(rpi.device[0]), Base) + del rpi