Passed
Push — master ( f980db...1c4121 )
by Fabio
01:20
created

tests.test_benedict.BenedictTestCase.test_unique()   A

Complexity

Conditions 1

Size

Total Lines 48
Code Lines 36

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 36
dl 0
loc 48
rs 9.016
c 0
b 0
f 0
cc 1
nop 1
1
# -*- coding: utf-8 -*-
2
3
from benedict import benedict
4
from datetime import datetime
5
from decimal import Decimal
6
7
import unittest
8
9
10
class BenedictTestCase(unittest.TestCase):
11
12
    def test_clean(self):
13
        d = {
14
            'a': {},
15
            'b': { 'x': 1 },
16
            'c': [],
17
            'd': [0, 1],
18
            'e': 0.0,
19
            'f': '',
20
            'g': None,
21
            'h': '0'
22
        }
23
        bd = benedict(d)
24
        bd.clean()
25
        r = {
26
            'b': { 'x': 1 },
27
            'd': [0, 1],
28
            'e': 0.0,
29
            'h': '0',
30
        }
31
        self.assertEqual(bd, r)
32
33
        bd = benedict(d)
34
        bd.clean(dicts=False)
35
        r = {
36
            'a': {},
37
            'b': { 'x': 1 },
38
            'd': [0, 1],
39
            'e': 0.0,
40
            'h': '0'
41
        }
42
        self.assertEqual(bd, r)
43
44
        bd = benedict(d)
45
        bd.clean(lists=False)
46
        r = {
47
            'b': { 'x': 1 },
48
            'c': [],
49
            'd': [0, 1],
50
            'e': 0.0,
51
            'h': '0'
52
        }
53
        self.assertEqual(bd, r)
54
55
        bd = benedict(d)
56
        bd.clean(strings=False)
57
        r = {
58
            'b': { 'x': 1 },
59
            'd': [0, 1],
60
            'e': 0.0,
61
            'f': '',
62
            'h': '0',
63
        }
64
        self.assertEqual(bd, r)
65
66
    def test_clone(self):
67
        d = {
68
            'a': {
69
                'b': {
70
                    'c': 1
71
                }
72
            }
73
        }
74
        b = benedict(d)
75
        c = b.clone()
76
        self.assertEqual(type(b), type(c))
77
        self.assertTrue(isinstance(c, benedict))
78
        self.assertEqual(b, c)
79
        self.assertFalse(c is b)
80
        c['a']['b']['c'] = 2
81
        self.assertEqual(b['a']['b']['c'], 1)
82
        self.assertEqual(c['a']['b']['c'], 2)
83
84
    def test_copy(self):
85
        d = {
86
            'a': {
87
                'b': {
88
                    'c': 1
89
                }
90
            }
91
        }
92
        b = benedict(d)
93
        c = b.copy()
94
        self.assertEqual(type(b), type(c))
95
        self.assertTrue(isinstance(c, benedict))
96
        self.assertEqual(b, c)
97
        self.assertFalse(c is b)
98
        c['a.b.c'] = 2
99
        self.assertEqual(b.get('a.b.c'), 2)
100
        self.assertEqual(c.get('a.b.c'), 2)
101
102
    def test_deepcopy(self):
103
        d = {
104
            'a': {
105
                'b': {
106
                    'c': 1
107
                }
108
            }
109
        }
110
        b = benedict(d)
111
        c = b.deepcopy()
112
        self.assertEqual(type(b), type(c))
113
        self.assertEqual(b, c)
114
        self.assertFalse(c is b)
115
        c['a.b.c'] = 2
116
        self.assertEqual(b.get('a.b.c'), 1)
117
        self.assertEqual(c.get('a.b.c'), 2)
118
119
    def test_deepupdate_with_single_dict(self):
120
        d = {
121
            'a': 1,
122
            'b': 1,
123
        }
124
        a = {
125
            'b': 2,
126
            'c': 3,
127
        }
128
        bd = benedict(d)
129
        bd.deepupdate(a)
130
        r = {
131
            'a': 1,
132
            'b': 2,
133
            'c': 3,
134
        }
135
        self.assertEqual(bd, r)
136
137
    def test_deepupdate_with_multiple_dicts(self):
138
        d = {
139
            'a': 1,
140
            'b': 1,
141
        }
