3 use expect_test::Expect;
5 assists::AssistResolveStrategy,
6 base_db::{fixture::WithFixture, SourceDatabaseExt},
10 use test_utils::{assert_eq_text, extract_annotations};
12 use crate::{DiagnosticsConfig, ExprFillDefaultMode, Severity};
14 /// Takes a multi-file input fixture with annotated cursor positions,
16 /// * a diagnostic is produced
17 /// * the first diagnostic fix trigger range touches the input cursor position
18 /// * that the contents of the file containing the cursor match `after` after the diagnostic fix is applied
20 pub(crate) fn check_fix(ra_fixture_before: &str, ra_fixture_after: &str) {
21 check_nth_fix(0, ra_fixture_before, ra_fixture_after);
23 /// Takes a multi-file input fixture with annotated cursor positions,
25 /// * a diagnostic is produced
26 /// * every diagnostic fixes trigger range touches the input cursor position
27 /// * that the contents of the file containing the cursor match `after` after each diagnostic fix is applied
28 pub(crate) fn check_fixes(ra_fixture_before: &str, ra_fixtures_after: Vec<&str>) {
29 for (i, ra_fixture_after) in ra_fixtures_after.iter().enumerate() {
30 check_nth_fix(i, ra_fixture_before, ra_fixture_after)
35 fn check_nth_fix(nth: usize, ra_fixture_before: &str, ra_fixture_after: &str) {
36 let after = trim_indent(ra_fixture_after);
38 let (db, file_position) = RootDatabase::with_position(ra_fixture_before);
39 let mut conf = DiagnosticsConfig::default();
40 conf.expr_fill_default = ExprFillDefaultMode::Default;
42 super::diagnostics(&db, &conf, &AssistResolveStrategy::All, file_position.file_id)
44 .expect("no diagnostics");
45 let fix = &diagnostic.fixes.expect("diagnostic misses fixes")[nth];
47 let source_change = fix.source_change.as_ref().unwrap();
48 let file_id = *source_change.source_file_edits.keys().next().unwrap();
49 let mut actual = db.file_text(file_id).to_string();
51 for edit in source_change.source_file_edits.values() {
52 edit.apply(&mut actual);
58 fix.target.contains_inclusive(file_position.offset),
59 "diagnostic fix range {:?} does not touch cursor position {:?}",
63 assert_eq_text!(&after, &actual);
66 /// Checks that there's a diagnostic *without* fix at `$0`.
67 pub(crate) fn check_no_fix(ra_fixture: &str) {
68 let (db, file_position) = RootDatabase::with_position(ra_fixture);
69 let diagnostic = super::diagnostics(
71 &DiagnosticsConfig::default(),
72 &AssistResolveStrategy::All,
73 file_position.file_id,
77 assert!(diagnostic.fixes.is_none(), "got a fix when none was expected: {:?}", diagnostic);
80 pub(crate) fn check_expect(ra_fixture: &str, expect: Expect) {
81 let (db, file_id) = RootDatabase::with_single_file(ra_fixture);
82 let diagnostics = super::diagnostics(
84 &DiagnosticsConfig::default(),
85 &AssistResolveStrategy::All,
88 expect.assert_debug_eq(&diagnostics)
92 pub(crate) fn check_diagnostics(ra_fixture: &str) {
93 let mut config = DiagnosticsConfig::default();
94 config.disabled.insert("inactive-code".to_string());
95 check_diagnostics_with_config(config, ra_fixture)
99 pub(crate) fn check_diagnostics_with_config(config: DiagnosticsConfig, ra_fixture: &str) {
100 let (db, files) = RootDatabase::with_many_files(ra_fixture);
101 for file_id in files {
102 let diagnostics = super::diagnostics(&db, &config, &AssistResolveStrategy::All, file_id);
104 let expected = extract_annotations(&*db.file_text(file_id));
105 let mut actual = diagnostics
108 let mut annotation = String::new();
109 if let Some(fixes) = &d.fixes {
110 assert!(!fixes.is_empty());
111 annotation.push_str("💡 ")
113 annotation.push_str(match d.severity {
114 Severity::Error => "error",
115 Severity::WeakWarning => "weak",
117 annotation.push_str(": ");
118 annotation.push_str(&d.message);
119 (d.range, annotation)
121 .collect::<Vec<_>>();
122 actual.sort_by_key(|(range, _)| range.start());
123 assert_eq!(expected, actual);
128 fn test_disabled_diagnostics() {
129 let mut config = DiagnosticsConfig::default();
130 config.disabled.insert("unresolved-module".into());
132 let (db, file_id) = RootDatabase::with_single_file(r#"mod foo;"#);
134 let diagnostics = super::diagnostics(&db, &config, &AssistResolveStrategy::All, file_id);
135 assert!(diagnostics.is_empty());
137 let diagnostics = super::diagnostics(
139 &DiagnosticsConfig::default(),
140 &AssistResolveStrategy::All,
143 assert!(!diagnostics.is_empty());