internal: document that we don't #[ignore] tests

This commit is contained in:
Aleksey Kladov 2021-06-14 22:55:05 +03:00
parent c2015e7d18
commit 3f4ad44082
8 changed files with 86 additions and 71 deletions

View file

@ -1992,8 +1992,8 @@ mod tests {
collector.def_map collector.def_map
} }
fn do_resolve(code: &str) -> DefMap { fn do_resolve(not_ra_fixture: &str) -> DefMap {
let (db, _file_id) = TestDB::with_single_file(code); let (db, _file_id) = TestDB::with_single_file(not_ra_fixture);
let krate = db.test_crate(); let krate = db.test_crate();
let edition = db.crate_graph()[krate].edition; let edition = db.crate_graph()[krate].edition;
@ -2013,16 +2013,21 @@ mod tests {
); );
} }
#[ignore] // this test does succeed, but takes quite a while :/ #[ignore]
#[test] #[test]
fn test_macro_expand_will_stop_2() { fn test_macro_expand_will_stop_2() {
// FIXME: this test does succeed, but takes quite a while: 90 seconds in
// the release mode. That's why the argument is not an ra_fixture --
// otherwise injection highlighting gets stuck.
//
// We need to find a way to fail this faster.
do_resolve( do_resolve(
r#" r#"
macro_rules! foo { macro_rules! foo {
($($ty:ty)*) => { foo!($($ty)* $($ty)*); } ($($ty:ty)*) => { foo!($($ty)* $($ty)*); }
} }
foo!(KABOOM); foo!(KABOOM);
"#, "#,
); );
} }
} }

View file

