Skip to content

Commit fb03ae7

Browse files
committed
Add the fixes & tests for nested structures.
1 parent 8efd1fa commit fb03ae7

File tree

2 files changed

+72
-4
lines changed

2 files changed

+72
-4
lines changed

Xlib/protocol/rq.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,8 @@ def parse_binary_value(self, data, display, length, format):
515515
def pack_value(self, val):
516516
# Single-char values, we'll assume that means integer lists.
517517
if self.type.structcode and len(self.type.structcode) == 1:
518+
if self.type.check_value is not None:
519+
val = [self.type.check_value(v) for v in val]
518520
data = array(struct_to_array_codes[self.type.structcode],
519521
val).tostring()
520522
else:
@@ -568,9 +570,13 @@ def check_value(self, val):
568570
for f in self.type.fields:
569571
if f.name:
570572
if f.check_value is None:
571-
vals.append(val[i])
573+
v = val[i]
572574
else:
573-
vals.append(f.check_value(val[i]))
575+
v = f.check_value(val[i])
576+
if f.structvalues == 1:
577+
vals.append(v)
578+
else:
579+
vals.extend(v)
574580
i = i + 1
575581
return vals
576582

@@ -585,9 +591,13 @@ def check_value(self, val):
585591
for f in self.type.fields:
586592
if f.name:
587593
if f.check_value is None:
588-
vals.append(data[f.name])
594+
v = data[f.name]
595+
else:
596+
v = f.check_value(data[f.name])
597+
if f.structvalues == 1:
598+
vals.append(v)
589599
else:
590-
vals.append(f.check_value(data[f.name]))
600+
vals.extend(v)
591601

592602
return vals
593603

@@ -821,6 +831,7 @@ def __init__(self, code):
821831
self.structcode = code
822832
self.structvalues = 1
823833
self.parse_value = None
834+
self.check_value = None
824835

825836
Card8Obj = ScalarObj('B')
826837
Card16Obj = ScalarObj('H')
@@ -832,6 +843,7 @@ class ResourceObj:
832843

833844
def __init__(self, class_name):
834845
self.class_name = class_name
846+
self.check_value = None
835847

836848
def parse_value(self, value, display):
837849
# if not display:

test/test_manual.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#!/usr/bin/env python
2+
3+
import sys, os
4+
sys.path.insert(1, os.path.join(sys.path[0], '..'))
5+
6+
import unittest
7+
from Xlib.protocol import rq
8+
9+
class Custom(rq.Card32):
10+
def check_value(self, value):
11+
return int(value)
12+
def parse_value(self, value, display):
13+
return str(value)
14+
15+
CustomObj = Custom(None)
16+
17+
18+
class TestNestedStruct(unittest.TestCase):
19+
def setUp(self):
20+
self.s1 = rq.Struct(rq.Card32('a1'), rq.Card32('a2'))
21+
self.s2 = rq.Struct(rq.Object('b1', self.s1), rq.Object('b2', self.s1))
22+
self.s3 = rq.Struct(rq.Object('c1', self.s2), rq.Object('c2', self.s2))
23+
24+
def testToBinary1(self):
25+
self.s1.to_binary(1, 2)
26+
27+
def testToBinary2(self):
28+
self.s2.to_binary((1, 2), (3, 4))
29+
30+
def testToBinary3(self):
31+
self.s3.to_binary(((1, 2), (3, 4)), ((5, 6), (7, 8)))
32+
33+
class TestNestedStructWithFancyValue(unittest.TestCase):
34+
def setUp(self):
35+
self.s1 = rq.Struct(Custom('a1'), Custom('a2'))
36+
self.s2 = rq.Struct(rq.Object('b1', self.s1), rq.Object('b2', self.s1))
37+
self.s3 = rq.Struct(rq.Object('c1', self.s2), rq.Object('c2', self.s2))
38+
39+
def testToBinary1(self):
40+
self.s1.to_binary('1', '2')
41+
42+
def testToBinary2(self):
43+
self.s2.to_binary(('1', '2'), ('3', '4'))
44+
45+
def testToBinary3(self):
46+
self.s3.to_binary((('1', '2'), ('3', '4')), (('5', '6'), ('7', '8')))
47+
48+
class TestListWithFancyValue(unittest.TestCase):
49+
def setUp(self):
50+
self.s1 = rq.Struct(rq.LengthOf('l', 4), rq.List('l', CustomObj))
51+
52+
def testToBinary1(self):
53+
self.s1.to_binary(['1', '2', '3'])
54+
55+
if __name__ == '__main__':
56+
unittest.main()

0 commit comments

Comments
 (0)