///|
test "structured error exposes fields" {
  let e = range_error(Syntax, InvalidRange, 3, "bad")
  assert_true(e.stage() == Syntax)
  assert_true(e.kind() == InvalidRange)
  assert_int_eq(e.offset(), 3)
  assert_str_eq(e.context(), "bad")
}

///|
test "error rendering includes offset" {
  assert_str_eq(
    range_error(Number, IntegerOverflow, 4, "large").to_string(),
    "Number/IntegerOverflow at 4: large",
  )
}

///|
test "stage names are stable" {
  assert_str_eq(ContentRange.name(), "ContentRange")
  assert_str_eq(Plan.name(), "Plan")
}

///|
test "kind names are stable" {
  assert_str_eq(LastBeforeFirst.name(), "LastBeforeFirst")
  assert_str_eq(LimitExceeded.name(), "LimitExceeded")
}