From 4c4a714328490d7f2626272663827fd51dfab0bd Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 24 Mar 2019 11:39:47 +0300 Subject: test diagnostics --- crates/ra_hir/src/mock.rs | 20 +++++++++++++++++++- crates/ra_hir/src/nameres/tests.rs | 18 ++++++++++++++++++ crates/ra_hir/src/ty/tests.rs | 24 ++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) (limited to 'crates') diff --git a/crates/ra_hir/src/mock.rs b/crates/ra_hir/src/mock.rs index 10d4c1b8c..08f927bb4 100644 --- a/crates/ra_hir/src/mock.rs +++ b/crates/ra_hir/src/mock.rs @@ -9,7 +9,7 @@ use relative_path::RelativePathBuf; use test_utils::{parse_fixture, CURSOR_MARKER, extract_offset}; use rustc_hash::FxHashMap; -use crate::{db, HirInterner}; +use crate::{db, HirInterner, diagnostics::DiagnosticSink, DefDatabase}; pub const WORKSPACE: SourceRootId = SourceRootId(0); @@ -70,6 +70,24 @@ impl MockDatabase { self.set_crate_graph(Arc::new(crate_graph)) } + pub fn diagnostics(&self) -> String { + let mut buf = String::from("\n"); + let mut files: Vec = self.files.values().map(|&it| it).collect(); + files.sort(); + for file in files { + let module = crate::source_binder::module_from_file_id(self, file).unwrap(); + module.diagnostics( + self, + &mut DiagnosticSink::new(|d| { + let source_file = self.hir_parse(d.file()); + let syntax_node = d.syntax_node().to_node(&source_file); + buf += &format!("{:?}: {}\n", syntax_node.text(), d.message()); + }), + ) + } + buf + } + fn from_fixture(fixture: &str) -> (MockDatabase, Option) { let mut db = MockDatabase::default(); diff --git a/crates/ra_hir/src/nameres/tests.rs b/crates/ra_hir/src/nameres/tests.rs index ac9b88520..277b0757c 100644 --- a/crates/ra_hir/src/nameres/tests.rs +++ b/crates/ra_hir/src/nameres/tests.rs @@ -552,3 +552,21 @@ foo: v "### ); } + +#[test] +fn unresolved_module_diagnostics() { + let diagnostics = MockDatabase::with_files( + r" + //- /lib.rs + mod foo; + mod bar; + //- /foo.rs + ", + ) + .diagnostics(); + + assert_snapshot_matches!(diagnostics, @r###" +"mod bar;": unresolved module +"### + ); +} diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs index 5d8ad4aa7..3aedba243 100644 --- a/crates/ra_hir/src/ty/tests.rs +++ b/crates/ra_hir/src/ty/tests.rs @@ -2319,3 +2319,27 @@ fn typing_whitespace_inside_a_function_should_not_invalidate_types() { assert!(!format!("{:?}", events).contains("infer"), "{:#?}", events) } } + +#[test] +fn no_such_field_diagnostics() { + let diagnostics = MockDatabase::with_files( + r" + //- /lib.rs + struct S { foo: i32, bar: () } + impl S { + fn new() -> S { + S { + foo: 92, + baz: 62, + } + } + } + ", + ) + .diagnostics(); + + assert_snapshot_matches!(diagnostics, @r###" +"baz: 62": no such field +"### + ); +} -- cgit v1.2.3