Close #18745: Improve enum tests in test_json for infinities and NaN.
diff --git a/Lib/test/test_json/test_enum.py b/Lib/test/test_json/test_enum.py
index 66c6480..10f4148 100644
--- a/Lib/test/test_json/test_enum.py
+++ b/Lib/test/test_json/test_enum.py
@@ -1,4 +1,5 @@
from enum import Enum, IntEnum
+from math import isnan
from test.test_json import PyTest, CTest
SMALL = 1
@@ -21,6 +22,15 @@
pi = PI
tau = TAU
+INF = float('inf')
+NEG_INF = float('-inf')
+NAN = float('nan')
+
+class WierdNum(float, Enum):
+ inf = INF
+ neg_inf = NEG_INF
+ nan = NAN
+
class TestEnum:
def test_floats(self):
@@ -29,6 +39,16 @@
self.assertEqual(float(self.dumps(enum)), enum)
self.assertEqual(self.loads(self.dumps(enum)), enum)
+ def test_weird_floats(self):
+ for enum, expected in zip(WierdNum, ('Infinity', '-Infinity', 'NaN')):
+ self.assertEqual(self.dumps(enum), expected)
+ if not isnan(enum):
+ self.assertEqual(float(self.dumps(enum)), enum)
+ self.assertEqual(self.loads(self.dumps(enum)), enum)
+ else:
+ self.assertTrue(isnan(float(self.dumps(enum))))
+ self.assertTrue(isnan(self.loads(self.dumps(enum))))
+
def test_ints(self):
for enum in BigNum:
self.assertEqual(self.dumps(enum), str(enum.value))
@@ -36,18 +56,28 @@
self.assertEqual(self.loads(self.dumps(enum)), enum)
def test_list(self):
- self.assertEqual(
- self.dumps(list(BigNum)),
- str([SMALL, BIG, HUGE, REALLY_HUGE]),
- )
- self.assertEqual(self.dumps(list(FloatNum)), str([E, PI, TAU]))
+ self.assertEqual(self.dumps(list(BigNum)),
+ str([SMALL, BIG, HUGE, REALLY_HUGE]))
+ self.assertEqual(self.loads(self.dumps(list(BigNum))),
+ list(BigNum))
+ self.assertEqual(self.dumps(list(FloatNum)),
+ str([E, PI, TAU]))
+ self.assertEqual(self.loads(self.dumps(list(FloatNum))),
+ list(FloatNum))
+ self.assertEqual(self.dumps(list(WierdNum)),
+ '[Infinity, -Infinity, NaN]')
+ self.assertEqual(self.loads(self.dumps(list(WierdNum)))[:2],
+ list(WierdNum)[:2])
+ self.assertTrue(isnan(self.loads(self.dumps(list(WierdNum)))[2]))
def test_dict_keys(self):
s, b, h, r = BigNum
e, p, t = FloatNum
+ i, j, n = WierdNum
d = {
s:'tiny', b:'large', h:'larger', r:'largest',
e:"Euler's number", p:'pi', t:'tau',
+ i:'Infinity', j:'-Infinity', n:'NaN',
}
nd = self.loads(self.dumps(d))
self.assertEqual(nd[str(SMALL)], 'tiny')
@@ -57,6 +87,9 @@
self.assertEqual(nd[repr(E)], "Euler's number")
self.assertEqual(nd[repr(PI)], 'pi')
self.assertEqual(nd[repr(TAU)], 'tau')
+ self.assertEqual(nd['Infinity'], 'Infinity')
+ self.assertEqual(nd['-Infinity'], '-Infinity')
+ self.assertEqual(nd['NaN'], 'NaN')
def test_dict_values(self):
d = dict(
@@ -67,6 +100,9 @@
e=FloatNum.e,
pi=FloatNum.pi,
tau=FloatNum.tau,
+ i=WierdNum.inf,
+ j=WierdNum.neg_inf,
+ n=WierdNum.nan,
)
nd = self.loads(self.dumps(d))
self.assertEqual(nd['tiny'], SMALL)
@@ -76,6 +112,9 @@
self.assertEqual(nd['e'], E)
self.assertEqual(nd['pi'], PI)
self.assertEqual(nd['tau'], TAU)
+ self.assertEqual(nd['i'], INF)
+ self.assertEqual(nd['j'], NEG_INF)
+ self.assertTrue(isnan(nd['n']))
class TestPyEnum(TestEnum, PyTest): pass
class TestCEnum(TestEnum, CTest): pass