Skip to main content

azalea_buf/
lib.rs

1#![doc = include_str!("../README.md")]
2#![feature(min_specialization)]
3// this is necessary for thiserror backtraces
4#![feature(error_generic_member_access)]
5
6mod definitions;
7pub mod impls;
8mod serializable_uuid;
9
10pub use azalea_buf_macros::*;
11pub use definitions::*;
12pub use impls::*;
13pub use serializable_uuid::*;
14
15// const DEFAULT_NBT_QUOTA: u32 = 2097152;
16const MAX_STRING_LENGTH: u32 = 32767;
17// const MAX_COMPONENT_STRING_LENGTH: u32 = 262144;
18
19#[cfg(test)]
20mod tests {
21    use std::{collections::HashMap, io::Cursor};
22
23    use super::*;
24
25    #[test]
26    fn test_boxed_bytes() {
27        let data: Box<[u8]> = (0..=255u8).cycle().take(3000).collect();
28        let mut buf = Vec::new();
29        data.azalea_write(&mut buf).unwrap();
30
31        let mut cursor = Cursor::new(buf.as_slice());
32        assert_eq!(Box::<[u8]>::azalea_read(&mut cursor).unwrap(), data);
33        assert_eq!(cursor.position(), buf.len() as u64);
34
35        let truncated = &buf[..buf.len() - 1];
36        assert!(Box::<[u8]>::azalea_read(&mut Cursor::new(truncated)).is_err());
37    }
38
39    #[test]
40    fn test_write_varint() {
41        let mut buf = Vec::new();
42        0.azalea_write_var(&mut buf).unwrap();
43        assert_eq!(buf, vec![0]);
44
45        let mut buf = Vec::new();
46        1.azalea_write_var(&mut buf).unwrap();
47        assert_eq!(buf, vec![1]);
48
49        let mut buf = Vec::new();
50        2.azalea_write_var(&mut buf).unwrap();
51        assert_eq!(buf, vec![2]);
52
53        let mut buf = Vec::new();
54        127.azalea_write_var(&mut buf).unwrap();
55        assert_eq!(buf, vec![127]);
56
57        let mut buf = Vec::new();
58        128.azalea_write_var(&mut buf).unwrap();
59        assert_eq!(buf, vec![128, 1]);
60
61        let mut buf = Vec::new();
62        255.azalea_write_var(&mut buf).unwrap();
63        assert_eq!(buf, vec![255, 1]);
64
65        let mut buf = Vec::new();
66        25565.azalea_write_var(&mut buf).unwrap();
67        assert_eq!(buf, vec![221, 199, 1]);
68
69        let mut buf = Vec::new();
70        2097151.azalea_write_var(&mut buf).unwrap();
71        assert_eq!(buf, vec![255, 255, 127]);
72
73        let mut buf = Vec::new();
74        2147483647.azalea_write_var(&mut buf).unwrap();
75        assert_eq!(buf, vec![255, 255, 255, 255, 7]);
76
77        let mut buf = Vec::new();
78        (-1).azalea_write_var(&mut buf).unwrap();
79        assert_eq!(buf, vec![255, 255, 255, 255, 15]);
80
81        let mut buf = Vec::new();
82        (-2147483648).azalea_write_var(&mut buf).unwrap();
83        assert_eq!(buf, vec![128, 128, 128, 128, 8]);
84    }
85
86    #[test]
87    fn test_read_varint() {
88        // let buf = &mut &vec![0][..];
89        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 0);
90        let buf = vec![0];
91        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 0);
92
93        // let buf = &mut &vec![1][..];
94        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 1);
95        let buf = vec![1];
96        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 1);
97
98        // let buf = &mut &vec![2][..];
99        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 2);
100        let buf = vec![2];
101        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 2);
102
103        // let buf = &mut &vec![127][..];
104        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 127);
105        let buf = vec![127];
106        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 127);
107
108        // let buf = &mut &vec![128, 1][..];
109        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 128);
110        let buf = vec![128, 1];
111        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 128);
112
113        // let buf = &mut &vec![255, 1][..];
114        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 255);
115        let buf = vec![255, 1];
116        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 255);
117
118        // let buf = &mut &vec![221, 199, 1][..];
119        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 25565);
120        let buf = vec![221, 199, 1];
121        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 25565);
122
123        // let buf = &mut &vec![255, 255, 127][..];
124        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 2097151);
125        let buf = vec![255, 255, 127];
126        assert_eq!(
127            i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(),
128            2097151
129        );
130
131        // let buf = &mut &vec![255, 255, 255, 255, 7][..];
132        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 2147483647);
133        let buf = vec![255, 255, 255, 255, 7];
134        assert_eq!(
135            i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(),
136            2147483647
137        );
138
139        // let buf = &mut &vec![255, 255, 255, 255, 15][..];
140        // assert_eq!(i32::azalea_read_var(buf).unwrap(), -1);
141        let buf = vec![255, 255, 255, 255, 15];
142        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), -1);
143
144        // let buf = &mut &vec![128, 128, 128, 128, 8][..];
145        // assert_eq!(i32::azalea_read_var(buf).unwrap(), -2147483648);
146        let buf = vec![128, 128, 128, 128, 8];
147        assert_eq!(
148            i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(),
149            -2147483648
150        );
151    }
152
153    #[test]
154    fn test_read_varint_longer() {
155        let buf = vec![138, 56, 0, 135, 56, 123];
156        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 7178);
157    }
158
159    #[test]
160    fn test_write_varlong() {
161        let mut buf = Vec::new();
162        0u64.azalea_write_var(&mut buf).unwrap();
163        assert_eq!(buf, vec![0]);
164
165        let mut buf = Vec::new();
166        1u64.azalea_write_var(&mut buf).unwrap();
167        assert_eq!(buf, vec![1]);
168
169        let mut buf = Vec::new();
170        9223372036854775807u64.azalea_write_var(&mut buf).unwrap();
171        assert_eq!(buf, vec![255, 255, 255, 255, 255, 255, 255, 255, 127]);
172    }
173
174    #[test]
175    fn test_list() {
176        let original_vec = vec!["a".to_owned(), "bc".to_owned(), "def".to_owned()];
177
178        let mut buf = Vec::new();
179        original_vec.azalea_write(&mut buf).unwrap();
180
181        dbg!(&buf);
182
183        let result = Vec::<String>::azalea_read(&mut Cursor::new(&buf)).unwrap();
184        assert_eq!(result, original_vec);
185    }
186
187    #[test]
188    fn test_int_id_list() {
189        let mut buf = Vec::new();
190        vec![1, 2, 3].azalea_write_var(&mut buf).unwrap();
191
192        let result = Vec::<i32>::azalea_read_var(&mut Cursor::new(&buf)).unwrap();
193        assert_eq!(result, vec![1, 2, 3]);
194    }
195
196    #[test]
197    fn test_map() {
198        let original_map = HashMap::from([
199            ("a".to_owned(), 1),
200            ("bc".to_owned(), 23),
201            ("def".to_owned(), 456),
202        ]);
203        let mut buf = Vec::new();
204        original_map.azalea_write_var(&mut buf).unwrap();
205
206        let result = HashMap::<String, i32>::azalea_read_var(&mut Cursor::new(&buf)).unwrap();
207
208        assert_eq!(result, original_map);
209    }
210
211    #[test]
212    fn test_long() {
213        let mut buf: Vec<u8> = Vec::new();
214        123456u64.azalea_write(&mut buf).unwrap();
215
216        assert_eq!(u64::azalea_read(&mut Cursor::new(&buf)).unwrap(), 123456);
217    }
218}