xref: /freebsd/contrib/libucl/python/tests/test_validation.py (revision 242b24828472137ec4411826b86e753d49bd2c39)
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