aboutsummaryrefslogtreecommitdiff
path: root/azalea-protocol/src/mc_buf/mod.rs
diff options
context:
space:
mode:
authormat <github@matdoes.dev>2022-01-02 17:03:34 -0600
committermat <github@matdoes.dev>2022-01-02 17:03:34 -0600
commitbb57273f48294355d7ac863c291d80878f711c16 (patch)
tree51586d63834d6cc6f2e036da8c67f63f2eae0113 /azalea-protocol/src/mc_buf/mod.rs
parent3ec7352da2c8a9870718e6a81913f6aa1b576b95 (diff)
downloadazalea-drasl-bb57273f48294355d7ac863c291d80878f711c16.tar.xz
start improving packet macros
Diffstat (limited to 'azalea-protocol/src/mc_buf/mod.rs')
-rw-r--r--azalea-protocol/src/mc_buf/mod.rs163
1 files changed, 163 insertions, 0 deletions
diff --git a/azalea-protocol/src/mc_buf/mod.rs b/azalea-protocol/src/mc_buf/mod.rs
new file mode 100644
index 00000000..a924431e
--- /dev/null
+++ b/azalea-protocol/src/mc_buf/mod.rs
@@ -0,0 +1,163 @@
+//! Utilities for reading and writing for the Minecraft protocol
+
+mod read;
+mod write;
+
+pub use read::{McBufReadable, McBufVarintReadable, Readable};
+pub use write::{McBufVarintWritable, McBufWritable, Writable};
+
+// const DEFAULT_NBT_QUOTA: u32 = 2097152;
+const MAX_STRING_LENGTH: u16 = 32767;
+// const MAX_COMPONENT_STRING_LENGTH: u32 = 262144;
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use azalea_core::resource_location::ResourceLocation;
+ use std::{collections::HashMap, io::Cursor};
+ use tokio::io::BufReader;
+
+ #[test]
+ fn test_write_varint() {
+ let mut buf = Vec::new();
+ buf.write_varint(123456).unwrap();
+ assert_eq!(buf, vec![192, 196, 7]);
+
+ let mut buf = Vec::new();
+ buf.write_varint(0).unwrap();
+ assert_eq!(buf, vec![0]);
+ }
+
+ #[tokio::test]
+ async fn test_read_varint() {
+ let mut buf = BufReader::new(Cursor::new(vec![192, 196, 7]));
+ assert_eq!(buf.read_varint().await.unwrap(), 123456);
+ assert_eq!(buf.get_varint_size(123456), 3);
+
+ let mut buf = BufReader::new(Cursor::new(vec![0]));
+ assert_eq!(buf.read_varint().await.unwrap(), 0);
+ assert_eq!(buf.get_varint_size(0), 1);
+
+ let mut buf = BufReader::new(Cursor::new(vec![1]));
+ assert_eq!(buf.read_varint().await.unwrap(), 1);
+ assert_eq!(buf.get_varint_size(1), 1);
+ }
+
+ #[tokio::test]
+ async fn test_read_varint_longer() {
+ let mut buf = BufReader::new(Cursor::new(vec![138, 56, 0, 135, 56, 123]));
+ assert_eq!(buf.read_varint().await.unwrap(), 7178);
+ }
+
+ #[tokio::test]
+ async fn test_list() {
+ let mut buf = Vec::new();
+ buf.write_list(&vec!["a", "bc", "def"], |buf, s| buf.write_utf(s))
+ .unwrap();
+
+ // there's no read_list because idk how to do it in rust
+ let mut buf = BufReader::new(Cursor::new(buf));
+
+ let mut result = Vec::new();
+ let length = buf.read_varint().await.unwrap();
+ for _ in 0..length {
+ result.push(buf.read_utf().await.unwrap());
+ }
+
+ assert_eq!(result, vec!["a", "bc", "def"]);
+ }
+
+ #[tokio::test]
+ async fn test_int_id_list() {
+ let mut buf = Vec::new();
+ buf.write_list(&vec![1, 2, 3], |buf, i| buf.write_varint(*i))
+ .unwrap();
+
+ let mut buf = BufReader::new(Cursor::new(buf));
+
+ let result = buf.read_int_id_list().await.unwrap();
+ assert_eq!(result, vec![1, 2, 3]);
+ }
+
+ #[tokio::test]
+ async fn test_map() {
+ let mut buf = Vec::new();
+ buf.write_map(
+ vec![("a", 1), ("bc", 23), ("def", 456)],
+ Vec::write_utf,
+ Vec::write_varint,
+ )
+ .unwrap();
+
+ let mut buf = BufReader::new(Cursor::new(buf));
+
+ let mut result = Vec::new();
+ let length = buf.read_varint().await.unwrap();
+ for _ in 0..length {
+ result.push((
+ buf.read_utf().await.unwrap(),
+ buf.read_varint().await.unwrap(),
+ ));
+ }
+
+ assert_eq!(
+ result,
+ vec![
+ ("a".to_string(), 1),
+ ("bc".to_string(), 23),
+ ("def".to_string(), 456)
+ ]
+ );
+ }
+
+ #[tokio::test]
+ async fn test_nbt() {
+ let mut buf = Vec::new();
+ buf.write_nbt(&azalea_nbt::Tag::Compound(HashMap::from_iter(vec![(
+ "hello world".to_string(),
+ azalea_nbt::Tag::Compound(HashMap::from_iter(vec![(
+ "name".to_string(),
+ azalea_nbt::Tag::String("Bananrama".to_string()),
+ )])),
+ )])))
+ .unwrap();
+
+ let mut buf = BufReader::new(Cursor::new(buf));
+
+ let result = buf.read_nbt().await.unwrap();
+ assert_eq!(
+ result,
+ azalea_nbt::Tag::Compound(HashMap::from_iter(vec![(
+ "hello world".to_string(),
+ azalea_nbt::Tag::Compound(HashMap::from_iter(vec![(
+ "name".to_string(),
+ azalea_nbt::Tag::String("Bananrama".to_string()),
+ )])),
+ )]))
+ );
+ }
+
+ #[tokio::test]
+ async fn test_long() {
+ let mut buf = Vec::new();
+ buf.write_long(123456).unwrap();
+
+ let mut buf = BufReader::new(Cursor::new(buf));
+
+ assert_eq!(buf.read_long().await.unwrap(), 123456);
+ }
+
+ #[tokio::test]
+ async fn test_resource_location() {
+ let mut buf = Vec::new();
+ buf.write_resource_location(&ResourceLocation::new("minecraft:dirt").unwrap())
+ .unwrap();
+
+ let mut buf = BufReader::new(Cursor::new(buf));
+
+ assert_eq!(
+ buf.read_resource_location().await.unwrap(),
+ ResourceLocation::new("minecraft:dirt").unwrap()
+ );
+ }
+}