#![allow(
invalid_from_utf8,
reason = "Intentional compatibility, platform, or test-only suppression."
)]
#![allow(
missing_docs,
reason = "Intentional compatibility, platform, or test-only suppression."
)]
#[cfg(test)]
mod tests {
use std::str;
#[test]
fn test_utf8_validation_edge_cases() {
let valid_ascii = b"Hello World";
let _valid_ascii = str::from_utf8(valid_ascii).unwrap();
let valid_unicode = "Hello 世界".as_bytes();
let _valid_unicode = str::from_utf8(valid_unicode).unwrap();
let valid_emoji = "🌍🚀✨".as_bytes();
let _valid_emoji = str::from_utf8(valid_emoji).unwrap();
let invalid_sequence = &[0xFF, 0xFE, b'X'];
let result = str::from_utf8(invalid_sequence);
let _invalid_error = result.unwrap_err();
match str::from_utf8(invalid_sequence) {
Ok(_) => panic!("Should not be valid UTF-8"),
Err(error) => {
println!("UTF-8 error: {error:?}");
println!("Valid up to: {}", error.valid_up_to());
println!("Error length: {:?}", error.error_len());
let valid_up_to = error.valid_up_to();
if valid_up_to > 0 {
let valid_part = &invalid_sequence[..valid_up_to];
let valid_str = str::from_utf8(valid_part).unwrap();
println!("Valid part: '{valid_str:?}'");
}
if let Some(error_len) = error.error_len() {
println!("Invalid sequence length: {error_len}");
}
}
}
}
#[test]
fn test_split_utf8_sequences() {
let full_sequence = [0xC3, 0xA9];
assert_eq!(str::from_utf8(&full_sequence).unwrap(), "é");
let incomplete_1 = [0xC3]; let _incomplete_error = str::from_utf8(&incomplete_1).unwrap_err();
let incomplete_2 = [0xA9]; let _incomplete_error = str::from_utf8(&incomplete_2).unwrap_err();
let full_emoji = [0xF0, 0x9F, 0x8C, 0x8D];
assert_eq!(str::from_utf8(&full_emoji).unwrap(), "🌍");
let incomplete_emoji_1 = [0xF0, 0x9F]; let _incomplete_error = str::from_utf8(&incomplete_emoji_1).unwrap_err();
let incomplete_emoji_2 = [0xF0, 0x9F, 0x8C]; let _incomplete_error = str::from_utf8(&incomplete_emoji_2).unwrap_err();
}
#[test]
fn test_utf8_replacement_character() {
let replacement = "\u{FFFD}";
assert_eq!(replacement, "�");
let mixed = format!("Hello{replacement}World");
assert!(mixed.contains("�"));
assert!(mixed.contains("Hello"));
assert!(mixed.contains("World"));
}
#[test]
fn test_overlong_utf8_encodings() {
let overlong_a = [0xC1, 0x81];
match str::from_utf8(&overlong_a) {
Ok(s) => {
println!("Overlong encoding accepted as: '{s:?}'");
}
Err(e) => {
println!("Overlong encoding correctly rejected: {e:?}");
}
}
}
#[test]
fn test_surrogate_code_points() {
let high_surrogate = [0xED, 0xA0, 0x80];
let _surrogate_error = str::from_utf8(&high_surrogate).unwrap_err();
let low_surrogate = [0xED, 0xB0, 0x80];
let _surrogate_error = str::from_utf8(&low_surrogate).unwrap_err();
}
#[test]
fn simulate_push_utf8_behavior() {
fn simulate_push_utf8(buffer: &mut Vec<u8>, eof: bool) -> String {
let mut result = String::new();
loop {
match str::from_utf8(buffer) {
Ok(valid) => {
if !valid.is_empty() {
result.push_str(valid);
}
buffer.clear();
break;
}
Err(error) => {
let valid_up_to = error.valid_up_to();
if valid_up_to > 0 {
if let Ok(valid) = str::from_utf8(&buffer[..valid_up_to])
&& !valid.is_empty()
{
result.push_str(valid);
}
let _drained = buffer.drain(..valid_up_to);
continue;
}
if let Some(error_len) = error.error_len() {
result.push('\u{FFFD}'); let _drained = buffer.drain(..error_len);
continue;
}
if eof && !buffer.is_empty() {
result.push('\u{FFFD}');
buffer.clear();
}
break;
}
}
}
result
}
let mut buffer1 = b"Hello World".to_vec();
let result1 = simulate_push_utf8(&mut buffer1, false);
assert_eq!(result1, "Hello World");
assert!(buffer1.is_empty());
let mut buffer2 = "Hello 世界".as_bytes().to_vec();
let result2 = simulate_push_utf8(&mut buffer2, false);
assert_eq!(result2, "Hello 世界");
assert!(buffer2.is_empty());
let mut buffer3 = vec![0xFF, 0xFE, b'X'];
let result3 = simulate_push_utf8(&mut buffer3, false);
assert!(result3.contains("\u{FFFD}")); assert!(result3.contains('X'));
assert!(buffer3.is_empty());
let mut buffer4 = vec![0xC3]; let result4 = simulate_push_utf8(&mut buffer4, true);
assert!(result4.contains("\u{FFFD}")); assert!(buffer4.is_empty());
let mut buffer5a = vec![0xC3]; let result5a = simulate_push_utf8(&mut buffer5a, false);
assert_eq!(result5a, ""); assert_eq!(buffer5a, vec![0xC3]);
buffer5a.extend_from_slice(&[0xA9, b' ']); let result5b = simulate_push_utf8(&mut buffer5a, false);
assert_eq!(result5b, "é ");
assert!(buffer5a.is_empty());
println!("Simulated push_utf8 behavior test completed successfully!");
}
#[test]
fn test_real_world_unicode_scenarios() {
let compiler_output = "error: expected one of `!` or `::`, found `🌍`";
assert!(compiler_output.contains("🌍"));
let progress = "Building... [wait] Compiling... v Done!";
assert!(progress.contains("[wait]"));
assert!(progress.contains("v"));
let unicode_path = "/projects/用户/документы/ファイル.txt";
assert!(unicode_path.contains("用户"));
assert!(unicode_path.contains("документы"));
assert!(unicode_path.contains("ファイル"));
let multilingual_error = "Error/Erreur/错误/エラー/오류";
assert!(multilingual_error.contains("错误"));
assert!(multilingual_error.contains("エラー"));
let math_symbols = "∑ ∏ ∫ ∂ ∇ ≤ ≥ ≠ ≈ ∞";
assert!(math_symbols.contains("∑"));
assert!(math_symbols.contains("∞"));
println!("Real-world unicode scenarios test completed!");
}
}