use super::*;
#[test]
fn char_navigator_newline_variations_comprehensive() {
let sources = [
"line1\nline2", "line1\rline2", "line1\r\nline2", ];
for source in &sources {
let mut nav = CharNavigator::new(source, 0, 1, 1);
while let Ok(ch) = nav.advance_char() {
if ch == '\n' || ch == '\r' {
break;
}
}
if !nav.is_at_end() {
nav.advance_char().ok(); assert!(nav.line() >= 2);
}
}
}
#[test]
fn char_navigator_carriage_return_line_increment() {
let source = "text\rmore";
let mut nav = CharNavigator::new(source, 0, 1, 1);
for _ in 0..4 {
nav.advance_char().unwrap();
}
let ch = nav.advance_char().unwrap();
assert_eq!(ch, '\r');
assert_eq!(nav.line(), 2);
assert_eq!(nav.column(), 1);
}
#[test]
fn char_navigator_newline_line_increment() {
let source = "text\nmore";
let mut nav = CharNavigator::new(source, 0, 1, 1);
for _ in 0..4 {
nav.advance_char().unwrap();
}
let ch = nav.advance_char().unwrap();
assert_eq!(ch, '\n');
assert_eq!(nav.line(), 2);
assert_eq!(nav.column(), 1);
}
#[test]
fn char_navigator_column_increment_default() {
let source = "abc";
let mut nav = CharNavigator::new(source, 0, 1, 1);
nav.advance_char().unwrap(); assert_eq!(nav.column(), 2);
nav.advance_char().unwrap(); assert_eq!(nav.column(), 3);
nav.advance_char().unwrap(); assert_eq!(nav.column(), 4);
}
#[test]
fn char_navigator_skip_whitespace_loop() {
let source = " \t\n text";
let mut nav = CharNavigator::new(source, 0, 1, 1);
nav.skip_whitespace();
assert_eq!(nav.position(), 4); }
#[test]
fn token_scanner_section_header_closing_bracket() {
let source = "[Test]";
let mut scanner = TokenScanner::new(source, 0, 1, 1);
let result = scanner.scan_section_header();
assert!(result.is_ok());
assert_eq!(
result.unwrap(),
crate::tokenizer::tokens::TokenType::SectionHeader
);
}
#[test]
fn token_scanner_style_override_closing_brace() {
let source = "{\\b1}";
let mut scanner = TokenScanner::new(source, 0, 1, 1);
let result = scanner.scan_style_override();
assert!(result.is_ok());
assert_eq!(
result.unwrap(),
crate::tokenizer::tokens::TokenType::OverrideBlock
);
}
#[test]
fn token_scanner_comment_scanning() {
let source = "! This is a comment";
let mut scanner = TokenScanner::new(source, 0, 1, 1);
let result = scanner.scan_comment();
assert!(result.is_ok());
assert_eq!(
result.unwrap(),
crate::tokenizer::tokens::TokenType::Comment
);
}
#[test]
fn token_scanner_scan_text_hex_detection() {
let source = "&H1234&";
let mut scanner = TokenScanner::new(source, 0, 1, 1);
let result = scanner.scan_text(crate::tokenizer::state::TokenContext::Document);
assert!(result.is_ok());
assert_eq!(
result.unwrap(),
crate::tokenizer::tokens::TokenType::HexValue
);
}
#[test]
fn token_scanner_scan_text_number_detection_targeted() {
let source = "123.45";
let mut scanner = TokenScanner::new(source, 0, 1, 1);
let result = scanner.scan_text(crate::tokenizer::state::TokenContext::Document);
assert!(result.is_ok());
assert_eq!(result.unwrap(), crate::tokenizer::tokens::TokenType::Number);
}
#[test]
fn token_scanner_scan_text_section_name_context() {
let source = "Script Info";
let mut scanner = TokenScanner::new(source, 0, 1, 1);
let result = scanner.scan_text(crate::tokenizer::state::TokenContext::SectionHeader);
assert!(result.is_ok());
assert_eq!(
result.unwrap(),
crate::tokenizer::tokens::TokenType::SectionName
);
}
#[test]
fn token_scanner_scan_text_field_value_context_targeted() {
let source = "value_text";
let mut scanner = TokenScanner::new(source, 0, 1, 1);
let result = scanner.scan_text(crate::tokenizer::state::TokenContext::FieldValue);
assert!(result.is_ok());
}