1import os
2import sys
3import textwrap
4import unittest
5import subprocess
6from test import test_support
7from test.script_helper import assert_python_ok
8
9class TestTool(unittest.TestCase):
10    data = """
11
12        [["blorpie"],[ "whoops" ] , [
13                                 ],\t"d-shtaeou",\r"d-nthiouh",
14        "i-vhbjkhnth", {"nifty":87}, {"morefield" :\tfalse,"field"
15            :"yes"}  ]
16           """
17
18    expect = textwrap.dedent("""\
19    [
20        [
21            "blorpie"
22        ],
23        [
24            "whoops"
25        ],
26        [],
27        "d-shtaeou",
28        "d-nthiouh",
29        "i-vhbjkhnth",
30        {
31            "nifty": 87
32        },
33        {
34            "field": "yes",
35            "morefield": false
36        }
37    ]
38    """)
39
40    def test_stdin_stdout(self):
41        proc = subprocess.Popen(
42                (sys.executable, '-m', 'json.tool'),
43                stdin=subprocess.PIPE, stdout=subprocess.PIPE)
44        out, err = proc.communicate(self.data.encode())
45        self.assertEqual(out.splitlines(), self.expect.encode().splitlines())
46        self.assertEqual(err, None)
47
48    def _create_infile(self):
49        infile = test_support.TESTFN
50        with open(infile, "w") as fp:
51            self.addCleanup(os.remove, infile)
52            fp.write(self.data)
53        return infile
54
55    def test_infile_stdout(self):
56        infile = self._create_infile()
57        rc, out, err = assert_python_ok('-m', 'json.tool', infile)
58        self.assertEqual(out.splitlines(), self.expect.encode().splitlines())
59        self.assertEqual(err, b'')
60
61    def test_infile_outfile(self):
62        infile = self._create_infile()
63        outfile = test_support.TESTFN + '.out'
64        rc, out, err = assert_python_ok('-m', 'json.tool', infile, outfile)
65        self.addCleanup(os.remove, outfile)
66        with open(outfile, "r") as fp:
67            self.assertEqual(fp.read(), self.expect)
68        self.assertEqual(out, b'')
69        self.assertEqual(err, b'')
70