@ -741,10 +741,24 @@ fn coerce_unsize_trait_object_simple() {
} }
#[test] #[test]
// The rust reference says this should be possible, but rustc doesn't implement
// it. We used to support it, but Chalk doesn't.
#[ignore]
fn coerce_unsize_trait_object_to_trait_object() { fn coerce_unsize_trait_object_to_trait_object() {
// FIXME: The rust reference says this should be possible, but rustc doesn't
// implement it. We used to support it, but Chalk doesn't. Here's the
// correct expect:
//
// 424..609 '{ ...bj2; }': ()
// 434..437 'obj': &dyn Baz<i8, i16>
// 459..461 '&S': &S<i8, i16>
// 460..461 'S': S<i8, i16>
// 471..474 'obj': &dyn Bar<usize, i8, i16>
// 496..499 'obj': &dyn Baz<i8, i16>
// 509..512 'obj': &dyn Foo<i8, usize>
// 531..534 'obj': &dyn Bar<usize, i8, i16>
// 544..548 'obj2': &dyn Baz<i8, i16>
// 570..572 '&S': &S<i8, i16>
// 571..572 'S': S<i8, i16>
// 582..583 '_': &dyn Foo<i8, usize>
// 602..606 'obj2': &dyn Baz<i8, i16>
check_infer_with_mismatches( check_infer_with_mismatches(
r#" r#"
#[lang = "sized"] #[lang = "sized"]
@ -773,21 +787,24 @@ fn coerce_unsize_trait_object_to_trait_object() {
let _: &dyn Foo<_, _> = obj2; let _: &dyn Foo<_, _> = obj2;
} }
"#, "#,
expect![[r" expect![[r#"
424..609 '{ ...bj2; }': () 424..609 '{ ...bj2; }': ()
434..437 'obj': &dyn Baz<i8, i16> 434..437 'obj': &dyn Baz<i8, i16>
459..461 '&S': &S<i8, i16> 459..461 '&S': &S<i8, i16>
460..461 'S': S<i8, i16> 460..461 'S': S<i8, i16>
471..474 'obj': &dyn Bar<usize, i8, i16> 471..474 'obj': &dyn Bar<{unknown}, {unknown}, {unknown}>
496..499 'obj': &dyn Baz<i8, i16> 496..499 'obj': &dyn Baz<i8, i16>
509..512 'obj': &dyn Foo<i8, usize> 509..512 'obj': &dyn Foo<{unknown}, {unknown}>
531..534 'obj': &dyn Bar<usize, i8, i16> 531..534 'obj': &dyn Bar<{unknown}, {unknown}, {unknown}>
544..548 'obj2': &dyn Baz<i8, i16> 544..548 'obj2': &dyn Baz<i8, i16>
570..572 '&S': &S<i8, i16> 570..572 '&S': &S<i8, i16>
571..572 'S': S<i8, i16> 571..572 'S': S<i8, i16>
582..583 '_': &dyn Foo<i8, usize> 582..583 '_': &dyn Foo<{unknown}, {unknown}>
602..606 'obj2': &dyn Baz<i8, i16> 602..606 'obj2': &dyn Baz<i8, i16>
"]], 496..499: expected &dyn Bar<{unknown}, {unknown}, {unknown}>, got &dyn Baz<i8, i16>
531..534: expected &dyn Foo<{unknown}, {unknown}>, got &dyn Bar<{unknown}, {unknown}, {unknown}>
602..606: expected &dyn Foo<{unknown}, {unknown}>, got &dyn Baz<i8, i16>
"#]],
); );
} }

View file

@ -1475,7 +1475,6 @@ fn test(
} }
#[test] #[test]
#[ignore]
fn error_bound_chalk() { fn error_bound_chalk() {
check_types( check_types(
r#" r#"

View file

@ -241,6 +241,10 @@ fn get_doc_link(db: &RootDatabase, definition: Definition) -> Option<String> {
Definition::ModuleDef(ModuleDef::Module(module)) => module.krate(), Definition::ModuleDef(ModuleDef::Module(module)) => module.krate(),
_ => definition.module(db)?.krate(), _ => definition.module(db)?.krate(),
}; };
// FIXME: using import map doesn't make sense here. What we want here is
// canonical path. What import map returns is the shortest path suitable for
// import. See this test:
cov_mark::hit!(test_reexport_order);
let import_map = db.import_map(krate.into()); let import_map = db.import_map(krate.into());
let mut base = krate.display_name(db)?.to_string(); let mut base = krate.display_name(db)?.to_string();
@ -642,13 +646,15 @@ pub mod foo {
) )
} }
// FIXME: ImportMap will return re-export paths instead of public module
// paths. The correct path to documentation will never be a re-export.
// This problem stops us from resolving stdlib items included in the prelude
// such as `Option::Some` correctly.
#[ignore = "ImportMap may return re-exports"]
#[test] #[test]
fn test_reexport_order() { fn test_reexport_order() {
cov_mark::check!(test_reexport_order);
// FIXME: This should return
//
// https://docs.rs/test/*/test/wrapper/modulestruct.Item.html
//
// That is, we should point inside the module, rather than at the
// re-export.
check( check(
r#" r#"
pub mod wrapper { pub mod wrapper {
@ -663,7 +669,7 @@ fn foo() {
let bar: wrapper::It$0em; let bar: wrapper::It$0em;
} }
"#, "#,
expect![[r#"https://docs.rs/test/*/test/wrapper/module/struct.Item.html"#]], expect![[r#"https://docs.rs/test/*/test/wrapper/struct.Item.html"#]],
) )
} }
} }

View file

@ -1821,9 +1821,10 @@ pub struct B$0ar
); );
} }
#[ignore = "path based links currently only support documentation on ModuleDef items"]
#[test] #[test]
fn test_hover_path_link_field() { fn test_hover_path_link_field() {
// FIXME: Should be
// [Foo](https://docs.rs/test/*/test/struct.Foo.html)
check( check(
r#" r#"
pub struct Foo; pub struct Foo;
@ -1845,7 +1846,7 @@ pub struct Bar {
--- ---
[Foo](https://docs.rs/test/*/test/struct.Foo.html) [Foo](struct.Foo.html)
"#]], "#]],
); );
} }

View file

@ -583,25 +583,25 @@ pub struct Foo { pub(crate) bar: () }
} }
#[test] #[test]
#[ignore]
// FIXME handle reexports properly
fn fix_visibility_of_reexport() { fn fix_visibility_of_reexport() {
// FIXME: broken test, this should fix visibility of the re-export
// rather than the struct.
check_assist( check_assist(
fix_visibility, fix_visibility,
r" r#"
mod foo { mod foo {
use bar::Baz; use bar::Baz;
mod bar { pub(super) struct Baz; } mod bar { pub(super) struct Baz; }
} }
foo::Baz$0 foo::Baz$0
", "#,
r" r#"
mod foo { mod foo {
$0pub(crate) use bar::Baz; use bar::Baz;
mod bar { pub(super) struct Baz; } mod bar { $0pub(crate) struct Baz; }
} }
foo::Baz foo::Baz
", "#,
) )
} }
} }

