///|
test "parse closed byte range" {
  assert_true(unwrap_request("bytes=0-499").specs()[0] == Closed(0L, 499L))
}

///|
test "parse open ended byte range" {
  assert_true(unwrap_request("bytes=500-").specs()[0] == OpenEnded(500L))
}

///|
test "parse suffix byte range" {
  assert_true(unwrap_request("bytes=-500").specs()[0] == Suffix(500L))
}

///|
test "parse multiple ranges preserves order" {
  let specs = unwrap_request("bytes=500-999,0-99,-1").specs()
  assert_true(specs == [Closed(500L, 999L), Closed(0L, 99L), Suffix(1L)])
}

///|
test "parse byte unit case insensitively" {
  assert_true(unwrap_request("BYTES=0-99").unit().is_bytes())
}

///|
test "parse allows outer and comma OWS" {
  assert_str_eq(
    serialize_range(unwrap_request(" bytes = 0-9 , -1 ")),
    "bytes=0-9,-1",
  )
}

///|
test "unknown unit preserves spelling and raw set" {
  let request = unwrap_request("exampleunit=1-2, raw")
  assert_true(request.unit() == Other("exampleunit"))
  assert_str_eq(request.raw_other_range_set().unwrap(), "1-2, raw")
}

///|
test "empty Range input is syntax error" {
  assert_true(expect_range_error("").kind() == EmptyInput)
}

///|
test "missing equals is syntax error" {
  assert_true(expect_range_error("bytes 0-1").kind() == MissingEquals)
}

///|
test "empty range set is syntax error" {
  assert_true(expect_range_error("bytes=").kind() == EmptyRangeSet)
}

///|
test "empty member is syntax error" {
  assert_true(expect_range_error("bytes=0-1,,2-3").kind() == InvalidRange)
}

///|
test "trailing comma is syntax error" {
  assert_true(expect_range_error("bytes=0-1,").kind() == InvalidRange)
}

///|
test "negative first position is rejected" {
  assert_true(parse_range("bytes=-1-2") is Err(_))
}

///|
test "last before first is syntax invalid" {
  assert_true(expect_range_error("bytes=500-400").kind() == LastBeforeFirst)
}

///|
test "multiple dashes are rejected" {
  assert_true(expect_range_error("bytes=1-2-3").kind() == InvalidRange)
}

///|
test "control characters are rejected" {
  assert_true(expect_range_error("bytes=0-1\n").kind() == UnexpectedCharacter)
}

///|
test "invalid unit separator is rejected" {
  assert_true(expect_range_error("bad unit=1-2").kind() == InvalidUnit)
}

///|
test "zero suffix is syntactically valid" {
  assert_true(unwrap_request("bytes=-0").specs()[0] == Suffix(0L))
}