///|
test "all byte prefixes of complex documents return ok or err without panic" {
  let fixtures = [
    "{}", "{\"title\":\"้”™่ฏฏ ๐Ÿ˜€\",\"status\":400}", "{\"type\":\"https://example.com/p\",\"meta\":{\"nested\":[true,false,null,1.5]}}",
    "{\"detail\":\"line\\nquote \\\" text\",\"instance\":\"/i/%20\"}", "{\"errors\":[{\"pointer\":\"#/name\",\"detail\":\"ๅฟ…ๅกซ\"},{\"pointer\":\"#/age\",\"detail\":\"too small\"}]}",
  ]
  let mut cases = 0
  for fixture in fixtures {
    let bytes = @utf8.encode(fixture)
    for length = 0; length <= bytes.length(); length = length + 1 {
      ignore(parse_problem_json_bytes(bytes_prefix(bytes, length)))
      cases = cases + 1
    }
  }
  assert_true(cases > 100)
}

///|
test "truncating inside four byte utf8 returns invalid utf8" {
  let bytes = @utf8.encode("{\"title\":\"๐Ÿ˜€\"}")
  let mut saw_invalid_utf8 = false
  for length = 0; length < bytes.length(); length = length + 1 {
    match parse_problem_json_bytes(bytes_prefix(bytes, length)) {
      Err(ProblemError(_, InvalidUtf8, _, _)) => saw_invalid_utf8 = true
      _ => ()
    }
  }
  assert_true(saw_invalid_utf8)
}