142
        a = {
143
            'b': 2,
144
            'c': 3,
145
            'd': 3,
146
        }
147
        b = {
148
            'd': 5,
149
            'e': 5,
150
        }
151
        c = {
152
            'd': 4,
153
            'f': 6,
154
        }
155
        bd = benedict(d)
156
        bd.deepupdate(a, b, c)
157
        r = {
158
            'a': 1,
159
            'b': 2,
160
            'c': 3,
161
            'd': 4,
162
            'e': 5,
163
            'f': 6,
164
        }
165
        self.assertEqual(bd, r)
166
167
    def test_deepupdate(self):
168
        d = {
169
            'a': 1,
170
            'b': {
171
                'c': {
172
                    'x': 2,
173
                    'y': 3,
174
                },
175
                'd': {
176
                    'x': 4,
177
                    'y': 5,
178
                },
179
                'e': {
180
                    'x': 6,
181
                    'y': 7,
182
                },
183
            },
184
        }
185
        a = {
186
            'a': 0,
187
            'b': {
188
                'c': 1,
189
                'd': {
190
                    'y': 1,
191
                    'z': 2,
192
                },
193
                'e': {
194
                    'f': {
195
                        'x': 2,
196
                        'y': 3,
197
                    },
198
                    'g': {
199
                        'x': 4,
200
                        'y': 5,
201
                    },
202
                },
203
            },
204
        }
205
        bd = benedict(d)
206
        bd.deepupdate(a)
207
        r = {
208
            'a': 0,
209
            'b': {
210
                'c': 1,
211
                'd': {
212
                    'x': 4,
213
                    'y': 1,
214
                    'z': 2,
215
                },
216
                'e': {
217
                    'f': {
218
                        'x': 2,
219
                        'y': 3,
220
                    },
221
                    'g': {
222
                        'x': 4,
223
                        'y': 5,
224
                    },
225
                    'x': 6,
226
                    'y': 7,
227
                },
228
            },
229
        }
230
        self.assertEqual(bd, r)
231
232
    def test_dump(self):
233
        d = {
234
            'a': {
235
                'b': {
236
                    'c': 1
237
                }
238
            }
239
        }
240
        b = benedict(d)
241
        expected_output = """{
242
    "a": {
243
        "b": {
244
            "c": 1
245
        }
246
    }
247
}"""
248
        output = benedict.dump(b)
249
        self.assertEqual(output, expected_output)
250
        output = b.dump()
251
        self.assertEqual(output, expected_output)
252
253
    def test_dump_with_datetime(self):
254
        d = {
255
            'datetime': datetime(2019, 6, 11),
256
        }
257
        b = benedict(d)
258
        expected_output = """{
259
    "datetime": "2019-06-11 00:00:00"
260
}"""
261
        output = b.dump()
262
        self.assertEqual(output, expected_output)
263
264
    def test_dump_with_decimal(self):
265
        d = {
266
            'decimal': Decimal('1.75'),
267
        }
268
        b = benedict(d)
269
        expected_output = """{
270
    "decimal": "1.75"
271
}"""
272
        output = b.dump()
273
        self.assertEqual(output, expected_output)
274
275
    def test_filter(self):
276
        d = {
277
            'a': 1,
278
            'b': 2,
279
            'c': '4',
280
            'e': '5',
281
            'f': 6,
282
            'g': 7,
283
        }
284
        b = benedict(d)
285
        with self.assertRaises(ValueError):
286
            f = b.filter(True)
287
        f = b.filter(lambda key, val: isinstance(val, int))
288
        r = {
289
            'a': 1,
290
            'b': 2,
291
            'f': 6,
292
            'g': 7,
293
        }
294
        self.assertEqual(type(b), type(f))
295
        self.assertTrue(isinstance(f, benedict))
296
        self.assertEqual(f, r)
297
        self.assertFalse(b is f)
298
299
    def test_filter_with_parse(self):
300
        d = {
301
            'a': {
302
                'ok': 'yes',
303
            },
304
            'b': {
305
                'ok': 'no',
306
            },
307
            'c': {
308
                'ok': 'yes',
309
            },
310
            'e': {
311
                'ok': 'no',
312
            },
313
            'f': {
314
                'ok': 'yes',
315
            },
316
            'g': {
317
                'ok': 'no',
318
            },
319
        }
320
        b = benedict(d)
