Skip to content

Conversation

@mattvaux
Copy link

Summary

Adds 7 edge case tests for the diagnostics module, expanding coverage from 1 to 8 tests. Covers empty diagnostics, multiple diagnostics, severity handling, extend/merge operations, notes formatting, and duplicate filtering.


Type of change

Please check one:

  • Bug fix (fixes incorrect behavior)
  • New feature
  • Performance improvement
  • Documentation change with concrete technical impact
  • Style, wording, formatting, or typo-only change

⚠️ Note:
To keep maintainer workload sustainable, we generally do not accept PRs that
are only minor wording, grammar, formatting, or style changes.
Such PRs may be closed without detailed review.


Why is this change needed?

The diagnostics module is core infrastructure used across the compiler, but it had minimal test coverage—only one basic test. Critical methods like is_empty(), has_errors(), extend(), merge(), and get_diagnostics_without_duplicates() lacked tests, creating risk of regressions.


What was the behavior or documentation before?

Only one test (test_diagnostics) verified basic formatting of a single error diagnostic.


What is the behavior or documentation after?

8 tests covering empty diagnostics, multiple diagnostics, severity handling (warnings vs errors), extend/merge operations, notes formatting, and duplicate filtering.


Related issue or discussion (if any)

None.


Additional context

The diagnostics module is used throughout the Cairo compiler. These tests validate edge cases and help prevent regressions. All tests pass.

@reviewable-StarkWare
Copy link

This change is Reviewable

Copy link
Collaborator

@orizi orizi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@orizi made 3 comments.
Reviewable status: 0 of 1 files reviewed, 3 unresolved discussions (waiting on @mattvaux).


crates/cairo-lang-diagnostics/src/diagnostics_test.rs line 42 at r1 (raw file):

 fn format(&self, _db: &dyn Database) -> String { self.message.clone() }

as not really used.

Suggestion:

 file_id: FileId<'db>, severity: Severity, notes: Vec<DiagnosticNote<'db>>, } impl<'db> SimpleDiag<'db> { fn new(file_id: FileId<'db>) -> Self { Self { file_id, severity: Severity::Error, notes: vec![] } } fn with_severity(file_id: FileId<'db>, severity: Severity) -> Self { Self { file_id, severity, notes: vec![] } } fn with_notes(file_id: FileId<'db>, notes: Vec<DiagnosticNote<'db>>) -> Self {  Self { file_id, severity: Severity::Error, notes }  } } impl<'db> DiagnosticEntry<'db> for SimpleDiag<'db> { fn format(&self, _db: &dyn Database) -> String { "Simple diagnostic.".into() }

crates/cairo-lang-diagnostics/src/diagnostics_test.rs line 48 at r1 (raw file):

 file_id: self.file_id, span: TextSpan::new(TextOffset::START, TextWidth::new_for_testing(6).as_offset()), }

make the location somewhat configurable instead - to check duplications.

Code quote:

 SpanInFile { file_id: self.file_id, span: TextSpan::new(TextOffset::START, TextWidth::new_for_testing(6).as_offset()), }

crates/cairo-lang-diagnostics/src/diagnostics_test.rs line 208 at r1 (raw file):

 let formatted = diagnostics.build().format(&db_val); assert!(formatted.contains("note:")); assert!(formatted.contains("This is a note."));

Suggestion:

 let formatted = diagnostics.build().format(&db_val); assert_eq!(diagnostics.build().format(&db_val), indoc! {" ... "});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

3 participants