aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2020-03-20 13:22:43 -0700
committerDylan Baker <dylan@pnwbakers.com>2020-04-17 10:49:09 -0700
commite0c9259e79f21c6ee19f996c1f5d817d510de663 (patch)
tree22cd773b3b0ec7635ce1dfdf31ddbb93d5047fb3
parent91050e0c7c4920d9e793e0b911f8f3255b4d0e3e (diff)
downloadmeson-e0c9259e79f21c6ee19f996c1f5d817d510de663.zip
meson-e0c9259e79f21c6ee19f996c1f5d817d510de663.tar.gz
meson-e0c9259e79f21c6ee19f996c1f5d817d510de663.tar.bz2
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.
-rw-r--r--.editorconfig2
-rw-r--r--data/test.schema.json105
-rw-r--r--docs/markdown/Contributing.md12
-rwxr-xr-xrun_unittests.py26
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):