321
        f = b.filter(lambda key, val: benedict(val).get_bool('ok'))
322
        r = {
323
            'a': {
324
                'ok': 'yes',
325
            },
326
            'c': {
327
                'ok': 'yes',
328
            },
329
            'f': {
330
                'ok': 'yes',
331
            },
332
        }
333
        self.assertEqual(f, r)
334
        self.assertTrue(isinstance(f, benedict))
335
336
    def test_flatten(self):
337
        d = {
338
            'a': 1,
339
            'b': 2,
340
            'c': {
341
                'd': {
342
                    'e': 3,
343
                    'f': 4,
344
                    'g': {
345
                        'h': 5,
346
                    }
347
                }
348
            },
349
        }
350
        b = benedict(d)
351
        f = b.flatten()
352
        r = {
353
            'a': 1,
354
            'b': 2,
355
            'c_d_e': 3,
356
            'c_d_f': 4,
357
            'c_d_g_h': 5,
358
        }
359
        self.assertEqual(f, r)
360
        self.assertEqual(type(b), type(f))
361
        self.assertTrue(isinstance(f, benedict))
362
363
    def test_flatten_with_custom_separator(self):
364
        d = {
365
            'a': 1,
366
            'b': 2,
367
            'c': {
368
                'd': {
369
                    'e': 3,
370
                    'f': 4,
371
                    'g': {
372
                        'h': 5,
373
                    }
374
                }
375
            },
376
        }
377
        b = benedict(d)
378
        f = b.flatten(separator='|')
379
        r = {
380
            'a': 1,
381
            'b': 2,
382
            'c|d|e': 3,
383
            'c|d|f': 4,
384
            'c|d|g|h': 5,
385
        }
386
        self.assertEqual(f, r)
387
        self.assertFalse(b is f)
388
389
    def test_flatten_with_key_conflict(self):
390
        d = {
391
            'a': 1,
392
            'b': 2,
393
            'c_d': 4,
394
            'c': {
395
                'd': 3,
396
            },
397
        }
398
        b = benedict(d)
399
        f = b.flatten()
400
        r = {
401
            'a': 1,
402
            'b': 2,
403
            'c_d': 4,
404
        }
405
        self.assertEqual(f, r)
406
        self.assertFalse(b is f)
407
408
    def test_fromkeys(self):
409
        k = [
410
            'a',
411
            'a.b',
412
            'a.b.c',
413
            'a.b.d',
414
            'a.b.e',
415
            'x',
416
            'x.y',
417
            'x.z',
418
        ]
419
        b = benedict.fromkeys(k)
420
        r = {
421
            'x': {
422
                'y': None,
423
                'z': None,
424
            },
425
            'a': {
426
                'b': {
427
                    'c': None,
428
                    'd': None,
429
                    'e': None,
430
                },
431
            },
432
        }
433
        self.assertEqual(b, r)
434
        self.assertEqual(type(b), benedict)
435
436
    def test_fromkeys_with_value(self):
437
        k = [
438
            'a',
439
            'a.b',
440
            'a.b.c',
441
            'a.b.d',
442
            'a.b.e',
443
            'x',
444
            'x.y',
445
            'x.z',
446
        ]
447
        b = benedict.fromkeys(k, True)
448
        r = {
449
            'x': {
450
                'y': True,
451
                'z': True,
452
            },
453
            'a': {
454
                'b': {
455
                    'c': True,
456
                    'd': True,
457
                    'e': True,
458
                },
459
            },
460
        }
461
        self.assertEqual(b, r)
462
        self.assertEqual(type(b), benedict)
463
464
    def test_from_base64(self):
465
        j = 'eyJhIjogMSwgImIiOiAyLCAiYyI6IDN9'
466
        # static method
467
        d = benedict.from_base64(j)
468
        self.assertTrue(isinstance(d, benedict))
469
        self.assertEqual(d, { 'a': 1, 'b': 2, 'c': 3, })
470
        # constructor
471
        d = benedict(j)
472
        self.assertTrue(isinstance(d, benedict))
473
        self.assertEqual(d, { 'a': 1, 'b': 2, 'c': 3, })
474
475
    def test_from_json(self):
476
        j = '{"a": 1, "b": 2, "c": 3}'
477
        # static method
478
        d = benedict.from_json(j)
479
        self.assertTrue(isinstance(d, benedict))
