7f904b5e1d
Ein Spieler hat eine dauerhafte Kennung, einen Namen, eine Werkzeugstufe und ein Inventar. Befehle (Beitreten, Verlassen, Graben) sind der einzige Weg, die Welt zu ändern, und lassen sich kodieren. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
58 lines
1.8 KiB
Rust
58 lines
1.8 KiB
Rust
use grovewright_core::codec::{DecodeError, Reader, Writer};
|
|
use grovewright_core::inventory::ITEM_STONE;
|
|
use grovewright_core::player::{clamp_name, Player, MAX_NAME_BYTES, STARTING_TOOL_TIER};
|
|
|
|
#[test]
|
|
fn a_new_player_is_online_with_a_stone_pickaxe_and_empty_pockets() {
|
|
let player = Player::new([5; 16], "Ada");
|
|
assert_eq!(player.key, [5; 16]);
|
|
assert_eq!(player.name, "Ada");
|
|
assert!(player.online);
|
|
assert_eq!(player.tool_tier, STARTING_TOOL_TIER);
|
|
assert_eq!(player.next_action_tick, 0);
|
|
assert!(player.inventory.slots().iter().all(Option::is_none));
|
|
}
|
|
|
|
#[test]
|
|
fn long_names_are_cut_at_a_character_boundary() {
|
|
// "ä" takes two bytes, so twenty of them are forty bytes.
|
|
let long = "ä".repeat(20);
|
|
let clamped = clamp_name(&long);
|
|
assert_eq!(clamped, "ä".repeat(16));
|
|
assert_eq!(clamped.len(), MAX_NAME_BYTES);
|
|
|
|
// With one byte in front, the limit falls into the middle of a character.
|
|
let odd = format!("a{}", "ä".repeat(20));
|
|
assert_eq!(clamp_name(&odd), format!("a{}", "ä".repeat(15)));
|
|
|
|
assert_eq!(clamp_name("Ada"), "Ada");
|
|
assert_eq!(Player::new([0; 16], &long).name, clamped);
|
|
}
|
|
|
|
#[test]
|
|
fn a_player_survives_encoding() {
|
|
let mut player = Player::new([9; 16], "Grace");
|
|
player.online = false;
|
|
player.next_action_tick = 1234;
|
|
player.inventory.add(ITEM_STONE, 17);
|
|
|
|
let mut w = Writer::new();
|
|
player.encode(&mut w);
|
|
let bytes = w.into_bytes();
|
|
let mut r = Reader::new(&bytes);
|
|
assert_eq!(Player::decode(&mut r), Ok(player));
|
|
assert_eq!(r.finish(), Ok(()));
|
|
}
|
|
|
|
#[test]
|
|
fn decoding_rejects_an_overlong_name() {
|
|
let mut w = Writer::new();
|
|
w.raw(&[0; 16]);
|
|
w.str(&"x".repeat(MAX_NAME_BYTES + 1));
|
|
let bytes = w.into_bytes();
|
|
assert_eq!(
|
|
Player::decode(&mut Reader::new(&bytes)),
|
|
Err(DecodeError::InvalidValue("player name"))
|
|
);
|
|
}
|