Add bitfield decoder
This commit is contained in:
60
protocol-derive/tests/bitfield_abilities.rs
Normal file
60
protocol-derive/tests/bitfield_abilities.rs
Normal file
@@ -0,0 +1,60 @@
|
||||
#[macro_use]
|
||||
extern crate minecraft_protocol_derive;
|
||||
|
||||
use minecraft_protocol::decoder::Decoder;
|
||||
use minecraft_protocol::encoder::Encoder;
|
||||
use minecraft_protocol::error::{DecodeError, EncodeError};
|
||||
|
||||
#[derive(Packet)]
|
||||
pub struct Abilities {
|
||||
#[packet(bitfield(size = 4))]
|
||||
pub _unused: u8,
|
||||
#[packet(bitfield(size = 1))]
|
||||
pub creative_mode: bool,
|
||||
#[packet(bitfield(size = 1))]
|
||||
pub allow_flying: bool,
|
||||
#[packet(bitfield(size = 1))]
|
||||
pub flying: bool,
|
||||
#[packet(bitfield(size = 1))]
|
||||
pub invulnerable: bool,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::Abilities;
|
||||
use minecraft_protocol::decoder::Decoder;
|
||||
use minecraft_protocol::encoder::Encoder;
|
||||
use minecraft_protocol::error::{DecodeError, EncodeError};
|
||||
use std::io::Cursor;
|
||||
|
||||
#[test]
|
||||
fn test_encode_abilities_i8_bitfield() {
|
||||
let abilities = Abilities {
|
||||
_unused: 0,
|
||||
creative_mode: true,
|
||||
allow_flying: true,
|
||||
flying: true,
|
||||
invulnerable: true,
|
||||
};
|
||||
let mut vec = Vec::new();
|
||||
|
||||
abilities
|
||||
.encode(&mut vec)
|
||||
.expect("Failed to encode abilities");
|
||||
assert_eq!(vec, [15]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_decode_abilities_i8_bitfield() {
|
||||
let value = 15i8;
|
||||
|
||||
let vec = value.to_be_bytes().to_vec();
|
||||
let mut cursor = Cursor::new(vec);
|
||||
|
||||
let abilities = Abilities::decode(&mut cursor).expect("Failed to decode abilities");
|
||||
assert!(abilities.invulnerable);
|
||||
assert!(abilities.flying);
|
||||
assert!(abilities.allow_flying);
|
||||
assert!(abilities.creative_mode);
|
||||
}
|
||||
}
|
107
protocol-derive/tests/bitfield_half.rs
Normal file
107
protocol-derive/tests/bitfield_half.rs
Normal file
@@ -0,0 +1,107 @@
|
||||
#[macro_use]
|
||||
extern crate minecraft_protocol_derive;
|
||||
|
||||
use minecraft_protocol::decoder::Decoder;
|
||||
use minecraft_protocol::encoder::Encoder;
|
||||
use minecraft_protocol::error::{DecodeError, EncodeError};
|
||||
|
||||
#[derive(Packet)]
|
||||
pub struct HalfLong {
|
||||
#[packet(bitfield(size = 32))]
|
||||
pub _unused: u32,
|
||||
#[packet(bitfield(size = 32))]
|
||||
pub value: u32,
|
||||
}
|
||||
|
||||
#[derive(Packet)]
|
||||
pub struct HalfInt {
|
||||
#[packet(bitfield(size = 16))]
|
||||
pub _unused: u16,
|
||||
#[packet(bitfield(size = 16))]
|
||||
pub value: u16,
|
||||
}
|
||||
|
||||
#[derive(Packet)]
|
||||
pub struct HalfShort {
|
||||
#[packet(bitfield(size = 8))]
|
||||
pub _unused: u8,
|
||||
#[packet(bitfield(size = 8))]
|
||||
pub value: u8,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::{HalfInt, HalfLong, HalfShort};
|
||||
use minecraft_protocol::decoder::Decoder;
|
||||
use minecraft_protocol::encoder::Encoder;
|
||||
use minecraft_protocol::error::{DecodeError, EncodeError};
|
||||
use std::io::Cursor;
|
||||
|
||||
#[test]
|
||||
fn test_encode_half_long_u64_bitfield() {
|
||||
let half = HalfLong {
|
||||
_unused: 0,
|
||||
value: u32::MAX,
|
||||
};
|
||||
let mut vec = Vec::new();
|
||||
|
||||
half.encode(&mut vec).expect("Failed to encode half");
|
||||
assert_eq!(vec, u32::MAX.to_be_bytes().to_vec());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_decode_half_long_u64_bitfield() {
|
||||
let value = u32::MAX as u64;
|
||||
|
||||
let vec = value.to_be_bytes().to_vec();
|
||||
let mut cursor = Cursor::new(vec);
|
||||
|
||||
let half = HalfLong::decode(&mut cursor).expect("Failed to decode half");
|
||||
assert_eq!(half.value, u32::MAX);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_encode_half_int_u32_bitfield() {
|
||||
let half = HalfInt {
|
||||
_unused: 0,
|
||||
value: u16::MAX,
|
||||
};
|
||||
let mut vec = Vec::new();
|
||||
|
||||
half.encode(&mut vec).expect("Failed to encode half");
|
||||
assert_eq!(vec, u16::MAX.to_be_bytes().to_vec());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_decode_half_int_u32_bitfield() {
|
||||
let value = u16::MAX as u32;
|
||||
|
||||
let vec = value.to_be_bytes().to_vec();
|
||||
let mut cursor = Cursor::new(vec);
|
||||
|
||||
let half = HalfInt::decode(&mut cursor).expect("Failed to decode half");
|
||||
assert_eq!(half.value, u16::MAX);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_encode_half_short_u8_bitfield() {
|
||||
let half = HalfShort {
|
||||
_unused: 0,
|
||||
value: u8::MAX,
|
||||
};
|
||||
let mut vec = Vec::new();
|
||||
|
||||
half.encode(&mut vec).expect("Failed to encode half");
|
||||
assert_eq!(vec, u8::MAX.to_be_bytes().to_vec());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_decode_half_short_u8_bitfield() {
|
||||
let value = u8::MAX as u16;
|
||||
let vec = value.to_be_bytes().to_vec();
|
||||
let mut cursor = Cursor::new(vec);
|
||||
|
||||
let half = HalfShort::decode(&mut cursor).expect("Failed to decode half");
|
||||
assert_eq!(half.value, u8::MAX);
|
||||
}
|
||||
}
|
54
protocol-derive/tests/bitfield_position.rs
Normal file
54
protocol-derive/tests/bitfield_position.rs
Normal file
@@ -0,0 +1,54 @@
|
||||
#[macro_use]
|
||||
extern crate minecraft_protocol_derive;
|
||||
|
||||
use minecraft_protocol::decoder::Decoder;
|
||||
use minecraft_protocol::encoder::Encoder;
|
||||
use minecraft_protocol::error::{DecodeError, EncodeError};
|
||||
|
||||
#[derive(Packet)]
|
||||
pub struct Position {
|
||||
#[packet(bitfield(size = 26))]
|
||||
pub x: i32,
|
||||
#[packet(bitfield(size = 26))]
|
||||
pub z: i32,
|
||||
#[packet(bitfield(size = 12))]
|
||||
pub y: u16,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::Position;
|
||||
use minecraft_protocol::decoder::Decoder;
|
||||
use minecraft_protocol::encoder::Encoder;
|
||||
use minecraft_protocol::error::{DecodeError, EncodeError};
|
||||
use std::io::Cursor;
|
||||
|
||||
#[test]
|
||||
fn test_encode_position_i64_bitfield() {
|
||||
let position = Position {
|
||||
x: 1000,
|
||||
y: 64,
|
||||
z: -1000,
|
||||
};
|
||||
|
||||
let mut vec = Vec::new();
|
||||
|
||||
position
|
||||
.encode(&mut vec)
|
||||
.expect("Failed to encode position");
|
||||
|
||||
assert_eq!(vec, 275152780755008i64.to_be_bytes().to_vec());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_decode_position_i64_bitfield() {
|
||||
let value = -137164079660992i64;
|
||||
let vec = value.to_be_bytes().to_vec();
|
||||
let mut cursor = Cursor::new(vec);
|
||||
let position = Position::decode(&mut cursor).expect("Failed to decode position");
|
||||
|
||||
assert_eq!(position.x, -500);
|
||||
assert_eq!(position.y, 64);
|
||||
assert_eq!(position.z, -1000);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user