pub fn peek<'a>(
tokens: &'a [(crate::internal::lexer::Token, &'a str)],
pos: usize,
) -> Option<&'a (crate::internal::lexer::Token, &'a str)> {
tokens.get(pos)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::internal::lexer::Token;
#[test]
fn test_peek_at_start() {
let tokens = vec![
(Token::ColumnName, "y"),
(Token::Tilde, "~"),
(Token::ColumnName, "x"),
];
let result = peek(&tokens, 0);
assert!(result.is_some());
let (token, slice) = result.unwrap();
assert_eq!(*token, Token::ColumnName);
assert_eq!(*slice, "y");
}
#[test]
fn test_peek_at_middle() {
let tokens = vec![
(Token::ColumnName, "y"),
(Token::Tilde, "~"),
(Token::ColumnName, "x"),
];
let result = peek(&tokens, 1);
assert!(result.is_some());
let (token, slice) = result.unwrap();
assert_eq!(*token, Token::Tilde);
assert_eq!(*slice, "~");
}
#[test]
fn test_peek_at_end() {
let tokens = vec![
(Token::ColumnName, "y"),
(Token::Tilde, "~"),
(Token::ColumnName, "x"),
];
let result = peek(&tokens, 2);
assert!(result.is_some());
let (token, slice) = result.unwrap();
assert_eq!(*token, Token::ColumnName);
assert_eq!(*slice, "x");
}
#[test]
fn test_peek_beyond_end() {
let tokens = vec![(Token::ColumnName, "y"), (Token::Tilde, "~")];
let result = peek(&tokens, 2);
assert!(result.is_none());
}
#[test]
fn test_peek_empty_tokens() {
let tokens: Vec<(Token, &str)> = vec![];
let result = peek(&tokens, 0);
assert!(result.is_none());
}
#[test]
fn test_peek_with_function_tokens() {
let tokens = vec![
(Token::Poly, "poly"),
(Token::FunctionStart, "("),
(Token::ColumnName, "x"),
(Token::Comma, ","),
(Token::Integer, "2"),
(Token::FunctionEnd, ")"),
];
let result = peek(&tokens, 3);
assert!(result.is_some());
let (token, slice) = result.unwrap();
assert_eq!(*token, Token::Comma);
assert_eq!(*slice, ",");
}
}