1use std::{
4 io::{Read, Write},
5 ops::Deref,
6};
7
8use borsh::{BorshDeserialize, BorshSerialize};
9use serde::{Deserialize, Serialize};
10use serde_json::{Map, Number, Value};
11
12const MAX_RECURSION_DEPTH: usize = 128;
15
16const MAX_COLLECTION_SIZE: u32 = 100_000;
18
19#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, Hash)]
24pub struct ValueWrapper(pub Value);
25
26impl Deref for ValueWrapper {
27 type Target = Value;
28
29 fn deref(&self) -> &Self::Target {
30 &self.0
31 }
32}
33
34impl Default for ValueWrapper {
35 fn default() -> Self {
36 Self(Value::Null)
37 }
38}
39
40impl BorshSerialize for ValueWrapper {
42 #[inline]
43 fn serialize<W: Write>(&self, writer: &mut W) -> std::io::Result<()> {
44 match &self.0 {
45 Value::Bool(data) => {
47 BorshSerialize::serialize(&0u8, writer)?;
48 BorshSerialize::serialize(&data, writer)
49 }
50 Value::Number(data) => {
52 BorshSerialize::serialize(&1u8, writer)?;
53 'data: {
54 if data.is_f64() {
56 let Some(data) = data.as_f64() else {
57 break 'data;
58 };
59 BorshSerialize::serialize(&0u8, writer)?;
60 return BorshSerialize::serialize(&data, writer);
61 }
62 else if data.is_i64() {
64 let Some(data) = data.as_i64() else {
65 break 'data;
66 };
67 BorshSerialize::serialize(&1u8, writer)?;
68 return BorshSerialize::serialize(&data, writer);
69 }
70 else if data.is_u64() {
72 let Some(data) = data.as_u64() else {
73 break 'data;
74 };
75 BorshSerialize::serialize(&2u8, writer)?;
76 return BorshSerialize::serialize(&data, writer);
77 }
78 }
79 Err(std::io::Error::new(
80 std::io::ErrorKind::InvalidData,
81 "Invalid number type",
82 ))
83 }
84 Value::String(data) => {
86 BorshSerialize::serialize(&2u8, writer)?;
87 BorshSerialize::serialize(&data, writer)
88 }
89 Value::Array(data) => {
91 BorshSerialize::serialize(&3u8, writer)?;
92 let len = u32::try_from(data.len()).map_err(|_| {
94 std::io::Error::new(
95 std::io::ErrorKind::InvalidInput,
96 format!(
97 "Array too large to serialize: {} elements exceeds u32::MAX",
98 data.len()
99 ),
100 )
101 })?;
102 BorshSerialize::serialize(&len, writer)?;
103 for element in data {
104 let element = Self(element.to_owned());
105 BorshSerialize::serialize(&element, writer)?;
106 }
107 Ok(())
108 }
109 Value::Object(data) => {
111 BorshSerialize::serialize(&4u8, writer)?;
112 let len = u32::try_from(data.len()).map_err(|_| {
114 std::io::Error::new(
115 std::io::ErrorKind::InvalidInput,
116 format!(
117 "Object too large to serialize: {} keys exceeds u32::MAX",
118 data.len()
119 ),
120 )
121 })?;
122 BorshSerialize::serialize(&len, writer)?;
123 for (key, value) in data {
124 BorshSerialize::serialize(&key, writer)?;
125 let value = Self(value.to_owned());
126 BorshSerialize::serialize(&value, writer)?;
127 }
128 Ok(())
129 }
130 Value::Null => BorshSerialize::serialize(&5u8, writer),
132 }
133 }
134}
135
136impl ValueWrapper {
137 fn deserialize_reader_with_depth<R: Read>(
139 reader: &mut R,
140 depth: usize,
141 ) -> std::io::Result<Self> {
142 if depth > MAX_RECURSION_DEPTH {
143 return Err(std::io::Error::new(
144 std::io::ErrorKind::InvalidInput,
145 format!(
146 "Recursion depth limit exceeded: maximum depth is {}",
147 MAX_RECURSION_DEPTH
148 ),
149 ));
150 }
151
152 let order: u8 = BorshDeserialize::deserialize_reader(reader)?;
154 match order {
155 0 => {
157 let data: bool = BorshDeserialize::deserialize_reader(reader)?;
158 Ok(Self(Value::Bool(data)))
159 }
160 1 => {
162 let internal_order: u8 =
163 BorshDeserialize::deserialize_reader(reader)?;
164 match internal_order {
165 0 => {
167 let data: f64 =
168 BorshDeserialize::deserialize_reader(reader)?;
169 let Some(data_f64) = Number::from_f64(data) else {
170 return Err(std::io::Error::new(
171 std::io::ErrorKind::InvalidInput,
172 format!("Invalid f64 Number: {}", data),
173 ));
174 };
175 Ok(Self(Value::Number(data_f64)))
176 }
177 1 => {
179 let data: i64 =
180 BorshDeserialize::deserialize_reader(reader)?;
181 Ok(Self(Value::Number(Number::from(data))))
182 }
183 2 => {
185 let data: u64 =
186 BorshDeserialize::deserialize_reader(reader)?;
187 Ok(Self(Value::Number(Number::from(data))))
188 }
189 _ => Err(std::io::Error::new(
190 std::io::ErrorKind::InvalidInput,
191 format!(
192 "Invalid Number representation: {}",
193 internal_order
194 ),
195 )),
196 }
197 }
198 2 => {
200 let data: String =
201 BorshDeserialize::deserialize_reader(reader)?;
202 Ok(Self(Value::String(data)))
203 }
204 3 => {
206 let len = u32::deserialize_reader(reader)?;
207
208 if len > MAX_COLLECTION_SIZE {
210 return Err(std::io::Error::new(
211 std::io::ErrorKind::InvalidInput,
212 format!(
213 "Array size too large: {} exceeds maximum of {}",
214 len, MAX_COLLECTION_SIZE
215 ),
216 ));
217 }
218
219 if len == 0 {
220 Ok(Self(Value::Array(Vec::new())))
221 } else {
222 let mut result = Vec::with_capacity(len as usize);
223 let next_depth = depth.checked_add(1).ok_or_else(|| {
225 std::io::Error::new(
226 std::io::ErrorKind::InvalidInput,
227 "Recursion depth counter overflow",
228 )
229 })?;
230 for _ in 0..len {
231 result.push(
232 Self::deserialize_reader_with_depth(
233 reader, next_depth,
234 )?
235 .0,
236 );
237 }
238 Ok(Self(Value::Array(result)))
239 }
240 }
241 4 => {
243 let len = u32::deserialize_reader(reader)?;
244
245 if len > MAX_COLLECTION_SIZE {
247 return Err(std::io::Error::new(
248 std::io::ErrorKind::InvalidInput,
249 format!(
250 "Object size too large: {} exceeds maximum of {}",
251 len, MAX_COLLECTION_SIZE
252 ),
253 ));
254 }
255
256 let mut result = Map::new();
257 let next_depth = depth.checked_add(1).ok_or_else(|| {
259 std::io::Error::new(
260 std::io::ErrorKind::InvalidInput,
261 "Recursion depth counter overflow",
262 )
263 })?;
264 for _ in 0..len {
265 let key = String::deserialize_reader(reader)?;
266 let value = Self::deserialize_reader_with_depth(
267 reader, next_depth,
268 )?;
269 result.insert(key, value.0);
270 }
271 Ok(Self(Value::Object(result)))
272 }
273 5 => Ok(Self(Value::Null)),
275 _ => Err(std::io::Error::new(
277 std::io::ErrorKind::InvalidInput,
278 format!("Invalid Value representation: {}", order),
279 )),
280 }
281 }
282}
283
284impl BorshDeserialize for ValueWrapper {
285 #[inline]
286 fn deserialize_reader<R: Read>(reader: &mut R) -> std::io::Result<Self> {
287 Self::deserialize_reader_with_depth(reader, 0)
289 }
290}
291
292#[cfg(test)]
293mod tests {
294 use super::*;
295 use std::io::Cursor;
296
297 #[test]
299 fn test_value_wrapper_string() {
300 let value = ValueWrapper(Value::String("test".to_owned()));
301 let vec = borsh::to_vec(&value).unwrap();
302 let value2: ValueWrapper =
303 BorshDeserialize::try_from_slice(&vec).unwrap();
304 assert_eq!(value, value2);
305 }
306
307 #[test]
309 fn test_value_wrapper_bool() {
310 let value = ValueWrapper(Value::Bool(true));
311 let vec = borsh::to_vec(&value).unwrap();
312 let value2: ValueWrapper =
313 BorshDeserialize::try_from_slice(&vec).unwrap();
314 assert_eq!(value, value2);
315
316 let value_false = ValueWrapper(Value::Bool(false));
317 let vec_false = borsh::to_vec(&value_false).unwrap();
318 let value2_false: ValueWrapper =
319 BorshDeserialize::try_from_slice(&vec_false).unwrap();
320 assert_eq!(value_false, value2_false);
321 }
322
323 #[test]
325 fn test_value_wrapper_number_f64() {
326 let value =
327 ValueWrapper(Value::Number(Number::from_f64(3.14).unwrap()));
328 let vec = borsh::to_vec(&value).unwrap();
329 let value2: ValueWrapper =
330 BorshDeserialize::try_from_slice(&vec).unwrap();
331 assert_eq!(value, value2);
332 }
333
334 #[test]
336 fn test_value_wrapper_number_i64() {
337 let value = ValueWrapper(Value::Number(Number::from(-42i64)));
338 let vec = borsh::to_vec(&value).unwrap();
339 let value2: ValueWrapper =
340 BorshDeserialize::try_from_slice(&vec).unwrap();
341 assert_eq!(value, value2);
342 }
343
344 #[test]
346 fn test_value_wrapper_number_u64() {
347 let value = ValueWrapper(Value::Number(Number::from(12345u64)));
348 let vec = borsh::to_vec(&value).unwrap();
349 let value2: ValueWrapper =
350 BorshDeserialize::try_from_slice(&vec).unwrap();
351 assert_eq!(value, value2);
352 }
353
354 #[test]
356 fn test_value_wrapper_null() {
357 let value = ValueWrapper(Value::Null);
358 let vec = borsh::to_vec(&value).unwrap();
359 let value2: ValueWrapper =
360 BorshDeserialize::try_from_slice(&vec).unwrap();
361 assert_eq!(value, value2);
362 }
363
364 #[test]
366 fn test_value_wrapper_array() {
367 let value = ValueWrapper(Value::Array(vec![
368 Value::Bool(true),
369 Value::String("test".to_owned()),
370 Value::Number(Number::from(42)),
371 Value::Null,
372 ]));
373 let vec = borsh::to_vec(&value).unwrap();
374 let value2: ValueWrapper =
375 BorshDeserialize::try_from_slice(&vec).unwrap();
376 assert_eq!(value, value2);
377 }
378
379 #[test]
381 fn test_value_wrapper_empty_array() {
382 let value = ValueWrapper(Value::Array(vec![]));
383 let vec = borsh::to_vec(&value).unwrap();
384 let value2: ValueWrapper =
385 BorshDeserialize::try_from_slice(&vec).unwrap();
386 assert_eq!(value, value2);
387 }
388
389 #[test]
391 fn test_value_wrapper_object() {
392 let mut map = Map::new();
393 map.insert("name".to_string(), Value::String("Alice".to_owned()));
394 map.insert("age".to_string(), Value::Number(Number::from(30)));
395 map.insert("active".to_string(), Value::Bool(true));
396
397 let value = ValueWrapper(Value::Object(map));
398 let vec = borsh::to_vec(&value).unwrap();
399 let value2: ValueWrapper =
400 BorshDeserialize::try_from_slice(&vec).unwrap();
401 assert_eq!(value, value2);
402 }
403
404 #[test]
406 fn test_value_wrapper_empty_object() {
407 let value = ValueWrapper(Value::Object(Map::new()));
408 let vec = borsh::to_vec(&value).unwrap();
409 let value2: ValueWrapper =
410 BorshDeserialize::try_from_slice(&vec).unwrap();
411 assert_eq!(value, value2);
412 }
413
414 #[test]
416 fn test_value_wrapper_nested_structure() {
417 let mut inner_map = Map::new();
418 inner_map.insert("x".to_string(), Value::Number(Number::from(1)));
419 inner_map.insert("y".to_string(), Value::Number(Number::from(2)));
420
421 let mut outer_map = Map::new();
422 outer_map.insert("point".to_string(), Value::Object(inner_map));
423 outer_map.insert(
424 "values".to_string(),
425 Value::Array(vec![
426 Value::Number(Number::from(1)),
427 Value::Number(Number::from(2)),
428 Value::Number(Number::from(3)),
429 ]),
430 );
431
432 let value = ValueWrapper(Value::Object(outer_map));
433 let vec = borsh::to_vec(&value).unwrap();
434 let value2: ValueWrapper =
435 BorshDeserialize::try_from_slice(&vec).unwrap();
436 assert_eq!(value, value2);
437 }
438
439 #[test]
441 fn test_value_wrapper_max_recursion_depth() {
442 let mut value = Value::Null;
443 for _ in 0..MAX_RECURSION_DEPTH {
444 value = Value::Array(vec![value]);
445 }
446
447 let wrapper = ValueWrapper(value);
448 let vec = borsh::to_vec(&wrapper).unwrap();
449
450 let result: Result<ValueWrapper, _> =
451 BorshDeserialize::try_from_slice(&vec);
452 assert!(result.is_ok());
453 }
454
455 #[test]
457 fn test_value_wrapper_exceeds_recursion_depth() {
458 let mut value = Value::Null;
459 for _ in 0..=MAX_RECURSION_DEPTH {
460 value = Value::Array(vec![value]);
461 }
462
463 let wrapper = ValueWrapper(value);
464 let vec = borsh::to_vec(&wrapper).unwrap();
465
466 let result: Result<ValueWrapper, _> =
467 BorshDeserialize::try_from_slice(&vec);
468 assert!(result.is_err());
469 assert!(
470 result
471 .unwrap_err()
472 .to_string()
473 .contains("Recursion depth limit exceeded")
474 );
475 }
476
477 #[test]
479 fn test_value_wrapper_large_array() {
480 let large_array = vec![Value::Null; MAX_COLLECTION_SIZE as usize];
481 let value = ValueWrapper(Value::Array(large_array));
482 let vec = borsh::to_vec(&value).unwrap();
483 let value2: ValueWrapper =
484 BorshDeserialize::try_from_slice(&vec).unwrap();
485 assert_eq!(value, value2);
486 }
487
488 #[test]
490 fn test_value_wrapper_array_size_overflow() {
491 let mut bytes = vec![3u8]; let oversized_len = MAX_COLLECTION_SIZE + 1;
493 bytes.extend_from_slice(&oversized_len.to_le_bytes());
494
495 let result: Result<ValueWrapper, _> =
496 BorshDeserialize::try_from_slice(&bytes);
497 assert!(result.is_err());
498 assert!(
499 result
500 .unwrap_err()
501 .to_string()
502 .contains("Array size too large")
503 );
504 }
505
506 #[test]
508 fn test_value_wrapper_object_size_overflow() {
509 let mut bytes = vec![4u8]; let oversized_len = MAX_COLLECTION_SIZE + 1;
511 bytes.extend_from_slice(&oversized_len.to_le_bytes());
512
513 let result: Result<ValueWrapper, _> =
514 BorshDeserialize::try_from_slice(&bytes);
515 assert!(result.is_err());
516 assert!(
517 result
518 .unwrap_err()
519 .to_string()
520 .contains("Object size too large")
521 );
522 }
523
524 #[test]
526 fn test_value_wrapper_invalid_type_tag() {
527 let bytes = vec![6u8];
528
529 let result: Result<ValueWrapper, _> =
530 BorshDeserialize::try_from_slice(&bytes);
531 assert!(result.is_err());
532 assert!(
533 result
534 .unwrap_err()
535 .to_string()
536 .contains("Invalid Value representation")
537 );
538 }
539
540 #[test]
542 fn test_value_wrapper_invalid_number_type() {
543 let bytes = vec![1u8, 3u8];
544
545 let result: Result<ValueWrapper, _> =
546 BorshDeserialize::try_from_slice(&bytes);
547 assert!(result.is_err());
548 assert!(
549 result
550 .unwrap_err()
551 .to_string()
552 .contains("Invalid Number representation")
553 );
554 }
555
556 #[test]
558 fn test_value_wrapper_unicode_strings() {
559 let value = ValueWrapper(Value::String("Hello δΈη π".to_owned()));
560 let vec = borsh::to_vec(&value).unwrap();
561 let value2: ValueWrapper =
562 BorshDeserialize::try_from_slice(&vec).unwrap();
563 assert_eq!(value, value2);
564 }
565
566 #[test]
568 fn test_value_wrapper_empty_string() {
569 let value = ValueWrapper(Value::String(String::new()));
570 let vec = borsh::to_vec(&value).unwrap();
571 let value2: ValueWrapper =
572 BorshDeserialize::try_from_slice(&vec).unwrap();
573 assert_eq!(value, value2);
574 }
575
576 #[test]
578 fn test_value_wrapper_special_floats() {
579 let value = ValueWrapper(Value::Number(Number::from_f64(0.0).unwrap()));
580 let vec = borsh::to_vec(&value).unwrap();
581 let value2: ValueWrapper =
582 BorshDeserialize::try_from_slice(&vec).unwrap();
583 assert_eq!(value, value2);
584
585 let value =
586 ValueWrapper(Value::Number(Number::from_f64(-0.0).unwrap()));
587 let vec = borsh::to_vec(&value).unwrap();
588 let value2: ValueWrapper =
589 BorshDeserialize::try_from_slice(&vec).unwrap();
590 assert_eq!(value, value2);
591 }
592
593 #[test]
595 fn test_value_wrapper_clone() {
596 let value = ValueWrapper(Value::String("test".to_owned()));
597 let cloned = value.clone();
598 assert_eq!(value, cloned);
599 }
600
601 #[test]
603 fn test_value_wrapper_debug() {
604 let value = ValueWrapper(Value::String("test".to_owned()));
605 let debug_str = format!("{:?}", value);
606 assert!(debug_str.contains("test"));
607 }
608
609 #[test]
611 fn test_value_wrapper_as_str() {
612 let value = ValueWrapper(Value::String("hello".to_owned()));
613 assert_eq!(value.as_str(), Some("hello"));
614
615 let non_string = ValueWrapper(Value::Number(Number::from(42)));
616 assert_eq!(non_string.as_str(), None);
617 }
618
619 #[test]
621 fn test_value_wrapper_get() {
622 let mut map = Map::new();
623 map.insert("name".to_string(), Value::String("Alice".to_owned()));
624 map.insert("age".to_string(), Value::Number(Number::from(30)));
625
626 let value = ValueWrapper(Value::Object(map));
627 assert_eq!(value.get("name"), Some(&Value::String("Alice".to_owned())));
628 assert_eq!(value.get("age"), Some(&Value::Number(Number::from(30))));
629 assert_eq!(value.get("missing"), None);
630
631 let non_object =
632 ValueWrapper(Value::String("not an object".to_owned()));
633 assert_eq!(non_object.get("key"), None);
634 }
635
636 #[test]
638 fn test_value_wrapper_deref() {
639 let value = ValueWrapper(Value::String("test".to_owned()));
640 assert!(value.is_string());
641 assert!(!value.is_number());
642
643 let number = ValueWrapper(Value::Number(Number::from(42)));
644 assert!(number.is_number());
645 assert!(!number.is_string());
646 }
647
648 #[test]
650 fn test_value_wrapper_default() {
651 let value = ValueWrapper::default();
652 assert_eq!(value.0, Value::Null);
653 assert!(value.is_null());
654 }
655
656 #[test]
658 fn test_value_wrapper_hash() {
659 use std::collections::HashMap;
660
661 let wrapper1 = ValueWrapper(Value::String("key1".to_owned()));
662 let wrapper2 = ValueWrapper(Value::String("key2".to_owned()));
663
664 let mut map = HashMap::new();
665 map.insert(wrapper1.clone(), "value1");
666 map.insert(wrapper2.clone(), "value2");
667
668 assert_eq!(map.get(&wrapper1), Some(&"value1"));
669 assert_eq!(map.get(&wrapper2), Some(&"value2"));
670 }
671
672 fn deser(bytes: Vec<u8>) -> std::io::Result<ValueWrapper> {
674 let mut c = Cursor::new(bytes);
675 ValueWrapper::deserialize_reader(&mut c)
676 }
677
678 fn push_u8(buf: &mut Vec<u8>, v: u8) {
680 buf.push(v);
681 }
682
683 fn push_u32(buf: &mut Vec<u8>, v: u32) {
685 buf.extend_from_slice(&v.to_le_bytes());
686 }
687
688 fn push_i64(buf: &mut Vec<u8>, v: i64) {
690 buf.extend_from_slice(&v.to_le_bytes());
691 }
692
693 fn push_u64(buf: &mut Vec<u8>, v: u64) {
695 buf.extend_from_slice(&v.to_le_bytes());
696 }
697
698 fn push_f64(buf: &mut Vec<u8>, v: f64) {
700 buf.extend_from_slice(&v.to_le_bytes());
701 }
702
703 fn push_borsh_string(buf: &mut Vec<u8>, s: &str) {
705 let b = s.as_bytes();
706 push_u32(buf, b.len() as u32);
707 buf.extend_from_slice(b);
708 }
709
710 #[test]
712 fn rejects_unknown_discriminator() {
713 let bytes = vec![255u8];
714 assert!(deser(bytes).is_err());
715 }
716
717 #[test]
719 fn rejects_number_unknown_internal_order() {
720 let mut bytes = Vec::new();
721 push_u8(&mut bytes, 1); push_u8(&mut bytes, 99); assert!(deser(bytes).is_err());
724 }
725
726 #[test]
728 fn rejects_nan_f64_number() {
729 let mut bytes = Vec::new();
730 push_u8(&mut bytes, 1); push_u8(&mut bytes, 0); push_f64(&mut bytes, f64::NAN);
733 assert!(deser(bytes).is_err());
734 }
735
736 #[test]
738 fn rejects_infinite_f64_number() {
739 let mut bytes = Vec::new();
740 push_u8(&mut bytes, 1); push_u8(&mut bytes, 0); push_f64(&mut bytes, f64::INFINITY);
743 assert!(deser(bytes).is_err());
744 }
745
746 #[test]
748 fn rejects_array_too_large() {
749 let mut bytes = Vec::new();
750 push_u8(&mut bytes, 3); let len = (MAX_COLLECTION_SIZE as u32) + 1;
752 push_u32(&mut bytes, len);
753 assert!(deser(bytes).is_err());
754 }
755
756 #[test]
758 fn rejects_object_too_large() {
759 let mut bytes = Vec::new();
760 push_u8(&mut bytes, 4); let len = (MAX_COLLECTION_SIZE as u32) + 1;
762 push_u32(&mut bytes, len);
763 assert!(deser(bytes).is_err());
764 }
765
766 #[test]
768 fn rejects_recursion_depth_exceeded_nested_arrays() {
769 let mut bytes = Vec::new();
770
771 let levels = (MAX_RECURSION_DEPTH as usize) + 2;
772 for _ in 0..levels {
773 push_u8(&mut bytes, 3); push_u32(&mut bytes, 1); }
776 push_u8(&mut bytes, 5); assert!(deser(bytes).is_err());
779 }
780
781 #[test]
783 fn rejects_invalid_utf8_string() {
784 let mut bytes = Vec::new();
785 push_u8(&mut bytes, 2); push_u32(&mut bytes, 1); bytes.push(0xFF); assert!(deser(bytes).is_err());
790 }
791
792 #[test]
794 fn rejects_truncated_payload_mid_value() {
795 let mut bytes = Vec::new();
796 push_u8(&mut bytes, 1); push_u8(&mut bytes, 0); assert!(deser(bytes).is_err());
800 }
801
802 #[test]
804 fn rejects_object_with_truncated_kv_pair() {
805 let mut bytes = Vec::new();
806 push_u8(&mut bytes, 4); push_u32(&mut bytes, 1); push_borsh_string(&mut bytes, "k");
810
811 push_u8(&mut bytes, 2); push_u32(&mut bytes, 10); assert!(deser(bytes).is_err());
816 }
817
818 #[test]
820 fn rejects_number_i64_ok_but_truncated() {
821 let mut bytes = Vec::new();
822 push_u8(&mut bytes, 1); push_u8(&mut bytes, 1); bytes.extend_from_slice(&[1, 2, 3]); assert!(deser(bytes).is_err());
827 }
828
829 #[test]
831 fn accepts_i64_number_via_push_i64() {
832 let mut bytes = Vec::new();
833 push_u8(&mut bytes, 1); push_u8(&mut bytes, 1); push_i64(&mut bytes, -123456789);
836
837 let result = deser(bytes).expect("should deserialize i64");
838 assert_eq!(result.0, Value::Number(Number::from(-123456789i64)));
839 }
840
841 #[test]
843 fn accepts_i64_min_max_values() {
844 let mut bytes_min = Vec::new();
845 push_u8(&mut bytes_min, 1); push_u8(&mut bytes_min, 1); push_i64(&mut bytes_min, i64::MIN);
848
849 let result_min = deser(bytes_min).expect("should deserialize i64::MIN");
850 assert_eq!(result_min.0, Value::Number(Number::from(i64::MIN)));
851
852 let mut bytes_max = Vec::new();
853 push_u8(&mut bytes_max, 1); push_u8(&mut bytes_max, 1); push_i64(&mut bytes_max, i64::MAX);
856
857 let result_max = deser(bytes_max).expect("should deserialize i64::MAX");
858 assert_eq!(result_max.0, Value::Number(Number::from(i64::MAX)));
859 }
860
861 #[test]
863 fn accepts_i64_zero_positive_negative() {
864 let mut bytes_zero = Vec::new();
865 push_u8(&mut bytes_zero, 1);
866 push_u8(&mut bytes_zero, 1);
867 push_i64(&mut bytes_zero, 0);
868 let result_zero = deser(bytes_zero).expect("should deserialize 0");
869 assert_eq!(result_zero.0, Value::Number(Number::from(0i64)));
870
871 let mut bytes_pos = Vec::new();
872 push_u8(&mut bytes_pos, 1);
873 push_u8(&mut bytes_pos, 1);
874 push_i64(&mut bytes_pos, 42);
875 let result_pos = deser(bytes_pos).expect("should deserialize positive");
876 assert_eq!(result_pos.0, Value::Number(Number::from(42i64)));
877
878 let mut bytes_neg = Vec::new();
879 push_u8(&mut bytes_neg, 1);
880 push_u8(&mut bytes_neg, 1);
881 push_i64(&mut bytes_neg, -42);
882 let result_neg = deser(bytes_neg).expect("should deserialize negative");
883 assert_eq!(result_neg.0, Value::Number(Number::from(-42i64)));
884 }
885
886 #[test]
888 fn accepts_u64_number_via_push_u64() {
889 let mut bytes = Vec::new();
890 push_u8(&mut bytes, 1); push_u8(&mut bytes, 2); push_u64(&mut bytes, 987654321);
893
894 let result = deser(bytes).expect("should deserialize u64");
895 assert_eq!(result.0, Value::Number(Number::from(987654321u64)));
896 }
897
898 #[test]
900 fn accepts_u64_min_max_values() {
901 let mut bytes_min = Vec::new();
902 push_u8(&mut bytes_min, 1); push_u8(&mut bytes_min, 2); push_u64(&mut bytes_min, u64::MIN);
905
906 let result_min = deser(bytes_min).expect("should deserialize u64::MIN");
907 assert_eq!(result_min.0, Value::Number(Number::from(u64::MIN)));
908
909 let mut bytes_max = Vec::new();
910 push_u8(&mut bytes_max, 1); push_u8(&mut bytes_max, 2); push_u64(&mut bytes_max, u64::MAX);
913
914 let result_max = deser(bytes_max).expect("should deserialize u64::MAX");
915 assert_eq!(result_max.0, Value::Number(Number::from(u64::MAX)));
916 }
917
918 #[test]
920 fn accepts_f64_number_via_push_f64() {
921 let mut bytes = Vec::new();
922 push_u8(&mut bytes, 1); push_u8(&mut bytes, 0); push_f64(&mut bytes, 3.14159);
925
926 let result = deser(bytes).expect("should deserialize f64");
927 assert_eq!(result.0, Value::Number(Number::from_f64(3.14159).unwrap()));
928 }
929
930 #[test]
932 fn accepts_f64_special_values() {
933 let mut bytes_pos_zero = Vec::new();
934 push_u8(&mut bytes_pos_zero, 1);
935 push_u8(&mut bytes_pos_zero, 0);
936 push_f64(&mut bytes_pos_zero, 0.0);
937 let result = deser(bytes_pos_zero).expect("should deserialize +0.0");
938 assert_eq!(result.0, Value::Number(Number::from_f64(0.0).unwrap()));
939
940 let mut bytes_neg_zero = Vec::new();
941 push_u8(&mut bytes_neg_zero, 1);
942 push_u8(&mut bytes_neg_zero, 0);
943 push_f64(&mut bytes_neg_zero, -0.0);
944 let result = deser(bytes_neg_zero).expect("should deserialize -0.0");
945 assert_eq!(result.0, Value::Number(Number::from_f64(-0.0).unwrap()));
946
947 let mut bytes_large = Vec::new();
948 push_u8(&mut bytes_large, 1);
949 push_u8(&mut bytes_large, 0);
950 push_f64(&mut bytes_large, 1.7976931348623157e308);
951 let result = deser(bytes_large).expect("should deserialize large f64");
952 assert!(result.0.is_number());
953
954 let mut bytes_small = Vec::new();
955 push_u8(&mut bytes_small, 1);
956 push_u8(&mut bytes_small, 0);
957 push_f64(&mut bytes_small, -2.2250738585072014e-308);
958 let result =
959 deser(bytes_small).expect("should deserialize small negative f64");
960 assert!(result.0.is_number());
961 }
962
963 #[test]
965 fn accepts_but_overwrites_duplicate_object_keys_semantic_issue() {
966 let mut bytes = Vec::new();
967 push_u8(&mut bytes, 4); push_u32(&mut bytes, 2); push_borsh_string(&mut bytes, "a");
971 push_u8(&mut bytes, 1); push_u8(&mut bytes, 2); push_u64(&mut bytes, 1);
974
975 push_borsh_string(&mut bytes, "a"); push_u8(&mut bytes, 1); push_u8(&mut bytes, 2); push_u64(&mut bytes, 2);
979
980 let v = deser(bytes).expect("should deserialize");
981 match v.0 {
982 serde_json::Value::Object(map) => {
983 assert_eq!(
984 map.get("a").unwrap(),
985 &serde_json::Value::Number(serde_json::Number::from(2u64))
986 );
987 }
988 _ => panic!("expected object"),
989 }
990 }
991}