Test_10_get.test_10_empty_path()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
c 1
b 0
f 1
dl 0
loc 5
rs 9.4285
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
This code seems to be duplicated in your project.
Loading history...
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
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
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