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