## XML validator -- exhaustive edge-case tests.
## Auto-generated. Tests valid code, invalid code, encoding attacks,
## nesting extremes, unicode bombs, binary injection, and more.
import std/[unittest, strutils, strformat, json]
import ../src/nimcheck
proc checkValid(result: ValidationResult, context: string = "") =
if result.errors.len > 0:
var msg = &"Expected valid, got {result.errors.len} error(s)"
if context.len > 0: msg.add(&" [{context}]")
for e in result.errors: msg.add(&"\n [{e.code}] {e.message}")
doAssert false, msg
proc checkInvalid(result: ValidationResult, context: string = "") =
if result.errors.len == 0:
doAssert false, &"Expected errors, got none [{context}]"
proc checkHasError(result: ValidationResult, code: string, context: string = "") =
var found = false
for e in result.errors:
if e.code == code: found = true
if not found:
var codes: seq[string] = @[]
for e in result.errors: codes.add(e.code)
let codesJoined = codes.join(", ")
doAssert false, "Expected error code '" & code & "', got " & codesJoined & " [" & context & "]"
proc checkSeverity(result: ValidationResult, sev: string, context: string = "") =
var found = false
for e in result.errors:
if $e.severity == sev: found = true
if not found:
doAssert false, &"Expected severity '{sev}', none found [{context}]"
suite "XML Exhaustive Tests":
test "basic valid XML":
let src = "value\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "unclosed element":
let src = "unclosed\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "mismatched tags":
let src = "text\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "self-closing element":
let src = " \n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "nested elements deep":
let src = "
deep
\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "attributes with double quotes":
let src = "click\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "attributes with single quotes":
let src = "click\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "XML comment":
let src = "
text
\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "CDATA section":
let src = "alert('xss')]]>\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "empty source":
let src = ""
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "XML declaration only":
let src = "\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "null byte in XML":
let src = "
hello\x00world
\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "entity references":
let src = "
&<>"'
\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "numeric character references":
let src = "
AA😀
\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "multiple attributes":
let src = "\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "namespaced elements":
let src = "value\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "namespaced attributes":
let src = "link\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "mixed content":
let src = "Some text with child and more text.\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "processing instruction":
let src = "data\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "duplicate attribute":
let src = "dup\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "unquoted attribute value":
let src = "unquoted\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "missing closing tag":
let src = "text"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "deeply nested with many children":
let src = "" & repeat("", 50) & "deep" & repeat("", 50) & "\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "UTF-8 encoded content":
let src = "\u3053\u3093\u306b\u3061\u306f\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "DOCTYPE declaration":
let src = "
text
\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "empty element content":
let src = "\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "whitespace-only content":
let src = " \n \t \n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0
test "long text content":
let src = "
" & repeat("x", 10000) & "
\n"
let result = validateSource(src, flavor = lfXML)
check result.errors.len >= 0