480
        self.assertEqual(d, { 'a': 1, 'b': 2, 'c': 3, })
481
        # constructor
482
        d = benedict(j)
483
        self.assertTrue(isinstance(d, benedict))
484
        self.assertEqual(d, { 'a': 1, 'b': 2, 'c': 3, })
485
486
    def test_from_toml(self):
487
        j = """
488
            a = 1
489
490
            [b]
491
            c = 3
492
            d = 4
493
        """
494
        # static method
495
        d = benedict.from_toml(j)
496
        self.assertTrue(isinstance(d, benedict))
497
        self.assertEqual(d, { 'a':1, 'b':{ 'c':3, 'd':4 },})
498
        # constructor
499
        d = benedict(j)
500
        self.assertTrue(isinstance(d, benedict))
501
        self.assertEqual(d, { 'a':1, 'b':{ 'c':3, 'd':4 },})
502
503
    def test_from_xml(self):
504
        j = """<?xml version="1.0" ?>
505
            <root>
506
                <a>1</a>
507
                <b>
508
                    <c>3</c>
509
                    <d>4</d>
510
                </b>
511
            </root>
512
        """
513
        # static method
514
        d = benedict.from_xml(j)
515
        self.assertTrue(isinstance(d, benedict))
516
        self.assertEqual(d.get('root'), { 'a':'1', 'b':{ 'c':'3', 'd':'4' },})
517
        # constructor
518
        d = benedict(j)
519
        self.assertTrue(isinstance(d, benedict))
520
        self.assertEqual(d.get('root'), { 'a':'1', 'b':{ 'c':'3', 'd':'4' },})
521
522
    def test_from_yaml(self):
523
        j = """
524
            a: 1
525
            b:
526
              c: 3
527
              d: 4
528
        """
529
        # static method
530
        d = benedict.from_yaml(j)
531
        self.assertTrue(isinstance(d, benedict))
532
        self.assertEqual(d, { 'a':1, 'b':{ 'c':3, 'd':4 },})
533
        # constructor
534
        d = benedict(j)
535
        self.assertTrue(isinstance(d, benedict))
536
        self.assertEqual(d, { 'a':1, 'b':{ 'c':3, 'd':4 },})
537
538
    def test_get(self):
539
        d = {
540
            'a': 1,
541
            'b': {
542
                'c': 2,
543
                'd': {
544
                    'e': 3,
545
                }
546
            }
547
        }
548
        b = benedict(d)
549
        self.assertEqual(b.get('a'), 1)
550
        self.assertEqual(b.get('b.c'), 2)
551
        # self.assertTrue(isinstance(b.get('b'), benedict))
552
        # self.assertTrue(isinstance(b.get('b.d'), benedict))
553
        # bb = b.get('b')
554
        # self.assertTrue(isinstance(bb.get('d'), benedict))
555
556
    def test_get_item(self):
557
        d = {
558
            'a': 1,
559
            'b': {
560
                'c': 2,
561
                'd': {
562
                    'e': 3,
563
                }
564
            }
565
        }
566
        b = benedict(d)
567
        self.assertEqual(b['a'], 1)
568
        self.assertEqual(b['b.c'], 2)
569
        # self.assertTrue(isinstance(b['b'], benedict))
570
        # self.assertTrue(isinstance(b['b.d'], benedict))
571
        # bb = b['b']
572
        # self.assertTrue(isinstance(bb['d'], benedict))
573
574
    def test_get_dict(self):
575
        d = {
576
            'a': {'x': 1, 'y': 2},
577
            'b': {},
578
        }
579
        b = benedict(d)
580
        # self.assertTrue(isinstance(b.get_dict('a'), benedict))
581
        self.assertEqual(b.get('a.x'), 1)
582
583
    def test_get_list(self):
584
        d = {
585
            'a': [
586
                {
587
                    'b': {
588
                        'c': 1,
589
                    }
590
                },
591
                {
592
                    'b': {
593
                        'c': 2,
594
                    }
595
                },
596
                {
597
                    'b': {
598
                        'c': 3,
599
                    }
600
                },
601
            ]
602
        }
603
        b = benedict(d)
604
        l = b.get_list('a')
605
        # self.assertTrue(isinstance(l[0], benedict))
606
        # self.assertTrue(isinstance(l[1], benedict))
