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")) ); }