forked from canopen-python/canopen
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_od.py
More file actions
302 lines (250 loc) · 12.9 KB
/
Copy pathtest_od.py
File metadata and controls
302 lines (250 loc) · 12.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
import unittest
from canopen import objectdictionary as od
class TestDataConversions(unittest.TestCase):
def test_boolean(self):
var = od.ODVariable("Test BOOLEAN", 0x1000)
var.data_type = od.BOOLEAN
self.assertEqual(var.decode_raw(b"\x01"), True)
self.assertEqual(var.decode_raw(b"\x00"), False)
self.assertEqual(var.encode_raw(True), b"\x01")
self.assertEqual(var.encode_raw(False), b"\x00")
def test_unsigned8(self):
var = od.ODVariable("Test UNSIGNED8", 0x1000)
var.data_type = od.UNSIGNED8
self.assertEqual(var.decode_raw(b"\xff"), 255)
self.assertEqual(var.encode_raw(254), b"\xfe")
def test_unsigned16(self):
var = od.ODVariable("Test UNSIGNED16", 0x1000)
var.data_type = od.UNSIGNED16
self.assertEqual(var.decode_raw(b"\xfe\xff"), 65534)
self.assertEqual(var.encode_raw(65534), b"\xfe\xff")
def test_unsigned24(self):
var = od.ODVariable("Test UNSIGNED24", 0x1000)
var.data_type = od.UNSIGNED24
self.assertEqual(var.decode_raw(b"\xfd\xfe\xff"), 16776957)
self.assertEqual(var.encode_raw(16776957), b"\xfd\xfe\xff")
def test_unsigned32(self):
var = od.ODVariable("Test UNSIGNED32", 0x1000)
var.data_type = od.UNSIGNED32
self.assertEqual(var.decode_raw(b"\xfc\xfd\xfe\xff"), 4294901244)
self.assertEqual(var.encode_raw(4294901244), b"\xfc\xfd\xfe\xff")
def test_unsigned40(self):
var = od.ODVariable("Test UNSIGNED40", 0x1000)
var.data_type = od.UNSIGNED40
self.assertEqual(var.decode_raw(b"\xfb\xfc\xfd\xfe\xff"), 0xfffefdfcfb)
self.assertEqual(var.encode_raw(0xfffefdfcfb), b"\xfb\xfc\xfd\xfe\xff")
def test_unsigned48(self):
var = od.ODVariable("Test UNSIGNED48", 0x1000)
var.data_type = od.UNSIGNED48
self.assertEqual(var.decode_raw(b"\xfa\xfb\xfc\xfd\xfe\xff"), 0xfffefdfcfbfa)
self.assertEqual(var.encode_raw(0xfffefdfcfbfa), b"\xfa\xfb\xfc\xfd\xfe\xff")
def test_unsigned56(self):
var = od.ODVariable("Test UNSIGNED56", 0x1000)
var.data_type = od.UNSIGNED56
self.assertEqual(var.decode_raw(b"\xf9\xfa\xfb\xfc\xfd\xfe\xff"), 0xfffefdfcfbfaf9)
self.assertEqual(var.encode_raw(0xfffefdfcfbfaf9), b"\xf9\xfa\xfb\xfc\xfd\xfe\xff")
def test_unsigned64(self):
var = od.ODVariable("Test UNSIGNED64", 0x1000)
var.data_type = od.UNSIGNED64
self.assertEqual(var.decode_raw(b"\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"), 0xfffefdfcfbfaf9f8)
self.assertEqual(var.encode_raw(0xfffefdfcfbfaf9f8), b"\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff")
def test_integer8(self):
var = od.ODVariable("Test INTEGER8", 0x1000)
var.data_type = od.INTEGER8
self.assertEqual(var.decode_raw(b"\xff"), -1)
self.assertEqual(var.decode_raw(b"\x7f"), 127)
self.assertEqual(var.encode_raw(-2), b"\xfe")
self.assertEqual(var.encode_raw(127), b"\x7f")
def test_integer16(self):
var = od.ODVariable("Test INTEGER16", 0x1000)
var.data_type = od.INTEGER16
self.assertEqual(var.decode_raw(b"\xfe\xff"), -2)
self.assertEqual(var.decode_raw(b"\x01\x00"), 1)
self.assertEqual(var.encode_raw(-2), b"\xfe\xff")
self.assertEqual(var.encode_raw(1), b"\x01\x00")
def test_integer24(self):
var = od.ODVariable("Test INTEGER24", 0x1000)
var.data_type = od.INTEGER24
self.assertEqual(var.decode_raw(b"\xfe\xff\xff"), -2)
self.assertEqual(var.decode_raw(b"\x01\x00\x00"), 1)
self.assertEqual(var.encode_raw(-2), b"\xfe\xff\xff")
self.assertEqual(var.encode_raw(1), b"\x01\x00\x00")
def test_integer32(self):
var = od.ODVariable("Test INTEGER32", 0x1000)
var.data_type = od.INTEGER32
self.assertEqual(var.decode_raw(b"\xfe\xff\xff\xff"), -2)
self.assertEqual(var.decode_raw(b"\x01\x00\x00\x00"), 1)
self.assertEqual(var.encode_raw(1), b"\x01\x00\x00\x00")
self.assertEqual(var.encode_raw(-2), b"\xfe\xff\xff\xff")
def test_integer40(self):
var = od.ODVariable("Test INTEGER40", 0x1000)
var.data_type = od.INTEGER40
self.assertEqual(var.decode_raw(b"\xfe\xff\xff\xff\xff"), -2)
self.assertEqual(var.decode_raw(b"\x01\x00\x00\x00\x00"), 1)
self.assertEqual(var.encode_raw(-2), b"\xfe\xff\xff\xff\xff")
self.assertEqual(var.encode_raw(1), b"\x01\x00\x00\x00\x00")
def test_integer48(self):
var = od.ODVariable("Test INTEGER48", 0x1000)
var.data_type = od.INTEGER48
self.assertEqual(var.decode_raw(b"\xfe\xff\xff\xff\xff\xff"), -2)
self.assertEqual(var.decode_raw(b"\x01\x00\x00\x00\x00\x00"), 1)
self.assertEqual(var.encode_raw(-2), b"\xfe\xff\xff\xff\xff\xff")
self.assertEqual(var.encode_raw(1), b"\x01\x00\x00\x00\x00\x00")
def test_integer56(self):
var = od.ODVariable("Test INTEGER56", 0x1000)
var.data_type = od.INTEGER56
self.assertEqual(var.decode_raw(b"\xfe\xff\xff\xff\xff\xff\xff"), -2)
self.assertEqual(var.decode_raw(b"\x01\x00\x00\x00\x00\x00\x00"), 1)
self.assertEqual(var.encode_raw(-2), b"\xfe\xff\xff\xff\xff\xff\xff")
self.assertEqual(var.encode_raw(1), b"\x01\x00\x00\x00\x00\x00\x00")
def test_integer64(self):
var = od.ODVariable("Test INTEGER64", 0x1000)
var.data_type = od.INTEGER64
self.assertEqual(var.decode_raw(b"\xfe\xff\xff\xff\xff\xff\xff\xff"), -2)
self.assertEqual(var.decode_raw(b"\x01\x00\x00\x00\x00\x00\x00\x00"), 1)
self.assertEqual(var.encode_raw(-2), b"\xfe\xff\xff\xff\xff\xff\xff\xff")
self.assertEqual(var.encode_raw(1), b"\x01\x00\x00\x00\x00\x00\x00\x00")
def test_real32(self):
var = od.ODVariable("Test REAL32", 0x1000)
var.data_type = od.REAL32
# Select values that are exaclty representable in decimal notation
self.assertEqual(var.decode_raw(b"\x00\x00\x00\x00"), 0.)
self.assertEqual(var.decode_raw(b"\x00\x00\x60\x40"), 3.5)
self.assertEqual(var.decode_raw(b"\x00\x20\x7a\xc4"), -1000.5)
def test_real64(self):
var = od.ODVariable("Test REAL64", 0x1000)
var.data_type = od.REAL64
# Select values that are exaclty representable in decimal notation
self.assertEqual(var.decode_raw(b"\x00\x00\x00\x00\x00\x00\x00\x00"), 0.)
self.assertEqual(var.decode_raw(b"\x00\x00\x00\x00\x00\x4a\x93\x40"), 1234.5)
self.assertEqual(var.decode_raw(b"\x06\x81\x95\x43\x0b\x42\x8f\xc0"), -1000.2555)
def test_visible_string(self):
var = od.ODVariable("Test VISIBLE_STRING", 0x1000)
var.data_type = od.VISIBLE_STRING
self.assertEqual(var.decode_raw(b"abcdefg"), "abcdefg")
self.assertEqual(var.decode_raw(b"zero terminated\x00"), "zero terminated")
self.assertEqual(var.encode_raw("testing"), b"testing")
def test_unicode_string(self):
var = od.ODVariable("Test UNICODE_STRING", 0x1000)
var.data_type = od.UNICODE_STRING
self.assertEqual(var.decode_raw(b"\x61\x00\x62\x00\x63\x00"), "abc")
self.assertEqual(var.decode_raw(b"\x61\x00\x62\x00\x63\x00\x00\x00"), "abc") # Zero terminated
self.assertEqual(var.encode_raw("abc"), b"\x61\x00\x62\x00\x63\x00")
self.assertEqual(var.decode_raw(b"\x60\x3f\x7d\x59"), "\u3f60\u597d") # Chinese "Nǐ hǎo", hello
self.assertEqual(var.encode_raw("\u3f60\u597d"), b"\x60\x3f\x7d\x59") # Chinese "Nǐ hǎo", hello
def test_octet_string(self):
var = od.ODVariable("Test OCTET_STRING", 0x1000)
var.data_type = od.OCTET_STRING
self.assertEqual(var.decode_raw(b"abcdefg"), b"abcdefg")
self.assertEqual(var.decode_raw(b"zero terminated\x00"), b"zero terminated\x00")
self.assertEqual(var.encode_raw(b"testing"), b"testing")
def test_domain(self):
var = od.ODVariable("Test DOMAIN", 0x1000)
var.data_type = od.DOMAIN
self.assertEqual(var.decode_raw(b"abcdefg"), b"abcdefg")
self.assertEqual(var.decode_raw(b"zero terminated\x00"), b"zero terminated\x00")
self.assertEqual(var.encode_raw(b"testing"), b"testing")
class TestAlternativeRepresentations(unittest.TestCase):
def test_phys(self):
var = od.ODVariable("Test INTEGER16", 0x1000)
var.data_type = od.INTEGER16
var.factor = 0.1
self.assertAlmostEqual(var.decode_phys(128), 12.8)
self.assertEqual(var.encode_phys(-0.1), -1)
def test_desc(self):
var = od.ODVariable("Test UNSIGNED8", 0x1000)
var.data_type = od.UNSIGNED8
var.add_value_description(0, "Value 0")
var.add_value_description(1, "Value 1")
var.add_value_description(3, "Value 3")
self.assertEqual(var.decode_desc(0), "Value 0")
self.assertEqual(var.decode_desc(3), "Value 3")
self.assertEqual(var.encode_desc("Value 1"), 1)
def test_bits(self):
var = od.ODVariable("Test UNSIGNED8", 0x1000)
var.data_type = od.UNSIGNED8
var.add_bit_definition("BIT 0", [0])
var.add_bit_definition("BIT 2 and 3", [2, 3])
self.assertEqual(var.decode_bits(1, "BIT 0"), 1)
self.assertEqual(var.decode_bits(1, [1]), 0)
self.assertEqual(var.decode_bits(0xf, [0, 1, 2, 3]), 15)
self.assertEqual(var.decode_bits(8, "BIT 2 and 3"), 2)
self.assertEqual(var.encode_bits(0xf, [1], 0), 0xd)
self.assertEqual(var.encode_bits(0, "BIT 0", 1), 1)
class TestObjectDictionary(unittest.TestCase):
def test_add_variable(self):
test_od = od.ObjectDictionary()
var = od.ODVariable("Test Variable", 0x1000)
test_od.add_object(var)
self.assertEqual(test_od["Test Variable"], var)
self.assertEqual(test_od[0x1000], var)
def test_add_record(self):
test_od = od.ObjectDictionary()
record = od.ODRecord("Test Record", 0x1001)
var = od.ODVariable("Test Subindex", 0x1001, 1)
record.add_member(var)
test_od.add_object(record)
self.assertEqual(test_od["Test Record"], record)
self.assertEqual(test_od[0x1001], record)
self.assertEqual(test_od["Test Record"]["Test Subindex"], var)
def test_add_array(self):
test_od = od.ObjectDictionary()
array = od.ODArray("Test Array", 0x1002)
array.add_member(od.ODVariable("Last subindex", 0x1002, 0))
test_od.add_object(array)
self.assertEqual(test_od["Test Array"], array)
self.assertEqual(test_od[0x1002], array)
def test_get_item_dot(self):
test_od = od.ObjectDictionary()
array = od.ODArray("Test Array", 0x1000)
last_subindex = od.ODVariable("Last subindex", 0x1000, 0)
last_subindex.data_type = od.UNSIGNED8
member1 = od.ODVariable("Test Variable", 0x1000, 1)
member2 = od.ODVariable("Test Variable 2", 0x1000, 2)
array.add_member(last_subindex)
array.add_member(member1)
array.add_member(member2)
test_od.add_object(array)
self.assertEqual(test_od["Test Array.Last subindex"], last_subindex)
self.assertEqual(test_od["Test Array.Test Variable"], member1)
self.assertEqual(test_od["Test Array.Test Variable 2"], member2)
def test_get_item_index(self):
test_od = od.ObjectDictionary()
array = od.ODArray("Test Array", 0x1000)
test_od.add_object(array)
item = test_od[0x1000]
self.assertIsInstance(item, od.ODArray)
self.assertIs(item, array)
item = test_od["Test Array"]
self.assertIsInstance(item, od.ODArray)
self.assertIs(item, array)
def test_get_variable_not_found(self):
test_od = od.ObjectDictionary()
self.assertIsNone(test_od.get_variable(0x9999))
class TestArray(unittest.TestCase):
def test_subindexes(self):
array = od.ODArray("Test Array", 0x1000)
last_subindex = od.ODVariable("Last subindex", 0x1000, 0)
last_subindex.data_type = od.UNSIGNED8
array.add_member(last_subindex)
array.add_member(od.ODVariable("Test Variable", 0x1000, 1))
array.add_member(od.ODVariable("Test Variable 2", 0x1000, 2))
self.assertEqual(array[0].name, "Last subindex")
self.assertEqual(array[1].name, "Test Variable")
self.assertEqual(array[2].name, "Test Variable 2")
self.assertEqual(array[3].name, "Test Variable_3")
class TestEquality(unittest.TestCase):
def test_record_eq_wrong_type(self):
record = od.ODRecord("Test Record", 0x1001)
self.assertNotEqual(record, "not a record")
self.assertNotEqual(record, 42)
def test_array_eq_wrong_type(self):
array = od.ODArray("Test Array", 0x1002)
self.assertNotEqual(array, "not an array")
self.assertNotEqual(array, 42)
def test_variable_eq_wrong_type(self):
var = od.ODVariable("Test Variable", 0x1000, 0)
self.assertNotEqual(var, "not a variable")
self.assertNotEqual(var, 42)
if __name__ == "__main__":
unittest.main()