///|
test "rfc style out of credit problem parses" {
  let p = unwrap_problem(
    "{\"type\":\"https://example.com/probs/out-of-credit\",\"title\":\"You do not have enough credit.\",\"status\":403,\"detail\":\"Your balance is 30, but that costs 50.\",\"instance\":\"/account/12345/msgs/abc\",\"balance\":30,\"accounts\":[\"/account/12345\",\"/account/67890\"]}",
  )
  assert_int_eq(p.status().unwrap(), 403)
  assert_true(p.has_extension("accounts"))
}

///|
test "validation problem keeps error array extension" {
  assert_true(
    unwrap_problem(
      "{\"type\":\"https://example.net/validation-error\",\"title\":\"Invalid request\",\"status\":422,\"errors\":[{\"detail\":\"must be positive\",\"pointer\":\"#/age\"}]}",
    ).extension("errors")
    is Some(Array(_)),
  )
}

///|
test "rfc consumer ignores wrong typed standard members" {
  let r = unwrap_parse(
    "{\"title\":42,\"status\":\"403\",\"detail\":false,\"balance\":30}",
  )
  assert_int_eq(r.diagnostics().length(), 3)
  assert_true(r.problem().has_extension("balance"))
}

///|
test "about blank is equivalent whether type is missing or explicit" {
  assert_str_eq(
    unwrap_problem("{}").effective_type(),
    unwrap_problem("{\"type\":\"about:blank\"}").effective_type(),
  )
}