1#![doc = include_str!("../README.md")]
2#![feature(min_specialization)]
3#![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
15const MAX_STRING_LENGTH: u32 = 32767;
17#[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 = vec![0];
91 assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 0);
92
93 let buf = vec![1];
96 assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 1);
97
98 let buf = vec![2];
101 assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 2);
102
103 let buf = vec![127];
106 assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 127);
107
108 let buf = vec![128, 1];
111 assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 128);
112
113 let buf = vec![255, 1];
116 assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 255);
117
118 let buf = vec![221, 199, 1];
121 assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 25565);
122
123 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 = 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 = vec![255, 255, 255, 255, 15];
142 assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), -1);
143
144 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}