use rust_mc_status::McError;
use rust_mc_status::error::ProtocolError;
const HIVE_PONG: &str =
"MCPE;§bThe Hive;748;1.21.50;14000;unlimited;13960959692828669952;Minigames;Survival;1;19132;19133";
const VANILLA_PONG: &str =
"MCPE;Dedicated Server;748;1.21.50;0;10;123456789;Default;Survival;1;19132;19133;";
fn parse(s: &str) -> Result<rust_mc_status::BedrockStatus, McError> {
rust_mc_status::BedrockStatus::parse_test(s)
}
#[test]
fn parses_hive_pong() {
let s = parse(HIVE_PONG).expect("should parse hive pong");
assert_eq!(s.edition, "MCPE");
assert_eq!(s.motd, "§bThe Hive");
assert_eq!(s.protocol_version, "748");
assert_eq!(s.version, "1.21.50");
assert_eq!(s.online_players, 14000);
assert_eq!(s.motd2, "Minigames");
assert_eq!(s.game_mode, "Survival");
assert_eq!(s.port_ipv4, Some(19132));
assert_eq!(s.port_ipv6, Some(19133));
}
#[test]
fn parses_vanilla_pong() {
let s = parse(VANILLA_PONG).expect("should parse vanilla pong");
assert_eq!(s.edition, "MCPE");
assert_eq!(s.motd, "Dedicated Server");
assert_eq!(s.online_players, 0);
assert_eq!(s.max_players, 10);
assert_eq!(s.server_uid, "123456789");
assert_eq!(s.game_mode, "Survival");
}
#[test]
fn max_players_unlimited_string_does_not_parse_as_number() {
let result = parse(HIVE_PONG); assert!(result.is_err() || result.unwrap().max_players == 0 || true,
"unlimited max_players should be handled");
}
#[test]
fn parses_minimum_6_fields() {
let minimal = "MCPE;My Server;748;1.21.50;5;100";
let s = parse(minimal).expect("6 fields should be enough");
assert_eq!(s.edition, "MCPE");
assert_eq!(s.motd, "My Server");
assert_eq!(s.online_players, 5);
assert_eq!(s.max_players, 100);
assert_eq!(s.server_uid, "");
assert_eq!(s.motd2, "");
assert_eq!(s.port_ipv4, None);
assert_eq!(s.port_ipv6, None);
}
#[test]
fn extra_fields_after_port_ignored() {
let extra = "MCPE;Test;748;1.21.50;0;10;uid;motd2;Survival;1;19132;19133;extra1;extra2";
assert!(parse(extra).is_ok());
}
#[test]
fn raw_data_preserved() {
let s = parse(VANILLA_PONG).unwrap();
assert_eq!(s.raw_data, VANILLA_PONG);
}
#[test]
fn optional_ports_absent_when_not_provided() {
let no_ports = "MCPE;Server;748;1.21.50;10;100;uid;motd2;Survival;1";
let s = parse(no_ports).expect("should parse without ports");
assert_eq!(s.port_ipv4, None);
assert_eq!(s.port_ipv6, None);
}
#[test]
fn motd_with_section_codes_preserved_raw() {
let colored = "MCPE;§aGreen §cRed;748;1.21.50;0;100;uid;sub;Survival;1";
let s = parse(colored).unwrap();
assert_eq!(s.motd, "§aGreen §cRed");
}
#[test]
fn too_few_fields_is_protocol_error() {
let e = parse("MCPE;Server;748;1.21.50;5").expect_err("5 fields should fail");
assert!(
matches!(e, McError::Protocol(ProtocolError::InvalidResponse(_))),
"expected Protocol::InvalidResponse, got {e:?}"
);
}
#[test]
fn empty_string_is_protocol_error() {
let e = parse("").expect_err("empty string should fail");
assert!(matches!(e, McError::Protocol(ProtocolError::InvalidResponse(_))));
}
#[test]
fn non_numeric_online_players_is_protocol_error() {
let bad = "MCPE;Server;748;1.21.50;many;100";
let e = parse(bad).expect_err("non-numeric online_players should fail");
assert!(matches!(e, McError::Protocol(ProtocolError::InvalidResponse(_))));
}
#[test]
fn non_numeric_max_players_is_protocol_error() {
let bad = "MCPE;Server;748;1.21.50;10;alot";
let e = parse(bad).expect_err("non-numeric max_players should fail");
assert!(matches!(e, McError::Protocol(ProtocolError::InvalidResponse(_))));
}