use abin::{AnyBin, BinFactory, NewBin, NewStr, Str, StrFactory};
#[test]
fn slice() {
let str1 = NewStr::from_static("Some text.");
assert_eq!(
"Some text.".get(5..9).unwrap(),
str1.slice(5..9).unwrap().as_str()
);
let str2 = NewStr::from_static("Warning: Don't open the door!");
assert_eq!("Don't open the door!", str2.slice(9..).unwrap().as_str());
let str3 = NewStr::from_static("HELLO");
assert!(str3.slice(0..6).is_none());
let str4 = NewStr::from_static("HELLO");
assert!(str4.slice(2..1).is_none())
}
#[test]
fn convert_from_utf8() {
let valid_utf8 = NewBin::from_static("Hello, world!".as_bytes());
let bin_ptr = valid_utf8.as_slice().as_ptr();
let string = Str::from_utf8(valid_utf8).unwrap();
assert_eq!("Hello, world!", string.as_str());
assert_eq!(bin_ptr, string.as_ptr());
let invalid_utf8 = NewBin::from_static(&[0xa0, 0xa1]);
match Str::from_utf8(invalid_utf8) {
Ok(_) => {
panic!("Expected an error");
}
Err(err) => {
let (_, bin) = err.deconstruct();
assert_eq!(&[0xa0, 0xa1], bin.as_slice());
}
}
}
#[test]
fn convert_to_vec_string() {
let input_data = "This is some input data. It has some length to make sure it's \
not stored on the stack (if stored on the stack, the test would fail - in that case a new vec \
has to be allocated and the pointers would differ)";
let str = NewStr::copy_from_str(input_data);
let pointer = str.as_str().as_ptr();
let string = str.into_string();
assert_eq!(input_data, string.as_str());
assert_eq!(pointer, string.as_ptr());
let bin = NewBin::copy_from_slice(input_data.as_bytes());
let pointer = bin.as_slice().as_ptr();
let vec = bin.into_vec();
assert_eq!(input_data.as_bytes(), vec.as_slice());
assert_eq!(pointer, vec.as_ptr());
}
#[test]
fn ord() {
assert!(NewStr::from_static("aaa") < NewStr::from_static("az"));
assert!(NewBin::from_static(&[15u8, 77u8, 20u8]) < NewBin::from_static(&[15u8, 78u8]));
}