1306542Sbaptfrom .compat import unittest 2306542Sbaptimport ucl 3306542Sbaptimport json 4306542Sbaptimport os.path 5306542Sbaptimport glob 6306542Sbaptimport re 7306542Sbapt 8306542SbaptTESTS_SCHEMA_FOLDER = '../tests/schema/*.json' 9306542Sbapt 10306542Sbaptcomment_re = re.compile('\/\*((?!\*\/).)*?\*\/', re.DOTALL | re.MULTILINE) 11306542Sbaptdef json_remove_comments(content): 12306542Sbapt return comment_re.sub('', content) 13306542Sbapt 14306542Sbaptclass ValidationTest(unittest.TestCase): 15306542Sbapt def validate(self, jsonfile): 16306542Sbapt def perform_test(schema, data, valid, description): 17306542Sbapt msg = '%s (valid=%r)' % (description, valid) 18306542Sbapt if valid: 19306542Sbapt self.assertTrue(ucl.validate(schema, data), msg) 20306542Sbapt else: 21306542Sbapt with self.assertRaises(ucl.SchemaError): 22306542Sbapt ucl.validate(schema, data) 23306542Sbapt self.fail(msg) # fail() will be called only if SchemaError is not raised 24306542Sbapt 25306542Sbapt with open(jsonfile) as f: 26306542Sbapt try: 27306542Sbapt # data = json.load(f) 28306542Sbapt data = json.loads(json_remove_comments(f.read())) 29306542Sbapt except ValueError as e: 30306542Sbapt raise self.skipTest('Failed to load JSON: %s' % str(e)) 31306542Sbapt 32306542Sbapt for testgroup in data: 33306542Sbapt for test in testgroup['tests']: 34306542Sbapt perform_test(testgroup['schema'], test['data'], 35306542Sbapt test['valid'], test['description']) 36306542Sbapt 37306542Sbapt @classmethod 38306542Sbapt def setupValidationTests(cls): 39306542Sbapt """Creates each test dynamically from a folder""" 40306542Sbapt def test_gen(filename): 41306542Sbapt def run_test(self): 42306542Sbapt self.validate(filename) 43306542Sbapt return run_test 44306542Sbapt 45306542Sbapt for jsonfile in glob.glob(TESTS_SCHEMA_FOLDER): 46306542Sbapt testname = os.path.splitext(os.path.basename(jsonfile))[0] 47306542Sbapt setattr(cls, 'test_%s' % testname, test_gen(jsonfile)) 48306542Sbapt 49306542Sbapt 50306542SbaptValidationTest.setupValidationTests() 51