diff --git a/Cargo.lock b/Cargo.lock index 8c28929ed7..b1fef2e80a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -526,6 +526,7 @@ dependencies = [ "base_db", "cfg", "either", + "expect-test", "la-arena", "log", "mbe", diff --git a/crates/hir_expand/Cargo.toml b/crates/hir_expand/Cargo.toml index 7bb40ba9b6..f649ab9259 100644 --- a/crates/hir_expand/Cargo.toml +++ b/crates/hir_expand/Cargo.toml @@ -25,3 +25,4 @@ mbe = { path = "../mbe", version = "0.0.0" } [dev-dependencies] test_utils = { path = "../test_utils" } +expect-test = "1.1" diff --git a/crates/hir_expand/src/builtin_derive.rs b/crates/hir_expand/src/builtin_derive.rs index b7f1aae8fa..dfdb9cf592 100644 --- a/crates/hir_expand/src/builtin_derive.rs +++ b/crates/hir_expand/src/builtin_derive.rs @@ -267,13 +267,14 @@ fn partial_ord_expand( #[cfg(test)] mod tests { use base_db::{fixture::WithFixture, CrateId, SourceDatabase}; + use expect_test::{expect, Expect}; use name::{known, Name}; use crate::{test_db::TestDB, AstId, MacroCallId, MacroCallKind, MacroCallLoc}; use super::*; - fn expand_builtin_derive(s: &str, name: Name) -> String { + fn expand_builtin_derive(ra_fixture: &str, name: Name) -> String { let expander = BuiltinDeriveExpander::find_by_name(&name).unwrap(); let fixture = format!( r#"//- /main.rs crate:main deps:core @@ -282,7 +283,7 @@ $0 //- /lib.rs crate:core // empty "#, - s + ra_fixture ); let (db, file_pos) = TestDB::with_position(&fixture); @@ -314,66 +315,57 @@ $0 parsed.text().to_string() } + fn check_derive(ra_fixture: &str, name: Name, expected: Expect) { + let expanded = expand_builtin_derive(ra_fixture, name); + expected.assert_eq(&expanded); + } + #[test] fn test_copy_expand_simple() { - let expanded = expand_builtin_derive( + check_derive( r#" - #[derive(Copy)] - struct Foo; -"#, + #[derive(Copy)] + struct Foo; + "#, known::Copy, + expect![["impl< >core::marker::CopyforFoo< >{}"]], ); - - assert_eq!(expanded, "impl< >core::marker::CopyforFoo< >{}"); } #[test] fn test_copy_expand_with_type_params() { - let expanded = expand_builtin_derive( + check_derive( r#" - #[derive(Copy)] - struct Foo; -"#, + #[derive(Copy)] + struct Foo; + "#, known::Copy, - ); - - assert_eq!( - expanded, - "implcore::marker::CopyforFoo{}" + expect![["implcore::marker::CopyforFoo{}"]], ); } #[test] fn test_copy_expand_with_lifetimes() { - let expanded = expand_builtin_derive( + check_derive( r#" - #[derive(Copy)] - struct Foo; -"#, + #[derive(Copy)] + struct Foo; + "#, known::Copy, - ); - - // We currently just ignore lifetimes - - assert_eq!( - expanded, - "implcore::marker::CopyforFoo{}" + // We currently just ignore lifetimes + expect![["implcore::marker::CopyforFoo{}"]], ); } #[test] fn test_clone_expand() { - let expanded = expand_builtin_derive( + check_derive( r#" - #[derive(Clone)] - struct Foo; -"#, + #[derive(Clone)] + struct Foo; + "#, known::Clone, - ); - - assert_eq!( - expanded, - "implcore::clone::CloneforFoo{}" + expect![["implcore::clone::CloneforFoo{}"]], ); } } diff --git a/crates/hir_expand/src/builtin_macro.rs b/crates/hir_expand/src/builtin_macro.rs index b34f1a4f22..2a79c892b5 100644 --- a/crates/hir_expand/src/builtin_macro.rs +++ b/crates/hir_expand/src/builtin_macro.rs @@ -491,6 +491,7 @@ mod tests { MacroCallLoc, }; use base_db::{fixture::WithFixture, SourceDatabase}; + use expect_test::{expect, Expect}; use std::sync::Arc; use syntax::ast::NameOwner; @@ -574,87 +575,86 @@ mod tests { db.parse_or_expand(file_id).unwrap().to_string() } + fn check_expansion(ra_fixture: &str, expect: Expect) { + let expansion = expand_builtin_macro(ra_fixture); + expect.assert_eq(&expansion); + } + #[test] fn test_column_expand() { - let expanded = expand_builtin_macro( + check_expansion( r#" #[rustc_builtin_macro] macro_rules! column {() => {}} column!() "#, + expect![["0"]], ); - - assert_eq!(expanded, "0"); } #[test] fn test_line_expand() { - let expanded = expand_builtin_macro( + check_expansion( r#" #[rustc_builtin_macro] macro_rules! line {() => {}} line!() "#, + expect![["0"]], ); - - assert_eq!(expanded, "0"); } #[test] fn test_stringify_expand() { - let expanded = expand_builtin_macro( + check_expansion( r#" #[rustc_builtin_macro] macro_rules! stringify {() => {}} stringify!(a b c) "#, + expect![["\"a b c\""]], ); - - assert_eq!(expanded, "\"a b c\""); } #[test] fn test_env_expand() { - let expanded = expand_builtin_macro( + check_expansion( r#" #[rustc_builtin_macro] macro_rules! env {() => {}} env!("TEST_ENV_VAR") "#, + expect![["\"__RA_UNIMPLEMENTED__\""]], ); - - assert_eq!(expanded, "\"__RA_UNIMPLEMENTED__\""); } #[test] fn test_option_env_expand() { - let expanded = expand_builtin_macro( + check_expansion( r#" #[rustc_builtin_macro] macro_rules! option_env {() => {}} option_env!("TEST_ENV_VAR") "#, + expect![["std::option::Option::None:: < &str>"]], ); - - assert_eq!(expanded, "std::option::Option::None:: < &str>"); } #[test] fn test_file_expand() { - let expanded = expand_builtin_macro( + check_expansion( r#" #[rustc_builtin_macro] macro_rules! file {() => {}} file!() "#, + expect![[r#""""#]], ); - - assert_eq!(expanded, "\"\""); } #[test] fn test_assert_expand() { - let expanded = expand_builtin_macro( + check_expansion( r#" #[rustc_builtin_macro] macro_rules! assert { @@ -663,14 +663,13 @@ mod tests { } assert!(true, "{} {:?}", arg1(a, b, c), arg2); "#, + expect![["{{(&(true), &(\"{} {:?}\"), &(arg1(a,b,c)), &(arg2),);}}"]], ); - - assert_eq!(expanded, "{{(&(true), &(\"{} {:?}\"), &(arg1(a,b,c)), &(arg2),);}}"); } #[test] fn test_compile_error_expand() { - let expanded = expand_builtin_macro( + check_expansion( r#" #[rustc_builtin_macro] macro_rules! compile_error { @@ -679,15 +678,14 @@ mod tests { } compile_error!("error!"); "#, + // This expands to nothing (since it's in item position), but emits an error. + expect![[""]], ); - - // This expands to nothing (since it's in item position), but emits an error. - assert_eq!(expanded, ""); } #[test] fn test_format_args_expand() { - let expanded = expand_builtin_macro( + check_expansion( r#" #[rustc_builtin_macro] macro_rules! format_args { @@ -696,17 +694,15 @@ mod tests { } format_args!("{} {:?}", arg1(a, b, c), arg2); "#, - ); - - assert_eq!( - expanded, - r#"std::fmt::Arguments::new_v1(&[], &[std::fmt::ArgumentV1::new(&(arg1(a,b,c)),std::fmt::Display::fmt),std::fmt::ArgumentV1::new(&(arg2),std::fmt::Display::fmt),])"# + expect![[ + r#"std::fmt::Arguments::new_v1(&[], &[std::fmt::ArgumentV1::new(&(arg1(a,b,c)),std::fmt::Display::fmt),std::fmt::ArgumentV1::new(&(arg2),std::fmt::Display::fmt),])"# + ]], ); } #[test] fn test_format_args_expand_with_comma_exprs() { - let expanded = expand_builtin_macro( + check_expansion( r#" #[rustc_builtin_macro] macro_rules! format_args { @@ -715,17 +711,15 @@ mod tests { } format_args!("{} {:?}", a::(), b); "#, - ); - - assert_eq!( - expanded, - r#"std::fmt::Arguments::new_v1(&[], &[std::fmt::ArgumentV1::new(&(a::()),std::fmt::Display::fmt),std::fmt::ArgumentV1::new(&(b),std::fmt::Display::fmt),])"# + expect![[ + r#"std::fmt::Arguments::new_v1(&[], &[std::fmt::ArgumentV1::new(&(a::()),std::fmt::Display::fmt),std::fmt::ArgumentV1::new(&(b),std::fmt::Display::fmt),])"# + ]], ); } #[test] fn test_include_bytes_expand() { - let expanded = expand_builtin_macro( + check_expansion( r#" #[rustc_builtin_macro] macro_rules! include_bytes { @@ -734,21 +728,19 @@ mod tests { } include_bytes("foo"); "#, + expect![[r#"b"""#]], ); - - assert_eq!(expanded, r#"b"""#); } #[test] fn test_concat_expand() { - let expanded = expand_builtin_macro( + check_expansion( r##" #[rustc_builtin_macro] macro_rules! concat {} concat!("foo", "r", 0, r#"bar"#, false); "##, + expect![[r#""foor0barfalse""#]], ); - - assert_eq!(expanded, r#""foor0barfalse""#); } }