607
        # self.assertTrue(isinstance(l[2], benedict))
608
        # self.assertEqual(l[0].get('b.c'), 1)
609
        # self.assertEqual(l[1].get('b.c'), 2)
610
        # self.assertEqual(l[2].get('b.c'), 3)
611
        self.assertEqual(benedict(l[0]).get('b.c'), 1)
612
        self.assertEqual(benedict(l[1]).get('b.c'), 2)
613
        self.assertEqual(benedict(l[2]).get('b.c'), 3)
614
615
    def test_get_list_item(self):
616
        d = {
617
            'a': [
618
                {
619
                    'b': {
620
                        'c': 1,
621
                    }
622
                },
623
                {
624
                    'b': {
625
                        'c': 2,
626
                    }
627
                },
628
                {
629
                    'b': {
630
                        'c': 3,
631
                    }
632
                },
633
            ]
634
        }
635
        b = benedict(d)
636
        i = benedict(b.get_list_item('a', index=1))
637
        # self.assertTrue(isinstance(i, benedict))
638
        self.assertEqual(i.get('b.c'), 2)
639
640
    def test_get_phonenumber(self):
641
        d = {
642
            'a': {
643
                'b': ' (0039) 3334445566 ',
644
                'c': '+393334445566  ',
645
                'd': '+39333444556677889900',
646
            }
647
        }
648
        r = {
649
            'e164': '+393334445566',
650
            'international': '+39 333 444 5566',
651
            'national': '333 444 5566'
652
        }
653
        b = benedict(d)
654
655
        p = b.get_phonenumber('a.b')
656
        self.assertEqual(p, r)
657
        # self.assertTrue(isinstance(p, benedict))
658
659
        p = b.get_phonenumber('a.c')
660
        self.assertEqual(p, r)
661
        # self.assertTrue(isinstance(p, benedict))
662
663
        p = b.get_phonenumber('a.d')
664
        self.assertEqual(p, {})
665
        # self.assertTrue(isinstance(p, benedict))
666
667
    def test_invert(self):
668
        d = {
669
            'a': 1,
670
            'b': 2,
671
            'c': 3,
672
            'd': 4,
673
            'e': 5,
674
        }
675
        bd = benedict(d)
676
        i = bd.invert()
677
        r = {
678
            1: ['a'],
679
            2: ['b'],
680
            3: ['c'],
681
            4: ['d'],
682
            5: ['e'],
683
        }
684
        self.assertEqual(i, r)
685
686
    def test_invert_multiple_values(self):
687
        d = {
688
            'a': 1,
689
            'b': 2,
690
            'c': 3,
691
            'd': 1,
692
            'e': 2,
693
            'f': 3,
694
        }
695
        bd = benedict(d)
696
        i = bd.invert()
697
        self.assertTrue('a' and 'd' in i[1])
698
        self.assertTrue('b' and 'e' in i[2])
699
        self.assertTrue('c' and 'f' in i[3])
700
701
    def test_invert_flat(self):
702
        d = {
703
            'a': 1,
704
            'b': 2,
705
            'c': 3,
706
            'd': 4,
707
            'e': 5,
708
        }
709
        bd = benedict(d)
710
        i = bd.invert(flat=True)
711
        r = {
712
            1: 'a',
713
            2: 'b',
714
            3: 'c',
715
            4: 'd',
716
            5: 'e',
717
        }
718
        self.assertEqual(i, r)
719
720
    def test_items_sorted_by_keys(self):
721
        d = {
722
            'y': 3,
723
            'a': 6,
724
            'f': 9,
725
            'z': 4,
726
            'x': 1,
727
        }
728
        bd = benedict(d)
729
        items = bd.items_sorted_by_keys()
730
        self.assertEqual(items, [
731
            ('a', 6,),
732
            ('f', 9,),
733
            ('x', 1,),
734
            ('y', 3,),
735
            ('z', 4,),
736
        ])
737
738
    def test_items_sorted_by_keys_reverse(self):
739
        d = {
740
            'y': 3,
741
            'a': 6,
742
            'f': 9,
743
            'z': 4,
744
            'x': 1,
745
        }
746
        bd = benedict(d)
747
        items = bd.items_sorted_by_keys(reverse=True)
748
        self.assertEqual(items, [
749
            ('z', 4,),
750
            ('y', 3,),
751
            ('x', 1,),
752
            ('f', 9,),
753
            ('a', 6,),
754
        ])
