use baa::*;
use proptest::prelude::*;
fn do_test_from_to_bit_str(s: &str) {
let value = BitVecValue::from_bit_str(s).unwrap();
let bit_str = if s.starts_with('-') {
value.to_bit_str_signed()
} else {
value.to_bit_str()
};
compare_digit_str(&bit_str, &s.to_ascii_lowercase());
}
#[test]
fn test_from_to_bit_str_regression() {
do_test_from_to_bit_str("-0");
do_test_from_to_bit_str("-1");
do_test_from_to_bit_str("-11");
}
fn do_test_from_to_hex_str(s: &str) {
let value = BitVecValue::from_hex_str(s).unwrap();
let hex_str = if s.starts_with('-') {
value.to_hex_str_signed()
} else {
value.to_hex_str()
};
compare_digit_str(&hex_str, &s.to_ascii_lowercase());
}
fn compare_digit_str(ours: &str, original: &str) {
let expected = if let Some(e) = original.strip_prefix('+') {
e.to_ascii_lowercase()
} else {
original.to_ascii_lowercase()
};
if let Some(wm) = expected.strip_prefix('-') {
if wm.chars().all(|c| c == '0') {
assert_eq!(ours, wm);
} else {
assert_eq!(ours, expected);
}
} else {
assert_eq!(ours, expected);
}
}
#[test]
fn test_from_to_hex_str_regression() {
do_test_from_to_hex_str("a");
do_test_from_to_hex_str("A");
do_test_from_to_hex_str("0aaaA0a0aAA0aaaA");
do_test_from_to_hex_str("+A");
do_test_from_to_hex_str("0");
do_test_from_to_hex_str("+aaaa0aa0aaaa0aaa00a0aaaaaa00aa00");
do_test_from_to_hex_str("-aaaa00aaaaaaaaa0");
}
fn do_test_to_from_decimal_str(s: &str) {
let expected = BitVecValue::from_bit_str(s).unwrap();
let dec_str = expected.to_dec_str();
let actual = BitVecValue::from_str_radix(&dec_str, 10, expected.width()).unwrap();
assert_eq!(expected, actual);
}
#[test]
fn test_to_from_dec_str_regression() {
do_test_to_from_decimal_str("1000000");
}
#[test]
fn test_to_from_dec_str_small_value() {
let dec_str = "34";
let value = BitVecValue::from_str_radix(dec_str, 10, 512).unwrap();
assert_eq!(value.to_u64().unwrap(), 34);
assert_eq!(value.to_dec_str(), dec_str);
}
#[test]
fn test_to_from_dec_str_large_value() {
let dec_str = "596886253802847701482483271715688189726967057213902170277048855852747875443594200622744233395250662615839263196891363475349438107920290669854978619157637";
let eq_hex_str = "0b6584ec8ec7ccc11f45b8bb2fc98439f9e09d3d4bae2461b212c796d027d334a9defeda2bc5328aeeff4b5210d9e9dd25afe7d1b05660d2f22d22c7fce72c85";
assert_eq!(eq_hex_str.len() * 4, 512);
let value = BitVecValue::from_str_radix(dec_str, 10, 512).unwrap();
assert_eq!(value.to_hex_str(), eq_hex_str);
}
#[test]
fn test_from_dec_str_exceeds_width() {
let dec_str = "16";
let value = BitVecValue::from_str_radix(dec_str, 10, 4);
assert!(value.is_err());
let dec_str = "18446744073709551616"; let value = BitVecValue::from_str_radix(dec_str, 10, 64);
assert!(value.is_err());
let dec_str = "596886253802847701482483271715688189726967057213902170277048855852747875443594200622744233395250662615839263196891363475349438107920290669854978619157637";
let value = BitVecValue::from_str_radix(dec_str, 10, 507); assert!(value.is_err());
}
#[test]
fn test_from_dec_str_exceeds_width_sub() {
let dec_str_minus = "-16";
let value = BitVecValue::from_str_radix(dec_str_minus, 10, 4);
assert!(value.is_err());
let dec_str_minus = "-18446744073709551616";
let value = BitVecValue::from_str_radix(dec_str_minus, 10, 64);
assert!(value.is_err());
let dec_str_minus = "-596886253802847701482483271715688189726967057213902170277048855852747875443594200622744233395250662615839263196891363475349438107920290669854978619157637";
let value = BitVecValue::from_str_radix(dec_str_minus, 10, 507);
assert!(value.is_err());
}
#[test]
fn test_from_hex_str_exceeds_width() {
let hex_str = "100";
let value = BitVecValue::from_str_radix(hex_str, 16, 8);
assert!(value.is_err());
let hex_str = "40000000000000000";
let value = BitVecValue::from_str_radix(hex_str, 16, 65);
assert!(value.is_err());
let hex_str = "400000000000000000000000000000000";
let value = BitVecValue::from_str_radix(hex_str, 16, 129);
assert!(value.is_err());
}
#[test]
fn test_from_hex_str_exceeds_width_sub() {
let hex_str_minus = "-100"; let value = BitVecValue::from_str_radix(hex_str_minus, 16, 8);
assert!(value.is_err());
let hex_str_minus = "-40000000000000000";
let value = BitVecValue::from_str_radix(hex_str_minus, 16, 65);
assert!(value.is_err());
let hex_str_minus = "-400000000000000000000000000000000";
let value = BitVecValue::from_str_radix(hex_str_minus, 16, 129);
assert!(value.is_err())
}
#[test]
fn test_from_bin_str_exceeds_width() {
let bin_str = "1010";
let value = BitVecValue::from_str_radix(bin_str, 2, 3);
assert!(value.is_err());
}
#[test]
fn test_from_bin_str_exceeds_width_sub() {
let bin_str_minus = "-1000"; let value = BitVecValue::from_str_radix(bin_str_minus, 2, 3);
assert!(value.is_err())
}
proptest! {
#![proptest_config(ProptestConfig::with_cases(10000))]
#[test]
fn test_from_to_bit_str(s in "([-+])?[01]+") {
do_test_from_to_bit_str(&s);
}
#[test]
fn test_from_to_hex_str(s in "([-+])?[01a-fA-F]+") {
do_test_from_to_hex_str(&s);
}
#[test]
fn test_to_from_decimal_str(s in "([-+])?[01]+") {
do_test_to_from_decimal_str(&s);
}
}