test_speedups.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. from __future__ import with_statement
  2. import sys
  3. import unittest
  4. from unittest import TestCase
  5. import simplejson
  6. from simplejson import encoder, decoder, scanner
  7. from simplejson.compat import PY3, long_type, b
  8. def has_speedups():
  9. return encoder.c_make_encoder is not None
  10. def skip_if_speedups_missing(func):
  11. def wrapper(*args, **kwargs):
  12. if not has_speedups():
  13. if hasattr(unittest, 'SkipTest'):
  14. raise unittest.SkipTest("C Extension not available")
  15. else:
  16. sys.stdout.write("C Extension not available")
  17. return
  18. return func(*args, **kwargs)
  19. return wrapper
  20. class BadBool:
  21. def __bool__(self):
  22. 1/0
  23. __nonzero__ = __bool__
  24. class TestDecode(TestCase):
  25. @skip_if_speedups_missing
  26. def test_make_scanner(self):
  27. self.assertRaises(AttributeError, scanner.c_make_scanner, 1)
  28. @skip_if_speedups_missing
  29. def test_bad_bool_args(self):
  30. def test(value):
  31. decoder.JSONDecoder(strict=BadBool()).decode(value)
  32. self.assertRaises(ZeroDivisionError, test, '""')
  33. self.assertRaises(ZeroDivisionError, test, '{}')
  34. if not PY3:
  35. self.assertRaises(ZeroDivisionError, test, u'""')
  36. self.assertRaises(ZeroDivisionError, test, u'{}')
  37. class TestEncode(TestCase):
  38. @skip_if_speedups_missing
  39. def test_make_encoder(self):
  40. self.assertRaises(
  41. TypeError,
  42. encoder.c_make_encoder,
  43. None,
  44. ("\xCD\x7D\x3D\x4E\x12\x4C\xF9\x79\xD7"
  45. "\x52\xBA\x82\xF2\x27\x4A\x7D\xA0\xCA\x75"),
  46. None
  47. )
  48. @skip_if_speedups_missing
  49. def test_bad_bool_args(self):
  50. def test(name):
  51. encoder.JSONEncoder(**{name: BadBool()}).encode({})
  52. self.assertRaises(ZeroDivisionError, test, 'skipkeys')
  53. self.assertRaises(ZeroDivisionError, test, 'ensure_ascii')
  54. self.assertRaises(ZeroDivisionError, test, 'check_circular')
  55. self.assertRaises(ZeroDivisionError, test, 'allow_nan')
  56. self.assertRaises(ZeroDivisionError, test, 'sort_keys')
  57. self.assertRaises(ZeroDivisionError, test, 'use_decimal')
  58. self.assertRaises(ZeroDivisionError, test, 'namedtuple_as_object')
  59. self.assertRaises(ZeroDivisionError, test, 'tuple_as_array')
  60. self.assertRaises(ZeroDivisionError, test, 'bigint_as_string')
  61. self.assertRaises(ZeroDivisionError, test, 'for_json')
  62. self.assertRaises(ZeroDivisionError, test, 'ignore_nan')
  63. self.assertRaises(ZeroDivisionError, test, 'iterable_as_array')
  64. @skip_if_speedups_missing
  65. def test_int_as_string_bitcount_overflow(self):
  66. long_count = long_type(2)**32+31
  67. def test():
  68. encoder.JSONEncoder(int_as_string_bitcount=long_count).encode(0)
  69. self.assertRaises((TypeError, OverflowError), test)
  70. if PY3:
  71. @skip_if_speedups_missing
  72. def test_bad_encoding(self):
  73. with self.assertRaises(UnicodeEncodeError):
  74. encoder.JSONEncoder(encoding='\udcff').encode({b('key'): 123})