///|
test "public document parser and portable project policy" {
  let document = @tracecite.parse_document("[配置](config.toml)\n")
  assert_eq(document.references.length(), 1)
  assert_eq(document.references[0].source, "config.toml")
  let project = @tracecite.parse_document_project_config("{\"version\":1,\"paths\":[\"docs\"]}")
  assert_true(project.config.unwrap().strict)
  assert_false(project.config.unwrap().online)
  assert_true(project.diagnostics.is_empty())
  let json = @json.to_json(project.config.unwrap()).stringify()
  assert_true(@tracecite.parse_document_project_config(json).config is Some(_))
}

///|
test "public source selection, excerpt matching and baseline serialization" {
  let selected = @tracecite.select_document_source("# Settings\ntimeout = 20\n# Other\nUnused.\n", "settings")
  assert_true(selected.ok)
  assert_true(@tracecite.document_excerpt_matches(selected.text, "timeout = 20", "snippet"))
  assert_false(@tracecite.document_excerpt_matches(selected.text, "timeout = 30", "snippet"))
  let baseline = @tracecite.DocumentSnapshot::{
    version: 1,
    entries: [{ document: "README.md", source: "config.toml", kind: "snippet", excerpt: Some("timeout = 20"), observed: "timeout = 20" }],
  }
  let decoded : @tracecite.DocumentSnapshot = @json.from_json(@json.to_json(baseline))
  assert_eq(decoded.entries[0].observed, "timeout = 20")
}

///|
test "public glob policy and Setext source selection" {
  assert_true(@tracecite.document_path_pattern_matches("docs/**/*.md", "docs/guide.md"))
  assert_false(@tracecite.document_path_pattern_matches("docs/*.md", "docs/a/guide.md"))
  let config = @tracecite.parse_document_project_config("{\"version\":1,\"coverage\":{\"max_skipped_web\":0}}").config.unwrap()
  assert_eq(config.coverage.max_skipped_web, Some(0))
  assert_true(@tracecite.select_document_source("Settings\n--------\nCurrent.\n", "settings").ok)
}

///|
test "public snapshot delta preserves previous and current evidence" {
  let entry : @tracecite.DocumentSnapshotEntry = {document: "guide.md", source: "source.md", kind: "link", excerpt: None, observed: "before"}
  let next : @tracecite.DocumentSnapshotEntry = {..entry, observed: "after"}
  let changes = @tracecite.compare_document_snapshots({version: 1, entries: [entry]}, {version: 1, entries: [next]})
  assert_eq(changes.length(), 1)
  assert_eq(changes[0].change, "changed")
  assert_eq(changes[0].previous, Some("before"))
  assert_eq(changes[0].current, Some("after"))
}

///|
test "public compatibility parsing preserves real links without footnote sources" {
  assert_eq(@tracecite.markdown_heading_slug("Blocking(n) — Backpressure"), "blockingn--backpressure")
  let parsed = @tracecite.parse_document("[Source](/source.md)[^note]\n[^note]: The explanation contains [config](/config.toml).\n")
  assert_eq(parsed.references.length(), 2)
  assert_eq(parsed.references[0].source, "/source.md")
  assert_eq(parsed.references[1].source, "/config.toml")
  assert_true(parsed.warnings.is_empty())
}

///|
test "public Unicode anchors preserve duplicate numbering and section evidence" {
  assert_eq(@tracecite.markdown_heading_slug("État CAFÉ"), "état-café")
  assert_eq(@tracecite.markdown_heading_slug("ΟΣ"), "ος")
  assert_eq(@tracecite.markdown_heading_slug("ΟΣΑ"), "οσα")
  assert_eq(@tracecite.markdown_heading_slug("İSTANBUL"), "i\u{307}stanbul")
  assert_eq(@tracecite.markdown_heading_slug("𐐀𐐁"), "𐐨𐐩")
  let source = "ÉTAT\n===\nFirst.\n\n# état\nSecond.\n# NEXT\nOther.\n"
  let selected = @tracecite.select_document_source(source, "état-1")
  assert_true(selected.ok)
  assert_eq(selected.text, "# état\nSecond.")
  assert_true(@tracecite.document_excerpt_matches(selected.text, "Second.", "quote"))
  assert_false(@tracecite.select_document_source(source, "état-2").ok)
}

///|
test "public reference parsing preserves the first target and Unicode label identity" {
  let parsed = @tracecite.parse_document("[First][id]\n[id]: missing.md\n[ID]: valid.md\n[Unicode][STRASSE]\n[Straße]: valid.md\n[Title](valid.md \"(\")\n")
  assert_eq(parsed.references.length(), 3)
  assert_eq(parsed.references[0].source, "missing.md")
  assert_eq(parsed.references[1].source, "valid.md")
  assert_eq(parsed.references[2].source, "valid.md")
  assert_true(parsed.warnings.is_empty())
}

///|
test "paired change display is separate from complete snapshot evidence" {
  let padding = String::from_array(Array::make(2000, 'x'))
  let (before, after) = @tracecite.document_change_context(padding + "OLD", padding + "NEW")
  assert_true(before.contains("OLD"))
  assert_true(after.contains("NEW"))
  assert_true(before.to_array().length() <= 1600)
  assert_true(after.to_array().length() <= 1600)
}

///|
test "explicit quote policy and coverage budget round trip through public configuration" {
  let config = @tracecite.parse_document_project_config("{\"version\":1,\"unassociated_quotes\":\"skip\",\"coverage\":{\"max_skipped_quotes\":2}}").config.unwrap()
  let restored = @tracecite.parse_document_project_config(@json.to_json(config).stringify()).config.unwrap()
  assert_eq(restored.unassociated_quotes, "skip")
  assert_eq(restored.coverage.max_skipped_quotes, Some(2))
  assert_true(@tracecite.parse_document("A \"term\".").warnings.length() == 1)
}

///|
test "public source selection resolves a standalone explicit HTML id" {
  let source = "<a id='stable'></a>\n\nSelected.\n\n## Other\nOutside."
  let selected = @tracecite.select_document_source(source, "stable")
  assert_true(selected.ok)
  assert_true(selected.text.contains("Selected."))
  assert_false(selected.text.contains("Outside."))
  assert_false(@tracecite.select_document_source(source, "missing").ok)
}
