]>
Commit | Line | Data |
---|---|---|
3257aa99 DM |
1 | import decimal\r |
2 | from StringIO import StringIO\r | |
3 | from collections import OrderedDict\r | |
4 | from json.tests import PyTest, CTest\r | |
5 | \r | |
6 | \r | |
7 | class TestDecode(object):\r | |
8 | def test_decimal(self):\r | |
9 | rval = self.loads('1.1', parse_float=decimal.Decimal)\r | |
10 | self.assertTrue(isinstance(rval, decimal.Decimal))\r | |
11 | self.assertEqual(rval, decimal.Decimal('1.1'))\r | |
12 | \r | |
13 | def test_float(self):\r | |
14 | rval = self.loads('1', parse_int=float)\r | |
15 | self.assertTrue(isinstance(rval, float))\r | |
16 | self.assertEqual(rval, 1.0)\r | |
17 | \r | |
18 | def test_decoder_optimizations(self):\r | |
19 | # Several optimizations were made that skip over calls to\r | |
20 | # the whitespace regex, so this test is designed to try and\r | |
21 | # exercise the uncommon cases. The array cases are already covered.\r | |
22 | rval = self.loads('{ "key" : "value" , "k":"v" }')\r | |
23 | self.assertEqual(rval, {"key":"value", "k":"v"})\r | |
24 | \r | |
25 | def test_empty_objects(self):\r | |
26 | self.assertEqual(self.loads('{}'), {})\r | |
27 | self.assertEqual(self.loads('[]'), [])\r | |
28 | self.assertEqual(self.loads('""'), u"")\r | |
29 | self.assertIsInstance(self.loads('""'), unicode)\r | |
30 | \r | |
31 | def test_object_pairs_hook(self):\r | |
32 | s = '{"xkd":1, "kcw":2, "art":3, "hxm":4, "qrt":5, "pad":6, "hoy":7}'\r | |
33 | p = [("xkd", 1), ("kcw", 2), ("art", 3), ("hxm", 4),\r | |
34 | ("qrt", 5), ("pad", 6), ("hoy", 7)]\r | |
35 | self.assertEqual(self.loads(s), eval(s))\r | |
36 | self.assertEqual(self.loads(s, object_pairs_hook=lambda x: x), p)\r | |
37 | self.assertEqual(self.json.load(StringIO(s),\r | |
38 | object_pairs_hook=lambda x: x), p)\r | |
39 | od = self.loads(s, object_pairs_hook=OrderedDict)\r | |
40 | self.assertEqual(od, OrderedDict(p))\r | |
41 | self.assertEqual(type(od), OrderedDict)\r | |
42 | # the object_pairs_hook takes priority over the object_hook\r | |
43 | self.assertEqual(self.loads(s, object_pairs_hook=OrderedDict,\r | |
44 | object_hook=lambda x: None),\r | |
45 | OrderedDict(p))\r | |
46 | # check that empty objects literals work (see #17368)\r | |
47 | self.assertEqual(self.loads('{}', object_pairs_hook=OrderedDict),\r | |
48 | OrderedDict())\r | |
49 | self.assertEqual(self.loads('{"empty": {}}',\r | |
50 | object_pairs_hook=OrderedDict),\r | |
51 | OrderedDict([('empty', OrderedDict())]))\r | |
52 | \r | |
53 | def test_extra_data(self):\r | |
54 | s = '[1, 2, 3]5'\r | |
55 | msg = 'Extra data'\r | |
56 | self.assertRaisesRegexp(ValueError, msg, self.loads, s)\r | |
57 | \r | |
58 | def test_invalid_escape(self):\r | |
59 | s = '["abc\\y"]'\r | |
60 | msg = 'escape'\r | |
61 | self.assertRaisesRegexp(ValueError, msg, self.loads, s)\r | |
62 | \r | |
63 | def test_negative_index(self):\r | |
64 | d = self.json.JSONDecoder()\r | |
65 | self.assertRaises(ValueError, d.raw_decode, 'a'*42, -50000)\r | |
66 | self.assertRaises(ValueError, d.raw_decode, u'a'*42, -50000)\r | |
67 | \r | |
68 | class TestPyDecode(TestDecode, PyTest): pass\r | |
69 | class TestCDecode(TestDecode, CTest): pass\r |