use crate::internal::{errors::ParseError, lexer::Token};
pub fn parse_response<'a>(
tokens: &'a [(Token, &'a str)],
pos: &mut usize,
) -> Result<String, ParseError> {
let (_, name) = crate::internal::expect::expect(
tokens,
pos,
|t| matches!(t, Token::ColumnName),
"ColumnName",
)?;
Ok(name.to_string())
}
#[cfg(test)]
mod tests {
use super::*;
use crate::internal::lexer::Token;
#[test]
fn test_parse_response_simple() {
let tokens = vec![
(Token::ColumnName, "y"),
(Token::Tilde, "~"),
(Token::ColumnName, "x")
];
let mut pos = 0;
let result = parse_response(&tokens, &mut pos);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "y");
assert_eq!(pos, 1); }
#[test]
fn test_parse_response_with_long_name() {
let tokens = vec![
(Token::ColumnName, "response_variable"),
(Token::Tilde, "~"),
(Token::ColumnName, "x")
];
let mut pos = 0;
let result = parse_response(&tokens, &mut pos);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "response_variable");
assert_eq!(pos, 1);
}
#[test]
fn test_parse_response_failure_wrong_token() {
let tokens = vec![
(Token::Tilde, "~"),
(Token::ColumnName, "y")
];
let mut pos = 0;
let result = parse_response(&tokens, &mut pos);
assert!(result.is_err());
assert_eq!(pos, 0); }
#[test]
fn test_parse_response_failure_end_of_input() {
let tokens: Vec<(Token, &str)> = vec![];
let mut pos = 0;
let result = parse_response(&tokens, &mut pos);
assert!(result.is_err());
assert_eq!(pos, 0); }
#[test]
fn test_parse_response_with_numeric_name() {
let tokens = vec![
(Token::ColumnName, "y1"),
(Token::Tilde, "~"),
(Token::ColumnName, "x")
];
let mut pos = 0;
let result = parse_response(&tokens, &mut pos);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "y1");
assert_eq!(pos, 1);
}
#[test]
fn test_parse_response_with_underscore_name() {
let tokens = vec![
(Token::ColumnName, "target_variable"),
(Token::Tilde, "~"),
(Token::ColumnName, "feature")
];
let mut pos = 0;
let result = parse_response(&tokens, &mut pos);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "target_variable");
assert_eq!(pos, 1);
}
#[test]
fn test_parse_response_preserves_position_on_failure() {
let tokens = vec![
(Token::Plus, "+"),
(Token::ColumnName, "y")
];
let mut pos = 0;
let result = parse_response(&tokens, &mut pos);
assert!(result.is_err());
assert_eq!(pos, 0); }
#[test]
fn test_parse_response_with_single_token() {
let tokens = vec![
(Token::ColumnName, "z")
];
let mut pos = 0;
let result = parse_response(&tokens, &mut pos);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "z");
assert_eq!(pos, 1);
}
}