summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_float.py110
1 files changed, 110 insertions, 0 deletions
diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py
new file mode 100644
index 0000000..cf8c094
--- /dev/null
+++ b/Lib/test/test_float.py
@@ -0,0 +1,110 @@
+
+import unittest, struct
+from test import test_support
+
+class FormatFunctionsTestCase(unittest.TestCase):
+
+ def setUp(self):
+ self.save_formats = {'double':float.__getformat__('double'),
+ 'float':float.__getformat__('float')}
+
+ def tearDown(self):
+ float.__setformat__('double', self.save_formats['double'])
+ float.__setformat__('float', self.save_formats['float'])
+
+ def test_getformat(self):
+ self.assert_(float.__getformat__('double') in
+ ['unknown', 'IEEE, big-endian', 'IEEE, little-endian'])
+ self.assert_(float.__getformat__('float') in
+ ['unknown', 'IEEE, big-endian', 'IEEE, little-endian'])
+ self.assertRaises(ValueError, float.__getformat__, 'chicken')
+ self.assertRaises(TypeError, float.__getformat__, 1)
+
+ def test_setformat(self):
+ for t in 'double', 'float':
+ float.__setformat__(t, 'unknown')
+ if self.save_formats[t] == 'IEEE, big-endian':
+ self.assertRaises(ValueError, float.__setformat__,
+ t, 'IEEE, little-endian')
+ elif self.save_formats[t] == 'IEEE, little-endian':
+ self.assertRaises(ValueError, float.__setformat__,
+ t, 'IEEE, big-endian')
+ else:
+ self.assertRaises(ValueError, float.__setformat__,
+ t, 'IEEE, big-endian')
+ self.assertRaises(ValueError, float.__setformat__,
+ t, 'IEEE, little-endian')
+ self.assertRaises(ValueError, float.__setformat__,
+ t, 'chicken')
+ self.assertRaises(ValueError, float.__setformat__,
+ 'chicken', 'unknown')
+
+BE_DOUBLE_INF = '\x7f\xf0\x00\x00\x00\x00\x00\x00'
+LE_DOUBLE_INF = ''.join(reversed(BE_DOUBLE_INF))
+BE_DOUBLE_NAN = '\x7f\xf8\x00\x00\x00\x00\x00\x00'
+LE_DOUBLE_NAN = ''.join(reversed(BE_DOUBLE_NAN))
+
+BE_FLOAT_INF = '\x7f\x80\x00\x00'
+LE_FLOAT_INF = ''.join(reversed(BE_FLOAT_INF))
+BE_FLOAT_NAN = '\x7f\xc0\x00\x00'
+LE_FLOAT_NAN = ''.join(reversed(BE_FLOAT_NAN))
+
+# on non-IEEE platforms, attempting to unpack a bit pattern
+# representing an infinity or a NaN should raise an exception.
+
+class UnknownFormatTestCase(unittest.TestCase):
+ def setUp(self):
+ self.save_formats = {'double':float.__getformat__('double'),
+ 'float':float.__getformat__('float')}
+ float.__setformat__('double', 'unknown')
+ float.__setformat__('float', 'unknown')
+
+ def tearDown(self):
+ float.__setformat__('double', self.save_formats['double'])
+ float.__setformat__('float', self.save_formats['float'])
+
+ def test_double_specials_dont_unpack(self):
+ for fmt, data in [('>d', BE_DOUBLE_INF),
+ ('>d', BE_DOUBLE_NAN),
+ ('<d', LE_DOUBLE_INF),
+ ('<d', LE_DOUBLE_NAN)]:
+ self.assertRaises(ValueError, struct.unpack, fmt, data)
+
+ def test_float_specials_dont_unpack(self):
+ for fmt, data in [('>f', BE_FLOAT_INF),
+ ('>f', BE_FLOAT_NAN),
+ ('<f', LE_FLOAT_INF),
+ ('<f', LE_FLOAT_NAN)]:
+ self.assertRaises(ValueError, struct.unpack, fmt, data)
+
+
+# on an IEEE platform, all we guarantee is that bit patterns
+# representing infinities or NaNs do not raise an exception; all else
+# is accident (today).
+
+class IEEEFormatTestCase(unittest.TestCase):
+ if float.__getformat__("double").startswith("IEEE"):
+ def test_double_specials_do_unpack(self):
+ for fmt, data in [('>d', BE_DOUBLE_INF),
+ ('>d', BE_DOUBLE_NAN),
+ ('<d', LE_DOUBLE_INF),
+ ('<d', LE_DOUBLE_NAN)]:
+ struct.unpack(fmt, data)
+
+ if float.__getformat__("float").startswith("IEEE"):
+ def test_float_specials_do_unpack(self):
+ for fmt, data in [('>f', BE_FLOAT_INF),
+ ('>f', BE_FLOAT_NAN),
+ ('<f', LE_FLOAT_INF),
+ ('<f', LE_FLOAT_NAN)]:
+ struct.unpack(fmt, data)
+
+
+def test_main():
+ test_support.run_unittest(
+ FormatFunctionsTestCase,
+ UnknownFormatTestCase,
+ IEEEFormatTestCase)
+
+if __name__ == '__main__':
+ test_main()