comparison tests/test-dicthelpers.py @ 18820:a45e44d76c81

mercurial: implement diff and join for dicts Given two dicts, diff returns a dict containing all the keys that are present in one dict but not the other, or whose values are different between the dicts. The values are pairs of the values from the dicts, with missing values being represented as an optional argument, defaulting to None. Given two dicts, join performs what is known as an outer join in relational database land: it returns a dict containing all the keys across both dicts. The values are pairs as above, except they aren't compared to see if they're the same.
author Siddharth Agarwal <sid0@fb.com>
date Mon, 25 Mar 2013 17:40:39 -0700
parents
children ed46c2b98b0d
comparison
equal deleted inserted replaced
18819:05acdf8e1f23 18820:a45e44d76c81
1 from mercurial.dicthelpers import diff, join
2 import unittest
3 import silenttestrunner
4
5 class testdicthelpers(unittest.TestCase):
6 def test_dicthelpers(self):
7 # empty dicts
8 self.assertEqual(diff({}, {}), {})
9 self.assertEqual(join({}, {}), {})
10
11 d1 = {}
12 d1['a'] = 'foo'
13 d1['b'] = 'bar'
14 d1['c'] = 'baz'
15
16 # same identity
17 self.assertEqual(diff(d1, d1), {})
18 self.assertEqual(join(d1, d1), {'a': ('foo', 'foo'),
19 'b': ('bar', 'bar'),
20 'c': ('baz', 'baz')})
21
22 # vs empty
23 self.assertEqual(diff(d1, {}), {'a': ('foo', None),
24 'b': ('bar', None),
25 'c': ('baz', None)})
26 self.assertEqual(diff(d1, {}), {'a': ('foo', None),
27 'b': ('bar', None),
28 'c': ('baz', None)})
29
30 d2 = {}
31 d2['a'] = 'foo2'
32 d2['b'] = 'bar'
33 d2['d'] = 'quux'
34
35 self.assertEqual(diff(d1, d2), {'a': ('foo', 'foo2'),
36 'c': ('baz', None),
37 'd': (None, 'quux')})
38 self.assertEqual(join(d1, d2), {'a': ('foo', 'foo2'),
39 'b': ('bar', 'bar'),
40 'c': ('baz', None),
41 'd': (None, 'quux')})
42
43 # with default argument
44 self.assertEqual(diff(d1, d2, 123), {'a': ('foo', 'foo2'),
45 'c': ('baz', 123),
46 'd': (123, 'quux')})
47 self.assertEqual(join(d1, d2, 456), {'a': ('foo', 'foo2'),
48 'b': ('bar', 'bar'),
49 'c': ('baz', 456),
50 'd': (456, 'quux')})
51
52 if __name__ == '__main__':
53 silenttestrunner.main(__name__)