{
  "$comment": "IDOP 1.0 conformance suite. A conforming Reader MUST open every \"valid\" case and MUST refuse every other case with exactly the listed code.",
  "version": "1.0",
  "specification": "https://idoplabs.com/spec/idop/1.0/",
  "registry": "https://idoplabs.com/spec/idop/1.0/errors/",
  "cases": [
    {
      "id": "valid-minimal",
      "file": "valid-minimal.idop",
      "expect": "valid",
      "description": "The smallest package: mimetype, manifest, an entry point and one script."
    },
    {
      "id": "valid-state-and-resources",
      "file": "valid-state-and-resources.idop",
      "expect": "valid",
      "description": "Saved state under storage/, passive files under resources/, an icon."
    },
    {
      "id": "valid-network-capability",
      "file": "valid-network-capability.idop",
      "expect": "valid",
      "description": "A network capability bound to a credential that names no service."
    },
    {
      "id": "valid-nested-code",
      "file": "valid-nested-code.idop",
      "expect": "valid",
      "description": "Code split across folders, loaded by several scripts."
    },
    {
      "id": "valid-unicode-names",
      "file": "valid-unicode-names.idop",
      "expect": "valid",
      "description": "UTF-8, NFC-normalised entry names with the UTF-8 flag."
    },
    {
      "id": "valid-extension-data",
      "file": "valid-extension-data.idop",
      "expect": "valid",
      "description": "Data of a namespaced extension under extensions/<namespace>/."
    },
    {
      "id": "valid-optional-feature-unknown",
      "file": "valid-optional-feature-unknown.idop",
      "expect": "valid",
      "description": "An unknown optional feature is ignored."
    },
    {
      "id": "valid-webassembly",
      "file": "valid-webassembly.idop",
      "expect": "valid",
      "description": "A WebAssembly module under code/, loaded by the document with a relative fetch."
    },
    {
      "id": "valid-modules-and-worker",
      "file": "valid-modules-and-worker.idop",
      "expect": "valid",
      "description": "ES modules importing each other by relative specifiers, and a dedicated worker."
    },
    {
      "id": "valid-binary-state",
      "file": "valid-binary-state.idop",
      "expect": "valid",
      "description": "Saved state that is not text: a binary file under storage/."
    },
    {
      "id": "valid-zip64-signature-in-content",
      "file": "valid-zip64-signature-in-content.idop",
      "expect": "valid",
      "description": "Entry data that happens to contain the ZIP64 signatures; ZIP64 is recognised by its structures, not by these bytes."
    },
    {
      "id": "valid-data-descriptor",
      "file": "valid-data-descriptor.idop",
      "expect": "valid",
      "description": "An entry written with general purpose bit 3 and a data descriptor that agrees with the central directory."
    },
    {
      "id": "valid-archive-comment",
      "file": "valid-archive-comment.idop",
      "expect": "valid",
      "description": "An end of central directory record with a comment; nothing follows it."
    },
    {
      "id": "valid-words-in-comments-and-strings",
      "file": "valid-words-in-comments-and-strings.idop",
      "expect": "valid",
      "description": "Forbidden names in comments, strings and JSON data are words, not uses (§8, rule 5)."
    },
    {
      "id": "valid-svg-namespace",
      "file": "valid-svg-namespace.idop",
      "expect": "valid",
      "description": "Inline SVG whose xmlns attribute is a namespace name, not a remote URL (§8, rule 3)."
    },
    {
      "id": "zip-not-an-archive",
      "file": "zip-not-an-archive.idop",
      "expect": "IDOP-ZIP-001",
      "description": "Not a ZIP archive at all."
    },
    {
      "id": "zip-trailing-bytes",
      "file": "zip-trailing-bytes.idop",
      "expect": "IDOP-ZIP-011",
      "description": "Bytes after the end of the archive (a polyglot)."
    },
    {
      "id": "zip-leading-bytes",
      "file": "zip-leading-bytes.idop",
      "expect": "IDOP-ZIP-018",
      "description": "Bytes before the first entry (a self-extracting stub)."
    },
    {
      "id": "zip-gap-between-entries",
      "file": "zip-gap-between-entries.idop",
      "expect": "IDOP-ZIP-023",
      "description": "Bytes between two local records that the central directory does not account for."
    },
    {
      "id": "zip-hidden-local-entry",
      "file": "zip-hidden-local-entry.idop",
      "expect": "IDOP-ZIP-023",
      "description": "A complete local record between two entries that the central directory does not list: what a reader walking the local headers would see."
    },
    {
      "id": "zip-local-central-mismatch",
      "file": "zip-local-central-mismatch.idop",
      "expect": "IDOP-ZIP-021",
      "description": "A local header whose CRC-32 differs from its central directory record."
    },
    {
      "id": "zip-data-descriptor-mismatch",
      "file": "zip-data-descriptor-mismatch.idop",
      "expect": "IDOP-ZIP-024",
      "description": "A data descriptor whose CRC-32 differs from the central directory."
    },
    {
      "id": "zip-encrypted-entry",
      "file": "zip-encrypted-entry.idop",
      "expect": "IDOP-ZIP-015",
      "description": "An entry flagged as encrypted."
    },
    {
      "id": "zip-unsupported-method",
      "file": "zip-unsupported-method.idop",
      "expect": "IDOP-ZIP-016",
      "description": "An entry compressed with a method other than Store or Deflate (12, bzip2)."
    },
    {
      "id": "zip-zip64-extra-field",
      "file": "zip-zip64-extra-field.idop",
      "expect": "IDOP-ZIP-010",
      "description": "An entry carrying a ZIP64 extended information extra field."
    },
    {
      "id": "zip-mimetype-extra-field",
      "file": "zip-mimetype-extra-field.idop",
      "expect": "IDOP-ZIP-019",
      "description": "The mimetype local header carries an extra field, which moves the media type away from offset 38."
    },
    {
      "id": "profile-mimetype-not-first",
      "file": "profile-mimetype-not-first.idop",
      "expect": "IDOP-PROFILE-001",
      "description": "mimetype is present but is not the first entry."
    },
    {
      "id": "profile-mimetype-compressed",
      "file": "profile-mimetype-compressed.idop",
      "expect": "IDOP-PROFILE-001",
      "description": "mimetype is compressed instead of Stored."
    },
    {
      "id": "profile-wrong-media-type",
      "file": "profile-wrong-media-type.idop",
      "expect": "IDOP-PROFILE-002",
      "description": "mimetype names another media type."
    },
    {
      "id": "profile-mimetype-line-terminator",
      "file": "profile-mimetype-line-terminator.idop",
      "expect": "IDOP-PROFILE-002",
      "description": "mimetype followed by a line terminator."
    },
    {
      "id": "path-traversal",
      "file": "path-traversal.idop",
      "expect": "IDOP-PATH-006",
      "description": "An entry name with a .. segment."
    },
    {
      "id": "path-backslash",
      "file": "path-backslash.idop",
      "expect": "IDOP-PATH-002",
      "description": "An entry name with a backslash."
    },
    {
      "id": "path-unknown-root",
      "file": "path-unknown-root.idop",
      "expect": "IDOP-PATH-010",
      "description": "An entry outside the defined roots."
    },
    {
      "id": "path-case-collision",
      "file": "path-case-collision.idop",
      "expect": "IDOP-PATH-030",
      "description": "Two names that collide after case folding."
    },
    {
      "id": "path-case-fold-collision",
      "file": "path-case-fold-collision.idop",
      "expect": "IDOP-PATH-030",
      "description": "Two names equal under Unicode full case folding but not under lowercasing (straße, STRASSE)."
    },
    {
      "id": "path-not-nfc",
      "file": "path-not-nfc.idop",
      "expect": "IDOP-PATH-004",
      "description": "An entry name in NFD instead of NFC."
    },
    {
      "id": "path-extension-namespace-uppercase",
      "file": "path-extension-namespace-uppercase.idop",
      "expect": "IDOP-PATH-012",
      "description": "An extension namespace that is not a lowercase reverse-domain identifier."
    },
    {
      "id": "path-windows-device",
      "file": "path-windows-device.idop",
      "expect": "IDOP-PATH-008",
      "description": "A segment that is a Windows device name."
    },
    {
      "id": "path-directory-entry",
      "file": "path-directory-entry.idop",
      "expect": "IDOP-ZIP-032",
      "description": "A directory entry; packages contain files only."
    },
    {
      "id": "limit-compression-ratio",
      "file": "limit-compression-ratio.idop",
      "expect": "IDOP-LIMIT-004",
      "description": "One entry expands more than 100:1 (a decompression bomb)."
    },
    {
      "id": "manifest-missing",
      "file": "manifest-missing.idop",
      "expect": "IDOP-PROFILE-003",
      "description": "No idop.json."
    },
    {
      "id": "manifest-duplicate-key",
      "file": "manifest-duplicate-key.idop",
      "expect": "IDOP-MANIFEST-001",
      "description": "idop.json repeats an object key."
    },
    {
      "id": "manifest-unknown-member",
      "file": "manifest-unknown-member.idop",
      "expect": "IDOP-MANIFEST-003",
      "description": "idop.json has a member the schema does not define."
    },
    {
      "id": "manifest-bad-application-id",
      "file": "manifest-bad-application-id.idop",
      "expect": "IDOP-MANIFEST-003",
      "description": "application.id is not reverse-domain."
    },
    {
      "id": "manifest-credential-names-provider",
      "file": "manifest-credential-names-provider.idop",
      "expect": "IDOP-MANIFEST-003",
      "description": "A credential binding names a service."
    },
    {
      "id": "manifest-unused-credential",
      "file": "manifest-unused-credential.idop",
      "expect": "IDOP-MANIFEST-026",
      "description": "A credential binding no capability references."
    },
    {
      "id": "manifest-revision-lineage",
      "file": "manifest-revision-lineage.idop",
      "expect": "IDOP-MANIFEST-014",
      "description": "parentRevisionId equals revisionId."
    },
    {
      "id": "manifest-timestamp-offset",
      "file": "manifest-timestamp-offset.idop",
      "expect": "IDOP-MANIFEST-015",
      "description": "A timestamp written with +00:00 instead of Z (§7.4)."
    },
    {
      "id": "manifest-extension-key",
      "file": "manifest-extension-key.idop",
      "expect": "IDOP-MANIFEST-003",
      "description": "A key of extensions that is not a reverse-domain namespace."
    },
    {
      "id": "manifest-origin-not-canonical",
      "file": "manifest-origin-not-canonical.idop",
      "expect": "IDOP-MANIFEST-003",
      "description": "A capability origin with an uppercase host, which is not its ASCII serialization."
    },
    {
      "id": "manifest-origin-default-port",
      "file": "manifest-origin-default-port.idop",
      "expect": "IDOP-MANIFEST-023",
      "description": "A capability origin that names the default port 443."
    },
    {
      "id": "manifest-duplicate-environment-id",
      "file": "manifest-duplicate-environment-id.idop",
      "expect": "IDOP-MANIFEST-027",
      "description": "Two environment bindings with the same identifier."
    },
    {
      "id": "unsupported-required-feature",
      "file": "unsupported-required-feature.idop",
      "expect": "IDOP-UNSUPPORTED-002",
      "description": "A required feature the Reader does not implement."
    },
    {
      "id": "unsupported-major-version",
      "file": "unsupported-major-version.idop",
      "expect": "IDOP-MANIFEST-003",
      "description": "formatVersion of a major version the Reader does not implement."
    },
    {
      "id": "policy-active-resource",
      "file": "policy-active-resource.idop",
      "expect": "IDOP-POLICY-001",
      "description": "A script under resources/."
    },
    {
      "id": "policy-code-not-text",
      "file": "policy-code-not-text.idop",
      "expect": "IDOP-POLICY-002",
      "description": "A non-code file type under code/."
    },
    {
      "id": "policy-inline-script",
      "file": "policy-inline-script.idop",
      "expect": "IDOP-POLICY-014",
      "description": "Inline script in HTML."
    },
    {
      "id": "policy-remote-url",
      "file": "policy-remote-url.idop",
      "expect": "IDOP-POLICY-011",
      "description": "HTML that loads a remote resource."
    },
    {
      "id": "policy-css-import",
      "file": "policy-css-import.idop",
      "expect": "IDOP-POLICY-012",
      "description": "CSS with @import."
    },
    {
      "id": "policy-wasm-not-a-module",
      "file": "policy-wasm-not-a-module.idop",
      "expect": "IDOP-POLICY-004",
      "description": "A .wasm file under code/ that is not a WebAssembly module."
    },
    {
      "id": "policy-wasm-outside-code",
      "file": "policy-wasm-outside-code.idop",
      "expect": "IDOP-POLICY-001",
      "description": "A WebAssembly module under resources/."
    },
    {
      "id": "policy-shared-worker",
      "file": "policy-shared-worker.idop",
      "expect": "IDOP-POLICY-010",
      "description": "A shared worker, which would outlive the document."
    },
    {
      "id": "policy-service-worker",
      "file": "policy-service-worker.idop",
      "expect": "IDOP-POLICY-010",
      "description": "Registering a service worker, which would outlive the document."
    },
    {
      "id": "policy-javascript-url",
      "file": "policy-javascript-url.idop",
      "expect": "IDOP-POLICY-010",
      "description": "A javascript: URL in HTML."
    },
    {
      "id": "policy-iframe",
      "file": "policy-iframe.idop",
      "expect": "IDOP-POLICY-011",
      "description": "An iframe in HTML."
    },
    {
      "id": "policy-eval",
      "file": "policy-eval.idop",
      "expect": "IDOP-POLICY-010",
      "description": "Dynamic evaluation in document code."
    }
  ]
}
