1import os 2import sys 3import json 4import doctest 5import unittest 6 7from test import test_support 8 9# import json with and without accelerations 10cjson = test_support.import_fresh_module('json', fresh=['_json']) 11pyjson = test_support.import_fresh_module('json', blocked=['_json']) 12 13# create two base classes that will be used by the other tests 14class PyTest(unittest.TestCase): 15 json = pyjson 16 loads = staticmethod(pyjson.loads) 17 dumps = staticmethod(pyjson.dumps) 18 19@unittest.skipUnless(cjson, 'requires _json') 20class CTest(unittest.TestCase): 21 if cjson is not None: 22 json = cjson 23 loads = staticmethod(cjson.loads) 24 dumps = staticmethod(cjson.dumps) 25 26# test PyTest and CTest checking if the functions come from the right module 27class TestPyTest(PyTest): 28 def test_pyjson(self): 29 self.assertEqual(self.json.scanner.make_scanner.__module__, 30 'json.scanner') 31 self.assertEqual(self.json.decoder.scanstring.__module__, 32 'json.decoder') 33 self.assertEqual(self.json.encoder.encode_basestring_ascii.__module__, 34 'json.encoder') 35 36class TestCTest(CTest): 37 def test_cjson(self): 38 self.assertEqual(self.json.scanner.make_scanner.__module__, '_json') 39 self.assertEqual(self.json.decoder.scanstring.__module__, '_json') 40 self.assertEqual(self.json.encoder.c_make_encoder.__module__, '_json') 41 self.assertEqual(self.json.encoder.encode_basestring_ascii.__module__, 42 '_json') 43 44 45here = os.path.dirname(__file__) 46 47def test_suite(): 48 suite = additional_tests() 49 loader = unittest.TestLoader() 50 for fn in os.listdir(here): 51 if fn.startswith("test") and fn.endswith(".py"): 52 modname = "json.tests." + fn[:-3] 53 __import__(modname) 54 module = sys.modules[modname] 55 suite.addTests(loader.loadTestsFromModule(module)) 56 return suite 57 58def additional_tests(): 59 suite = unittest.TestSuite() 60 for mod in (json, json.encoder, json.decoder): 61 suite.addTest(doctest.DocTestSuite(mod)) 62 suite.addTest(TestPyTest('test_pyjson')) 63 suite.addTest(TestCTest('test_cjson')) 64 return suite 65 66def main(): 67 suite = test_suite() 68 runner = unittest.TextTestRunner() 69 runner.run(suite) 70 71if __name__ == '__main__': 72 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) 73 main() 74