use wdg_base32::B32;
use wdg_base32::B32Encode;
use wdg_base32::B32Decode;
use wdg_base32::B32DecodeError;
macro_rules! test_encode{($t:ty,$v1:expr,$v2:expr)=>{assert_eq!(B32::<$t>::encode($v1),$v2);}}
macro_rules! test_decode{($t:ty,$v1:expr,$v2:expr,$v3:expr)=>{match B32::<$t>::decode($v1){Ok(v)=>{assert_eq!(v,$v2);},Err(e)=>{assert_eq!(e,$v3);}}}}
macro_rules! test_unsafe_decode{($t:ty,$v1:expr,$v2:expr)=>{assert_eq!(unsafe{B32::<$t>::unsafe_decode($v1)},$v2);}}
macro_rules! test_validation{($t:ty,$v1:expr,$v2:expr)=>{assert_eq!(B32::<$t>::validation($v1),$v2);}}
#[test]
fn encode() {
test_encode!(String,String::from(""), String::from(""));
test_encode!(String,String::from("f"), String::from("MY======"));
test_encode!(String,String::from("fo"), String::from("MZXQ===="));
test_encode!(String,String::from("foo"), String::from("MZXW6==="));
test_encode!(String,String::from("foob"), String::from("MZXW6YQ="));
test_encode!(String,String::from("fooba"), String::from("MZXW6YTB"));
}
#[test]
fn validation(){
test_validation!(String,String::from("A"), B32DecodeError::InvalidLength);
test_validation!(String,String::from("AA"), B32DecodeError::InvalidLength);
test_validation!(String,String::from("AAA"), B32DecodeError::InvalidLength);
test_validation!(String,String::from("AAAA"), B32DecodeError::InvalidLength);
test_validation!(String,String::from("AAAAA"), B32DecodeError::InvalidLength);
test_validation!(String,String::from("AAAAAA"), B32DecodeError::InvalidLength);
test_validation!(String,String::from("AAAAAAA"), B32DecodeError::InvalidLength);
test_validation!(String,String::from("AAAAAA=="), B32DecodeError::InvalidPadding);
test_validation!(String,String::from("AAA====="), B32DecodeError::InvalidPadding);
test_validation!(String,String::from("A======="), B32DecodeError::InvalidPadding);
test_validation!(String,String::from("========"), B32DecodeError::InvalidPadding);
test_validation!(String,String::from(""), B32DecodeError::Null);
test_validation!(String,String::from("MY======"), B32DecodeError::Null);
test_validation!(String,String::from("MZXQ===="), B32DecodeError::Null);
test_validation!(String,String::from("MZXW6==="), B32DecodeError::Null);
test_validation!(String,String::from("MZXW6YQ="), B32DecodeError::Null);
test_validation!(String,String::from("MZXW6YTB"), B32DecodeError::Null);
}
#[test]
fn decode(){
test_decode!(String,String::from("A"), String::from(""), B32DecodeError::InvalidLength);
test_decode!(String,String::from("AA"), String::from(""), B32DecodeError::InvalidLength);
test_decode!(String,String::from("AAA"), String::from(""), B32DecodeError::InvalidLength);
test_decode!(String,String::from("AAAA"), String::from(""), B32DecodeError::InvalidLength);
test_decode!(String,String::from("AAAAA"), String::from(""), B32DecodeError::InvalidLength);
test_decode!(String,String::from("AAAAAA"), String::from(""), B32DecodeError::InvalidLength);
test_decode!(String,String::from("AAAAAAA"), String::from(""), B32DecodeError::InvalidLength);
test_decode!(String,String::from("AAAAAA=="), String::from(""), B32DecodeError::InvalidPadding);
test_decode!(String,String::from("AAA====="), String::from(""), B32DecodeError::InvalidPadding);
test_decode!(String,String::from("A======="), String::from(""), B32DecodeError::InvalidPadding);
test_decode!(String,String::from("========"), String::from(""), B32DecodeError::InvalidPadding);
test_decode!(String,String::from(""), String::from(""), B32DecodeError::Null);
test_decode!(String,String::from("MY======"), String::from("f"), B32DecodeError::Null);
test_decode!(String,String::from("MZXQ===="), String::from("fo"), B32DecodeError::Null);
test_decode!(String,String::from("MZXW6==="), String::from("foo"), B32DecodeError::Null);
test_decode!(String,String::from("MZXW6YQ="), String::from("foob"), B32DecodeError::Null);
test_decode!(String,String::from("MZXW6YTB"), String::from("fooba"), B32DecodeError::Null);
}
#[test]
fn unsafe_decode() {
test_unsafe_decode!(String,String::from(""), String::from(""));
test_unsafe_decode!(String,String::from("MY======"), String::from("f"));
test_unsafe_decode!(String,String::from("MZXQ===="), String::from("fo"));
test_unsafe_decode!(String,String::from("MZXW6==="), String::from("foo"));
test_unsafe_decode!(String,String::from("MZXW6YQ="), String::from("foob"));
test_unsafe_decode!(String,String::from("MZXW6YTB"), String::from("fooba"));
}