755
756
    def test_items_sorted_by_values(self):
757
        d = {
758
            'a': 3,
759
            'b': 6,
760
            'c': 9,
761
            'e': 4,
762
            'd': 1,
763
        }
764
        bd = benedict(d)
765
        items = bd.items_sorted_by_values()
766
        self.assertEqual(items, [
767
            ('d', 1,),
768
            ('a', 3,),
769
            ('e', 4,),
770
            ('b', 6,),
771
            ('c', 9,),
772
        ])
773
774
    def test_items_sorted_by_values_reverse(self):
775
        d = {
776
            'a': 3,
777
            'b': 6,
778
            'c': 9,
779
            'e': 4,
780
            'd': 1,
781
        }
782
        bd = benedict(d)
783
        items = bd.items_sorted_by_values(reverse=True)
784
        self.assertEqual(items, [
785
            ('c', 9,),
786
            ('b', 6,),
787
            ('e', 4,),
788
            ('a', 3,),
789
            ('d', 1,),
790
        ])
791
792
    def test_merge_with_single_dict(self):
793
        d = {
794
            'a': 1,
795
            'b': 1,
796
        }
797
        a = {
798
            'b': 2,
799
            'c': 3,
800
        }
801
        d = benedict(d)
802
        d.merge(a)
803
        r = {
804
            'a': 1,
805
            'b': 2,
806
            'c': 3,
807
        }
808
        self.assertEqual(d, r)
809
810
    def test_merge_with_multiple_dicts(self):
811
        d = {
812
            'a': 1,
813
            'b': 1,
814
        }
815
        a = {
816
            'b': 2,
817
            'c': 3,
818
            'd': 3,
819
        }
820
        b = {
821
            'd': 5,
822
            'e': 5,
823
        }
824
        c = {
825
            'd': 4,
826
            'f': 6,
827
        }
828
        d = benedict(d)
829
        d.merge(a, b, c)
830
        r = {
831
            'a': 1,
832
            'b': 2,
833
            'c': 3,
834
            'd': 4,
835
            'e': 5,
836
            'f': 6,
837
        }
838
        self.assertEqual(d, r)
839
840
    def test_merge(self):
841
        d = {
842
            'a': 1,
843
            'b': {
844
                'c': {
845
                    'x': 2,
846
                    'y': 3,
847
                },
848
                'd': {
849
                    'x': 4,
850
                    'y': 5,
851
                },
852
                'e': {
853
                    'x': 6,
854
                    'y': 7,
855
                },
856
            },
857
        }
858
        a = {
859
            'a': 0,
860
            'b': {
861
                'c': 1,
862
                'd': {
863
                    'y': 1,
864
                    'z': 2,
865
                },
866
                'e': {
867
                    'f': {
868
                        'x': 2,
869
                        'y': 3,
870
                    },
871
                    'g': {
872
                        'x': 4,
873
                        'y': 5,
874
                    },
875
                },
876
            },
877
        }
878
        d = benedict(d)
879
        d.merge(a)
880
        r = {
881
            'a': 0,
882
            'b': {
883
                'c': 1,
884
                'd': {
885
                    'x': 4,
886
                    'y': 1,
887
                    'z': 2,
888
                },
889
                'e': {
890
                    'f': {
891
                        'x': 2,
892
                        'y': 3,
893
                    },
894
                    'g': {
895
                        'x': 4,
896
                        'y': 5,
897
                    },
898
                    'x': 6,
899
                    'y': 7,
900
                },
901
            },
902
        }
903
        self.assertEqual(d, r)
904
905
    def test_move(self):
906
        d = {
907
            'a': {
908
                'x': 1,
909
                'y': 1,
910
            },
911
            'b': {
912
                'x': 2,
913
                'y': 2,
914
            },
915
            'c': {
916
                'x': 3,
917
                'y': 3,
918
            },
919
        }
920
        b = benedict(d)
921
        b.move('a', 'c.z')
922
        r = {
923
            'b': {
924
                'x': 2,
925
                'y': 2,
926
            },
927
            'c': {
928
                'x': 3,
929
                'y': 3,
930
                'z': {
931
                    'x': 1,
932
                    'y': 1,
933
                },
934
            },
935
        }
936
        self.assertEqual(b, r)
