use ass_core::tokenizer::{state::TokenContext, AssTokenizer, TokenType};
#[test]
fn test_tokenizer_context_edge_transitions() {
let mut tokenizer = AssTokenizer::new("[}]{:}{}[");
let mut tokens = Vec::new();
while let Ok(Some(token)) = tokenizer.next_token() {
tokens.push(token);
if tokens.len() > 20 {
break;
}
}
assert!(!tokens.is_empty());
}
#[test]
fn test_tokenizer_field_value_context_edge_cases() {
let mut tokenizer = AssTokenizer::new("key:value}with]wrong{delimiters");
let mut tokens = Vec::new();
while let Ok(Some(token)) = tokenizer.next_token() {
tokens.push(token);
if tokens.len() > 10 {
break;
}
}
assert!(tokens.len() >= 3); assert!(tokens.iter().any(|t| t.token_type == TokenType::Colon));
}
#[test]
fn test_delimiter_type_edge_cases() {
let mut tokenizer = AssTokenizer::new("{}[]():,;\n\r");
let mut delimiter_types = Vec::new();
while let Ok(Some(token)) = tokenizer.next_token() {
match token.token_type {
TokenType::SectionHeader | TokenType::SectionOpen => {
delimiter_types.push("section");
}
TokenType::SectionClose => {
delimiter_types.push("section_close");
}
TokenType::OverrideBlock | TokenType::OverrideOpen => {
delimiter_types.push("override");
}
TokenType::OverrideClose => {
delimiter_types.push("override_close");
}
TokenType::Colon => {
delimiter_types.push("colon");
}
TokenType::Comma => {
delimiter_types.push("comma");
}
TokenType::Comment => {
delimiter_types.push("comment");
}
TokenType::Newline => {
delimiter_types.push("newline");
}
_ => {}
}
}
assert!(!delimiter_types.is_empty());
}
#[test]
fn test_token_context_transitions_exhaustive() {
let context_transitions = [
("[", TokenContext::SectionHeader),
(":", TokenContext::FieldValue),
("{", TokenContext::StyleOverride),
];
for (trigger, _expected_context) in context_transitions {
let mut tokenizer = AssTokenizer::new(trigger);
let _token = tokenizer.next_token().unwrap();
let remaining_input = &trigger[1..];
if !remaining_input.is_empty() {
let _next_token = tokenizer.next_token();
}
}
}