|
1 | 1 | # Python test set -- part 6, built-in types |
2 | 2 |
|
3 | 3 | from test.support import run_unittest, run_with_locale |
4 | | -import unittest |
5 | | -import sys |
| 4 | +import collections |
6 | 5 | import locale |
| 6 | +import sys |
| 7 | +import types |
| 8 | +import unittest |
7 | 9 |
|
8 | 10 | class TypesTests(unittest.TestCase): |
9 | 11 |
|
@@ -569,8 +571,184 @@ def test_internal_sizes(self): |
569 | 571 | self.assertGreater(tuple.__itemsize__, 0) |
570 | 572 |
|
571 | 573 |
|
| 574 | +class MappingProxyTests(unittest.TestCase): |
| 575 | + mappingproxy = types.MappingProxyType |
| 576 | + |
| 577 | + def test_constructor(self): |
| 578 | + class userdict(dict): |
| 579 | + pass |
| 580 | + |
| 581 | + mapping = {'x': 1, 'y': 2} |
| 582 | + self.assertEqual(self.mappingproxy(mapping), mapping) |
| 583 | + mapping = userdict(x=1, y=2) |
| 584 | + self.assertEqual(self.mappingproxy(mapping), mapping) |
| 585 | + mapping = collections.ChainMap({'x': 1}, {'y': 2}) |
| 586 | + self.assertEqual(self.mappingproxy(mapping), mapping) |
| 587 | + |
| 588 | + self.assertRaises(TypeError, self.mappingproxy, 10) |
| 589 | + self.assertRaises(TypeError, self.mappingproxy, ("a", "tuple")) |
| 590 | + self.assertRaises(TypeError, self.mappingproxy, ["a", "list"]) |
| 591 | + |
| 592 | + def test_methods(self): |
| 593 | + attrs = set(dir(self.mappingproxy({}))) - set(dir(object())) |
| 594 | + self.assertEqual(attrs, { |
| 595 | + '__contains__', |
| 596 | + '__getitem__', |
| 597 | + '__iter__', |
| 598 | + '__len__', |
| 599 | + 'copy', |
| 600 | + 'get', |
| 601 | + 'items', |
| 602 | + 'keys', |
| 603 | + 'values', |
| 604 | + }) |
| 605 | + |
| 606 | + def test_get(self): |
| 607 | + view = self.mappingproxy({'a': 'A', 'b': 'B'}) |
| 608 | + self.assertEqual(view['a'], 'A') |
| 609 | + self.assertEqual(view['b'], 'B') |
| 610 | + self.assertRaises(KeyError, view.__getitem__, 'xxx') |
| 611 | + self.assertEqual(view.get('a'), 'A') |
| 612 | + self.assertIsNone(view.get('xxx')) |
| 613 | + self.assertEqual(view.get('xxx', 42), 42) |
| 614 | + |
| 615 | + def test_missing(self): |
| 616 | + class dictmissing(dict): |
| 617 | + def __missing__(self, key): |
| 618 | + return "missing=%s" % key |
| 619 | + |
| 620 | + view = self.mappingproxy(dictmissing(x=1)) |
| 621 | + self.assertEqual(view['x'], 1) |
| 622 | + self.assertEqual(view['y'], 'missing=y') |
| 623 | + self.assertEqual(view.get('x'), 1) |
| 624 | + self.assertEqual(view.get('y'), None) |
| 625 | + self.assertEqual(view.get('y', 42), 42) |
| 626 | + self.assertTrue('x' in view) |
| 627 | + self.assertFalse('y' in view) |
| 628 | + |
| 629 | + def test_customdict(self): |
| 630 | + class customdict(dict): |
| 631 | + def __contains__(self, key): |
| 632 | + if key == 'magic': |
| 633 | + return True |
| 634 | + else: |
| 635 | + return dict.__contains__(self, key) |
| 636 | + |
| 637 | + def __iter__(self): |
| 638 | + return iter(('iter',)) |
| 639 | + |
| 640 | + def __len__(self): |
| 641 | + return 500 |
| 642 | + |
| 643 | + def copy(self): |
| 644 | + return 'copy' |
| 645 | + |
| 646 | + def keys(self): |
| 647 | + return 'keys' |
| 648 | + |
| 649 | + def items(self): |
| 650 | + return 'items' |
| 651 | + |
| 652 | + def values(self): |
| 653 | + return 'values' |
| 654 | + |
| 655 | + def __getitem__(self, key): |
| 656 | + return "getitem=%s" % dict.__getitem__(self, key) |
| 657 | + |
| 658 | + def get(self, key, default=None): |
| 659 | + return "get=%s" % dict.get(self, key, 'default=%r' % default) |
| 660 | + |
| 661 | + custom = customdict({'key': 'value'}) |
| 662 | + view = self.mappingproxy(custom) |
| 663 | + self.assertTrue('key' in view) |
| 664 | + self.assertTrue('magic' in view) |
| 665 | + self.assertFalse('xxx' in view) |
| 666 | + self.assertEqual(view['key'], 'getitem=value') |
| 667 | + self.assertRaises(KeyError, view.__getitem__, 'xxx') |
| 668 | + self.assertEqual(tuple(view), ('iter',)) |
| 669 | + self.assertEqual(len(view), 500) |
| 670 | + self.assertEqual(view.copy(), 'copy') |
| 671 | + self.assertEqual(view.get('key'), 'get=value') |
| 672 | + self.assertEqual(view.get('xxx'), 'get=default=None') |
| 673 | + self.assertEqual(view.items(), 'items') |
| 674 | + self.assertEqual(view.keys(), 'keys') |
| 675 | + self.assertEqual(view.values(), 'values') |
| 676 | + |
| 677 | + def test_chainmap(self): |
| 678 | + d1 = {'x': 1} |
| 679 | + d2 = {'y': 2} |
| 680 | + mapping = collections.ChainMap(d1, d2) |
| 681 | + view = self.mappingproxy(mapping) |
| 682 | + self.assertTrue('x' in view) |
| 683 | + self.assertTrue('y' in view) |
| 684 | + self.assertFalse('z' in view) |
| 685 | + self.assertEqual(view['x'], 1) |
| 686 | + self.assertEqual(view['y'], 2) |
| 687 | + self.assertRaises(KeyError, view.__getitem__, 'z') |
| 688 | + self.assertEqual(tuple(sorted(view)), ('x', 'y')) |
| 689 | + self.assertEqual(len(view), 2) |
| 690 | + copy = view.copy() |
| 691 | + self.assertIsNot(copy, mapping) |
| 692 | + self.assertIsInstance(copy, collections.ChainMap) |
| 693 | + self.assertEqual(copy, mapping) |
| 694 | + self.assertEqual(view.get('x'), 1) |
| 695 | + self.assertEqual(view.get('y'), 2) |
| 696 | + self.assertIsNone(view.get('z')) |
| 697 | + self.assertEqual(tuple(sorted(view.items())), (('x', 1), ('y', 2))) |
| 698 | + self.assertEqual(tuple(sorted(view.keys())), ('x', 'y')) |
| 699 | + self.assertEqual(tuple(sorted(view.values())), (1, 2)) |
| 700 | + |
| 701 | + def test_contains(self): |
| 702 | + view = self.mappingproxy(dict.fromkeys('abc')) |
| 703 | + self.assertTrue('a' in view) |
| 704 | + self.assertTrue('b' in view) |
| 705 | + self.assertTrue('c' in view) |
| 706 | + self.assertFalse('xxx' in view) |
| 707 | + |
| 708 | + def test_views(self): |
| 709 | + mapping = {} |
| 710 | + view = self.mappingproxy(mapping) |
| 711 | + keys = view.keys() |
| 712 | + values = view.values() |
| 713 | + items = view.items() |
| 714 | + self.assertEqual(list(keys), []) |
| 715 | + self.assertEqual(list(values), []) |
| 716 | + self.assertEqual(list(items), []) |
| 717 | + mapping['key'] = 'value' |
| 718 | + self.assertEqual(list(keys), ['key']) |
| 719 | + self.assertEqual(list(values), ['value']) |
| 720 | + self.assertEqual(list(items), [('key', 'value')]) |
| 721 | + |
| 722 | + def test_len(self): |
| 723 | + for expected in range(6): |
| 724 | + data = dict.fromkeys('abcde'[:expected]) |
| 725 | + self.assertEqual(len(data), expected) |
| 726 | + view = self.mappingproxy(data) |
| 727 | + self.assertEqual(len(view), expected) |
| 728 | + |
| 729 | + def test_iterators(self): |
| 730 | + keys = ('x', 'y') |
| 731 | + values = (1, 2) |
| 732 | + items = tuple(zip(keys, values)) |
| 733 | + view = self.mappingproxy(dict(items)) |
| 734 | + self.assertEqual(set(view), set(keys)) |
| 735 | + self.assertEqual(set(view.keys()), set(keys)) |
| 736 | + self.assertEqual(set(view.values()), set(values)) |
| 737 | + self.assertEqual(set(view.items()), set(items)) |
| 738 | + |
| 739 | + def test_copy(self): |
| 740 | + original = {'key1': 27, 'key2': 51, 'key3': 93} |
| 741 | + view = self.mappingproxy(original) |
| 742 | + copy = view.copy() |
| 743 | + self.assertEqual(type(copy), dict) |
| 744 | + self.assertEqual(copy, original) |
| 745 | + original['key1'] = 70 |
| 746 | + self.assertEqual(view['key1'], 70) |
| 747 | + self.assertEqual(copy['key1'], 27) |
| 748 | + |
| 749 | + |
572 | 750 | def test_main(): |
573 | | - run_unittest(TypesTests) |
| 751 | + run_unittest(TypesTests, MappingProxyTests) |
574 | 752 |
|
575 | 753 | if __name__ == '__main__': |
576 | 754 | test_main() |
0 commit comments