rott/rottlib/tests/parser_diagnostics/selector_expressions.rs

778 lines
25 KiB
Rust

use super::*;
pub(super) const P0028_FIXTURES: &[Fixture] = &[
Fixture {
label: "files/P0028_01.uc",
source: "{\n local Actor A;\n A.\n}\n",
},
Fixture {
label: "files/P0028_02.uc",
source: "{\n local Actor A;\n A.;\n Log(\"after\");\n}\n",
},
Fixture {
label: "files/P0028_03.uc",
source: "{\n local Actor A;\n A.\n ;\n Log(\"after\");\n}\n",
},
Fixture {
label: "files/P0028_04.uc",
source: "{\n local Actor A;\n Log(A.\n );\n Log(\"after\");\n}\n",
},
];
pub(super) const P0029_FIXTURES: &[Fixture] = &[
Fixture {
label: "files/P0029_01.uc",
source: "{\n local array<int> Values;\n Values[];\n Log(\"after\");\n}\n",
},
Fixture {
label: "files/P0029_02.uc",
source: "{\n local array<int> Values;\n Values[\n ];\n Log(\"after\");\n}\n",
},
Fixture {
label: "files/P0029_03.uc",
source: "{\n local array<int> Values;\n Values[, 1];\n Log(\"after\");\n}\n",
},
Fixture {
label: "files/P0029_04.uc",
source: "{\n local array<int> Values;\n Log(Values[\n ]);\n Log(\"after\");\n}\n",
},
];
pub(super) const P0030_FIXTURES: &[Fixture] = &[
Fixture {
label: "files/P0030_01.uc",
source: "{\n local array<int> Values;\n Values[0;\n Log(\"after\");\n}\n",
},
Fixture {
label: "files/P0030_02.uc",
source: "{\n local array<int> Values;\n Values[\n 0\n ;\n Log(\"after\");\n}\n",
},
Fixture {
label: "files/P0030_03.uc",
source: "{\n local array<int> Values;\n Log(Values[0));\n Log(\"after\");\n}\n",
},
Fixture {
label: "files/P0030_04.uc",
source: "{\n local array<int> Values;\n Values[GetIndex()\n Values[1] = 7;\n}\n",
},
];
#[test]
fn check_p0028_fixtures() {
let runs = run_fixtures(P0028_FIXTURES);
assert_eq!(runs.get("files/P0028_01.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0028_02.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0028_03.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0028_04.uc").unwrap().len(), 1);
assert_diagnostic(
&runs.get_any("files/P0028_01.uc"),
&ExpectedDiagnostic {
headline: "expected member name after `.`, found `}`",
severity: Severity::Error,
code: Some("P0028"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(14),
end: TokenPosition(14),
},
message: "unexpected `}`",
}),
secondary_labels: &[ExpectedLabel {
span: TokenSpan {
start: TokenPosition(12),
end: TokenPosition(12),
},
message: "after this `.`, a member name was expected",
}],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0028_02.uc"),
&ExpectedDiagnostic {
headline: "expected member name after `.`, found `;`",
severity: Severity::Error,
code: Some("P0028"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(13),
end: TokenPosition(13),
},
message: "unexpected `;`",
}),
secondary_labels: &[],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0028_03.uc"),
&ExpectedDiagnostic {
headline: "expected member name after `.`, found `;`",
severity: Severity::Error,
code: Some("P0028"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(15),
end: TokenPosition(15),
},
message: "unexpected `;`",
}),
secondary_labels: &[ExpectedLabel {
span: TokenSpan {
start: TokenPosition(12),
end: TokenPosition(12),
},
message: "after this `.`, a member name was expected",
}],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0028_04.uc"),
&ExpectedDiagnostic {
headline: "expected member name after `.`, found `)`",
severity: Severity::Error,
code: Some("P0028"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(17),
end: TokenPosition(17),
},
message: "unexpected `)`",
}),
secondary_labels: &[ExpectedLabel {
span: TokenSpan {
start: TokenPosition(14),
end: TokenPosition(14),
},
message: "after this `.`, a member name was expected",
}],
help: None,
notes: &[],
},
);
}
#[test]
fn check_p0029_fixtures() {
let runs = run_fixtures(P0029_FIXTURES);
assert_eq!(runs.get("files/P0029_01.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0029_02.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0029_03.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0029_04.uc").unwrap().len(), 1);
assert_diagnostic(
&runs.get_any("files/P0029_01.uc"),
&ExpectedDiagnostic {
headline: "expected index expression after `[`, found `]`",
severity: Severity::Error,
code: Some("P0029"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(16),
end: TokenPosition(16),
},
message: "expected expression before `]`",
}),
secondary_labels: &[],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0029_02.uc"),
&ExpectedDiagnostic {
headline: "expected index expression after `[`, found `]`",
severity: Severity::Error,
code: Some("P0029"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(15),
end: TokenPosition(18),
},
message: "expected expression before `]`",
}),
secondary_labels: &[ExpectedLabel {
span: TokenSpan {
start: TokenPosition(15),
end: TokenPosition(15),
},
message: "after this `[`, an index expression was expected",
}],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0029_03.uc"),
&ExpectedDiagnostic {
headline: "expected index expression after `[`, found `,`",
severity: Severity::Error,
code: Some("P0029"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(16),
end: TokenPosition(16),
},
message: "unexpected `,`",
}),
secondary_labels: &[],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0029_04.uc"),
&ExpectedDiagnostic {
headline: "expected index expression after `[`, found `]`",
severity: Severity::Error,
code: Some("P0029"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(17),
end: TokenPosition(20),
},
message: "expected expression before `]`",
}),
secondary_labels: &[ExpectedLabel {
span: TokenSpan {
start: TokenPosition(17),
end: TokenPosition(17),
},
message: "after this `[`, an index expression was expected",
}],
help: None,
notes: &[],
},
);
}
#[test]
fn check_p0030_fixtures() {
let runs = run_fixtures(P0030_FIXTURES);
assert_eq!(runs.get("files/P0030_01.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0030_02.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0030_04.uc").unwrap().len(), 1);
assert_diagnostic(
&runs.get_any("files/P0030_01.uc"),
&ExpectedDiagnostic {
headline: "missing `]` to close index selector",
severity: Severity::Error,
code: Some("P0030"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(17),
end: TokenPosition(17),
},
message: "expected `]` before `;`",
}),
secondary_labels: &[],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0030_02.uc"),
&ExpectedDiagnostic {
headline: "missing `]` to close index selector",
severity: Severity::Error,
code: Some("P0030"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(15),
end: TokenPosition(21),
},
message: "expected `]` before `;`",
}),
secondary_labels: &[ExpectedLabel {
span: TokenSpan {
start: TokenPosition(15),
end: TokenPosition(15),
},
message: "index selector starts here",
}],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_by_code("files/P0030_03.uc", "P0030"),
&ExpectedDiagnostic {
headline: "missing `]` to close index selector",
severity: Severity::Error,
code: Some("P0030"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(19),
end: TokenPosition(19),
},
message: "expected `]` before `)`",
}),
secondary_labels: &[],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0030_04.uc"),
&ExpectedDiagnostic {
headline: "missing `]` to close index selector",
severity: Severity::Error,
code: Some("P0030"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(15),
end: TokenPosition(21),
},
message: "expected `]` before `Values`",
}),
secondary_labels: &[ExpectedLabel {
span: TokenSpan {
start: TokenPosition(15),
end: TokenPosition(15),
},
message: "index selector starts here",
}],
help: None,
notes: &[],
},
);
}
pub(super) const P0031_FIXTURES: &[Fixture] = &[
Fixture {
label: "files/P0031_01.uc",
source: "{\n Func(A B);\n Log(\"after\");\n}\n",
},
Fixture {
label: "files/P0031_02.uc",
source: "{\n Func\n (A 123);\n Log(\"after\");\n}\n",
},
Fixture {
label: "files/P0031_03.uc",
source: "{\n Func(\n A\n new SomeClass\n );\n Log(\"after\");\n}\n",
},
];
pub(super) const P0032_FIXTURES: &[Fixture] = &[
Fixture {
label: "files/P0032_01.uc",
source: "Func(",
},
Fixture {
label: "files/P0032_02.uc",
source: "Func\n(\n A,",
},
Fixture {
label: "files/P0032_03.uc",
source: "Func(A,\n B,",
},
Fixture {
label: "files/P0032_04.uc",
source: "{\n Func\n (\n A,\n B,\n",
},
];
pub(super) const P0033_FIXTURES: &[Fixture] = &[
Fixture {
label: "files/P0033_01.uc",
source: "{\n Func(A #, B);\n Log(\"after\");\n}\n",
},
Fixture {
label: "files/P0033_02.uc",
source: "{\n Func\n (A\n #,\n B);\n Log(\"after\");\n}\n",
},
Fixture {
label: "files/P0033_03.uc",
source: "{\n Func(\n A ?\n , B\n );\n Log(\"after\");\n}\n",
},
Fixture {
label: "files/P0033_04.uc",
source: "{\n Func\n (\n A\n #,\n B\n );\n Log(\"after\");\n}\n",
},
];
#[test]
fn check_p0031_fixtures() {
let runs = run_fixtures(P0031_FIXTURES);
assert_eq!(runs.get("files/P0031_01.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0031_02.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0031_03.uc").unwrap().len(), 1);
assert_diagnostic(
&runs.get_any("files/P0031_01.uc"),
&ExpectedDiagnostic {
headline: "missing `,` between function call arguments",
severity: Severity::Error,
code: Some("P0031"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(7),
end: TokenPosition(7),
},
message: "expected `,` before `B`",
}),
secondary_labels: &[ExpectedLabel {
span: TokenSpan {
start: TokenPosition(5),
end: TokenPosition(5),
},
message: "previous argument ends here",
}],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0031_02.uc"),
&ExpectedDiagnostic {
headline: "missing `,` between function call arguments",
severity: Severity::Error,
code: Some("P0031"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(9),
end: TokenPosition(9),
},
message: "expected `,` before `123`",
}),
secondary_labels: &[
ExpectedLabel {
span: TokenSpan {
start: TokenPosition(3),
end: TokenPosition(3),
},
message: "function called here",
},
ExpectedLabel {
span: TokenSpan {
start: TokenPosition(7),
end: TokenPosition(7),
},
message: "previous argument ends here",
},
],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0031_03.uc"),
&ExpectedDiagnostic {
headline: "missing `,` between function call arguments",
severity: Severity::Error,
code: Some("P0031"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(10),
end: TokenPosition(10),
},
message: "expected `,` before `new`",
}),
secondary_labels: &[
ExpectedLabel {
span: TokenSpan {
start: TokenPosition(4),
end: TokenPosition(4),
},
message: "function call argument list starts here",
},
ExpectedLabel {
span: TokenSpan {
start: TokenPosition(7),
end: TokenPosition(7),
},
message: "previous argument ends here",
},
],
help: None,
notes: &[],
},
);
}
#[test]
fn check_p0032_fixtures() {
let runs = run_fixtures(P0032_FIXTURES);
assert_eq!(runs.get("files/P0032_01.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0032_02.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0032_03.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0032_04.uc").unwrap().len(), 2);
assert_diagnostic(
&runs.get_any("files/P0032_01.uc"),
&ExpectedDiagnostic {
headline: "missing `)` to close function call argument list",
severity: Severity::Error,
code: Some("P0032"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(2),
end: TokenPosition(2),
},
message: "expected `)` before end of file",
}),
secondary_labels: &[],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0032_02.uc"),
&ExpectedDiagnostic {
headline: "missing `)` to close function call argument list",
severity: Severity::Error,
code: Some("P0032"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(2),
end: TokenPosition(7),
},
message: "expected `)` before end of file",
}),
secondary_labels: &[
ExpectedLabel {
span: TokenSpan {
start: TokenPosition(0),
end: TokenPosition(0),
},
message: "function called here",
},
ExpectedLabel {
span: TokenSpan {
start: TokenPosition(2),
end: TokenPosition(2),
},
message: "function call argument list starts here",
},
],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0032_03.uc"),
&ExpectedDiagnostic {
headline: "missing `)` to close function call argument list",
severity: Severity::Error,
code: Some("P0032"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(1),
end: TokenPosition(8),
},
message: "expected `)` before end of file",
}),
secondary_labels: &[ExpectedLabel {
span: TokenSpan {
start: TokenPosition(1),
end: TokenPosition(1),
},
message: "function call argument list starts here",
}],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_by_code("files/P0032_04.uc", "P0032"),
&ExpectedDiagnostic {
headline: "missing `)` to close function call argument list",
severity: Severity::Error,
code: Some("P0032"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(6),
end: TokenPosition(16),
},
message: "expected `)` before end of file",
}),
secondary_labels: &[
ExpectedLabel {
span: TokenSpan {
start: TokenPosition(3),
end: TokenPosition(3),
},
message: "function called here",
},
ExpectedLabel {
span: TokenSpan {
start: TokenPosition(6),
end: TokenPosition(6),
},
message: "function call argument list starts here",
},
],
help: None,
notes: &[],
},
);
}
#[test]
fn check_p0033_fixtures() {
let runs = run_fixtures(P0033_FIXTURES);
assert_eq!(runs.get("files/P0033_01.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0033_02.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0033_03.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0033_04.uc").unwrap().len(), 1);
assert_diagnostic(
&runs.get_any("files/P0033_01.uc"),
&ExpectedDiagnostic {
headline: "expected `,` or `)` after argument, found `#`",
severity: Severity::Error,
code: Some("P0033"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(7),
end: TokenPosition(7),
},
message: "unexpected `#`",
}),
secondary_labels: &[ExpectedLabel {
span: TokenSpan {
start: TokenPosition(5),
end: TokenPosition(5),
},
message: "argument ends here",
}],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0033_02.uc"),
&ExpectedDiagnostic {
headline: "expected `,` or `)` after argument, found `#`",
severity: Severity::Error,
code: Some("P0033"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(10),
end: TokenPosition(10),
},
message: "unexpected `#`",
}),
secondary_labels: &[
ExpectedLabel {
span: TokenSpan {
start: TokenPosition(3),
end: TokenPosition(3),
},
message: "function called here",
},
ExpectedLabel {
span: TokenSpan {
start: TokenPosition(7),
end: TokenPosition(7),
},
message: "argument ends here",
},
],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0033_03.uc"),
&ExpectedDiagnostic {
headline: "expected `,` or `)` after argument, found `?`",
severity: Severity::Error,
code: Some("P0033"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(9),
end: TokenPosition(9),
},
message: "unexpected `?`",
}),
secondary_labels: &[
ExpectedLabel {
span: TokenSpan {
start: TokenPosition(4),
end: TokenPosition(4),
},
message: "function call argument list starts here",
},
ExpectedLabel {
span: TokenSpan {
start: TokenPosition(7),
end: TokenPosition(7),
},
message: "argument ends here",
},
],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0033_04.uc"),
&ExpectedDiagnostic {
headline: "expected `,` or `)` after argument, found `#`",
severity: Severity::Error,
code: Some("P0033"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(12),
end: TokenPosition(12),
},
message: "unexpected `#`",
}),
secondary_labels: &[
ExpectedLabel {
span: TokenSpan {
start: TokenPosition(3),
end: TokenPosition(3),
},
message: "function called here",
},
ExpectedLabel {
span: TokenSpan {
start: TokenPosition(6),
end: TokenPosition(6),
},
message: "function call argument list starts here",
},
ExpectedLabel {
span: TokenSpan {
start: TokenPosition(9),
end: TokenPosition(9),
},
message: "argument ends here",
},
],
help: None,
notes: &[],
},
);
}