asn1_codecs/per/aper/
mod.rs1#![allow(dead_code)]
2pub mod encode;
5
6pub mod decode;
7
8pub trait AperCodec {
13 type Output;
14
15 fn aper_decode(data: &mut crate::PerCodecData) -> Result<Self::Output, crate::PerCodecError>;
16
17 fn aper_encode(&self, _data: &mut crate::PerCodecData) -> Result<(), crate::PerCodecError> {
18 todo!();
19 }
20}
21
22#[cfg(test)]
23mod tests {
24 use super::*;
25 use crate::PerCodecData;
26 use bitvec::prelude::*;
27
28 #[test]
30 fn get_bytes_unaligned() {
31 let mut d = PerCodecData::from_slice_aper(&vec![0x0f, 0xf0]);
32 let _ = d.get_bitvec(4);
33 let bytes = d.get_bytes(1).unwrap();
34 assert_eq!(bytes, vec![0xff]);
35 }
36
37 #[test]
38 fn test_encode_decode_unconstrained_whole_number() {
39 let numbers: Vec<i128> = vec![
40 140737488355328,
41 140737488355327,
42 549755813888,
43 549755813887,
44 2147483648,
45 2147483647,
46 8388608,
47 8388607,
48 32768,
49 32767,
50 128,
51 127,
52 1,
53 0,
54 -1,
55 -128,
56 -129,
57 -32768,
58 -32769,
59 -8388608,
60 -8388609,
61 -2147483648,
62 -2147483649,
63 -549755813888,
64 -549755813889,
65 -140737488355328,
66 -140737488355329,
67 ];
68 for num in numbers {
70 let mut d = PerCodecData::new_aper();
71 let result = encode::encode_integer(&mut d, None, None, false, num, false);
72 assert!(
73 result.is_ok(),
74 "number: {}, d: {:#?}, error: {:#?}",
75 num,
76 d,
77 result.err().unwrap()
78 );
79 let value = decode::decode_integer(&mut d, None, None, false);
80 assert!(value.is_ok(), "{:#?}", value.err().unwrap());
81 assert!(value.unwrap().0 == num);
82 }
83 }
84
85 #[test]
87 fn get_all_remaining_bits() {
88 let mut d = PerCodecData::new_aper();
89 d.append_bits(bits![u8, Msb0; 1,0,1,0]);
90 assert_eq!(d.get_bitvec(4).unwrap(), bitvec![u8,Msb0;1,0,1,0]);
91 }
92
93 #[test]
95 fn get_all_remaining_bytes() {
96 let mut d = PerCodecData::new_aper();
97 let b: u8 = 0b10101111;
98 d.append_bits(b.view_bits());
99 assert_eq!(d.get_bytes(1).unwrap()[0], b);
100 }
101
102 #[test]
103 fn printable_string_coding() {
104 let mut d = PerCodecData::new_aper();
105 let s1 = "hello".to_string();
106 encode::encode_printable_string(&mut d, None, None, false, &s1, false).unwrap();
107 let s2 = decode::decode_printable_string(&mut d, None, None, false).unwrap();
108 assert_eq!(s1, s2);
109 }
110
111 #[test]
112 fn empty_string() {
113 let mut d = PerCodecData::new_aper();
114 let s1 = "".to_string();
115 encode::encode_printable_string(&mut d, None, None, false, &s1, false).unwrap();
116 let s2 = decode::decode_printable_string(&mut d, None, None, false).unwrap();
117 assert_eq!(s1, s2);
118 }
119}