use rust_mc_status::McError;
use rust_mc_status::error::ConfigError;
fn parse(addr: &str, default: u16) -> Result<(String, u16, bool), McError> {
rust_mc_status::core::address::parse(addr, default)
.map(|(h, p, e)| (h.to_string(), p, e))
}
fn ok(addr: &str, default: u16) -> (String, u16, bool) {
parse(addr, default).unwrap_or_else(|e| panic!("expected Ok for {addr:?}, got {e}"))
}
fn err(addr: &str, default: u16) -> McError {
parse(addr, default).expect_err(&format!("expected Err for {addr:?}"))
}
#[test]
fn hostname_no_port_uses_default() {
let (host, port, explicit) = ok("mc.hypixel.net", 25565);
assert_eq!(host, "mc.hypixel.net");
assert_eq!(port, 25565);
assert!(!explicit);
}
#[test]
fn hostname_with_port() {
let (host, port, explicit) = ok("mc.hypixel.net:19132", 25565);
assert_eq!(host, "mc.hypixel.net");
assert_eq!(port, 19132);
assert!(explicit);
}
#[test]
fn hostname_port_overrides_default() {
let (_, port, explicit) = ok("server.example.com:1234", 9999);
assert_eq!(port, 1234);
assert!(explicit);
}
#[test]
fn ipv4_no_port() {
let (host, port, explicit) = ok("192.168.1.1", 25565);
assert_eq!(host, "192.168.1.1");
assert_eq!(port, 25565);
assert!(!explicit);
}
#[test]
fn ipv4_with_port() {
let (host, port, explicit) = ok("192.168.1.1:25566", 25565);
assert_eq!(host, "192.168.1.1");
assert_eq!(port, 25566);
assert!(explicit);
}
#[test]
fn ipv6_bracketed_no_port() {
let (host, port, explicit) = ok("[::1]", 25565);
assert_eq!(host, "::1");
assert_eq!(port, 25565);
assert!(!explicit);
}
#[test]
fn ipv6_bracketed_with_port() {
let (host, port, explicit) = ok("[::1]:19132", 25565);
assert_eq!(host, "::1");
assert_eq!(port, 19132);
assert!(explicit);
}
#[test]
fn ipv6_full_address_bracketed() {
let (host, port, explicit) = ok("[2001:db8::1]:25565", 9999);
assert_eq!(host, "2001:db8::1");
assert_eq!(port, 25565);
assert!(explicit);
}
#[test]
fn ipv6_bare_no_brackets_uses_default_port() {
let (host, port, explicit) = ok("::1", 25565);
assert_eq!(host, "::1");
assert_eq!(port, 25565);
assert!(!explicit);
}
#[test]
fn port_zero_is_valid() {
let (_, port, explicit) = ok("host.example.com:0", 25565);
assert_eq!(port, 0);
assert!(explicit);
}
#[test]
fn port_max_u16_is_valid() {
let (_, port, explicit) = ok("host.example.com:65535", 25565);
assert_eq!(port, 65535);
assert!(explicit);
}
#[test]
fn port_out_of_range_is_config_error() {
let e = err("mc.hypixel.net:99999", 25565);
assert!(
matches!(e, McError::Config(ConfigError::InvalidPort(_))),
"expected ConfigError::InvalidPort, got {e:?}"
);
}
#[test]
fn port_not_a_number_is_config_error() {
let e = err("mc.hypixel.net:abc", 25565);
assert!(matches!(e, McError::Config(ConfigError::InvalidPort(_))));
}
#[test]
fn ipv6_missing_closing_bracket_is_config_error() {
let e = err("[::1:25565", 25565);
assert!(
matches!(e, McError::Config(ConfigError::InvalidAddress(_))),
"expected ConfigError::InvalidAddress, got {e:?}"
);
}
#[test]
fn ipv6_port_not_a_number_is_config_error() {
let e = err("[::1]:xyz", 25565);
assert!(matches!(e, McError::Config(ConfigError::InvalidPort(_))));
}