///|
fn assert_true(value : Bool) -> Unit raise {
  if !value {
    fail("expected true")
  }
}

///|
fn assert_false(value : Bool) -> Unit raise {
  if value {
    fail("expected false")
  }
}

///|
fn assert_int_eq(actual : Int, expected : Int) -> Unit raise {
  if actual != expected {
    fail("expected \{expected}, got \{actual}")
  }
}

///|
fn assert_i64_eq(actual : Int64, expected : Int64) -> Unit raise {
  if actual != expected {
    fail("expected \{expected}, got \{actual}")
  }
}

///|
fn assert_str_eq(actual : String, expected : String) -> Unit raise {
  if actual != expected {
    fail("expected '\{expected}', got '\{actual}'")
  }
}

///|
fn unwrap_request(input : String) -> RangeRequest raise {
  match parse_range(input) {
    Ok(value) => value
    Err(error) => fail(error.to_string())
  }
}

///|
fn expect_range_error(input : String) -> RangeError raise {
  match parse_range(input) {
    Ok(_) => fail("expected Range error")
    Err(error) => error
  }
}

///|
fn unwrap_resolve(input : String, length : Int64) -> ResolvedRangeSet raise {
  match resolve_byte_ranges(unwrap_request(input), length) {
    Ok(value) => value
    Err(error) => fail(error.to_string())
  }
}

///|
fn has_finding(report : AuditReport, kind : AuditFindingKind) -> Bool {
  for finding in report.findings() {
    if finding.kind() == kind {
      return true
    }
  }
  false
}