View file

@ -341,43 +341,27 @@ mod F {
} }
#[test] #[test]
#[ignore] fn complex_ignore() {
fn bug_trait_inside_fn() { // FIXME: this should trigger errors for the second case.
// FIXME:
// This is broken, and in fact, should not even be looked at by this
// lint in the first place. There's weird stuff going on in the
// collection phase.
// It's currently being brought in by:
// * validate_func on `a` recursing into modules
// * then it finds the trait and then the function while iterating
// through modules
// * then validate_func is called on Dirty
// * ... which then proceeds to look at some unknown module taking no
// attrs from either the impl or the fn a, and then finally to the root
// module
//
// It should find the attribute on the trait, but it *doesn't even see
// the trait* as far as I can tell.
check_diagnostics( check_diagnostics(
r#" r#"
trait T { fn a(); } trait T { fn a(); }
struct U {} struct U {}
impl T for U { impl T for U {
fn a() { fn a() {
// this comes out of bitflags, mostly
#[allow(non_snake_case)] #[allow(non_snake_case)]
trait __BitFlags { trait __BitFlagsOk {
const HiImAlsoBad: u8 = 2; const HiImAlsoBad: u8 = 2;
#[inline] fn Dirty(&self) -> bool { false }
fn Dirty(&self) -> bool {
false
}
} }
trait __BitFlagsBad {
const HiImAlsoBad: u8 = 2;
fn Dirty(&self) -> bool { false }
}
} }
} }
"#, "#,
); );
} }
@ -414,18 +398,14 @@ extern {
} }
#[test] #[test]
#[ignore]
fn bug_traits_arent_checked() { fn bug_traits_arent_checked() {
// FIXME: Traits and functions in traits aren't currently checked by // FIXME: Traits and functions in traits aren't currently checked by
// r-a, even though rustc will complain about them. // r-a, even though rustc will complain about them.
check_diagnostics( check_diagnostics(
r#" r#"
trait BAD_TRAIT { trait BAD_TRAIT {
// ^^^^^^^^^ 💡 weak: Trait `BAD_TRAIT` should have CamelCase name, e.g. `BadTrait`
fn BAD_FUNCTION(); fn BAD_FUNCTION();
// ^^^^^^^^^^^^ 💡 weak: Function `BAD_FUNCTION` should have snake_case name, e.g. `bad_function`
fn BadFunction(); fn BadFunction();
// ^^^^^^^^^^^^ 💡 weak: Function `BadFunction` should have snake_case name, e.g. `bad_function`
} }
"#, "#,
); );

View file

@ -174,6 +174,13 @@ Instead, explicitly check for `None`, `Err`, etc.
`rust-analyzer` is not a library, we don't need to test for API misuse, and we have to handle any user input without panics. `rust-analyzer` is not a library, we don't need to test for API misuse, and we have to handle any user input without panics.
Panic messages in the logs from the `#[should_panic]` tests are confusing. Panic messages in the logs from the `#[should_panic]` tests are confusing.
## `#[ignore]`
Do not `#[ignore]` tests.
If the test currently does not work, assert the wrong behavior and add a fixme explaining why it is wrong.
**Rationale:** noticing when the behavior is fixed, making sure that even the wrong behavior is acceptable (ie, not a panic).
## Function Preconditions ## Function Preconditions
Express function preconditions in types and force the caller to provide them (rather than checking in callee): Express function preconditions in types and force the caller to provide them (rather than checking in callee):