use std::fmt::Write; use std::mem::size_of; use std::ops::Deref; use tinystr::{Error, TinyStr16, TinyStr4, TinyStr8}; #[cfg(any(feature = "std", feature = "alloc"))] use tinystr::TinyStrAuto; #[test] fn tiny_sizes() { assert_eq!(4, size_of::()); assert_eq!(8, size_of::()); assert_eq!(16, size_of::()); assert_eq!(24, size_of::()); // Note: TinyStrAuto is size 32 even when a smaller TinyStr type is used #[cfg(any(feature = "std", feature = "alloc"))] assert_eq!(32, size_of::()); } #[test] fn tiny4_basic() { let s: TinyStr4 = "abc".parse().unwrap(); assert_eq!(s.deref(), "abc"); } #[test] fn tiny4_from_bytes() { let s = TinyStr4::from_bytes("abc".as_bytes()).unwrap(); assert_eq!(s.deref(), "abc"); assert_eq!( TinyStr4::from_bytes(&[0, 159, 146, 150]), Err(Error::NonAscii) ); assert_eq!(TinyStr4::from_bytes(&[]), Err(Error::InvalidSize)); assert_eq!(TinyStr4::from_bytes(&[0]), Err(Error::InvalidNull)); } #[test] fn tiny4_size() { assert_eq!("".parse::(), Err(Error::InvalidSize)); assert!("1".parse::().is_ok()); assert!("12".parse::().is_ok()); assert!("123".parse::().is_ok()); assert!("1234".parse::().is_ok()); assert_eq!("12345".parse::(), Err(Error::InvalidSize)); assert_eq!("123456789".parse::(), Err(Error::InvalidSize)); } #[test] fn tiny4_null() { assert_eq!("a\u{0}b".parse::(), Err(Error::InvalidNull)); } #[test] fn tiny4_new_unchecked() { let reference: TinyStr4 = "en".parse().unwrap(); let uval: u32 = reference.into(); let s = unsafe { TinyStr4::new_unchecked(uval) }; assert_eq!(s, reference); assert_eq!(s, "en"); } #[test] fn tiny4_nonascii() { assert_eq!("\u{4000}".parse::(), Err(Error::NonAscii)); } #[test] fn tiny4_alpha() { let s: TinyStr4 = "@aZ[".parse().unwrap(); assert!(!s.is_ascii_alphabetic()); assert!(!s.is_ascii_alphanumeric()); assert_eq!(s.to_ascii_uppercase().as_str(), "@AZ["); assert_eq!(s.to_ascii_lowercase().as_str(), "@az["); assert!("abYZ".parse::().unwrap().is_ascii_alphabetic()); assert!("abYZ".parse::().unwrap().is_ascii_alphanumeric()); assert!("a123".parse::().unwrap().is_ascii_alphanumeric()); assert!(!"a123".parse::().unwrap().is_ascii_alphabetic()); } #[test] fn tiny4_numeric() { let s: TinyStr4 = "@aZ[".parse().unwrap(); assert!(!s.is_ascii_numeric()); assert!("0123".parse::().unwrap().is_ascii_numeric()); } #[test] fn tiny4_titlecase() { assert_eq!( "abcd" .parse::() .unwrap() .to_ascii_titlecase() .as_str(), "Abcd" ); assert_eq!( "ABCD" .parse::() .unwrap() .to_ascii_titlecase() .as_str(), "Abcd" ); assert_eq!( "aBCD" .parse::() .unwrap() .to_ascii_titlecase() .as_str(), "Abcd" ); assert_eq!( "A123" .parse::() .unwrap() .to_ascii_titlecase() .as_str(), "A123" ); assert_eq!( "123a" .parse::() .unwrap() .to_ascii_titlecase() .as_str(), "123a" ); } #[test] fn tiny4_ord() { let mut v: Vec = vec!["zh".parse().unwrap(), "fr".parse().unwrap()]; v.sort(); assert_eq!(v.get(0).unwrap().as_str(), "fr"); assert_eq!(v.get(1).unwrap().as_str(), "zh"); } #[test] fn tiny4_eq() { let s1: TinyStr4 = "en".parse().unwrap(); let s2: TinyStr4 = "fr".parse().unwrap(); let s3: TinyStr4 = "en".parse().unwrap(); assert_eq!(s1, s3); assert_ne!(s1, s2); } #[test] fn tiny4_display() { let s: TinyStr4 = "abcd".parse().unwrap(); let mut result = String::new(); write!(result, "{}", s).unwrap(); assert_eq!(result, "abcd"); assert_eq!(format!("{}", s), "abcd"); } #[test] fn tiny4_debug() { let s: TinyStr4 = "abcd".parse().unwrap(); assert_eq!(format!("{:#?}", s), "\"abcd\""); } #[test] fn tiny8_basic() { let s: TinyStr8 = "abcde".parse().unwrap(); assert_eq!(s.deref(), "abcde"); } #[test] fn tiny8_from_bytes() { let s = TinyStr8::from_bytes("abcde".as_bytes()).unwrap(); assert_eq!(s.deref(), "abcde"); assert_eq!( TinyStr8::from_bytes(&[0, 159, 146, 150]), Err(Error::NonAscii) ); assert_eq!(TinyStr8::from_bytes(&[]), Err(Error::InvalidSize)); assert_eq!(TinyStr8::from_bytes(&[0]), Err(Error::InvalidNull)); } #[test] fn tiny8_size() { assert_eq!("".parse::(), Err(Error::InvalidSize)); assert!("1".parse::().is_ok()); assert!("12".parse::().is_ok()); assert!("123".parse::().is_ok()); assert!("1234".parse::().is_ok()); assert!("12345".parse::().is_ok()); assert!("123456".parse::().is_ok()); assert!("1234567".parse::().is_ok()); assert!("12345678".parse::().is_ok()); assert_eq!("123456789".parse::(), Err(Error::InvalidSize)); } #[test] fn tiny8_null() { assert_eq!("a\u{0}b".parse::(), Err(Error::InvalidNull)); } #[test] fn tiny8_new_unchecked() { let reference: TinyStr8 = "Windows".parse().unwrap(); let uval: u64 = reference.into(); let s = unsafe { TinyStr8::new_unchecked(uval) }; assert_eq!(s, reference); assert_eq!(s, "Windows"); } #[test] fn tiny8_nonascii() { assert_eq!("\u{4000}".parse::(), Err(Error::NonAscii)); } #[test] fn tiny8_alpha() { let s: TinyStr8 = "@abcXYZ[".parse().unwrap(); assert!(!s.is_ascii_alphabetic()); assert!(!s.is_ascii_alphanumeric()); assert_eq!(s.to_ascii_uppercase().as_str(), "@ABCXYZ["); assert_eq!(s.to_ascii_lowercase().as_str(), "@abcxyz["); assert!("abcXYZ".parse::().unwrap().is_ascii_alphabetic()); assert!("abcXYZ" .parse::() .unwrap() .is_ascii_alphanumeric()); assert!(!"abc123".parse::().unwrap().is_ascii_alphabetic()); assert!("abc123" .parse::() .unwrap() .is_ascii_alphanumeric()); } #[test] fn tiny8_numeric() { let s: TinyStr8 = "@abcXYZ[".parse().unwrap(); assert!(!s.is_ascii_numeric()); assert!("01234567".parse::().unwrap().is_ascii_numeric()); } #[test] fn tiny8_titlecase() { assert_eq!( "abcdabcd" .parse::() .unwrap() .to_ascii_titlecase() .as_str(), "Abcdabcd" ); assert_eq!( "ABCDABCD" .parse::() .unwrap() .to_ascii_titlecase() .as_str(), "Abcdabcd" ); assert_eq!( "aBCDaBCD" .parse::() .unwrap() .to_ascii_titlecase() .as_str(), "Abcdabcd" ); assert_eq!( "A123a123" .parse::() .unwrap() .to_ascii_titlecase() .as_str(), "A123a123" ); assert_eq!( "123a123A" .parse::() .unwrap() .to_ascii_titlecase() .as_str(), "123a123a" ); } #[test] fn tiny8_ord() { let mut v: Vec = vec!["nedis".parse().unwrap(), "macos".parse().unwrap()]; v.sort(); assert_eq!(v.get(0).unwrap().as_str(), "macos"); assert_eq!(v.get(1).unwrap().as_str(), "nedis"); } #[test] fn tiny8_eq() { let s1: TinyStr8 = "windows".parse().unwrap(); let s2: TinyStr8 = "mac".parse().unwrap(); let s3: TinyStr8 = "windows".parse().unwrap(); assert_eq!(s1, s3); assert_ne!(s1, s2); } #[test] fn tiny8_display() { let s: TinyStr8 = "abcdef".parse().unwrap(); let mut result = String::new(); write!(result, "{}", s).unwrap(); assert_eq!(result, "abcdef"); assert_eq!(format!("{}", s), "abcdef"); } #[test] fn tiny8_debug() { let s: TinyStr8 = "abcdef".parse().unwrap(); assert_eq!(format!("{:#?}", s), "\"abcdef\""); } #[test] fn tiny16_from_bytes() { let s = TinyStr16::from_bytes("abcdefghijk".as_bytes()).unwrap(); assert_eq!(s.deref(), "abcdefghijk"); assert_eq!( TinyStr16::from_bytes(&[0, 159, 146, 150]), Err(Error::NonAscii) ); assert_eq!(TinyStr16::from_bytes(&[]), Err(Error::InvalidSize)); assert_eq!(TinyStr16::from_bytes(&[0]), Err(Error::InvalidNull)); } #[test] fn tiny16_size() { assert_eq!("".parse::(), Err(Error::InvalidSize)); assert!("1".parse::().is_ok()); assert!("12".parse::().is_ok()); assert!("123".parse::().is_ok()); assert!("1234".parse::().is_ok()); assert!("12345".parse::().is_ok()); assert!("123456".parse::().is_ok()); assert!("1234567".parse::().is_ok()); assert!("12345678".parse::().is_ok()); assert!("123456781".parse::().is_ok()); assert!("1234567812".parse::().is_ok()); assert!("12345678123".parse::().is_ok()); assert!("123456781234".parse::().is_ok()); assert!("1234567812345".parse::().is_ok()); assert!("12345678123456".parse::().is_ok()); assert!("123456781234567".parse::().is_ok()); assert!("1234567812345678".parse::().is_ok()); assert_eq!( "12345678123456789".parse::(), Err(Error::InvalidSize) ); } #[test] fn tiny16_null() { assert_eq!("a\u{0}b".parse::(), Err(Error::InvalidNull)); } #[test] fn tiny16_new_unchecked() { let reference: TinyStr16 = "WindowsCE/ME/NT".parse().unwrap(); let uval: u128 = reference.into(); let s = unsafe { TinyStr16::new_unchecked(uval) }; assert_eq!(s, reference); assert_eq!(s, "WindowsCE/ME/NT"); } #[test] fn tiny16_nonascii() { assert_eq!("\u{4000}".parse::(), Err(Error::NonAscii)); } #[test] fn tiny16_alpha() { let s: TinyStr16 = "@abcdefgTUVWXYZ[".parse().unwrap(); assert!(!s.is_ascii_alphabetic()); assert!(!s.is_ascii_alphanumeric()); assert_eq!(s.to_ascii_uppercase().as_str(), "@ABCDEFGTUVWXYZ["); assert_eq!(s.to_ascii_lowercase().as_str(), "@abcdefgtuvwxyz["); assert!("abcdefgTUVWXYZ" .parse::() .unwrap() .is_ascii_alphabetic()); assert!("abcdefgTUVWXYZ" .parse::() .unwrap() .is_ascii_alphanumeric()); assert!(!"abcdefg0123456" .parse::() .unwrap() .is_ascii_alphabetic()); assert!("abcdefgTUVWXYZ" .parse::() .unwrap() .is_ascii_alphanumeric()); } #[test] fn tiny16_numeric() { let s: TinyStr16 = "@abcdefgTUVWXYZ[".parse().unwrap(); assert!(!s.is_ascii_numeric()); assert!("0123456789" .parse::() .unwrap() .is_ascii_numeric()); } #[test] fn tiny16_titlecase() { assert_eq!( "abcdabcdabcdabcd" .parse::() .unwrap() .to_ascii_titlecase() .as_str(), "Abcdabcdabcdabcd" ); assert_eq!( "ABCDABCDABCDABCD" .parse::() .unwrap() .to_ascii_titlecase() .as_str(), "Abcdabcdabcdabcd" ); assert_eq!( "aBCDaBCDaBCDaBCD" .parse::() .unwrap() .to_ascii_titlecase() .as_str(), "Abcdabcdabcdabcd" ); assert_eq!( "A123a123A123a123" .parse::() .unwrap() .to_ascii_titlecase() .as_str(), "A123a123a123a123" ); assert_eq!( "123a123A123a123A" .parse::() .unwrap() .to_ascii_titlecase() .as_str(), "123a123a123a123a" ); } #[test] fn tiny16_ord() { let mut v: Vec = vec!["nedis_xxxx".parse().unwrap(), "macos_xxxx".parse().unwrap()]; v.sort(); assert_eq!(v.get(0).unwrap().as_str(), "macos_xxxx"); assert_eq!(v.get(1).unwrap().as_str(), "nedis_xxxx"); } #[test] fn tiny16_eq() { let s1: TinyStr16 = "windows98SE".parse().unwrap(); let s2: TinyStr16 = "mac".parse().unwrap(); let s3: TinyStr16 = "windows98SE".parse().unwrap(); assert_eq!(s1, s3); assert_ne!(s1, s2); } #[test] fn tiny16_display() { let s: TinyStr16 = "abcdefghijkl".parse().unwrap(); let mut result = String::new(); write!(result, "{}", s).unwrap(); assert_eq!(result, "abcdefghijkl"); assert_eq!(format!("{}", s), "abcdefghijkl"); } #[test] fn tiny16_debug() { let s: TinyStr16 = "abcdefghijkl".parse().unwrap(); assert_eq!(format!("{:#?}", s), "\"abcdefghijkl\""); } #[cfg(any(feature = "std", feature = "alloc"))] #[test] fn tinyauto_basic() { let s1: TinyStrAuto = "abc".parse().unwrap(); assert_eq!(s1, "abc"); let s2: TinyStrAuto = "veryveryveryveryverylong".parse().unwrap(); assert_eq!(s2, "veryveryveryveryverylong"); } #[cfg(any(feature = "std", feature = "alloc"))] #[test] fn tinyauto_nonascii() { assert_eq!("\u{4000}".parse::(), Err(Error::NonAscii)); assert_eq!( "veryveryveryveryverylong\u{4000}".parse::(), Err(Error::NonAscii) ); } #[cfg(feature = "macros")] const TS: TinyStr8 = tinystr::macros::tinystr8!("test"); #[cfg(feature = "macros")] #[test] fn tinystr_macros() { use tinystr::macros::*; let x: TinyStr8 = "test".parse().unwrap(); assert_eq!(TS, x); let x: TinyStr4 = "foo".parse().unwrap(); assert_eq!(tinystr4!("foo"), x); let x: TinyStr8 = "barbaz".parse().unwrap(); assert_eq!(tinystr8!("barbaz"), x); let x: TinyStr16 = "metamorphosis".parse().unwrap(); assert_eq!(tinystr16!("metamorphosis"), x); }