Add a json schema for the test.json used in tests

This does a couple of nice things, one is that editors like vscode can
be configured to use this schema to provide auto completion and error
highlighting if invalid values are added or required values are missing.
It also allows us test that the format of the test matrix work in a unit
test, which I've added. It does require that the python jsonschema
package is installed.
pull/6816/head
Dylan Baker 4 years ago
parent 91050e0c7c
commit e0c9259e79
  1. 2
      .editorconfig
  2. 105
      data/test.schema.json
  3. 12
      docs/markdown/Contributing.md
  4. 26
      run_unittests.py

@ -23,3 +23,5 @@ indent_size = 2
[meson.build]
indent_size = 2
[*.json]
indent_size = 2

@ -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"
]
}
}
}
}

@ -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

@ -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):

Loading…
Cancel
Save