use crate::lexer;
use crate::lexer::LexerTrait;
macro_rules! tokens {
[$($ty:ident => $lit:literal),*] => {
{
let mut v: Vec<lexer::Token> = Vec::new();
$(
v.push(lexer::Token{token_type: lexer::Keyword::$ty, token_literal: $lit.parse().unwrap(), position: (0, 0)});
)*
v
}
};
}
#[test]
fn lex() {
let input: String = "
some comments about the workout
# Squat
60kg x 3 x 5 @ 6.5
60kg x 3 x 5 @ 6
good squat session
# Deadlift
60kg x 3 x 5 @ 6
60kg x 3 x 5 @ 6.4
good deadlift session
# Push-up
5 x 3
".parse().unwrap();
let mut l = lexer::Lexer::new(input.as_str());
let correct_tokens: Vec<lexer::Token> = tokens![
DELIMITER => "\n",
TEXT => "some comments about the workout\n",
HASH => "#",
IDENT => "Squat",
DELIMITER => "\n",
NUMBER => "60",
LABEL => "kg",
CROSS => "x",
NUMBER => "3",
CROSS => "x",
NUMBER => "5",
AT => "@",
NUMBER => "6.5",
DELIMITER => "\n",
NUMBER => "60",
LABEL => "kg",
CROSS => "x",
NUMBER => "3",
CROSS => "x",
NUMBER => "5",
AT => "@",
NUMBER => "6",
DELIMITER => "\n",
TEXT => "good squat session\n",
DELIMITER => "\n",
HASH => "#",
IDENT => "Deadlift",
DELIMITER => "\n",
NUMBER => "60",
LABEL => "kg",
CROSS => "x",
NUMBER => "3",
CROSS => "x",
NUMBER => "5",
AT => "@",
NUMBER => "6",
DELIMITER => "\n",
NUMBER => "60",
LABEL => "kg",
CROSS => "x",
NUMBER => "3",
CROSS => "x",
NUMBER => "5",
AT => "@",
NUMBER => "6.4",
DELIMITER => "\n",
TEXT => "good deadlift session\n",
DELIMITER => "\n",
HASH => "#",
IDENT => "Push-up",
DELIMITER => "\n",
NUMBER => "5",
CROSS => "x",
NUMBER => "3",
DELIMITER => "\n",
EOF => ""
];
let mut tokens: Vec<lexer::Token> = tokens![];
loop {
let tok = l.next_token();
tokens.push(tok.clone());
if (&tok).token_type == lexer::Keyword::EOF {
break
}
}
assert_eq!(correct_tokens.len(), tokens.len());
let mut i = 0;
for x in tokens {
assert_eq!(x.token_type, correct_tokens[i].token_type);
assert_eq!(x.token_literal, correct_tokens[i].token_literal);
i += 1;
}
}