1*273c26a3SBaptiste Daroussinfrom .compat import unittest 2*273c26a3SBaptiste Daroussinimport ucl 3*273c26a3SBaptiste Daroussinimport json 4*273c26a3SBaptiste Daroussinimport os.path 5*273c26a3SBaptiste Daroussinimport glob 6*273c26a3SBaptiste Daroussinimport re 7*273c26a3SBaptiste Daroussin 8*273c26a3SBaptiste DaroussinTESTS_SCHEMA_FOLDER = '../tests/schema/*.json' 9*273c26a3SBaptiste Daroussin 10*273c26a3SBaptiste Daroussincomment_re = re.compile('\/\*((?!\*\/).)*?\*\/', re.DOTALL | re.MULTILINE) 11*273c26a3SBaptiste Daroussindef json_remove_comments(content): 12*273c26a3SBaptiste Daroussin return comment_re.sub('', content) 13*273c26a3SBaptiste Daroussin 14*273c26a3SBaptiste Daroussinclass ValidationTest(unittest.TestCase): 15*273c26a3SBaptiste Daroussin def validate(self, jsonfile): 16*273c26a3SBaptiste Daroussin def perform_test(schema, data, valid, description): 17*273c26a3SBaptiste Daroussin msg = '%s (valid=%r)' % (description, valid) 18*273c26a3SBaptiste Daroussin if valid: 19*273c26a3SBaptiste Daroussin self.assertTrue(ucl.validate(schema, data), msg) 20*273c26a3SBaptiste Daroussin else: 21*273c26a3SBaptiste Daroussin with self.assertRaises(ucl.SchemaError): 22*273c26a3SBaptiste Daroussin ucl.validate(schema, data) 23*273c26a3SBaptiste Daroussin self.fail(msg) # fail() will be called only if SchemaError is not raised 24*273c26a3SBaptiste Daroussin 25*273c26a3SBaptiste Daroussin with open(jsonfile) as f: 26*273c26a3SBaptiste Daroussin try: 27*273c26a3SBaptiste Daroussin # data = json.load(f) 28*273c26a3SBaptiste Daroussin data = json.loads(json_remove_comments(f.read())) 29*273c26a3SBaptiste Daroussin except ValueError as e: 30*273c26a3SBaptiste Daroussin raise self.skipTest('Failed to load JSON: %s' % str(e)) 31*273c26a3SBaptiste Daroussin 32*273c26a3SBaptiste Daroussin for testgroup in data: 33*273c26a3SBaptiste Daroussin for test in testgroup['tests']: 34*273c26a3SBaptiste Daroussin perform_test(testgroup['schema'], test['data'], 35*273c26a3SBaptiste Daroussin test['valid'], test['description']) 36*273c26a3SBaptiste Daroussin 37*273c26a3SBaptiste Daroussin @classmethod 38*273c26a3SBaptiste Daroussin def setupValidationTests(cls): 39*273c26a3SBaptiste Daroussin """Creates each test dynamically from a folder""" 40*273c26a3SBaptiste Daroussin def test_gen(filename): 41*273c26a3SBaptiste Daroussin def run_test(self): 42*273c26a3SBaptiste Daroussin self.validate(filename) 43*273c26a3SBaptiste Daroussin return run_test 44*273c26a3SBaptiste Daroussin 45*273c26a3SBaptiste Daroussin for jsonfile in glob.glob(TESTS_SCHEMA_FOLDER): 46*273c26a3SBaptiste Daroussin testname = os.path.splitext(os.path.basename(jsonfile))[0] 47*273c26a3SBaptiste Daroussin setattr(cls, 'test_%s' % testname, test_gen(jsonfile)) 48*273c26a3SBaptiste Daroussin 49*273c26a3SBaptiste Daroussin 50*273c26a3SBaptiste DaroussinValidationTest.setupValidationTests() 51