use crate::base32::{Base32, Base32Hex};
#[test]
fn test_base32_encode() {
let test_cases: Vec<(&[u8], &str)> = vec![
(b"Hello, World!", "JBSWY3DPFQQFO33SNRSCC==="),
(b"", ""),
(b"f", "MY======"),
(b"fo", "MZXQ===="),
(b"foo", "MZXW6==="),
(b"foob", "MZXW6YQ="),
(b"fooba", "MZXW6YTB"),
(b"foobar", "MZXW6YTBOI======"),
];
for (input, expected) in test_cases {
assert_eq!(Base32::encode(input, None), expected);
}
}
#[test]
fn test_base32_decode() {
let test_cases: Vec<(&str, &[u8])> = vec![
("JBSWY3DPFQQFO33SNRSCC===", b"Hello, World!"),
("", b""),
("MY======", b"f"),
("MZXQ====", b"fo"),
("MZXW6===", b"foo"),
("MZXW6YQ=", b"foob"),
("MZXW6YTB", b"fooba"),
("MZXW6YTBOI======", b"foobar"),
];
for (input, expected) in test_cases {
assert_eq!(Base32::decode(input).unwrap(), expected);
}
}
#[test]
fn test_base32hex_encode() {
let test_cases: Vec<(&[u8], &str)> = vec![
(b"Hello, World!", "91IMOR3F5GG5ERRIDHI22==="),
(b"", ""),
(b"f", "CO======"),
(b"fo", "CPNG===="),
(b"foo", "CPNMU==="),
(b"foob", "CPNMUOG="),
(b"fooba", "CPNMUOJ1"),
(b"foobar", "CPNMUOJ1E8======"),
];
for (input, expected) in test_cases {
let output = Base32Hex::encode(input, None);
assert_eq!(output.replace(" ", ""), expected.replace(" ", ""));
}
}
#[test]
fn test_base32hex_decode() {
let test_cases: Vec<(&str, &[u8])> = vec![
("91IMOR3F5GG5ERRIDHI22===", b"Hello, World!"),
("", b""),
("CO======", b"f"),
("CPNG====", b"fo"),
("CPNMU===", b"foo"),
("CPNMUOG=", b"foob"),
("CPNMUOJ1", b"fooba"),
("CPNMUOJ1E8======", b"foobar"),
];
for (input, expected) in test_cases {
assert_eq!(Base32Hex::decode(input).unwrap(), expected);
}
}
#[test]
fn test_padding_options() {
let input = b"Hello";
assert_eq!(Base32::encode(input, Some(true)), "JBSWY3DP");
assert_eq!(Base32::encode(input, Some(false)), "JBSWY3DP");
}
#[test]
fn test_invalid_input() {
let result = Base32::decode("!@#$%^&*");
assert!(result.is_err());
let error = result.unwrap_err();
assert!(error.contains("Invalid Base32 character"));
}