1 | # |
||
2 | # Copyright (C) 2011 - 2016 Satoru SATOH <ssato @ redhat.com> |
||
3 | # |
||
4 | # pylint: disable=missing-docstring,invalid-name |
||
5 | from __future__ import absolute_import |
||
6 | |||
7 | import collections |
||
8 | import unittest |
||
9 | import m9dicts.api as TT |
||
10 | import m9dicts.dicts as MD |
||
11 | import m9dicts.globals as MG |
||
12 | |||
13 | from m9dicts.tests.common import dicts_equal |
||
14 | from m9dicts.compat import OrderedDict |
||
15 | |||
16 | |||
17 | class Test_10_get(unittest.TestCase): |
||
18 | |||
19 | def test_10_empty_path(self): |
||
20 | dic = dict(a=1, b=[1, 2]) |
||
21 | (dic2, err) = TT.get(dic, '') |
||
22 | self.assertEqual(err, '') |
||
23 | self.assertTrue(dicts_equal(dic2, dic)) |
||
24 | |||
25 | def test_20_json_pointer(self): |
||
26 | # test case in rfc, http://tools.ietf.org/html/rfc6901 |
||
27 | dic = {"foo": ["bar", "baz"], |
||
28 | "": 0, |
||
29 | "a/b": 1, |
||
30 | "c%d": 2, |
||
31 | "e^f": 3, |
||
32 | "g|h": 4, |
||
33 | r"i\\j": 5, |
||
34 | r'k\"l': 6, |
||
35 | " ": 7, |
||
36 | "m~n": 8} |
||
37 | |||
38 | self.assertTrue(dicts_equal(TT.get(dic, "")[0], dic)) |
||
39 | self.assertEqual(TT.get(dic, "/foo")[0], ["bar", "baz"]) |
||
40 | self.assertEqual(TT.get(dic, "/foo/0")[0], "bar") |
||
41 | self.assertEqual(TT.get(dic, "/")[0], 0) |
||
42 | self.assertEqual(TT.get(dic, "/a~1b")[0], 1) |
||
43 | self.assertEqual(TT.get(dic, "/c%d")[0], 2) |
||
44 | self.assertEqual(TT.get(dic, "/e^f")[0], 3) |
||
45 | self.assertEqual(TT.get(dic, "/g|h")[0], 4) |
||
46 | self.assertEqual(TT.get(dic, r"/i\\j")[0], 5) |
||
47 | self.assertEqual(TT.get(dic, r'/k\"l')[0], 6) |
||
48 | self.assertEqual(TT.get(dic, "/ ")[0], 7) |
||
49 | self.assertEqual(TT.get(dic, "/m~0n")[0], 8) |
||
50 | |||
51 | def test_22_json_pointer__array(self): |
||
52 | dic = dict(a=[1, 2], ) |
||
53 | self.assertEqual(TT.get(dic, "/a/1"), (2, '')) |
||
54 | |||
55 | (val, msg) = TT.get(dic, "/a/2") |
||
56 | self.assertTrue(val is None) |
||
57 | self.assertTrue(bool(msg)) |
||
58 | # maybe the error message depends on python version. |
||
59 | # self.assertEqual(msg, 'list index out of range') |
||
60 | |||
61 | (val, msg) = TT.get(dic, "/a/b/d/-") |
||
62 | self.assertTrue(val is None) |
||
63 | self.assertTrue(bool(msg)) |
||
64 | # Likewise. |
||
65 | # self.assertEqual(msg, 'list indices must be integers...') |
||
66 | |||
67 | |||
68 | _CNF_0 = OrderedDict((("name", "a"), ("a", 1), |
||
69 | ("b", OrderedDict((("b", (1, 2)), ))), |
||
70 | ("c", "C"), ("e", [3, 4]), ("f", None))) |
||
71 | |||
72 | |||
73 | class Test_20_make(unittest.TestCase): |
||
74 | |||
75 | def test_00_null(self): |
||
76 | md0 = TT.make() |
||
77 | |||
78 | # check if md0 is an object of base and default class: |
||
79 | self.assertTrue(isinstance(md0, MD.UpdateWithReplaceDict)) |
||
80 | self.assertTrue(isinstance(md0, MD.UpdateWithMergeDict)) |
||
81 | self.assertTrue(not md0) |
||
82 | |||
83 | View Code Duplication | def test_10_default(self): |
|
0 ignored issues
–
show
Duplication
introduced
by
![]() |
|||
84 | md0 = TT.make(_CNF_0) |
||
85 | |||
86 | self.assertTrue(isinstance(md0, MD.UpdateWithReplaceDict)) |
||
87 | self.assertTrue(isinstance(md0, MD.UpdateWithMergeDict)) |
||
88 | self.assertTrue(isinstance(md0["b"], MD.UpdateWithReplaceDict)) |
||
89 | self.assertTrue(isinstance(md0["b"], MD.UpdateWithMergeDict)) |
||
90 | for k in "name a c e f".split(): |
||
91 | self.assertTrue(md0[k] == _CNF_0[k], |
||
92 | "%r vs. %r" % (md0[k], _CNF_0[k])) |
||
93 | |||
94 | def test_20_merge(self): |
||
95 | md1 = TT.make(_CNF_0, merge=MG.MS_REPLACE) |
||
96 | md2 = TT.make(_CNF_0, merge=MG.MS_NO_REPLACE) |
||
97 | md3 = TT.make(_CNF_0, merge=MG.MS_DICTS_AND_LISTS) |
||
98 | |||
99 | self.assertTrue(isinstance(md1, MD.UpdateWithReplaceDict)) |
||
100 | self.assertTrue(isinstance(md2, MD.UpdateWoReplaceDict)) |
||
101 | self.assertTrue(isinstance(md3, MD.UpdateWithMergeListsDict)) |
||
102 | |||
103 | for idx, mdn in enumerate((md1, md2, md3)): |
||
104 | self.assertTrue(isinstance(mdn["b"], type(mdn)), |
||
105 | "#%d %r (%r)" % (idx, mdn["b"], type(mdn["b"]))) |
||
106 | for k in "name a c e f".split(): |
||
107 | self.assertTrue(mdn[k] == _CNF_0[k], |
||
108 | "%r vs. %r" % (mdn[k], _CNF_0[k])) |
||
109 | |||
110 | raised = False |
||
111 | md4 = None |
||
112 | try: |
||
113 | md4 = TT.make(_CNF_0, merge="invalid_merge") |
||
114 | except ValueError: |
||
115 | raised = True |
||
116 | self.assertTrue(raised, "md4 = %r" % type(md4)) |
||
117 | |||
118 | View Code Duplication | def test_30_ordered(self): |
|
0 ignored issues
–
show
|
|||
119 | md0 = TT.make(_CNF_0, ordered=True) |
||
120 | |||
121 | self.assertTrue(isinstance(md0, MD.UpdateWithReplaceDict)) |
||
122 | self.assertTrue(isinstance(md0, MD.UpdateWithMergeOrderedDict)) |
||
123 | self.assertTrue(isinstance(md0["b"], MD.UpdateWithReplaceDict)) |
||
124 | self.assertTrue(isinstance(md0["b"], MD.UpdateWithMergeOrderedDict)) |
||
125 | for k in "name a c e f".split(): |
||
126 | self.assertTrue(md0[k] == _CNF_0[k], |
||
127 | "%r vs. %r" % (md0[k], _CNF_0[k])) |
||
128 | |||
129 | def test_40_namedtuple(self): |
||
130 | _point = collections.namedtuple("Point", "x y") |
||
131 | _triangle = collections.namedtuple("Triangle", "p0 p1 p2") |
||
132 | obj = _triangle(_point(0, 0), _point(1, 0), _point(0, 1)) |
||
133 | md0 = TT.make(obj) |
||
134 | |||
135 | self.assertTrue(isinstance(md0, MD.UpdateWithMergeOrderedDict)) |
||
136 | self.assertTrue(isinstance(md0["p0"], MD.UpdateWithMergeOrderedDict)) |
||
137 | |||
138 | for k in "p0 p1 p2".split(): |
||
139 | self.assertEqual(md0[MG.NTPL_CLS_KEY], "Triangle") |
||
140 | for k2 in "x y".split(): |
||
141 | self.assertEqual(md0[k][MG.NTPL_CLS_KEY], "Point") |
||
142 | ref = getattr(getattr(obj, k), k2) |
||
143 | self.assertTrue(md0[k][k2] == ref, |
||
144 | "%r vs. %r" % (md0[k][k2], ref)) |
||
145 | |||
146 | |||
147 | class Test_30_convert_to(unittest.TestCase): |
||
148 | |||
149 | def test_00_none(self): |
||
150 | self.assertTrue(TT.convert_to(None) is None) |
||
151 | |||
152 | def test_10_iterable(self): |
||
153 | for inp in ([], [0, 1, 2], (), (0, 1), [0, [1, [2]]]): |
||
154 | self.assertEqual(TT.convert_to(inp), inp) |
||
155 | |||
156 | def test_20_mdict(self): |
||
157 | md0 = TT.make(_CNF_0) |
||
158 | dic0 = TT.convert_to(md0) |
||
159 | |||
160 | for k in "name a c e f".split(): |
||
161 | self.assertTrue(dic0[k] == md0[k], "%r vs. %r" % (dic0[k], md0[k])) |
||
162 | |||
163 | for k in dic0["b"].keys(): |
||
164 | self.assertTrue(dic0["b"][k] == md0["b"][k]) |
||
165 | |||
166 | def test_30_to_namedtuple(self): |
||
167 | _point = collections.namedtuple("Point", "x y") |
||
168 | _triangle = collections.namedtuple("Triangle", "p0 p1 p2") |
||
169 | itpl = _triangle(_point(0, 0), _point(1, 0), _point(0, 1)) |
||
170 | md0 = TT.make(itpl) |
||
171 | otpl = TT.convert_to(md0, to_type=MG.NAMED_TUPLE_TYPE) |
||
172 | self.assertEqual(otpl, itpl) |
||
173 | |||
174 | # vim:sw=4:ts=4:et: |
||
175 |