Skip to content

Commit c05b49d

Browse files
acolombbizfsc
andauthored
Add unit tests for Variable class (#656)
* Add unit tests for Variable class. * Raise ValueError on invalid fmt argument. Co-authored-by: Frieder Schüler <frieder.schueler@bizerba.com>
1 parent 473fbd7 commit c05b49d

4 files changed

Lines changed: 74 additions & 0 deletions

File tree

canopen/variable.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,15 @@ def read(self, fmt: str = "raw") -> Union[int, bool, float, str, bytes]:
135135
136136
:returns:
137137
The value of the variable.
138+
:raises ValueError: For unsupported fmt values.
138139
"""
139140
if fmt == "raw":
140141
return self.raw
141142
elif fmt == "phys":
142143
return self.phys
143144
elif fmt == "desc":
144145
return self.desc
146+
raise ValueError(f"Invalid format '{fmt}'")
145147

146148
def write(
147149
self, value: Union[int, bool, float, str, bytes], fmt: str = "raw"

test/test_od.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,10 @@ def test_get_item_index(self):
260260
self.assertIsInstance(item, od.ODArray)
261261
self.assertIs(item, array)
262262

263+
def test_get_variable_not_found(self):
264+
test_od = od.ObjectDictionary()
265+
self.assertIsNone(test_od.get_variable(0x9999))
266+
263267

264268
class TestArray(unittest.TestCase):
265269

test/test_sdo.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ def test_array_contains_non_int(self):
5454
self.assertNotIn("not an int", array)
5555
self.assertNotIn(None, array)
5656

57+
def test_get_variable_not_found(self):
58+
self.assertIsNone(self.sdo_node.get_variable(0x9999))
59+
5760

5861
class TestSDO(unittest.TestCase):
5962
"""

test/test_variable.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import unittest
2+
3+
from canopen import objectdictionary as od
4+
from canopen.variable import Variable
5+
6+
7+
class _StubVariable(Variable):
8+
"""Minimal concrete Variable for testing read/write/bits."""
9+
10+
def __init__(self, od_var):
11+
super().__init__(od_var)
12+
self._data = od_var.encode_raw(od_var.default)
13+
14+
def get_data(self):
15+
return self._data
16+
17+
def set_data(self, data):
18+
self._data = data
19+
20+
21+
class TestVariable(unittest.TestCase):
22+
23+
def test_read_invalid_format(self):
24+
var = od.ODVariable("Test UNSIGNED8", 0x1000)
25+
var.data_type = od.UNSIGNED8
26+
var.default = 0
27+
v = _StubVariable(var)
28+
with self.assertRaises(ValueError):
29+
v.read(fmt="invalid")
30+
31+
def test_write_desc(self):
32+
var = od.ODVariable("Test UNSIGNED8", 0x1000)
33+
var.data_type = od.UNSIGNED8
34+
var.default = 0
35+
var.add_value_description(0, "Off")
36+
var.add_value_description(1, "On")
37+
v = _StubVariable(var)
38+
v.write("On", fmt="desc")
39+
self.assertEqual(v.raw, 1)
40+
41+
def test_raw_with_string_value(self):
42+
var = od.ODVariable("Test VISIBLE_STRING", 0x1000)
43+
var.data_type = od.VISIBLE_STRING
44+
var.default = "hello"
45+
var.add_value_description(0, "Off")
46+
v = _StubVariable(var)
47+
# String value must not be looked up in value_descriptions
48+
self.assertEqual(v.raw, "hello")
49+
50+
def test_bits(self):
51+
var = od.ODVariable("Test UNSIGNED8", 0x1000)
52+
var.data_type = od.UNSIGNED8
53+
var.default = 0
54+
var.add_bit_definition("BIT 0", [0])
55+
var.add_bit_definition("BIT 2 and 3", [2, 3])
56+
v = _StubVariable(var)
57+
v.raw = 5
58+
bits = v.bits
59+
self.assertEqual(bits[0], 1)
60+
bits[0] = 0
61+
self.assertEqual(v.raw, 4)
62+
63+
64+
if __name__ == "__main__":
65+
unittest.main()

0 commit comments

Comments
 (0)