source: pyyaml/trunk/tests/test_representer.py @ 234

Revision 234, 2.5 KB checked in by xi, 8 years ago (diff)

Fix loss of microsecond precision in datetime.datetime constructor (fix #30).
Thanks to edemaine@… for the bug report and the patch.

Line 
1
2import test_appliance
3from test_constructor import *
4
5from yaml import *
6
7class TestRepresenterTypes(test_appliance.TestAppliance):
8
9    def _testTypesUnicode(self, test_name, data_filename, code_filename):
10        return self._testTypes(test_name, data_filename, code_filename, allow_unicode=True)
11
12    def _testTypes(self, test_name, data_filename, code_filename, allow_unicode=False):
13        data1 = eval(file(code_filename, 'rb').read())
14        data2 = None
15        output = None
16        try:
17            output = dump(data1, Dumper=MyDumper, allow_unicode=allow_unicode)
18            data2 = load(output, Loader=MyLoader)
19            self.failUnlessEqual(type(data1), type(data2))
20            try:
21                self.failUnlessEqual(data1, data2)
22            except (AssertionError, TypeError):
23                if isinstance(data1, dict):
24                    data1 = [(repr(key), value) for key, value in data1.items()]
25                    data1.sort()
26                    data1 = repr(data1)
27                    data2 = [(repr(key), value) for key, value in data2.items()]
28                    data2.sort()
29                    data2 = repr(data2)
30                    if data1 != data2:
31                        raise
32                elif isinstance(data1, list):
33                    self.failUnlessEqual(type(data1), type(data2))
34                    self.failUnlessEqual(len(data1), len(data2))
35                    for item1, item2 in zip(data1, data2):
36                        if (item1 != item1 or (item1 == 0.0 and item1 == 1.0)) and  \
37                                (item2 != item2 or (item2 == 0.0 and item2 == 1.0)):
38                            continue
39                        if isinstance(item1, datetime.datetime) \
40                                and isinstance(item2, datetime.datetime):
41                            self.failUnlessEqual(item1.microsecond,
42                                    item2.microsecond)
43                        if isinstance(item1, datetime.datetime):
44                            item1 = item1.utctimetuple()
45                        if isinstance(item2, datetime.datetime):
46                            item2 = item2.utctimetuple()
47                        self.failUnlessEqual(item1, item2)
48                else:
49                    raise
50        except:
51            print
52            print "OUTPUT:"
53            print output
54            print "NATIVES1:", data1
55            print "NATIVES2:", data2
56            raise
57
58TestRepresenterTypes.add_tests('testTypes', '.data', '.code')
59TestRepresenterTypes.add_tests('testTypesUnicode', '.data', '.code')
60
Note: See TracBrowser for help on using the repository browser.