From af6984f6a6fad56f24345c03d018ac29549b169d Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 14 Jul 2020 12:05:50 +0200 Subject: Data-driven diagnostics tests --- crates/ra_hir_ty/src/diagnostics.rs | 22 ++++ crates/ra_hir_ty/src/diagnostics/expr.rs | 169 +++++++++++++------------------ crates/ra_hir_ty/src/test_db.rs | 2 +- 3 files changed, 93 insertions(+), 100 deletions(-) diff --git a/crates/ra_hir_ty/src/diagnostics.rs b/crates/ra_hir_ty/src/diagnostics.rs index 3623b8569..49a616c6f 100644 --- a/crates/ra_hir_ty/src/diagnostics.rs +++ b/crates/ra_hir_ty/src/diagnostics.rs @@ -244,3 +244,25 @@ impl AstDiagnostic for MismatchedArgCount { ast::CallExpr::cast(node).unwrap() } } + +#[cfg(test)] +fn check_diagnostics(ra_fixture: &str) { + use ra_db::{fixture::WithFixture, FileId}; + use ra_syntax::TextRange; + use rustc_hash::FxHashMap; + + use crate::test_db::TestDB; + + let db = TestDB::with_files(ra_fixture); + let annotations = db.extract_annotations(); + + let mut actual: FxHashMap> = FxHashMap::default(); + db.diag(|d| { + // FXIME: macros... + let file_id = d.source().file_id.original_file(&db); + let range = d.syntax_node(&db).text_range(); + actual.entry(file_id).or_default().push((range, d.message().to_owned())); + }); + + assert_eq!(annotations, actual); +} diff --git a/crates/ra_hir_ty/src/diagnostics/expr.rs b/crates/ra_hir_ty/src/diagnostics/expr.rs index 239be779f..277ace180 100644 --- a/crates/ra_hir_ty/src/diagnostics/expr.rs +++ b/crates/ra_hir_ty/src/diagnostics/expr.rs @@ -376,146 +376,117 @@ pub fn record_pattern_missing_fields( #[cfg(test)] mod tests { - use expect::{expect, Expect}; - use ra_db::fixture::WithFixture; - - use crate::{diagnostics::MismatchedArgCount, test_db::TestDB}; - - fn check_diagnostic(ra_fixture: &str, expect: Expect) { - let msg = TestDB::with_single_file(ra_fixture).0.diagnostic::().0; - expect.assert_eq(&msg); - } - - fn check_no_diagnostic(ra_fixture: &str) { - let (s, diagnostic_count) = - TestDB::with_single_file(ra_fixture).0.diagnostic::(); - - assert_eq!(0, diagnostic_count, "expected no diagnostic, found one: {}", s); - } + use crate::diagnostics::check_diagnostics; #[test] fn simple_free_fn_zero() { - check_diagnostic( - r" - fn zero() {} - fn f() { zero(1); } - ", - expect![["\"zero(1)\": Expected 0 arguments, found 1\n"]], + check_diagnostics( + r#" +fn zero() {} +fn f() { zero(1); } + //^^^^^^^ Expected 0 arguments, found 1 +"#, ); - check_no_diagnostic( - r" - fn zero() {} - fn f() { zero(); } - ", + check_diagnostics( + r#" +fn zero() {} +fn f() { zero(); } +"#, ); } #[test] fn simple_free_fn_one() { - check_diagnostic( - r" - fn one(arg: u8) {} - fn f() { one(); } - ", - expect![["\"one()\": Expected 1 argument, found 0\n"]], + check_diagnostics( + r#" +fn one(arg: u8) {} +fn f() { one(); } + //^^^^^ Expected 1 argument, found 0 +"#, ); - check_no_diagnostic( - r" - fn one(arg: u8) {} - fn f() { one(1); } - ", + check_diagnostics( + r#" +fn one(arg: u8) {} +fn f() { one(1); } +"#, ); } #[test] fn method_as_fn() { - check_diagnostic( - r" - struct S; - impl S { - fn method(&self) {} - } - - fn f() { - S::method(); - } - ", - expect![["\"S::method()\": Expected 1 argument, found 0\n"]], + check_diagnostics( + r#" +struct S; +impl S { fn method(&self) {} } + +fn f() { + S::method(); +} //^^^^^^^^^^^ Expected 1 argument, found 0 +"#, ); - check_no_diagnostic( - r" - struct S; - impl S { - fn method(&self) {} - } + check_diagnostics( + r#" +struct S; +impl S { fn method(&self) {} } - fn f() { - S::method(&S); - S.method(); - } - ", +fn f() { + S::method(&S); + S.method(); +} +"#, ); } #[test] fn method_with_arg() { - check_diagnostic( - r" - struct S; - impl S { - fn method(&self, arg: u8) {} - } + check_diagnostics( + r#" +struct S; +impl S { fn method(&self, arg: u8) {} } fn f() { S.method(); - } - ", - expect![["\"S.method()\": Expected 1 argument, found 0\n"]], + } //^^^^^^^^^^ Expected 1 argument, found 0 + "#, ); - check_no_diagnostic( - r" - struct S; - impl S { - fn method(&self, arg: u8) {} - } + check_diagnostics( + r#" +struct S; +impl S { fn method(&self, arg: u8) {} } - fn f() { - S::method(&S, 0); - S.method(1); - } - ", +fn f() { + S::method(&S, 0); + S.method(1); +} +"#, ); } #[test] fn tuple_struct() { - check_diagnostic( - r" - struct Tup(u8, u16); - fn f() { - Tup(0); - } - ", - expect![["\"Tup(0)\": Expected 2 arguments, found 1\n"]], + check_diagnostics( + r#" +struct Tup(u8, u16); +fn f() { + Tup(0); +} //^^^^^^ Expected 2 arguments, found 1 +"#, ) } #[test] fn enum_variant() { - check_diagnostic( - r" - enum En { - Variant(u8, u16), - } - fn f() { - En::Variant(0); - } - ", - expect![["\"En::Variant(0)\": Expected 2 arguments, found 1\n"]], + check_diagnostics( + r#" +enum En { Variant(u8, u16), } +fn f() { + En::Variant(0); +} //^^^^^^^^^^^^^^ Expected 2 arguments, found 1 +"#, ) } } diff --git a/crates/ra_hir_ty/src/test_db.rs b/crates/ra_hir_ty/src/test_db.rs index ddafd0ea1..0bd29f435 100644 --- a/crates/ra_hir_ty/src/test_db.rs +++ b/crates/ra_hir_ty/src/test_db.rs @@ -94,7 +94,7 @@ impl TestDB { panic!("Can't find module for file") } - fn diag(&self, mut cb: F) { + pub(crate) fn diag(&self, mut cb: F) { let crate_graph = self.crate_graph(); for krate in crate_graph.iter() { let crate_def_map = self.crate_def_map(krate); -- cgit v1.2.3