460 lines
8.9 KiB
Rust
460 lines
8.9 KiB
Rust
////////////////////////////
|
|
// Automatically Generated//
|
|
////////////////////////////
|
|
use crate::logger::messages::Message;
|
|
use crate::parsing::lexer::lex;
|
|
use crate::parsing::lexer::lex_tokens::LexToken;
|
|
use crate::parsing::parser::parse;
|
|
use crate::parsing::parser::parsed_statement::ParsedStatement;
|
|
use crate::span::Span;
|
|
|
|
fn ignore_error(_msg: Message, _: Span) {
|
|
}
|
|
|
|
fn panic_on_error(msg: Message, _: Span) {
|
|
std::panic::panic_any(msg.stringify());
|
|
}
|
|
#[test]
|
|
fn integration_enum_definition() {
|
|
let script = "enum TestEnum : uint8 {
|
|
a,
|
|
b,
|
|
c,
|
|
d = 128,
|
|
e
|
|
}";
|
|
let lexed_tokens = lex(script, &mut panic_on_error);
|
|
println!("{}", serde_json::to_string(&lexed_tokens).unwrap());
|
|
let expected_tokens: Vec<LexToken> =
|
|
serde_json::from_str(r#"[
|
|
{
|
|
"token_type": "EnumKeyword",
|
|
"span": {
|
|
"start": 0,
|
|
"end": 4
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 4,
|
|
"end": 5
|
|
}
|
|
},
|
|
{
|
|
"token_type": {
|
|
"Identifier": "TestEnum"
|
|
},
|
|
"span": {
|
|
"start": 5,
|
|
"end": 13
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 13,
|
|
"end": 14
|
|
}
|
|
},
|
|
{
|
|
"token_type": "Colon",
|
|
"span": {
|
|
"start": 14,
|
|
"end": 15
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 15,
|
|
"end": 16
|
|
}
|
|
},
|
|
{
|
|
"token_type": "Uint8Keyword",
|
|
"span": {
|
|
"start": 16,
|
|
"end": 21
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 21,
|
|
"end": 22
|
|
}
|
|
},
|
|
{
|
|
"token_type": "OpenCurlyBracket",
|
|
"span": {
|
|
"start": 22,
|
|
"end": 23
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 23,
|
|
"end": 24
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 24,
|
|
"end": 25
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 25,
|
|
"end": 26
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 26,
|
|
"end": 27
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 27,
|
|
"end": 28
|
|
}
|
|
},
|
|
{
|
|
"token_type": {
|
|
"Identifier": "a"
|
|
},
|
|
"span": {
|
|
"start": 28,
|
|
"end": 29
|
|
}
|
|
},
|
|
{
|
|
"token_type": "Comma",
|
|
"span": {
|
|
"start": 29,
|
|
"end": 30
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 30,
|
|
"end": 31
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 31,
|
|
"end": 32
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 32,
|
|
"end": 33
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 33,
|
|
"end": 34
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 34,
|
|
"end": 35
|
|
}
|
|
},
|
|
{
|
|
"token_type": {
|
|
"Identifier": "b"
|
|
},
|
|
"span": {
|
|
"start": 35,
|
|
"end": 36
|
|
}
|
|
},
|
|
{
|
|
"token_type": "Comma",
|
|
"span": {
|
|
"start": 36,
|
|
"end": 37
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 37,
|
|
"end": 38
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 38,
|
|
"end": 39
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 39,
|
|
"end": 40
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 40,
|
|
"end": 41
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 41,
|
|
"end": 42
|
|
}
|
|
},
|
|
{
|
|
"token_type": {
|
|
"Identifier": "c"
|
|
},
|
|
"span": {
|
|
"start": 42,
|
|
"end": 43
|
|
}
|
|
},
|
|
{
|
|
"token_type": "Comma",
|
|
"span": {
|
|
"start": 43,
|
|
"end": 44
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 44,
|
|
"end": 45
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 45,
|
|
"end": 46
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 46,
|
|
"end": 47
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 47,
|
|
"end": 48
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 48,
|
|
"end": 49
|
|
}
|
|
},
|
|
{
|
|
"token_type": {
|
|
"Identifier": "d"
|
|
},
|
|
"span": {
|
|
"start": 49,
|
|
"end": 50
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 50,
|
|
"end": 51
|
|
}
|
|
},
|
|
{
|
|
"token_type": "Equals",
|
|
"span": {
|
|
"start": 51,
|
|
"end": 52
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 52,
|
|
"end": 53
|
|
}
|
|
},
|
|
{
|
|
"token_type": {
|
|
"IntegerLiteral": 128
|
|
},
|
|
"span": {
|
|
"start": 53,
|
|
"end": 56
|
|
}
|
|
},
|
|
{
|
|
"token_type": "Comma",
|
|
"span": {
|
|
"start": 56,
|
|
"end": 57
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 57,
|
|
"end": 58
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 58,
|
|
"end": 59
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 59,
|
|
"end": 60
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 60,
|
|
"end": 61
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 61,
|
|
"end": 62
|
|
}
|
|
},
|
|
{
|
|
"token_type": {
|
|
"Identifier": "e"
|
|
},
|
|
"span": {
|
|
"start": 62,
|
|
"end": 63
|
|
}
|
|
},
|
|
{
|
|
"token_type": "WhiteSpace",
|
|
"span": {
|
|
"start": 63,
|
|
"end": 64
|
|
}
|
|
},
|
|
{
|
|
"token_type": "CloseCurlyBracket",
|
|
"span": {
|
|
"start": 64,
|
|
"end": 65
|
|
}
|
|
},
|
|
{
|
|
"token_type": "EndOfFile",
|
|
"span": {
|
|
"start": 65,
|
|
"end": 65
|
|
}
|
|
}
|
|
]"#).unwrap();
|
|
assert_eq!(lexed_tokens, expected_tokens);
|
|
|
|
let parsed_tree = parse(lexed_tokens, &mut panic_on_error);
|
|
println!("{}", serde_json::to_string(&parsed_tree).unwrap());
|
|
let expected_tree: Box<ParsedStatement> =
|
|
serde_json::from_str(r#"{
|
|
"Script": {
|
|
"statements": [
|
|
{
|
|
"EnumDeclaration": {
|
|
"modifiers": 0,
|
|
"identifier": "TestEnum",
|
|
"base_type": {
|
|
"DataTypePrimType": {
|
|
"prim_type": "UInt8"
|
|
}
|
|
},
|
|
"values": [
|
|
[
|
|
"a",
|
|
null
|
|
],
|
|
[
|
|
"b",
|
|
null
|
|
],
|
|
[
|
|
"c",
|
|
null
|
|
],
|
|
[
|
|
"d",
|
|
{
|
|
"IntegerLiteral": 128
|
|
}
|
|
],
|
|
[
|
|
"e",
|
|
null
|
|
]
|
|
]
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}"#).unwrap();
|
|
assert_eq!(parsed_tree, expected_tree);
|
|
}
|
|
// A substring of a script should never panic, even though it might be completely invalid.
|
|
#[test]
|
|
fn integration_enum_definition_substring() {
|
|
let mut script = "enum TestEnum : uint8 {
|
|
a,
|
|
b,
|
|
c,
|
|
d = 128,
|
|
e
|
|
}".to_string();
|
|
for _ in 0..script.len() {
|
|
script.pop();
|
|
let lexed_tokens = lex(script.as_str(), &mut ignore_error);
|
|
let _parsed_tree = parse(lexed_tokens, &mut ignore_error);
|
|
}
|
|
|
|
}
|
|
|