#
# Schema to validate a YAML file describing a Zephyr test platform
#
# We load this with pykwalify
# (http://pykwalify.readthedocs.io/en/unstable/validation-rules.html),
# a YAML structure validator, to validate the YAML files that describe
# Zephyr test platforms
#
# The original spec comes from Zephyr's twister script
#
type: map
mapping:
  "common":
    type: map
    required: no
    mapping:
      "arch_exclude":
        type: str
        required: no
      "arch_allow":
        type: str
        required: no
      "build_only":
        type: bool
        required: no
      "build_on_all":
        type: bool
        required: no
      "depends_on":
        type: str
        required: no
      "extra_args":
        type: str
        required: no
      "extra_sections":
        type: str
        required: no
      "filter":
        type: str
        required: no
      "integration_platforms":
        type: seq
        required: no
        sequence:
          - type: str
      "harness":
        type: str
        required: no
      "harness_config":
        type: map
        required: no
        mapping:
          "type":
            type: str
            required: no
          "fixture":
            type: str
            required: no
          "ordered":
            type: bool
            required: no
          "repeat":
            type: int
            required: no
          "pytest_root":
            type: str
            required: no
          "regex":
            type: seq
            required: no
            sequence:
              - type: str
          "record":
            type: map
            required: no
            mapping:
              "regex":
                type: str
                required: no
      "min_ram":
        type: int
        required: no
      "min_flash":
        type: int
        required: no
      "platform_exclude":
        type: str
        required: no
      "platform_allow":
        type: str
        required: no
      "tags":
        type: str
        required: no
      "timeout":
        type: int
        required: no
      "toolchain_exclude":
        type: str
        required: no
      "toolchain_allow":
        type: str
        required: no
      "type":
        type: str
        enum: ["unit"]
      "skip":
        type: bool
        required: no
      "slow":
        type: bool
        required: no
  # The sample descriptor, if present
  "sample":
    type: map
    required: no
    mapping:
      "name":
        type: str
        required: yes
      "description":
        type: str
        required: no
  # The list of testcases -- IDK why this is a sequence of
  # maps maps, shall just be a sequence of maps
  # maybe it is just an artifact?
  "tests":
    type: map
    matching-rule: "any"
    mapping:
      # The key for the testname is any, so
      # regex;(([a-zA-Z0-9_]+)) for this to work, note below we
      # make it required: no
      regex;(([a-zA-Z0-9_]+)):
        type: map
        # has to be not-required, otherwise the parser gets
        # confused and things it never found it
        required: no
        mapping:
          "arch_exclude":
            type: str
            required: no
          "arch_allow":
            type: str
            required: no
          "build_only":
            type: bool
            required: no
          "build_on_all":
            type: bool
            required: no
          "depends_on":
            type: str
            required: no
          "extra_args":
            type: str
            required: no
          "extra_configs":
            type: seq
            required: no
            sequence:
              - type: str
          "extra_sections":
            type: str
            required: no
          "filter":
            type: str
            required: no
          "integration_platforms":
            type: seq
            required: no
            sequence:
              - type: str
          "harness":
            type: str
            required: no
          "harness_config":
            type: map
            required: no
            mapping:
              "type":
                type: str
                required: no
              "fixture":
                type: str
                required: no
              "ordered":
                type: bool
                required: no
              "repeat":
                type: int
                required: no
              "pytest_root":
                type: str
                required: no
              "regex":
                type: seq
                required: no
                sequence:
                  - type: str
              "record":
                type: map
                required: no
                mapping:
                  "regex":
                    type: str
                    required: no
          "min_ram":
            type: int
            required: no
          "min_flash":
            type: int
            required: no
          "platform_exclude":
            type: str
            required: no
          "platform_allow":
            type: str
            required: no
          "tags":
            type: str
            required: no
          "timeout":
            type: int
            required: no
          "toolchain_exclude":
            type: str
            required: no
          "toolchain_allow":
            type: str
            required: no
          "type":
            type: str
            enum: ["unit"]
          "skip":
            type: bool
            required: no
          "slow":
            type: bool
            required: no