use super::*;
use crate::tokenizer::{state::TokenContext, tokens::TokenType};
#[cfg(not(feature = "std"))]
use alloc::{format, vec};
#[test]
fn token_scanner_scan_text_section_name() {
let source = "Script Info]";
let mut scanner = TokenScanner::new(source, 0, 1, 1);
let token_type = scanner.scan_text(TokenContext::SectionHeader).unwrap();
assert_eq!(token_type, TokenType::SectionName);
}
#[test]
fn token_scanner_scan_text_field_value_context() {
let source = "0:01:23.45,";
let mut scanner = TokenScanner::new(source, 0, 1, 1);
let token_type = scanner.scan_text(TokenContext::FieldValue).unwrap();
assert_eq!(token_type, TokenType::Text);
}
#[test]
fn token_scanner_scan_field_value() {
let source = "Some field value,";
let mut scanner = TokenScanner::new(source, 0, 1, 1);
let token_type = scanner.scan_field_value().unwrap();
assert_eq!(token_type, TokenType::Text);
}
#[test]
fn token_scanner_scan_field_value_number() {
let source = "0:01:23.45,";
let mut scanner = TokenScanner::new(source, 0, 1, 1);
let token_type = scanner.scan_field_value().unwrap();
assert_eq!(token_type, TokenType::Number);
}
#[test]
fn token_scanner_is_hex_value_simple() {
assert!(!TokenScanner::is_hex_value("ABCD"));
assert!(!TokenScanner::is_hex_value("1234"));
assert!(TokenScanner::is_hex_value("&HABCD&"));
assert!(TokenScanner::is_hex_value("&H1234&"));
assert!(!TokenScanner::is_hex_value("&HABCDE&")); assert!(!TokenScanner::is_hex_value("&HGHIJ&")); assert!(!TokenScanner::is_hex_value("")); }
#[test]
fn token_scanner_is_hex_value_with_prefix() {
assert!(TokenScanner::is_hex_value("&HFF00FF&"));
assert!(TokenScanner::is_hex_value("&HFF00FF"));
assert!(!TokenScanner::is_hex_value("&H&")); assert!(!TokenScanner::is_hex_value("&HGHIJ&")); }
#[test]
fn token_scanner_is_hex_value_max_length() {
assert!(!TokenScanner::is_hex_value("ABCDEF")); assert!(!TokenScanner::is_hex_value("00FF00FF")); assert!(!TokenScanner::is_hex_value("1234567890")); assert!(!TokenScanner::is_hex_value(&"A".repeat(100)));
assert!(TokenScanner::is_hex_value("&H00FF00FF&")); assert!(TokenScanner::is_hex_value("&HABCD&")); assert!(!TokenScanner::is_hex_value("&H1234567890&"));
assert!(!TokenScanner::is_hex_value("00")); assert!(!TokenScanner::is_hex_value("123abc")); }
#[test]
fn token_scanner_hex_value_trailing_ampersand_variants() {
assert!(TokenScanner::is_hex_value("&H00FFFFFF&"));
assert!(TokenScanner::is_hex_value("&HFF0000&"));
assert!(TokenScanner::is_hex_value("&H80FF00FF&"));
assert!(TokenScanner::is_hex_value("&H00FFFFFF"));
assert!(TokenScanner::is_hex_value("&HFF0000"));
assert!(TokenScanner::is_hex_value("&H80FF00FF"));
assert!(TokenScanner::is_hex_value("&H00&"));
assert!(TokenScanner::is_hex_value("&H00"));
assert!(!TokenScanner::is_hex_value("&H&")); assert!(!TokenScanner::is_hex_value("&H")); }
#[test]
fn token_scanner_scan_text_hex_value_ampersand_variants() {
let source1 = "&H00FFFFFF&";
let mut scanner1 = TokenScanner::new(source1, 0, 1, 1);
let token_type1 = scanner1.scan_text(TokenContext::Document).unwrap();
assert_eq!(token_type1, TokenType::HexValue);
assert_eq!(scanner1.navigator().position(), source1.len());
let source2 = "&H00FFFFFF";
let mut scanner2 = TokenScanner::new(source2, 0, 1, 1);
let token_type2 = scanner2.scan_text(TokenContext::Document).unwrap();
assert_eq!(token_type2, TokenType::HexValue);
assert_eq!(scanner2.navigator().position(), source2.len());
let source3 = "&HFF00&";
let mut scanner3 = TokenScanner::new(source3, 0, 1, 1);
let token_type3 = scanner3.scan_text(TokenContext::Document).unwrap();
assert_eq!(token_type3, TokenType::HexValue);
let source4 = "&HFF00";
let mut scanner4 = TokenScanner::new(source4, 0, 1, 1);
let token_type4 = scanner4.scan_text(TokenContext::Document).unwrap();
assert_eq!(token_type4, TokenType::HexValue);
}
#[test]
fn token_scanner_delimiter_context_field_value() {
let source = "Title: My Script";
let mut scanner = TokenScanner::new(source, 7, 1, 8); let token_type = scanner.scan_text(TokenContext::FieldValue).unwrap();
assert_eq!(token_type, TokenType::Text);
}
#[test]
fn token_scanner_delimiter_context_document() {
let source = "Field:Value";
let mut scanner = TokenScanner::new(source, 0, 1, 1);
let token_type = scanner.scan_text(TokenContext::Document).unwrap();
assert_eq!(token_type, TokenType::Text);
assert_eq!(scanner.navigator().position(), 5);
}
#[test]
fn token_scanner_various_delimiters() {
let test_cases = vec![
(",", TokenContext::Document),
("{", TokenContext::Document),
("}", TokenContext::Document),
("[", TokenContext::Document),
("]", TokenContext::Document),
("\n", TokenContext::Document),
("\r", TokenContext::Document),
];
for (delimiter, context) in test_cases {
let source = format!("text{delimiter}more");
let mut scanner = TokenScanner::new(&source, 0, 1, 1);
let _token_type = scanner.scan_text(context).unwrap();
assert_eq!(scanner.navigator().position(), 4); }
}
#[test]
fn token_scanner_navigator_mut() {
let source = "test";
let mut scanner = TokenScanner::new(source, 0, 1, 1);
{
let nav_mut = scanner.navigator_mut();
nav_mut.advance_char().unwrap();
}
assert_eq!(scanner.navigator().position(), 1);
}
#[test]
fn char_navigator_utf8_handling() {
let source = "café";
let mut nav = CharNavigator::new(source, 0, 1, 1);
assert_eq!(nav.advance_char().unwrap(), 'c');
assert_eq!(nav.advance_char().unwrap(), 'a');
assert_eq!(nav.advance_char().unwrap(), 'f');
assert_eq!(nav.advance_char().unwrap(), 'é');
assert_eq!(nav.position(), 5); }