937
938
    def test_pop(self):
939
        d = {
940
            'a': 1,
941
            'b': {
942
                'c': 2,
943
                'd': {
944
                    'e': 3,
945
                }
946
            }
947
        }
948
        b = benedict(d)
949
        self.assertEqual(b.pop('a'), 1)
950
        self.assertEqual(b.pop('b.c'), 2)
951
        # self.assertTrue(isinstance(b.pop('b.d'), benedict))
952
953
    def test_remove_with_key(self):
954
        d = {
955
            'a': 1,
956
            'b': 2,
957
            'c': '4',
958
        }
959
        b = benedict(d)
960
        b.remove('c')
961
        r = {
962
            'a': 1,
963
            'b': 2,
964
        }
965
        self.assertEqual(b, r)
966
967
    def test_remove_with_keys_list(self):
968
        d = {
969
            'a': 1,
970
            'b': 2,
971
            'c': '4',
972
            'e': '5',
973
            'f': 6,
974
            'g': 7,
975
        }
976
        b = benedict(d)
977
        b.remove(['c', 'e', 'f', 'g', 'x', 'y', 'z'])
978
        r = {
979
            'a': 1,
980
            'b': 2,
981
        }
982
        self.assertEqual(b, r)
983
984
    def test_remove_with_keys_args(self):
985
        d = {
986
            'a': 1,
987
            'b': 2,
988
            'c': '4',
989
            'e': '5',
990
            'f': 6,
991
            'g': 7,
992
        }
993
        b = benedict(d)
994
        b.remove('c', 'e', 'f', 'g', 'x', 'y', 'z')
995
        r = {
996
            'a': 1,
997
            'b': 2,
998
        }
999
        self.assertEqual(b, r)
1000
1001
    def test_remove_with_keypath(self):
1002
        d = {
1003
            'a': {
1004
                'x': 1,
1005
                'y': 1,
1006
            },
1007
            'b': {
1008
                'x': 2,
1009
                'y': 2,
1010
            },
1011
            'c': {
1012
                'x': 3,
1013
                'y': 3,
1014
            },
1015
            'd': {
1016
                'x': 4,
1017
                'y': 4,
1018
            },
1019
        }
1020
        b = benedict(d)
1021
        b.remove(['a.x', 'b.y', 'c.x', 'c.y', 'd'])
1022
        r = {
1023
            'a': {
1024
                'y': 1
1025
            },
1026
            'b': {
1027
                'x': 2
1028
            },
1029
            'c': {
1030
            },
1031
        }
1032
        self.assertEqual(b, r)
1033
1034
    # def test_setdefault(self):
1035
    #     d = {
1036
    #         'a': 1,
1037
    #         'b': {
1038
    #             'c': 2,
1039
    #             'd': {
1040
    #                 'e': 3,
1041
    #             }
1042
    #         }
1043
    #     }
1044
    #     b = benedict(d)
1045
    #     self.assertTrue(isinstance(b.setdefault('b', 1), benedict))
1046
    #     self.assertTrue(isinstance(b.setdefault('b.d', 1), benedict))
1047
1048
    def test_subset(self):
1049
        d = {
1050
            'a': 1,
1051
            'b': 2,
1052
            'c': '4',
1053
            'e': '5',
1054
            'f': 6,
1055
            'g': 7,
1056
        }
1057
        b = benedict(d)
1058
        f = b.subset(['c', 'f', 'x'])
1059
        r = {
1060
            'c': '4',
1061
            'f': 6,
1062
            'x': None,
1063
        }
1064
        self.assertEqual(f, r)
1065
        self.assertFalse(f is b)
1066
        self.assertEqual(type(b), type(f))
1067
        self.assertTrue(isinstance(f, benedict))
1068
1069
    def test_subset_with_keys_args(self):
1070
        d = {
1071
            'a': 1,
1072
            'b': 2,
1073
            'c': '4',
1074
            'e': '5',
1075
            'f': 6,
1076
            'g': 7,
1077
        }
1078
        b = benedict(d)
1079
        f = b.subset('c', 'f', 'x')
1080
        r = {
1081
            'c': '4',
1082
            'f': 6,
1083
            'x': None,
1084
        }
1085
        self.assertEqual(f, r)
1086
        self.assertFalse(f is b)
1087
1088
    def test_subset_with_keypath(self):
