//////////////////////////// // 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_class_with_many_statements() { let script = "final shared class Foobar { int _a; int _b; Foobar(int a, int b) { _a = a; _b = b; } int GetA(){ return _a; } int Add() { return _a + _b; } class Inner { int a; } }"; let lexed_tokens = lex(script, &mut panic_on_error); println!("Lexed tokens JSON: {}", serde_json::to_string(&lexed_tokens).unwrap()); let parsed_tree = parse(lexed_tokens, &mut panic_on_error); println!("Parsed Tree JSON: {}", serde_json::to_string(&parsed_tree).unwrap()); let expected_tree: Box = serde_json::from_str(r#"{ "data": { "Script": { "statements": [ { "data": { "ClassDeclaration": { "modifiers": 10, "name": "Foobar", "inherits": [], "statements": [ { "data": { "Var": { "modifier": 0, "var_type": { "data": { "Type": { "is_const": false, "scope": null, "datatype": { "data": { "DataTypePrimType": { "prim_type": "Int32" } }, "span": { "start": 32, "end": 35 } }, "modifiers": [] } }, "span": { "start": 32, "end": 35 } }, "identifier": "_a", "assignment": null } }, "span": { "start": 32, "end": 39 } }, { "data": { "Var": { "modifier": 0, "var_type": { "data": { "Type": { "is_const": false, "scope": null, "datatype": { "data": { "DataTypePrimType": { "prim_type": "Int32" } }, "span": { "start": 44, "end": 47 } }, "modifiers": [] } }, "span": { "start": 44, "end": 47 } }, "identifier": "_b", "assignment": null } }, "span": { "start": 44, "end": 51 } }, { "data": { "FuncDeclaration": { "modifiers": 0, "field_mod": null, "is_destructor": false, "is_constructor": true, "returns_reference": false, "return_type": { "data": { "Type": { "is_const": false, "scope": null, "datatype": { "data": { "DataTypeIdentifier": { "identifier": "Foobar" } }, "span": { "start": 57, "end": 63 } }, "modifiers": [] } }, "span": { "start": 57, "end": 63 } }, "name": "Foobar", "param_list": { "data": { "ParamList": { "parameters": [ { "parameter_type": { "data": { "Type": { "is_const": false, "scope": null, "datatype": { "data": { "DataTypePrimType": { "prim_type": "Int32" } }, "span": { "start": 64, "end": 67 } }, "modifiers": [] } }, "span": { "start": 64, "end": 67 } }, "type_mod": null, "identifier": "a", "default": null }, { "parameter_type": { "data": { "Type": { "is_const": false, "scope": null, "datatype": { "data": { "DataTypePrimType": { "prim_type": "Int32" } }, "span": { "start": 71, "end": 74 } }, "modifiers": [] } }, "span": { "start": 71, "end": 74 } }, "type_mod": null, "identifier": "b", "default": null } ] } }, "span": { "start": 63, "end": 77 } }, "is_const": false, "func_attr": 0, "block": { "data": { "StatBlock": { "statements": [ { "data": { "Assignment": { "left": { "data": { "VarAccess": { "scope": null, "identifier": "_a" } }, "span": { "start": 88, "end": 90 } }, "operator": "Assignment", "right": { "data": { "VarAccess": { "scope": null, "identifier": "a" } }, "span": { "start": 93, "end": 94 } } } }, "span": { "start": 88, "end": 94 } }, { "data": { "Assignment": { "left": { "data": { "VarAccess": { "scope": null, "identifier": "_b" } }, "span": { "start": 104, "end": 106 } }, "operator": "Assignment", "right": { "data": { "VarAccess": { "scope": null, "identifier": "b" } }, "span": { "start": 109, "end": 110 } } } }, "span": { "start": 104, "end": 110 } } ] } }, "span": { "start": 78, "end": 117 } } } }, "span": { "start": 57, "end": 117 } }, { "data": { "FuncDeclaration": { "modifiers": 0, "field_mod": null, "is_destructor": false, "is_constructor": false, "returns_reference": false, "return_type": { "data": { "Type": { "is_const": false, "scope": null, "datatype": { "data": { "DataTypePrimType": { "prim_type": "Int32" } }, "span": { "start": 123, "end": 126 } }, "modifiers": [] } }, "span": { "start": 123, "end": 126 } }, "name": "GetA", "param_list": { "data": { "ParamList": { "parameters": [] } }, "span": { "start": 131, "end": 133 } }, "is_const": false, "func_attr": 0, "block": { "data": { "StatBlock": { "statements": [ { "data": { "ReturnStatement": { "expression": { "data": { "VarAccess": { "scope": null, "identifier": "_a" } }, "span": { "start": 150, "end": 152 } } } }, "span": { "start": 143, "end": 153 } } ] } }, "span": { "start": 133, "end": 159 } } } }, "span": { "start": 123, "end": 159 } }, { "data": { "FuncDeclaration": { "modifiers": 0, "field_mod": null, "is_destructor": false, "is_constructor": false, "returns_reference": false, "return_type": { "data": { "Type": { "is_const": false, "scope": null, "datatype": { "data": { "DataTypePrimType": { "prim_type": "Int32" } }, "span": { "start": 165, "end": 168 } }, "modifiers": [] } }, "span": { "start": 165, "end": 168 } }, "name": "Add", "param_list": { "data": { "ParamList": { "parameters": [] } }, "span": { "start": 172, "end": 174 } }, "is_const": false, "func_attr": 0, "block": { "data": { "StatBlock": { "statements": [ { "data": { "ReturnStatement": { "expression": { "data": { "BinaryExpr": { "left": { "data": { "VarAccess": { "scope": null, "identifier": "_a" } }, "span": { "start": 192, "end": 194 } }, "operator": "Addition", "right": { "data": { "VarAccess": { "scope": null, "identifier": "_b" } }, "span": { "start": 197, "end": 199 } } } }, "span": { "start": 192, "end": 199 } } } }, "span": { "start": 185, "end": 200 } } ] } }, "span": { "start": 175, "end": 206 } } } }, "span": { "start": 165, "end": 206 } }, { "data": { "ClassDeclaration": { "modifiers": 0, "name": "Inner", "inherits": [], "statements": [ { "data": { "Var": { "modifier": 0, "var_type": { "data": { "Type": { "is_const": false, "scope": null, "datatype": { "data": { "DataTypePrimType": { "prim_type": "Int32" } }, "span": { "start": 234, "end": 237 } }, "modifiers": [] } }, "span": { "start": 234, "end": 237 } }, "identifier": "a", "assignment": null } }, "span": { "start": 234, "end": 240 } } ] } }, "span": { "start": 212, "end": 246 } } ] } }, "span": { "start": 0, "end": 248 } } ] } }, "span": { "start": 0, "end": 248 } }"#).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_class_with_many_statements_substring() { let mut script = "final shared class Foobar { int _a; int _b; Foobar(int a, int b) { _a = a; _b = b; } int GetA(){ return _a; } int Add() { return _a + _b; } class Inner { int a; } }".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); } }