pub mod slice;
pub mod utils;
mod iterators;
pub use iterators::*;
mod utf16str;
mod utf16string;
#[derive(Debug, Eq, PartialEq, Hash)]
#[repr(transparent)]
pub struct Utf16Str {
pub(crate) raw: [u16],
}
#[derive(Debug, Eq, PartialEq, Hash)]
pub struct Utf16String {
pub(crate) buf: Vec<u16>,
}
#[cfg(test)]
mod tests {
use super::Utf16String;
#[test]
fn test_iter() {
let string = Utf16String::from("a\u{10000}");
let mut chars = string.chars();
assert_eq!(chars.next().unwrap(), 'a');
assert_eq!(chars.next().unwrap(), '\u{10000}');
let string = Utf16String::from("\u{10000}\u{10FFFF}");
let mut chars = string.chars();
assert_eq!(chars.next().unwrap(), '\u{10000}');
assert_eq!(chars.next().unwrap(), '\u{10FFFF}');
}
#[test]
fn test_length() {
let mut string1 = Utf16String::from("a\u{10000}");
assert_eq!(string1.len(), 3);
string1.pop();
assert_eq!(string1.len(), 1);
}
#[test]
fn test_slicing() {
let string1 = Utf16String::from("a\u{10000}");
assert_eq!(string1[1..3].len(), 2);
assert_eq!(string1[0..1].len(), 1);
assert_eq!(string1[0..].len(), 3);
assert_eq!(string1[1..].len(), 2);
assert_eq!(string1[..1].len(), 1);
}
#[test]
fn test_offset_conversion() {
use crate::utils::*;
let utf8string = "a\u{10000}b";
let utf16string = Utf16String::from(utf8string);
assert_eq!(two_utf16_offsets_as_utf8_offsets(utf8string, &utf16string, 1, 3), (1, 5));
assert_eq!(two_utf8_offsets_as_utf16_offsets(&utf16string, utf8string, 1, 5), (1, 3));
let utf8string = "a\u{10FFFF}b\u{10000}";
let utf16string = Utf16String::from(utf8string);
assert_eq!(two_utf16_offsets_as_utf8_offsets(utf8string, &utf16string, 3, 4), (5, 6));
assert_eq!(two_utf8_offsets_as_utf16_offsets(&utf16string, utf8string, 5, 6), (3, 4));
}
}