Skip to content

Commit f7fe12d

Browse files
committed
test: Make property tests enforce witnessed outcomes
1 parent 691cf8e commit f7fe12d

5 files changed

Lines changed: 731 additions & 126 deletions

File tree

‎crates/plotnik-lib/src/compiler/fmt/format_tests.rs‎

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use indoc::indoc;
22

33
use super::format::{FormatError, format_query, format_query_measured, format_query_with_config};
4-
use crate::compiler::diagnostics::Error;
4+
use crate::compiler::diagnostics::{DiagnosticKind, Error};
55
use crate::compiler::parse::ParseConfig;
66

77
#[test]
@@ -433,6 +433,19 @@ fn rejects_parse_errors_and_propagates_limits() {
433433
));
434434
}
435435

436+
#[test]
437+
fn rejects_recovered_group_without_closer() {
438+
let error = format_query("((\"(\"").expect_err("unclosed nested group is rejected");
439+
let diagnostics = error.diagnostics().expect("syntax failure has diagnostics");
440+
441+
assert_eq!(diagnostics.error_count(), 1);
442+
assert!(
443+
diagnostics
444+
.kinds()
445+
.any(|kind| kind == DiagnosticKind::UnclosedTree)
446+
);
447+
}
448+
436449
#[test]
437450
fn parse_errors_include_their_rendering_source_map() {
438451
let error = format_query("Q = (").expect_err("broken query is rejected");

‎crates/plotnik-lib/src/compiler/parse/parser.rs‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -410,10 +410,11 @@ impl<'q, 'd> Parser<'q, 'd> {
410410
// Use full range for easier downstream error suppression
411411
let full_range = TextRange::new(open.span.start(), current.end());
412412
let source_id = self.source_id;
413-
let Some(report) = self.report_at(kind, full_range) else {
414-
return;
415-
};
416-
report
413+
// The opener may already own a warning (legacy sequence syntax). Report
414+
// past start-offset dedup so that warning cannot suppress this gating error.
415+
self.diagnostics
416+
.report(kind, Span::new(source_id, full_range))
417+
.suppression_range(full_range)
417418
.related_to(
418419
Span::new(source_id, open.span),
419420
format!("{construct} started here"),

‎crates/plotnik-lib/src/compiler/parse/parser_tests.rs‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
1+
use crate::compiler::DiagnosticKind;
12
use crate::compiler::query::QueryBuilder;
23

4+
#[test]
5+
fn unclosed_legacy_sequence_is_an_error() {
6+
let query = QueryBuilder::from_inline("((\"(\"")
7+
.analyze()
8+
.expect("query parsing stays within resource limits");
9+
10+
assert!(!query.is_valid());
11+
assert!(
12+
query
13+
.diagnostics()
14+
.kinds()
15+
.any(|kind| kind == DiagnosticKind::UnclosedTree)
16+
);
17+
}
18+
319
#[test]
420
fn deeply_nested_trees_hit_recursion_limit() {
521
let depth = 128;

‎crates/plotnik-tests/Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ arborium-dart = "2.18.0"
2222
arborium-javascript = "2.18.0"
2323
arborium-typescript = "2.18.0"
2424
serde = { version = "1.0", features = ["derive"] }
25-
serde_json = "=1.0.150"
25+
serde_json = { version = "=1.0.150", features = ["unbounded_depth"] }
2626
tree-sitter = "=0.26.10"
2727

2828
[dev-dependencies]

0 commit comments

Comments
 (0)