{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://angular.io/internal/compliance-test-cases.json",
  "title": "Compliance test cases",
  "description": "Describes configuration for an Angular compliance test",
  "type": "object",
  "properties": {
    "cases": {
      "title": "A collection of test cases",
      "type": "array",
      "items": {
        "title": "A test case definition",
        "type": "object",
        "required": [
          "description"
        ],
        "properties": {
          "description": {
            "title": "A description of the test case",
            "description": "This will be used as the message in an `it()` clause.",
            "type": "string"
          },
          "compilationModeFilter": {
            "title": "An array of compilation modes under which this test-case should be run.",
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "full compile",
                "linked compile"
              ]
            },
            "default": [
              "full compile",
              "linked compile"
            ]
          },
          "inputFiles": {
            "title": "A collection of source files to compile",
            "type": "array",
            "items": {
              "title": "Path (relative to the test case) of a source file to compile",
              "type": "string"
            }
          },
          "expectations": {
            "title": "A collection of expectations for this test case",
            "type": "array",
            "items": {
              "title": "An expectation to check for this test case",
              "type": "object",
              "properties": {
                "failureMessage": {
                  "title": "The message to display if this expectation fails",
                  "type": "string",
                  "default": "Incorrect generated output."
                },
                "files": {
                  "title": "A collection of expected-generated file path pairs",
                  "type": "array",
                  "items": {
                    "anyOf": [
                      {
                        "title": "A pair of expected-generated file paths to be compared",
                        "type": "object",
                        "required": [
                          "expected",
                          "generated"
                        ],
                        "properties": {
                          "expected": {
                            "title": "A path (relative to the test case) where a file containing expected output can be found",
                            "type": "string"
                          },
                          "generated": {
                            "title": "A path (relative to the build output directory) where the compiled file can be found.",
                            "type": "string"
                          }
                        }
                      },
                      {
                        "type": "string",
                        "title": "A path (relative to the test case) where an file containing expected output can be found. (The generated path is inferred from this.)"
                      }
                    ]
                  }
                },
                "expectedErrors": {
                  "title": "A collection of expected error messages for this test-case.",
                  "type": "array",
                  "items": {
                    "title": "An array of strings that should appear in the error message.",
                    "type": "object",
                    "properties": {
                      "message": {
                        "title": "A regular expression that should match the error message",
                        "type": "string"
                      },
                      "location": {
                        "title": "An optional regular expression that should match the location of the error",
                        "type": "string"
                      }
                    },
                    "required": [
                      "message"
                    ]
                  }
                },
                "extraChecks": {
                  "title": "Additional checks to run against the generated code.",
                  "type": "array",
                  "items": {
                    "anyOf": [
                      {
                        "title": "The name of a function to run as an additional check on the source.",
                        "type": "string"
                      },
                      {
                        "title": "An array whose first element is the name of a function to run as an additional check, and subsequent elements are args for this function",
                        "type": "array"
                      }
                    ]
                  }
                }
              }
            }
          },
          "compilerOptions": {
            "title": "Additional options to pass to the TypeScript compiler",
            "type": "object"
          },
          "angularCompilerOptions": {
            "title": "Additional options to pass to the Angular compiler",
            "type": "object"
          },
          "focusTest": {
            "title": "Set to true to focus on this test - equivalent to jasmine's `fit()` function",
            "type": "boolean"
          },
          "excludeTest": {
            "title": "Set to true to exclude this test - equivalent to jasmine's `xit()` function",
            "type": "boolean"
          }
        }
      },
      "minItems": 1
    }
  }
}
