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