///|
test "cli parses business day rules" {
  match parse_rule_spec("business-days:5") {
    Ok(rule) =>
      match rule {
        @lib.DateRule::BusinessDays(count) => inspect(count, content="5")
        _ => inspect(false, content="true")
      }
    Err(_) => inspect(false, content="true")
  }
}

///|
test "cli parses a sequence rule" {
  match parse_rule_spec("calendar-days:3,business-days:2") {
    Ok(@lib.DateRule::Sequence(rules)) => inspect(rules.length(), content="2")
    _ => inspect(false, content="true")
  }
}

///|
test "cli parses extension and start options" {
  match
    parse_cli_arguments([
      "--start", "2026-08-07", "--rule", "business-days:5", "--exclude-start", "--extension",
      "following",
    ]) {
    Ok(config) => {
      inspect(config.start.to_string(), content="2026-08-07")
      inspect(config.exclude_start, content="true")
      match config.extension {
        @lib.ExtensionPolicy::Following => inspect(true, content="true")
        _ => inspect(false, content="true")
      }
    }
    Err(_) => inspect(false, content="true")
  }
}

///|
test "cli rejects malformed rules" {
  match parse_rule_spec("unknown:4") {
    Ok(_) => inspect(false, content="true")
    Err(_) => inspect(true, content="true")
  }
}

///|
test "cli parses table output format" {
  match
    parse_cli_arguments([
      "--start", "2026-08-07", "--rule", "calendar-days:2", "--format", "table",
    ]) {
    Ok(config) =>
      match config.format {
        Table => inspect(true, content="true")
        _ => inspect(false, content="true")
      }
    Err(_) => inspect(false, content="true")
  }
}

///|
test "cli rejects unknown output formats" {
  match
    parse_cli_arguments([
      "--start", "2026-08-07", "--rule", "calendar-days:2", "--format", "csv",
    ]) {
    Err(InvalidOption(value)) => inspect(value, content="--format=csv")
    _ => inspect(false, content="true")
  }
}