| 1 | // SPDX-License-Identifier: Apache-2.0 |
| 2 | |
| 3 | extern crate std; |
| 4 | |
| 5 | use ciborium::cbor; |
| 6 | use ciborium::tag::Required; |
| 7 | use ciborium::value::CanonicalValue; |
| 8 | use rand::prelude::*; |
| 9 | use std::collections::BTreeMap; |
| 10 | |
| 11 | macro_rules! cval { |
| 12 | ($x:expr) => { |
| 13 | CanonicalValue::from(val!($x)) |
| 14 | }; |
| 15 | } |
| 16 | |
| 17 | macro_rules! val { |
| 18 | ($x:expr) => { |
| 19 | cbor!($x).unwrap() |
| 20 | }; |
| 21 | } |
| 22 | |
| 23 | #[test] |
| 24 | fn rfc8949_example() { |
| 25 | let mut array: Vec<CanonicalValue> = vec![ |
| 26 | cval!(10), |
| 27 | cval!(-1), |
| 28 | cval!(false), |
| 29 | cval!(100), |
| 30 | cval!("z" ), |
| 31 | cval!([-1]), |
| 32 | cval!("aa" ), |
| 33 | cval!([100]), |
| 34 | ]; |
| 35 | let golden = array.clone(); |
| 36 | |
| 37 | // Shuffle the array. |
| 38 | array.shuffle(&mut rand::thread_rng()); |
| 39 | |
| 40 | array.sort(); |
| 41 | |
| 42 | assert_eq!(array, golden); |
| 43 | } |
| 44 | |
| 45 | #[test] |
| 46 | fn map() { |
| 47 | let mut map = BTreeMap::new(); |
| 48 | map.insert(cval!(false), val!(2)); |
| 49 | map.insert(cval!([-1]), val!(5)); |
| 50 | map.insert(cval!(-1), val!(1)); |
| 51 | map.insert(cval!(10), val!(0)); |
| 52 | map.insert(cval!(100), val!(3)); |
| 53 | map.insert(cval!([100]), val!(7)); |
| 54 | map.insert(cval!("z" ), val!(4)); |
| 55 | map.insert(cval!("aa" ), val!(6)); |
| 56 | |
| 57 | let mut bytes1 = Vec::new(); |
| 58 | ciborium::ser::into_writer(&map, &mut bytes1).unwrap(); |
| 59 | |
| 60 | assert_eq!( |
| 61 | hex::encode(&bytes1), |
| 62 | "a80a002001f402186403617a048120056261610681186407" |
| 63 | ); |
| 64 | } |
| 65 | |
| 66 | #[test] |
| 67 | fn negative_numbers() { |
| 68 | let mut array: Vec<CanonicalValue> = vec![ |
| 69 | cval!(10), |
| 70 | cval!(-1), |
| 71 | cval!(-2), |
| 72 | cval!(-3), |
| 73 | cval!(-4), |
| 74 | cval!(false), |
| 75 | cval!(100), |
| 76 | cval!(-100), |
| 77 | cval!(-200), |
| 78 | cval!("z" ), |
| 79 | cval!([-1]), |
| 80 | cval!(-300), |
| 81 | cval!("aa" ), |
| 82 | cval!([100]), |
| 83 | ]; |
| 84 | let golden = array.clone(); |
| 85 | |
| 86 | // Shuffle the array. |
| 87 | array.shuffle(&mut rand::thread_rng()); |
| 88 | |
| 89 | array.sort(); |
| 90 | |
| 91 | assert_eq!(array, golden); |
| 92 | } |
| 93 | |
| 94 | #[test] |
| 95 | fn tagged_option() { |
| 96 | let mut opt = Some(Required::<u64, 0xff>(2u32.into())); |
| 97 | |
| 98 | let mut bytes = Vec::new(); |
| 99 | ciborium::ser::into_writer(&opt, &mut bytes).unwrap(); |
| 100 | |
| 101 | let output = ciborium::de::from_reader(&bytes[..]).unwrap(); |
| 102 | assert_eq!(opt, output); |
| 103 | |
| 104 | opt = None; |
| 105 | |
| 106 | let mut bytes = Vec::new(); |
| 107 | ciborium::ser::into_writer(&opt, &mut bytes).unwrap(); |
| 108 | |
| 109 | let output = ciborium::de::from_reader(&bytes[..]).unwrap(); |
| 110 | assert_eq!(opt, output); |
| 111 | } |
| 112 | |