{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://wyrcan-io.github.io/playtestr/schema/playtestr-spec-v1.schema.json",
  "title": "Playtestr specification version 1",
  "type": "object",
  "additionalProperties": false,
  "required": ["version", "command", "steps"],
  "properties": {
    "version": {"const": 1},
    "name": {"type": "string"},
    "command": {
      "type": "array",
      "minItems": 1,
      "items": {"type": "string"}
    },
    "cwd": {"type": "string"},
    "env": {
      "type": "object",
      "propertyNames": {"pattern": "^[A-Za-z_][A-Za-z0-9_]*$"},
      "additionalProperties": {"type": "string"}
    },
    "inherit_env": {
      "type": "array",
      "items": {"type": "string", "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"}
    },
    "width": {"type": "integer", "minimum": 1, "maximum": 500, "default": 80},
    "height": {"type": "integer", "minimum": 1, "maximum": 200, "default": 24},
    "timeout_ms": {"type": "integer", "minimum": 1, "maximum": 120000, "default": 3000},
    "run_timeout_ms": {"type": "integer", "minimum": 1, "maximum": 3600000, "default": 30000},
    "startup_timeout_ms": {"type": "integer", "minimum": 0, "maximum": 120000},
    "max_output_bytes": {"type": "integer", "minimum": 1, "maximum": 1000000000, "default": 2000000},
    "steps": {
      "type": "array",
      "minItems": 1,
      "maxItems": 1000,
      "items": {"$ref": "#/$defs/step"}
    }
  },
  "$defs": {
    "size": {
      "type": "object",
      "additionalProperties": false,
      "required": ["width", "height"],
      "properties": {
        "width": {"type": "integer", "minimum": 1, "maximum": 500},
        "height": {"type": "integer", "minimum": 1, "maximum": 200}
      }
    },
    "step": {
      "type": "object",
      "additionalProperties": false,
      "oneOf": [
        {"required": ["key"]},
        {"required": ["text"]},
        {"required": ["expect"]},
        {"required": ["expect_not"]},
        {"required": ["wait_for_redraw"]},
        {"required": ["snapshot"]},
        {"required": ["exit"]},
        {"required": ["resize"]}
      ],
      "properties": {
        "key": {"enum": ["Enter", "ArrowDown", "ArrowUp", "ArrowRight", "ArrowLeft", "Escape", "Tab", "Backspace", "CtrlC"]},
        "text": {"type": "string", "minLength": 1},
        "expect": {"type": "string", "minLength": 1},
        "expect_not": {"type": "string", "minLength": 1},
        "wait_for_redraw": {"const": true},
        "snapshot": {"type": "string", "pattern": "^[^/\\\\:]+$"},
        "exit": {"type": "integer", "minimum": 0, "maximum": 255},
        "resize": {"$ref": "#/$defs/size"}
      }
    }
  }
}
