diff options
-rw-r--r-- | .editorconfig | 2 | ||||
-rw-r--r-- | data/test.schema.json | 105 | ||||
-rw-r--r-- | docs/markdown/Contributing.md | 12 | ||||
-rwxr-xr-x | run_unittests.py | 26 |
4 files changed, 143 insertions, 2 deletions
diff --git a/.editorconfig b/.editorconfig index d848627..c2dd5d0 100644 --- a/.editorconfig +++ b/.editorconfig @@ -23,3 +23,5 @@ indent_size = 2 [meson.build] indent_size = 2 +[*.json] +indent_size = 2 diff --git a/data/test.schema.json b/data/test.schema.json new file mode 100644 index 0000000..72f160f --- /dev/null +++ b/data/test.schema.json @@ -0,0 +1,105 @@ +{ + "type": "object", + "properties": { + "env": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "installed": { + "type": "array", + "items": { + "type": "object", + "properties": { + "file": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "file", + "exe", + "shared_lib", + "pdb", + "implib", + "implibempty", + "expr" + ] + }, + "platform": { + "type": "string", + "enum": [ + "msvc", + "gcc", + "cygwin", + "!cygwin" + ] + }, + "version": { + "type": "string" + }, + "language": { + "type": "string" + } + }, + "required": [ + "file", + "type" + ] + } + }, + "matrix": { + "type": "object", + "additionalProperties": { + "properties": { + "options": { + "type": "array", + "items": { + "type": "object", + "properties": { + "val": { + "type": "string" + }, + "compilers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "skip_on_env": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "val" + ] + } + }, + "exclude": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "do_not_set_opts": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "libdir", + "prefix" + ] + } + } + } +} diff --git a/docs/markdown/Contributing.md b/docs/markdown/Contributing.md index 6f4c397..5332938 100644 --- a/docs/markdown/Contributing.md +++ b/docs/markdown/Contributing.md @@ -294,9 +294,17 @@ Additionally, the `skip_on_env` key can be used to specify a list of environment variables. If at least one environment variable in `skip_on_env` is present, all matrix entries containing this value are skipped. -Similarly, the `compilers` key can be used to define a set of compilers required -for this value. +Similarly, the `compilers` key can be used to define a mapping of compilers to languages that are required for this value. +```json +{ + "compilers": { + "c": "gcc", + "cpp": "gcc", + "d": "gdc" + } +} +``` Specific option combinations can be excluded with the `exclude` section. It should be noted that `exclude` does not require exact matches. Instead, any matrix entry diff --git a/run_unittests.py b/run_unittests.py index 4cd6e17..cc294dd 100755 --- a/run_unittests.py +++ b/run_unittests.py @@ -1227,6 +1227,32 @@ class InternalTests(unittest.TestCase): actual = [m() for m in f(env, MachineChoice.HOST, {'required': False})] self.assertListEqual([m.type_name for m in actual], ['cmake', 'pkgconfig']) + def test_validate_json(self) -> None: + """Validate the json schema for the test cases.""" + try: + from jsonschema import validate, ValidationError + except ImportError: + if is_ci(): + raise + raise unittest.SkipTest('Python jsonschema module not found.') + + with Path('data/test.schema.json').open() as f: + schema = json.load(f) + + errors = [] # type: T.Tuple[str, Exception] + for p in Path('test cases').glob('**/test.json'): + with p.open() as f: + try: + validate(json.load(f), schema=schema) + except ValidationError as e: + errors.append((p.resolve(), e)) + + for f, e in errors: + print('Failed to validate: "{}"'.format(f)) + print(str(e)) + + self.assertFalse(errors) + @unittest.skipIf(is_tarball(), 'Skipping because this is a tarball release') class DataTests(unittest.TestCase): |