1mod decode;
2mod encode;
3mod error;
4pub mod pem;
5mod tables;
6
7pub use decode::{decode, decode_url_safe};
8pub use encode::{encode, encode_url_safe};
9pub use error::DecodeError;
10pub use pem::PemError;
11
12#[cfg(test)]
13mod tests {
14 use super::*;
15
16 #[test]
17 fn round_trip_empty() {
18 let encoded = encode(b"");
19 assert_eq!(decode(&encoded).unwrap(), b"");
20 }
21
22 #[test]
23 fn round_trip_hello_world() {
24 let input = b"Hello, world!";
25 let encoded = encode(input);
26 assert_eq!(decode(&encoded).unwrap(), input);
27 }
28
29 #[test]
30 fn round_trip_all_byte_values() {
31 let input: Vec<u8> = (0..=255).collect();
32 let encoded = encode(&input);
33 assert_eq!(decode(&encoded).unwrap(), input);
34 }
35
36 #[test]
37 fn round_trip_lengths_0_to_259() {
38 for len in 0..=259 {
39 let input: Vec<u8> = (0..len).map(|i| (i % 256) as u8).collect();
40 let encoded = encode(&input);
41 let decoded = decode(&encoded).unwrap();
42 assert_eq!(decoded, input, "failed round-trip for length {len}");
43 }
44 }
45
46 #[test]
47 fn encode_accepts_string() {
48 let s = String::from("hello");
49 let encoded = encode(&s);
50 assert_eq!(encoded, encode(s.as_bytes()));
51 }
52
53 #[test]
54 fn url_safe_round_trip_all_byte_values() {
55 let input: Vec<u8> = (0..=255).collect();
56 let encoded = encode_url_safe(&input);
57 assert_eq!(decode_url_safe(&encoded).unwrap(), input);
58 }
59
60 #[test]
61 fn pem_round_trip() {
62 let der: Vec<u8> = (0..=255).collect();
63 let pem_str = pem::encode(&der, "CERTIFICATE");
64 let decoded = pem::decode(&pem_str, "CERTIFICATE").unwrap();
65 assert_eq!(decoded, der);
66 }
67}