bpo-29636: json.tool: Add document for indentation options. (GH-17482)

And updated test to use subprocess.run
diff --git a/Doc/library/json.rst b/Doc/library/json.rst
index 573ec1c..cfe68c9 100644
--- a/Doc/library/json.rst
+++ b/Doc/library/json.rst
@@ -744,6 +744,12 @@
 
    .. versionadded:: 3.8
 
+.. cmdoption:: --indent, --tab, --no-indent, --compact
+
+   Mutually exclusive options for whitespace control
+
+   .. versionadded:: 3.9
+
 .. cmdoption:: -h, --help
 
    Show the help message.
diff --git a/Lib/json/tool.py b/Lib/json/tool.py
index 5542ce4..6d7d9a0 100644
--- a/Lib/json/tool.py
+++ b/Lib/json/tool.py
@@ -33,7 +33,8 @@
     parser.add_argument('--no-ensure-ascii', dest='ensure_ascii', action='store_false',
                         help='disable escaping of non-ASCII characters')
     parser.add_argument('--json-lines', action='store_true', default=False,
-                        help='parse input using the jsonlines format')
+                        help='parse input using the JSON Lines format. '
+                        'Use with --no-indent or --compact to produce valid JSON Lines output.')
     group = parser.add_mutually_exclusive_group()
     group.add_argument('--indent', default=4, type=int,
                        help='separate items with newlines and use this number '
diff --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py
index 54800ae..c9a969b 100644
--- a/Lib/test/test_json/test_tool.py
+++ b/Lib/test/test_json/test_tool.py
@@ -2,7 +2,7 @@
 import sys
 import textwrap
 import unittest
-from subprocess import Popen, PIPE
+import subprocess
 from test import support
 from test.support.script_helper import assert_python_ok
 
@@ -84,10 +84,9 @@
 
     def test_stdin_stdout(self):
         args = sys.executable, '-m', 'json.tool'
-        with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc:
-            out, err = proc.communicate(self.data.encode())
-        self.assertEqual(out.splitlines(), self.expect.encode().splitlines())
-        self.assertEqual(err, b'')
+        process = subprocess.run(args, input=self.data, capture_output=True, text=True, check=True)
+        self.assertEqual(process.stdout, self.expect)
+        self.assertEqual(process.stderr, '')
 
     def _create_infile(self, data=None):
         infile = support.TESTFN
@@ -131,10 +130,9 @@
 
     def test_jsonlines(self):
         args = sys.executable, '-m', 'json.tool', '--json-lines'
-        with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc:
-            out, err = proc.communicate(self.jsonlines_raw.encode())
-        self.assertEqual(out.splitlines(), self.jsonlines_expect.encode().splitlines())
-        self.assertEqual(err, b'')
+        process = subprocess.run(args, input=self.jsonlines_raw, capture_output=True, text=True, check=True)
+        self.assertEqual(process.stdout, self.jsonlines_expect)
+        self.assertEqual(process.stderr, '')
 
     def test_help_flag(self):
         rc, out, err = assert_python_ok('-m', 'json.tool', '-h')
@@ -151,45 +149,41 @@
         self.assertEqual(err, b'')
 
     def test_indent(self):
-        json_stdin = b'[1, 2]'
+        input_ = '[1, 2]'
         expect = textwrap.dedent('''\
         [
           1,
           2
         ]
-        ''').encode()
+        ''')
         args = sys.executable, '-m', 'json.tool', '--indent', '2'
-        with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc:
-            json_stdout, err = proc.communicate(json_stdin)
-        self.assertEqual(expect.splitlines(), json_stdout.splitlines())
-        self.assertEqual(err, b'')
+        process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True)
+        self.assertEqual(process.stdout, expect)
+        self.assertEqual(process.stderr, '')
 
     def test_no_indent(self):
-        json_stdin = b'[1,\n2]'
-        expect = b'[1, 2]'
+        input_ = '[1,\n2]'
+        expect = '[1, 2]\n'
         args = sys.executable, '-m', 'json.tool', '--no-indent'
-        with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc:
-            json_stdout, err = proc.communicate(json_stdin)
-        self.assertEqual(expect.splitlines(), json_stdout.splitlines())
-        self.assertEqual(err, b'')
+        process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True)
+        self.assertEqual(process.stdout, expect)
+        self.assertEqual(process.stderr, '')
 
     def test_tab(self):
-        json_stdin = b'[1, 2]'
-        expect = b'[\n\t1,\n\t2\n]\n'
+        input_ = '[1, 2]'
+        expect = '[\n\t1,\n\t2\n]\n'
         args = sys.executable, '-m', 'json.tool', '--tab'
-        with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc:
-            json_stdout, err = proc.communicate(json_stdin)
-        self.assertEqual(expect.splitlines(), json_stdout.splitlines())
-        self.assertEqual(err, b'')
+        process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True)
+        self.assertEqual(process.stdout, expect)
+        self.assertEqual(process.stderr, '')
 
     def test_compact(self):
-        json_stdin = b'[ 1 ,\n 2]'
-        expect = b'[1,2]'
+        input_ = '[ 1 ,\n 2]'
+        expect = '[1,2]\n'
         args = sys.executable, '-m', 'json.tool', '--compact'
-        with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc:
-            json_stdout, err = proc.communicate(json_stdin)
-        self.assertEqual(expect.splitlines(), json_stdout.splitlines())
-        self.assertEqual(err, b'')
+        process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True)
+        self.assertEqual(process.stdout, expect)
+        self.assertEqual(process.stderr, '')
 
     def test_no_ensure_ascii_flag(self):
         infile = self._create_infile('{"key":"💩"}')