use super::*;
#[cfg(not(feature = "std"))]
extern crate alloc;
#[cfg(not(feature = "std"))]
use alloc::string::ToString;
#[test]
fn tokenizer_position_tracking() {
let mut tokenizer = AssTokenizer::new("Test\nLine 2");
let initial_pos = tokenizer.position();
let initial_line = tokenizer.line();
let initial_col = tokenizer.column();
assert_eq!(initial_pos, 0);
assert_eq!(initial_line, 1);
assert_eq!(initial_col, 1);
let _ = tokenizer.next_token().unwrap();
assert!(tokenizer.position() > initial_pos);
}
#[test]
fn tokenizer_issues_collection() {
let mut tokenizer = AssTokenizer::new("test content");
let _ = tokenizer.tokenize_all().unwrap();
let _issues = tokenizer.issues();
}
#[test]
fn tokenize_empty_input() {
let mut tokenizer = AssTokenizer::new("");
let result = tokenizer.next_token().unwrap();
assert!(result.is_none());
}
#[test]
fn tokenize_only_whitespace() {
let mut tokenizer = AssTokenizer::new(" \t ");
let result = tokenizer.next_token().unwrap();
assert!(result.is_none());
}
#[test]
fn tokenizer_infinite_loop_protection() {
let mut tokenizer = AssTokenizer::new("test");
let result = tokenizer.next_token();
assert!(result.is_ok());
assert!(tokenizer.position() > 0 || tokenizer.scanner.navigator().is_at_end());
}
#[test]
fn tokenizer_iteration_limit_exceeded() {
let long_content = "a ".repeat(30); let mut tokenizer = AssTokenizer::new(&long_content);
let result = tokenizer.tokenize_all();
match result {
Ok(tokens) => assert!(tokens.len() <= 50),
Err(e) => assert!(e.to_string().contains("Too many tokenizer iterations")),
}
}
#[test]
fn tokenizer_context_transitions_comprehensive() {
let mut tokenizer = AssTokenizer::new("[Section]:value{override}text\n");
assert_eq!(tokenizer.context, TokenContext::Document);
let token1 = tokenizer.next_token().unwrap().unwrap();
assert_eq!(token1.token_type, TokenType::SectionHeader);
assert_eq!(tokenizer.context, TokenContext::SectionHeader);
let token2 = tokenizer.next_token().unwrap().unwrap();
assert_eq!(token2.token_type, TokenType::SectionClose);
assert_eq!(tokenizer.context, TokenContext::Document);
let token3 = tokenizer.next_token().unwrap().unwrap();
assert_eq!(token3.token_type, TokenType::Colon);
assert_eq!(tokenizer.context, TokenContext::FieldValue);
let _remaining_tokens = tokenizer.tokenize_all().unwrap();
}
#[test]
fn tokenizer_delimiter_in_wrong_context() {
let mut tokenizer = AssTokenizer::new("}text");
let token = tokenizer.next_token().unwrap().unwrap();
assert_eq!(token.token_type, TokenType::Text);
assert_eq!(token.span, "}");
let mut tokenizer2 = AssTokenizer::new("]text");
let token2 = tokenizer2.next_token().unwrap().unwrap();
assert_eq!(token2.token_type, TokenType::Text);
assert_eq!(token2.span, "]");
}
#[test]
fn tokenizer_bom_edge_cases() {
let mut tokenizer = AssTokenizer::new("\u{FEFF}content");
assert_eq!(tokenizer.position(), 3);
let _token = tokenizer.next_token().unwrap();
tokenizer.reset();
assert_eq!(tokenizer.position(), 3); assert_eq!(tokenizer.line(), 1);
assert_eq!(tokenizer.column(), 1);
assert_eq!(tokenizer.context, TokenContext::Document);
}
#[test]
fn tokenizer_carriage_return_line_feed() {
let mut tokenizer = AssTokenizer::new("line1\r\nline2");
let token1 = tokenizer.next_token().unwrap().unwrap();
assert_eq!(token1.token_type, TokenType::Text);
let token2 = tokenizer.next_token().unwrap().unwrap();
assert_eq!(token2.token_type, TokenType::Newline);
assert_eq!(tokenizer.context, TokenContext::Document);
let token3 = tokenizer.next_token().unwrap().unwrap();
assert_eq!(token3.token_type, TokenType::Text);
assert_eq!(token3.span, "line2");
}
#[test]
fn tokenizer_exclamation_comment_detection() {
let mut tokenizer = AssTokenizer::new("!:comment");
let token = tokenizer.next_token().unwrap().unwrap();
assert_eq!(token.token_type, TokenType::Comment);
let mut tokenizer2 = AssTokenizer::new("!text");
let token2 = tokenizer2.next_token().unwrap().unwrap();
assert_eq!(token2.token_type, TokenType::Text);
}
#[test]
fn tokenizer_field_value_context_handling() {
let mut tokenizer = AssTokenizer::new("key:value with spaces,next");
let token1 = tokenizer.next_token().unwrap().unwrap();
assert_eq!(token1.token_type, TokenType::Text);
let token2 = tokenizer.next_token().unwrap().unwrap();
assert_eq!(token2.token_type, TokenType::Colon);
assert_eq!(tokenizer.context, TokenContext::FieldValue);
let token3 = tokenizer.next_token().unwrap().unwrap();
assert!(matches!(
token3.token_type,
TokenType::Text | TokenType::Number | TokenType::HexValue
));
}