pub fn next<'a>(
tokens: &'a [(crate::internal::lexer::Token, &'a str)],
pos: &mut usize,
) -> Option<(crate::internal::lexer::Token, &'a str)> {
let t = tokens.get(*pos).cloned();
if t.is_some() {
*pos += 1;
}
t
}
#[cfg(test)]
mod tests {
use super::*;
use crate::internal::lexer::Token;
#[test]
fn test_next_consumes_tokens() {
let tokens = vec![
(Token::ColumnName, "y"),
(Token::Tilde, "~"),
(Token::ColumnName, "x")
];
let mut pos = 0;
let first = next(&tokens, &mut pos);
assert_eq!(pos, 1);
assert!(first.is_some());
assert_eq!(first.unwrap().0, Token::ColumnName);
let second = next(&tokens, &mut pos);
assert_eq!(pos, 2);
assert!(second.is_some());
assert_eq!(second.unwrap().0, Token::Tilde);
let third = next(&tokens, &mut pos);
assert_eq!(pos, 3);
assert!(third.is_some());
assert_eq!(third.unwrap().0, Token::ColumnName);
}
#[test]
fn test_next_at_end_returns_none() {
let tokens = vec![
(Token::ColumnName, "y"),
(Token::Tilde, "~")
];
let mut pos = 2;
let result = next(&tokens, &mut pos);
assert!(result.is_none());
assert_eq!(pos, 2); }
#[test]
fn test_next_beyond_end_returns_none() {
let tokens = vec![
(Token::ColumnName, "y")
];
let mut pos = 5;
let result = next(&tokens, &mut pos);
assert!(result.is_none());
assert_eq!(pos, 5); }
#[test]
fn test_next_with_empty_tokens() {
let tokens: Vec<(Token, &str)> = vec![];
let mut pos = 0;
let result = next(&tokens, &mut pos);
assert!(result.is_none());
assert_eq!(pos, 0); }
#[test]
fn test_next_preserves_string_slices() {
let tokens = vec![
(Token::ColumnName, "response_var"),
(Token::Integer, "42")
];
let mut pos = 0;
let first = next(&tokens, &mut pos);
assert_eq!(first.unwrap().1, "response_var");
let second = next(&tokens, &mut pos);
assert_eq!(second.unwrap().1, "42");
}
#[test]
fn test_next_with_function_tokens() {
let tokens = vec![
(Token::Poly, "poly"),
(Token::FunctionStart, "("),
(Token::ColumnName, "x"),
(Token::Comma, ","),
(Token::Integer, "3"),
(Token::FunctionEnd, ")")
];
let mut pos = 0;
let func_name = next(&tokens, &mut pos);
assert_eq!(func_name.unwrap().0, Token::Poly);
assert_eq!(pos, 1);
let open_paren = next(&tokens, &mut pos);
assert_eq!(open_paren.unwrap().0, Token::FunctionStart);
assert_eq!(pos, 2);
}
}