#[cfg(test)]
mod lexer_test {
use envl_utils::{
types::{FilePosition, Position},
variable::Type,
};
use crate::{
lexer::Lexer,
misc::token::{Token, Value},
};
fn generate_tokens(code: String) -> Vec<Value> {
let lex = Lexer::new("test.envl".to_string(), code);
lex.generate()
.0
.into_iter()
.map(|t| t.value)
.collect::<Vec<_>>()
}
#[test]
fn position_test() {
let lex = Lexer::new(
"test.envl".to_string(),
include_str!("./files/position.test.envl").to_string(),
);
let tokens = lex.generate().0;
macro_rules! gen_position {
($row: expr, $col: expr, $end_row: expr, $end_col: expr) => {{
Position {
file_path: "test.envl".to_string(),
start: FilePosition {
col: $col,
row: $row,
},
end: FilePosition {
col: $end_col,
row: $end_row,
},
}
}};
}
assert_eq!(
tokens,
vec![
Token {
value: Value::Comment(" this is a comment".to_string()),
position: gen_position!(1, 1, 1, 20),
},
Token {
value: Value::Settings,
position: gen_position!(3, 1, 3, 8),
},
Token {
value: Value::LeftCurlyBracket,
position: gen_position!(3, 10, 3, 10),
},
Token {
value: Value::RightCurlyBracket,
position: gen_position!(3, 11, 3, 11),
},
Token {
value: Value::Vars,
position: gen_position!(5, 1, 5, 4),
},
Token {
value: Value::LeftCurlyBracket,
position: gen_position!(5, 6, 5, 6),
},
Token {
value: Value::Ident("a".to_string()),
position: gen_position!(6, 5, 6, 5),
},
Token {
value: Value::Colon,
position: gen_position!(6, 6, 6, 6),
},
Token {
value: Value::Option,
position: gen_position!(6, 8, 6, 13),
},
Token {
value: Value::LeftShift,
position: gen_position!(6, 14, 6, 14),
},
Token {
value: Value::Type(Type::Bool),
position: gen_position!(6, 15, 6, 18),
},
Token {
value: Value::RightShift,
position: gen_position!(6, 19, 6, 19),
},
Token {
value: Value::Comma,
position: gen_position!(6, 20, 6, 20),
},
Token {
value: Value::Ident("b".to_string()),
position: gen_position!(7, 5, 7, 5),
},
Token {
value: Value::Colon,
position: gen_position!(7, 6, 7, 6),
},
Token {
value: Value::Array,
position: gen_position!(7, 8, 7, 12),
},
Token {
value: Value::LeftShift,
position: gen_position!(7, 13, 7, 13),
},
Token {
value: Value::Type(Type::String),
position: gen_position!(7, 14, 7, 19),
},
Token {
value: Value::RightShift,
position: gen_position!(7, 20, 7, 20),
},
Token {
value: Value::Comma,
position: gen_position!(7, 21, 7, 21),
},
Token {
value: Value::RightCurlyBracket,
position: gen_position!(8, 1, 8, 1),
},
]
)
}
#[test]
fn default_file_test() {
let tokens = generate_tokens(include_str!("./files/default_file.test.envl").to_string());
assert_eq!(
tokens,
vec![
Value::Settings,
Value::LeftCurlyBracket,
Value::RightCurlyBracket,
Value::Vars,
Value::LeftCurlyBracket,
Value::RightCurlyBracket,
]
);
}
#[test]
fn settings_test() {
let tokens = generate_tokens(include_str!("./files/settings.test.envl").to_string());
assert_eq!(
tokens,
vec![
Value::Settings,
Value::LeftCurlyBracket,
Value::Ident(String::from("envl_file_path")),
Value::Equal,
Value::Ident(String::from("\"test.envl\"")),
Value::Semi,
Value::RightCurlyBracket,
Value::Vars,
Value::LeftCurlyBracket,
Value::RightCurlyBracket,
]
);
}
#[test]
fn vars_test() {
let tokens = generate_tokens(include_str!("./files/vars.test.envl").to_string());
assert_eq!(
tokens,
vec![
Value::Settings,
Value::LeftCurlyBracket,
Value::RightCurlyBracket,
Value::Vars,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Type(Type::String),
Value::Comma,
Value::Ident("b".to_string()),
Value::Colon,
Value::Type(Type::Char),
Value::Comma,
Value::Ident("c".to_string()),
Value::Colon,
Value::Type(Type::Float),
Value::Comma,
Value::Ident("d".to_string()),
Value::Colon,
Value::Type(Type::Int),
Value::Comma,
Value::Ident("e".to_string()),
Value::Colon,
Value::Type(Type::Uint),
Value::Comma,
Value::Ident("f".to_string()),
Value::Colon,
Value::Type(Type::Bool),
Value::Comma,
Value::Ident("g".to_string()),
Value::Colon,
Value::Array,
Value::LeftShift,
Value::Type(Type::Int),
Value::RightShift,
Value::Comma,
Value::Ident("h".to_string()),
Value::Colon,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Type(Type::Bool),
Value::Semi,
Value::Ident("b".to_string()),
Value::Colon,
Value::Type(Type::Int),
Value::Semi,
Value::RightCurlyBracket,
Value::Comma,
Value::Ident("i".to_string()),
Value::Colon,
Value::Null,
Value::Comma,
Value::Ident("j".to_string()),
Value::Colon,
Value::Array,
Value::LeftShift,
Value::Array,
Value::LeftShift,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Type(Type::Int),
Value::Semi,
Value::RightCurlyBracket,
Value::RightShift,
Value::RightShift,
Value::Comma,
Value::Ident("k".to_string()),
Value::Colon,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("b".to_string()),
Value::Colon,
Value::Type(Type::Bool),
Value::Semi,
Value::RightCurlyBracket,
Value::Semi,
Value::Ident("b".to_string()),
Value::Colon,
Value::Array,
Value::LeftShift,
Value::Type(Type::Int),
Value::RightShift,
Value::Semi,
Value::RightCurlyBracket,
Value::RightCurlyBracket,
]
);
}
#[test]
fn option_value_test() {
let tokens = generate_tokens(include_str!("./files/option_value.test.envl").to_string());
assert_eq!(
tokens,
vec![
Value::Settings,
Value::LeftCurlyBracket,
Value::RightCurlyBracket,
Value::Vars,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Type(Type::Int),
Value::LeftParentheses,
Value::Ident("default".to_string()),
Value::Colon,
Value::Ident("123".to_string()),
Value::Comma,
Value::Ident("actions".to_string()),
Value::Colon,
Value::Ident("456".to_string()),
Value::RightParentheses,
Value::Comma,
Value::Ident("b".to_string()),
Value::Colon,
Value::Type(Type::Bool),
Value::LeftParentheses,
Value::Ident("default".to_string()),
Value::Colon,
Value::Ident("false".to_string()),
Value::Comma,
Value::Ident("actions".to_string()),
Value::Colon,
Value::Ident("true".to_string()),
Value::RightParentheses,
Value::Comma,
Value::Ident("c".to_string()),
Value::Colon,
Value::Type(Type::String),
Value::LeftParentheses,
Value::Ident("default".to_string()),
Value::Colon,
Value::Null,
Value::Comma,
Value::Ident("actions".to_string()),
Value::Colon,
Value::Null,
Value::RightParentheses,
Value::Comma,
Value::Ident("d".to_string()),
Value::Colon,
Value::Array,
Value::LeftShift,
Value::Type(Type::Int),
Value::RightShift,
Value::LeftParentheses,
Value::Ident("default".to_string()),
Value::Colon,
Value::LeftSquareBracket,
Value::Ident("123".to_string()),
Value::Comma,
Value::Ident("456".to_string()),
Value::RightSquareBracket,
Value::Comma,
Value::Ident("actions".to_string()),
Value::Colon,
Value::LeftSquareBracket,
Value::RightSquareBracket,
Value::RightParentheses,
Value::Comma,
Value::Ident("e".to_string()),
Value::Colon,
Value::Array,
Value::LeftShift,
Value::Array,
Value::LeftShift,
Value::Type(Type::Int),
Value::RightShift,
Value::RightShift,
Value::LeftParentheses,
Value::Ident("default".to_string()),
Value::Colon,
Value::LeftSquareBracket,
Value::LeftSquareBracket,
Value::Ident("123".to_string()),
Value::RightSquareBracket,
Value::Comma,
Value::LeftSquareBracket,
Value::Ident("456".to_string()),
Value::RightSquareBracket,
Value::RightSquareBracket,
Value::Comma,
Value::Ident("actions".to_string()),
Value::Colon,
Value::LeftSquareBracket,
Value::LeftSquareBracket,
Value::RightSquareBracket,
Value::RightSquareBracket,
Value::RightParentheses,
Value::Comma,
Value::Ident("f".to_string()),
Value::Colon,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Type(Type::Bool),
Value::Semi,
Value::RightCurlyBracket,
Value::LeftParentheses,
Value::Ident("default".to_string()),
Value::Colon,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Ident("true".to_string()),
Value::Semi,
Value::RightCurlyBracket,
Value::Comma,
Value::Ident("actions".to_string()),
Value::Colon,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Ident("false".to_string()),
Value::Semi,
Value::RightCurlyBracket,
Value::RightParentheses,
Value::Comma,
Value::Ident("g".to_string()),
Value::Colon,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("b".to_string()),
Value::Colon,
Value::Type(Type::Bool),
Value::Semi,
Value::RightCurlyBracket,
Value::Semi,
Value::RightCurlyBracket,
Value::LeftParentheses,
Value::Ident("default".to_string()),
Value::Colon,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("b".to_string()),
Value::Colon,
Value::Ident("true".to_string()),
Value::Semi,
Value::RightCurlyBracket,
Value::Semi,
Value::RightCurlyBracket,
Value::Comma,
Value::Ident("actions".to_string()),
Value::Colon,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("b".to_string()),
Value::Colon,
Value::Ident("false".to_string()),
Value::Semi,
Value::RightCurlyBracket,
Value::Semi,
Value::RightCurlyBracket,
Value::RightParentheses,
Value::RightCurlyBracket,
]
);
}
#[test]
fn uncommon_option_value_test() {
let tokens =
generate_tokens(include_str!("./files/uncommon_option_value.test.envl").to_string());
assert_eq!(
tokens,
vec![
Value::Settings,
Value::LeftCurlyBracket,
Value::RightCurlyBracket,
Value::Vars,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Array,
Value::LeftShift,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Type(Type::Int),
Value::Semi,
Value::RightCurlyBracket,
Value::RightShift,
Value::LeftParentheses,
Value::Ident("default".to_string()),
Value::Colon,
Value::LeftSquareBracket,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Ident("123".to_string()),
Value::Semi,
Value::RightCurlyBracket,
Value::Comma,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Ident("456".to_string()),
Value::Semi,
Value::RightCurlyBracket,
Value::RightSquareBracket,
Value::Comma,
Value::Ident("actions".to_string()),
Value::Colon,
Value::LeftSquareBracket,
Value::RightSquareBracket,
Value::RightParentheses,
Value::Comma,
Value::Ident("b".to_string()),
Value::Colon,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Array,
Value::LeftShift,
Value::Type(Type::Int),
Value::RightShift,
Value::Semi,
Value::RightCurlyBracket,
Value::LeftParentheses,
Value::Ident("default".to_string()),
Value::Colon,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::LeftSquareBracket,
Value::Ident("123".to_string()),
Value::Comma,
Value::Ident("456".to_string()),
Value::RightSquareBracket,
Value::Semi,
Value::RightCurlyBracket,
Value::Comma,
Value::Ident("actions".to_string()),
Value::Colon,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::LeftSquareBracket,
Value::RightSquareBracket,
Value::Semi,
Value::RightCurlyBracket,
Value::RightParentheses,
Value::RightCurlyBracket,
]
)
}
#[test]
fn optional_test() {
let tokens = generate_tokens(include_str!("./files/optional.test.envl").to_string());
assert_eq!(
tokens,
vec![
Value::Settings,
Value::LeftCurlyBracket,
Value::RightCurlyBracket,
Value::Vars,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Option,
Value::LeftShift,
Value::Type(Type::Bool),
Value::RightShift,
Value::Comma,
Value::Ident("b".to_string()),
Value::Colon,
Value::Option,
Value::LeftShift,
Value::Array,
Value::LeftShift,
Value::Type(Type::Int),
Value::RightShift,
Value::RightShift,
Value::Comma,
Value::Ident("c".to_string()),
Value::Colon,
Value::Option,
Value::LeftShift,
Value::Struct,
Value::LeftCurlyBracket,
Value::Ident("a".to_string()),
Value::Colon,
Value::Type(Type::Bool),
Value::Semi,
Value::Ident("b".to_string()),
Value::Colon,
Value::Option,
Value::LeftShift,
Value::Type(Type::Int),
Value::RightShift,
Value::Semi,
Value::RightCurlyBracket,
Value::RightShift,
Value::Comma,
Value::Ident("d".to_string()),
Value::Colon,
Value::Option,
Value::LeftShift,
Value::Array,
Value::LeftShift,
Value::Option,
Value::LeftShift,
Value::Type(Type::String),
Value::RightShift,
Value::RightShift,
Value::RightShift,
Value::RightCurlyBracket,
]
)
}
}