use ass_core::tokenizer::{AssTokenizer, TokenType};
#[cfg(not(feature = "std"))]
use alloc::{format, string::ToString};
#[test]
fn test_tokenizer_iteration_limit_boundary() {
let content = "a,".repeat(30); let mut tokenizer = AssTokenizer::new(&content);
let result = tokenizer.tokenize_all();
match result {
Ok(tokens) => {
assert!(tokens.len() <= 60);
}
Err(e) => {
assert!(e.to_string().contains("Too many tokenizer iterations"));
}
}
}
#[test]
fn test_tokenizer_mixed_line_endings() {
let mut tokenizer = AssTokenizer::new("line1\rline2\nline3\r\nline4");
let mut newline_count = 0;
let mut text_count = 0;
while let Ok(Some(token)) = tokenizer.next_token() {
match token.token_type {
TokenType::Newline => newline_count += 1,
TokenType::Text => text_count += 1,
_ => {}
}
}
assert_eq!(newline_count, 3); assert_eq!(text_count, 4); }
#[test]
fn test_tokenizer_unicode_handling() {
let mut tokenizer = AssTokenizer::new("Text with 中文 and 🎭 emojis");
let tokens = tokenizer.tokenize_all().unwrap();
assert!(!tokens.is_empty());
assert!(tokens.iter().any(|t| t.token_type == TokenType::Text));
let mut positions = Vec::new();
let mut tokenizer2 = AssTokenizer::new("中文🎭");
while let Ok(Some(_)) = tokenizer2.next_token() {
positions.push(tokenizer2.position());
}
if positions.len() > 1 {
assert!(positions.windows(2).all(|w| w[1] >= w[0]));
}
}
#[test]
fn test_comment_detection_edge_cases() {
let test_cases = [
(";comment", true),
("!:comment", true),
("! not comment", false),
("text;not comment in text", false),
("text!:not comment in text", false),
];
for (input, should_have_comment) in test_cases {
let mut tokenizer = AssTokenizer::new(input);
let tokens = tokenizer.tokenize_all().unwrap();
let has_comment = tokens.iter().any(|t| t.token_type == TokenType::Comment);
if should_have_comment {
assert!(has_comment, "Should detect comment in: {input}");
}
}
}
#[test]
fn test_tokenizer_large_input_handling() {
let large_input = format!("[Section]\n{}\n", "Field: Value\n".repeat(100));
let mut tokenizer = AssTokenizer::new(&large_input);
let result = tokenizer.tokenize_all();
match result {
Ok(tokens) => {
assert!(!tokens.is_empty());
assert!(tokens.len() > 100);
}
Err(e) => {
assert!(e.to_string().contains("Too many tokenizer iterations"));
}
}
}
#[test]
fn test_whitespace_handling_edge_cases() {
let whitespace_cases = [
"",
" ",
"\t",
"\n",
"\r",
" \t \n \r ",
"\u{00A0}", "\u{2000}", "\u{3000}", ];
for ws in whitespace_cases {
let mut tokenizer = AssTokenizer::new(ws);
let result = tokenizer.next_token();
if let Ok(Some(token)) = result {
assert!(matches!(
token.token_type,
TokenType::Text | TokenType::Newline
));
} else {
}
}
}