Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 24 additions & 3 deletions Lib/test/test_json/test_decode.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,34 @@
class TestDecode:
def test_decimal(self):
rval = self.loads('1.1', parse_float=decimal.Decimal)
self.assertTrue(isinstance(rval, decimal.Decimal))
self.assertIsInstance(rval, decimal.Decimal)
self.assertEqual(rval, decimal.Decimal('1.1'))

def test_float(self):
rval = self.loads('1', parse_int=float)
self.assertTrue(isinstance(rval, float))
self.assertIsInstance(rval, float)
self.assertEqual(rval, 1.0)

def test_bytes(self):
self.assertEqual(self.loads(b"1"), 1)

def test_parse_constant(self):
for constant, expected in [
Comment thread
hugovk marked this conversation as resolved.
("Infinity", "INFINITY"),
("-Infinity", "-INFINITY"),
("NaN", "NAN"),
]:
self.assertEqual(
self.loads(constant, parse_constant=str.upper), expected

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can simply use constant.upper() instead of expected.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I generally prefer to have explicit expected results and avoid computing them:

https://testing.googleblog.com/2014/07/testing-on-toilet-dont-put-logic-in.html

But I can change it if you prefer.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good reason to do keep expected.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To be consistent in avoiding computations in tests we should write this more explicitly:

        self.assertEqual(self.loads("Infinity", parse_constant=str.upper),
                         "INFINITY")
        self.assertEqual(self.loads("-Infinity", parse_constant=str.upper),
                         "-INFINITY")
        self.assertEqual(self.loads("NaN", parse_constant=str.upper), "NAN")

If you want to allow some computations, you can write it as:

        for name in "Infinity", "-Infinity", "NaN":
            self.assertEqual(self.loads(name, parse_constant=str.upper),
                             name.upper())

which is also more breaf and simple that the current code.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I prefer the existing version:

  • it shows the explicit inputs and outputs
  • avoids extra computations
  • we can immediately see we're asserting the function under test in the exact same way each time

)

def test_constant_invalid_case(self):
for constant in [
"nan", "NAN", "naN", "infinity", "INFINITY", "inFiniTy"
]:
with self.assertRaises(self.JSONDecodeError):
self.loads(constant)

def test_empty_objects(self):
self.assertEqual(self.loads('{}'), {})
self.assertEqual(self.loads('[]'), [])
Expand Down Expand Up @@ -88,7 +108,8 @@ def test_string_with_utf8_bom(self):
self.json.load(StringIO(bom_json))
self.assertIn('BOM', str(cm.exception))
# make sure that the BOM is not detected in the middle of a string
bom_in_str = '"{}"'.format(''.encode('utf-8-sig').decode('utf-8'))
bom = ''.encode('utf-8-sig').decode('utf-8')
bom_in_str = f'"{bom}"'
self.assertEqual(self.loads(bom_in_str), '\ufeff')
self.assertEqual(self.json.load(StringIO(bom_in_str)), '\ufeff')

Expand Down
3 changes: 1 addition & 2 deletions Lib/test/test_json/test_encode_basestring_ascii.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@ def test_encode_basestring_ascii(self):
for input_string, expect in CASES:
result = self.json.encoder.encode_basestring_ascii(input_string)
self.assertEqual(result, expect,
'{0!r} != {1!r} for {2}({3!r})'.format(
result, expect, fname, input_string))
f'{result!r} != {expect!r} for {fname}({input_string!r})')

def test_ordered_dict(self):
# See issue 6105
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/test_json/test_fail.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ def test_failures(self):
except self.JSONDecodeError:
pass
else:
self.fail("Expected failure for fail{0}.json: {1!r}".format(idx, doc))
self.fail(f"Expected failure for fail{idx}.json: {doc!r}")

def test_non_string_keys_dict(self):
data = {'a' : 1, (1, 2) : 2}
Expand Down
13 changes: 9 additions & 4 deletions Lib/test/test_json/test_unicode.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,17 @@ def test_encoding4(self):
def test_encoding5(self):
u = '\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}'
j = self.dumps(u, ensure_ascii=False)
self.assertEqual(j, '"{0}"'.format(u))
self.assertEqual(j, f'"{u}"')

def test_encoding6(self):
u = '\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}'
j = self.dumps([u], ensure_ascii=False)
self.assertEqual(j, '["{0}"]'.format(u))
self.assertEqual(j, f'["{u}"]')

def test_encoding7(self):
u = '\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}'
j = self.dumps(u + "\n", ensure_ascii=False)
self.assertEqual(j, f'"{u}\\n"')

def test_big_unicode_encode(self):
u = '\U0001d120'
Expand All @@ -34,13 +39,13 @@ def test_big_unicode_encode(self):

def test_big_unicode_decode(self):
u = 'z\U0001d120x'
self.assertEqual(self.loads('"' + u + '"'), u)
self.assertEqual(self.loads(f'"{u}"'), u)
self.assertEqual(self.loads('"z\\ud834\\udd20x"'), u)

def test_unicode_decode(self):
for i in range(0, 0xd7ff):
u = chr(i)
s = '"\\u{0:04x}"'.format(i)
s = f'"\\u{i:04x}"'
self.assertEqual(self.loads(s), u)

def test_unicode_preservation(self):
Expand Down