use super::*;
#[test]
fn tokens() {
macro_rules! test {
($input:expr, $expected:expr $(,)?) => {{
debug!("Testing tokens! Input: {}", $input);
let expected: Vec<ExtractedToken> = $expected;
let result = {
let tokenization = crate::tokenize($input);
let mut tokens: Vec<ExtractedToken> = tokenization.into();
let first = tokens.remove(0);
let last = tokens.pop().expect("No final element in resultant tokens");
assert_eq!(first.token, Token::InputStart, "First token wasn't Token::InputStart");
assert_eq!(first.slice, "", "First slice wasn't an empty string");
assert_eq!(last.token, Token::InputEnd, "Final token wasn't Token::InputEnd");
assert_eq!(last.slice, "", "Final slice wasn't an empty string");
tokens
};
if result != expected {
panic!(
"Extracted tokens from lexer do not match expected!\n\nExpected: {:#?}\nActual: {:#?}",
result,
expected,
);
}
}};
}
test!("", vec![]);
test!(
"text",
vec![ExtractedToken {
token: Token::Identifier,
slice: "text",
span: 0..4,
}],
);
test!(
"-- doubleDash",
vec![
ExtractedToken {
token: Token::DoubleDash,
slice: "--",
span: 0..2,
},
ExtractedToken {
token: Token::Whitespace,
slice: " ",
span: 2..3,
},
ExtractedToken {
token: Token::Identifier,
slice: "doubleDash",
span: 3..13,
},
],
);
test!(
"--doubleDash",
vec![
ExtractedToken {
token: Token::DoubleDash,
slice: "--",
span: 0..2,
},
ExtractedToken {
token: Token::Identifier,
slice: "doubleDash",
span: 2..12,
},
],
);
test!(
"__[[*user }}",
vec![
ExtractedToken {
token: Token::Underline,
slice: "__",
span: 0..2,
},
ExtractedToken {
token: Token::LeftBlockStar,
slice: "[[*",
span: 2..5,
},
ExtractedToken {
token: Token::Identifier,
slice: "user",
span: 5..9,
},
ExtractedToken {
token: Token::Whitespace,
slice: " ",
span: 9..10,
},
ExtractedToken {
token: Token::RightMonospace,
slice: "}}",
span: 10..12,
},
],
);
test!(
r#"[[> unsure = "malformed \string"#,
vec![
ExtractedToken {
token: Token::LeftBlock,
slice: "[[",
span: 0..2,
},
ExtractedToken {
token: Token::Quote,
slice: ">",
span: 2..3,
},
ExtractedToken {
token: Token::Whitespace,
slice: " ",
span: 3..4,
},
ExtractedToken {
token: Token::Identifier,
slice: "unsure",
span: 4..10,
},
ExtractedToken {
token: Token::Whitespace,
slice: " ",
span: 10..11,
},
ExtractedToken {
token: Token::Equals,
slice: "=",
span: 11..12,
},
ExtractedToken {
token: Token::Whitespace,
slice: " ",
span: 12..13,
},
ExtractedToken {
token: Token::DoubleQuote,
slice: "\"",
span: 13..14,
},
ExtractedToken {
token: Token::Identifier,
slice: "malformed",
span: 14..23,
},
ExtractedToken {
token: Token::Whitespace,
slice: " ",
span: 23..24,
},
ExtractedToken {
token: Token::Other,
slice: "\\",
span: 24..25,
},
ExtractedToken {
token: Token::Identifier,
slice: "string",
span: 25..31,
},
],
);
test!(
"[[[[quadLinkTest]]]]",
vec![
ExtractedToken {
token: Token::LeftBracket,
slice: "[",
span: 0..1,
},
ExtractedToken {
token: Token::LeftLink,
slice: "[[[",
span: 1..4,
},
ExtractedToken {
token: Token::Identifier,
slice: "quadLinkTest",
span: 4..16,
},
ExtractedToken {
token: Token::RightLink,
slice: "]]]",
span: 16..19,
},
ExtractedToken {
token: Token::RightBracket,
slice: "]",
span: 19..20,
},
],
);
}