1089
        d = {
1090
            'x': {
1091
                'a': 1,
1092
                'aa': 1,
1093
            },
1094
            'y': {
1095
                'b': 2,
1096
                'bb': 2,
1097
            },
1098
            'z': {
1099
                'c': 3,
1100
                'cc': 3,
1101
            },
1102
        }
1103
        b = benedict(d)
1104
        f = b.subset(['x', 'y'])
1105
        r = {
1106
            'x': {
1107
                'a': 1,
1108
                'aa': 1,
1109
            },
1110
            'y': {
1111
                'b': 2,
1112
                'bb': 2,
1113
            },
1114
        }
1115
        self.assertEqual(f, r)
1116
        self.assertFalse(f is b)
1117
        self.assertTrue(isinstance(f, benedict))
1118
        self.assertEqual(f.get('x.a'), 1)
1119
        self.assertEqual(f.get('x.aa'), 1)
1120
        self.assertEqual(f.get('y.b'), 2)
1121
        self.assertEqual(f.get('y.bb'), 2)
1122
        # test with keypath
1123
        f = b.subset(['x.a', 'y.b'])
1124
        r = {
1125
            'x': {
1126
                'a': 1,
1127
            },
1128
            'y': {
1129
                'b': 2,
1130
            },
1131
        }
1132
        self.assertEqual(f, r)
1133
        self.assertFalse(f is b)
1134
        self.assertTrue(isinstance(f, benedict))
1135
        self.assertEqual(f.get('x.a'), 1)
1136
        self.assertEqual(f.get('y.b'), 2)
1137
1138
    def test_swap(self):
1139
        d = {
1140
            'a': 1,
1141
            'b': 2,
1142
            'c': 3,
1143
        }
1144
        b = benedict(d)
1145
        b.swap('a', 'b')
1146
        r = {
1147
            'a': 2,
1148
            'b': 1,
1149
            'c': 3,
1150
        }
1151
        self.assertEqual(b, r)
1152
1153
    def test_swap_with_invalid_key(self):
1154
        d = {
1155
            'a': 1,
1156
            'b': 2,
1157
            'c': 3,
1158
        }
1159
        b = benedict(d)
1160
        with self.assertRaises(KeyError):
1161
            b.swap('a', 'd')
1162
1163
    def test_swap_with_keypath(self):
1164
        d = {
1165
            'a': {
1166
                'x': 1,
1167
                'y': 1,
1168
            },
1169
            'b': {
1170
                'x': 2,
1171
                'y': 2,
1172
            },
1173
            'c': {
1174
                'x': 3,
1175
                'y': 3,
1176
            },
1177
        }
1178
        b = benedict(d)
1179
        b.swap('a.y', 'b.y')
1180
        b.swap('b.x', 'c.x')
1181
        b.swap('a', 'c')
1182
        r = {
1183
            'a': {
1184
                'x': 2,
1185
                'y': 3,
1186
            },
1187
            'b': {
1188
                'x': 3,
1189
                'y': 1,
1190
            },
1191
            'c': {
1192
                'x': 1,
1193
                'y': 2,
1194
            },
1195
        }
1196
        self.assertEqual(b, r)
1197
1198
    def test_unique(self):
1199
        d = {
1200
            'a': {
1201
                'x': 1,
1202
                'y': 1,
1203
            },
1204
            'b': {
1205
                'x': 2,
1206
                'y': 2,
1207
            },
1208
            'c': {
1209
                'x': 1,
1210
                'y': 1,
1211
            },
1212
            'd': {
1213
                'x': 1,
1214
            },
1215
            'e': {
1216
                'x': 1,
1217
                'y': 1,
1218
                'z': 1,
1219
            },
1220
            'f': {
1221
                'x': 2,
1222
                'y': 2,
1223
            },
1224
        }
1225
        b = benedict(d)
1226
        b.unique()
1227
        r = {
1228
            'a': {
1229
                'x': 1,
1230
                'y': 1,
1231
            },
1232
            'b': {
1233
                'x': 2,
1234
                'y': 2,
1235
            },
1236
            'd': {
1237
                'x': 1,
1238
            },
1239
            'e': {
1240
                'x': 1,
1241
                'y': 1,
1242
                'z': 1,
1243
            },
1244
        }
1245
        self.assertEqual(b, r)
1246