1057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melottiimport os
2057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melottiimport sys
3057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melottiimport textwrap
4057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melottiimport unittest
5057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melottiimport subprocess
6057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melottifrom test import support
7ce643913a9049953950918b214fb7cef40506be5Berker Peksagfrom test.support.script_helper import assert_python_ok
8057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti
939e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag
10057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotticlass TestTool(unittest.TestCase):
11057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti    data = """
12057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti
13057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        [["blorpie"],[ "whoops" ] , [
14057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti                                 ],\t"d-shtaeou",\r"d-nthiouh",
15057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        "i-vhbjkhnth", {"nifty":87}, {"morefield" :\tfalse,"field"
16057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti            :"yes"}  ]
17057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti           """
18057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti
1939e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag    expect_without_sort_keys = textwrap.dedent("""\
20057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti    [
21057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        [
22057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti            "blorpie"
23b32512ed9a1ab9912a9e0bdbb609ca1a19949355Ezio Melotti        ],
24057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        [
25057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti            "whoops"
26b32512ed9a1ab9912a9e0bdbb609ca1a19949355Ezio Melotti        ],
27b32512ed9a1ab9912a9e0bdbb609ca1a19949355Ezio Melotti        [],
28b32512ed9a1ab9912a9e0bdbb609ca1a19949355Ezio Melotti        "d-shtaeou",
29b32512ed9a1ab9912a9e0bdbb609ca1a19949355Ezio Melotti        "d-nthiouh",
30b32512ed9a1ab9912a9e0bdbb609ca1a19949355Ezio Melotti        "i-vhbjkhnth",
31057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        {
32057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti            "nifty": 87
33b32512ed9a1ab9912a9e0bdbb609ca1a19949355Ezio Melotti        },
34057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        {
35b32512ed9a1ab9912a9e0bdbb609ca1a19949355Ezio Melotti            "field": "yes",
36057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti            "morefield": false
37057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        }
38057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti    ]
39057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti    """)
40057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti
4139e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag    expect = textwrap.dedent("""\
4239e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag    [
4339e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag        [
4439e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag            "blorpie"
4539e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag        ],
4639e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag        [
4739e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag            "whoops"
4839e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag        ],
4939e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag        [],
5039e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag        "d-shtaeou",
5139e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag        "d-nthiouh",
5239e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag        "i-vhbjkhnth",
5339e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag        {
5439e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag            "nifty": 87
5539e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag        },
5639e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag        {
5739e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag            "morefield": false,
5839e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag            "field": "yes"
5939e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag        }
6039e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag    ]
6139e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag    """)
6239e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag
63057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti    def test_stdin_stdout(self):
64057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        with subprocess.Popen(
65057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti                (sys.executable, '-m', 'json.tool'),
66057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti                stdin=subprocess.PIPE, stdout=subprocess.PIPE) as proc:
67057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti            out, err = proc.communicate(self.data.encode())
684927633ab6c6895621d88d51ae2d7943426e2c04Ezio Melotti        self.assertEqual(out.splitlines(), self.expect.encode().splitlines())
69057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        self.assertEqual(err, None)
70057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti
71057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti    def _create_infile(self):
72057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        infile = support.TESTFN
73057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        with open(infile, "w") as fp:
74057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti            self.addCleanup(os.remove, infile)
75057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti            fp.write(self.data)
76057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        return infile
77057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti
78057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti    def test_infile_stdout(self):
79057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        infile = self._create_infile()
80057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        rc, out, err = assert_python_ok('-m', 'json.tool', infile)
81940e2074123f7d18236e2e8ee08044b400261c42Benjamin Peterson        self.assertEqual(rc, 0)
824927633ab6c6895621d88d51ae2d7943426e2c04Ezio Melotti        self.assertEqual(out.splitlines(), self.expect.encode().splitlines())
83057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        self.assertEqual(err, b'')
84057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti
85057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti    def test_infile_outfile(self):
86057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        infile = self._create_infile()
87057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        outfile = support.TESTFN + '.out'
88057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        rc, out, err = assert_python_ok('-m', 'json.tool', infile, outfile)
89057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        self.addCleanup(os.remove, outfile)
90057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        with open(outfile, "r") as fp:
91057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti            self.assertEqual(fp.read(), self.expect)
92940e2074123f7d18236e2e8ee08044b400261c42Benjamin Peterson        self.assertEqual(rc, 0)
93057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        self.assertEqual(out, b'')
94057bcb4c6c7eef93066002db7ab486f12d50cceeEzio Melotti        self.assertEqual(err, b'')
95940e2074123f7d18236e2e8ee08044b400261c42Benjamin Peterson
96940e2074123f7d18236e2e8ee08044b400261c42Benjamin Peterson    def test_help_flag(self):
97940e2074123f7d18236e2e8ee08044b400261c42Benjamin Peterson        rc, out, err = assert_python_ok('-m', 'json.tool', '-h')
98940e2074123f7d18236e2e8ee08044b400261c42Benjamin Peterson        self.assertEqual(rc, 0)
99940e2074123f7d18236e2e8ee08044b400261c42Benjamin Peterson        self.assertTrue(out.startswith(b'usage: '))
100940e2074123f7d18236e2e8ee08044b400261c42Benjamin Peterson        self.assertEqual(err, b'')
10139e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag
10239e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag    def test_sort_keys_flag(self):
10339e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag        infile = self._create_infile()
10439e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag        rc, out, err = assert_python_ok('-m', 'json.tool', '--sort-keys', infile)
10539e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag        self.assertEqual(rc, 0)
10639e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag        self.assertEqual(out.splitlines(),
10739e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag                         self.expect_without_sort_keys.encode().splitlines())
10839e4c4d873927b902c53aeb0e2e15c12d2678e1bBerker Peksag        self.assertEqual(err, b'')
109