From 977b688144fb997fdf5dd5bdb587e4f357d853f2 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 1 Jul 2020 10:37:55 +0200 Subject: Don't fail tests when updating snapshot --- crates/expect/src/lib.rs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'crates') diff --git a/crates/expect/src/lib.rs b/crates/expect/src/lib.rs index dd7b96aab..d678b1817 100644 --- a/crates/expect/src/lib.rs +++ b/crates/expect/src/lib.rs @@ -2,7 +2,7 @@ //! https://github.com/rust-analyzer/rust-analyzer/pull/5101 use std::{ collections::HashMap, - env, fmt, fs, + env, fmt, fs, mem, ops::Range, panic, path::{Path, PathBuf}, @@ -97,24 +97,25 @@ static RT: Lazy> = Lazy::new(Default::default); impl Runtime { fn fail(expect: &Expect, expected: &str, actual: &str) { let mut rt = RT.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); - let mut updated = ""; if update_expect() { - updated = " (updated)"; + println!( + "\x1b[1m\x1b[92mupdating\x1b[0m: {}:{}:{}", + expect.file, expect.line, expect.column + ); rt.per_file .entry(expect.file) .or_insert_with(|| FileRuntime::new(expect)) .update(expect, actual); + return; } - let print_help = !rt.help_printed && !update_expect(); - rt.help_printed = true; - + let print_help = !mem::replace(&mut rt.help_printed, true); let help = if print_help { HELP } else { "" }; let diff = Changeset::new(actual, expected, "\n"); println!( "\n -\x1b[1m\x1b[91merror\x1b[97m: expect test failed\x1b[0m{} +\x1b[1m\x1b[91merror\x1b[97m: expect test failed\x1b[0m \x1b[1m\x1b[34m-->\x1b[0m {}:{}:{} {} \x1b[1mExpect\x1b[0m: @@ -132,7 +133,7 @@ impl Runtime { {} ---- ", - updated, expect.file, expect.line, expect.column, help, expected, actual, diff + expect.file, expect.line, expect.column, help, expected, actual, diff ); // Use resume_unwind instead of panic!() to prevent a backtrace, which is unnecessary noise. panic::resume_unwind(Box::new(())); -- cgit v1.2.3 From 82838f5eda6ee98cebb9574ceef36544f1a45a4d Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 1 Jul 2020 10:43:11 +0200 Subject: Cleanup --- crates/expect/src/lib.rs | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) (limited to 'crates') diff --git a/crates/expect/src/lib.rs b/crates/expect/src/lib.rs index d678b1817..3a92b36e2 100644 --- a/crates/expect/src/lib.rs +++ b/crates/expect/src/lib.rs @@ -29,9 +29,11 @@ fn update_expect() -> bool { #[macro_export] macro_rules! expect { [[$lit:literal]] => {$crate::Expect { - file: file!(), - line: line!(), - column: column!(), + position: $crate::Position { + file: file!(), + line: line!(), + column: column!(), + }, data: $lit, }}; [[]] => { $crate::expect![[""]] }; @@ -39,10 +41,21 @@ macro_rules! expect { #[derive(Debug)] pub struct Expect { + pub position: Position, + pub data: &'static str, +} + +#[derive(Debug)] +pub struct Position { pub file: &'static str, pub line: u32, pub column: u32, - pub data: &'static str, +} + +impl fmt::Display for Position { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}:{}:{}", self.file, self.line, self.column) + } } impl Expect { @@ -69,7 +82,7 @@ impl Expect { let mut target_line = None; let mut line_start = 0; for (i, line) in lines_with_ends(file).enumerate() { - if i == self.line as usize - 1 { + if i == self.position.line as usize - 1 { let pat = "expect![["; let offset = line.find(pat).unwrap(); let literal_start = line_start + offset + pat.len(); @@ -98,12 +111,9 @@ impl Runtime { fn fail(expect: &Expect, expected: &str, actual: &str) { let mut rt = RT.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); if update_expect() { - println!( - "\x1b[1m\x1b[92mupdating\x1b[0m: {}:{}:{}", - expect.file, expect.line, expect.column - ); + println!("\x1b[1m\x1b[92mupdating\x1b[0m: {}", expect.position); rt.per_file - .entry(expect.file) + .entry(expect.position.file) .or_insert_with(|| FileRuntime::new(expect)) .update(expect, actual); return; @@ -116,7 +126,7 @@ impl Runtime { println!( "\n \x1b[1m\x1b[91merror\x1b[97m: expect test failed\x1b[0m - \x1b[1m\x1b[34m-->\x1b[0m {}:{}:{} + \x1b[1m\x1b[34m-->\x1b[0m {} {} \x1b[1mExpect\x1b[0m: ---- @@ -133,7 +143,7 @@ impl Runtime { {} ---- ", - expect.file, expect.line, expect.column, help, expected, actual, diff + expect.position, help, expected, actual, diff ); // Use resume_unwind instead of panic!() to prevent a backtrace, which is unnecessary noise. panic::resume_unwind(Box::new(())); @@ -148,7 +158,7 @@ struct FileRuntime { impl FileRuntime { fn new(expect: &Expect) -> FileRuntime { - let path = workspace_root().join(expect.file); + let path = workspace_root().join(expect.position.file); let original_text = fs::read_to_string(&path).unwrap(); let patchwork = Patchwork::new(original_text.clone()); FileRuntime { path, original_text, patchwork } -- cgit v1.2.3 From adf624b433277a0106f5354bb7d62ab1a04f216b Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 1 Jul 2020 11:19:40 +0200 Subject: Add file support to expect --- crates/expect/src/lib.rs | 60 ++++++++++++++++++++++---- crates/ra_ide/src/syntax_highlighting/tests.rs | 22 +++++----- crates/rust-analyzer/src/handlers.rs | 2 +- 3 files changed, 63 insertions(+), 21 deletions(-) (limited to 'crates') diff --git a/crates/expect/src/lib.rs b/crates/expect/src/lib.rs index 3a92b36e2..3f293f5d5 100644 --- a/crates/expect/src/lib.rs +++ b/crates/expect/src/lib.rs @@ -14,7 +14,7 @@ use once_cell::sync::Lazy; use stdx::{lines_with_ends, trim_indent}; const HELP: &str = " -You can update all `expect![[]]` tests by: +You can update all `expect![[]]` tests by running: env UPDATE_EXPECT=1 cargo test @@ -25,26 +25,37 @@ fn update_expect() -> bool { env::var("UPDATE_EXPECT").is_ok() } -/// expect![[""]] +/// expect![[r#"inline snapshot"#]] #[macro_export] macro_rules! expect { - [[$lit:literal]] => {$crate::Expect { + [[$data:literal]] => {$crate::Expect { position: $crate::Position { file: file!(), line: line!(), column: column!(), }, - data: $lit, + data: $data, }}; [[]] => { $crate::expect![[""]] }; } +/// expect_file!["/crates/foo/test_data/foo.rs"] +#[macro_export] +macro_rules! expect_file { + [$path:literal] => {$crate::ExpectFile { path: $path }}; +} + #[derive(Debug)] pub struct Expect { pub position: Position, pub data: &'static str, } +#[derive(Debug)] +pub struct ExpectFile { + pub path: &'static str, +} + #[derive(Debug)] pub struct Position { pub file: &'static str, @@ -64,7 +75,7 @@ impl Expect { if &trimmed == actual { return; } - Runtime::fail(self, &trimmed, actual); + Runtime::fail_expect(self, &trimmed, actual); } pub fn assert_debug_eq(&self, actual: &impl fmt::Debug) { let actual = format!("{:#?}\n", actual); @@ -100,6 +111,25 @@ impl Expect { } } +impl ExpectFile { + pub fn assert_eq(&self, actual: &str) { + let expected = self.read(); + if actual == expected { + return; + } + Runtime::fail_file(self, &expected, actual); + } + fn read(&self) -> String { + fs::read_to_string(self.abs_path()).unwrap_or_default().replace("\r\n", "\n") + } + fn write(&self, contents: &str) { + fs::write(self.abs_path(), contents).unwrap() + } + fn abs_path(&self) -> PathBuf { + workspace_root().join(self.path) + } +} + #[derive(Default)] struct Runtime { help_printed: bool, @@ -108,7 +138,7 @@ struct Runtime { static RT: Lazy> = Lazy::new(Default::default); impl Runtime { - fn fail(expect: &Expect, expected: &str, actual: &str) { + fn fail_expect(expect: &Expect, expected: &str, actual: &str) { let mut rt = RT.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); if update_expect() { println!("\x1b[1m\x1b[92mupdating\x1b[0m: {}", expect.position); @@ -118,7 +148,21 @@ impl Runtime { .update(expect, actual); return; } - let print_help = !mem::replace(&mut rt.help_printed, true); + rt.panic(expect.position.to_string(), expected, actual); + } + + fn fail_file(expect: &ExpectFile, expected: &str, actual: &str) { + let mut rt = RT.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); + if update_expect() { + println!("\x1b[1m\x1b[92mupdating\x1b[0m: {}", expect.path); + expect.write(actual); + return; + } + rt.panic(expect.path.to_string(), expected, actual); + } + + fn panic(&mut self, position: String, expected: &str, actual: &str) { + let print_help = !mem::replace(&mut self.help_printed, true); let help = if print_help { HELP } else { "" }; let diff = Changeset::new(actual, expected, "\n"); @@ -143,7 +187,7 @@ impl Runtime { {} ---- ", - expect.position, help, expected, actual, diff + position, help, expected, actual, diff ); // Use resume_unwind instead of panic!() to prevent a backtrace, which is unnecessary noise. panic::resume_unwind(Box::new(())); diff --git a/crates/ra_ide/src/syntax_highlighting/tests.rs b/crates/ra_ide/src/syntax_highlighting/tests.rs index b7fad9719..f19628485 100644 --- a/crates/ra_ide/src/syntax_highlighting/tests.rs +++ b/crates/ra_ide/src/syntax_highlighting/tests.rs @@ -1,6 +1,7 @@ use std::fs; -use test_utils::{assert_eq_text, project_dir, read_text}; +use expect::{expect_file, ExpectFile}; +use test_utils::project_dir; use crate::{mock_analysis::single_file, FileRange, TextRange}; @@ -91,7 +92,7 @@ impl Option { } "# .trim(), - "crates/ra_ide/src/snapshots/highlighting.html", + expect_file!["crates/ra_ide/src/snapshots/highlighting.html"], false, ); } @@ -114,7 +115,7 @@ fn bar() { } "# .trim(), - "crates/ra_ide/src/snapshots/rainbow_highlighting.html", + expect_file!["crates/ra_ide/src/snapshots/rainbow_highlighting.html"], true, ); } @@ -167,7 +168,7 @@ fn main() { ); }"## .trim(), - "crates/ra_ide/src/snapshots/highlight_injection.html", + expect_file!["crates/ra_ide/src/snapshots/highlight_injection.html"], false, ); } @@ -250,7 +251,7 @@ fn main() { println!("{ничоси}", ничоси = 92); }"# .trim(), - "crates/ra_ide/src/snapshots/highlight_strings.html", + expect_file!["crates/ra_ide/src/snapshots/highlight_strings.html"], false, ); } @@ -278,7 +279,7 @@ fn main() { } "# .trim(), - "crates/ra_ide/src/snapshots/highlight_unsafe.html", + expect_file!["crates/ra_ide/src/snapshots/highlight_unsafe.html"], false, ); } @@ -354,7 +355,7 @@ macro_rules! noop { } "# .trim(), - "crates/ra_ide/src/snapshots/highlight_doctest.html", + expect_file!["crates/ra_ide/src/snapshots/highlight_doctest.html"], false, ); } @@ -362,11 +363,8 @@ macro_rules! noop { /// Highlights the code given by the `ra_fixture` argument, renders the /// result as HTML, and compares it with the HTML file given as `snapshot`. /// Note that the `snapshot` file is overwritten by the rendered HTML. -fn check_highlighting(ra_fixture: &str, snapshot: &str, rainbow: bool) { +fn check_highlighting(ra_fixture: &str, expect: ExpectFile, rainbow: bool) { let (analysis, file_id) = single_file(ra_fixture); - let dst_file = project_dir().join(snapshot); let actual_html = &analysis.highlight_as_html(file_id, rainbow).unwrap(); - let expected_html = &read_text(&dst_file); - fs::write(dst_file, &actual_html).unwrap(); - assert_eq_text!(expected_html, actual_html); + expect.assert_eq(actual_html) } diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs index 25bcd80af..607a95682 100644 --- a/crates/rust-analyzer/src/handlers.rs +++ b/crates/rust-analyzer/src/handlers.rs @@ -415,7 +415,7 @@ pub(crate) fn handle_runnables( let source_file = snap.analysis.parse(file_id)?; algo::find_node_at_offset::(source_file.syntax(), offset) .and_then(|it| it.path()?.segment()?.name_ref()) - .map_or(false, |it| it.text() == "expect") + .map_or(false, |it| it.text() == "expect" || it.text() == "expect_file") } None => false, }; -- cgit v1.2.3 From 05d67a9a0efafb3dd5087aad17d75aa88aa85178 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 1 Jul 2020 11:25:22 +0200 Subject: Move test data to test_data directory --- crates/expect/src/lib.rs | 2 +- crates/ra_ide/src/snapshots/highlight_doctest.html | 101 ------------------ .../ra_ide/src/snapshots/highlight_injection.html | 47 --------- crates/ra_ide/src/snapshots/highlight_strings.html | 95 ----------------- crates/ra_ide/src/snapshots/highlight_unsafe.html | 53 ---------- crates/ra_ide/src/snapshots/highlighting.html | 117 --------------------- .../ra_ide/src/snapshots/rainbow_highlighting.html | 48 --------- crates/ra_ide/src/syntax_highlighting/tests.rs | 12 +-- crates/ra_ide/test_data/highlight_doctest.html | 101 ++++++++++++++++++ crates/ra_ide/test_data/highlight_injection.html | 47 +++++++++ crates/ra_ide/test_data/highlight_strings.html | 95 +++++++++++++++++ crates/ra_ide/test_data/highlight_unsafe.html | 53 ++++++++++ crates/ra_ide/test_data/highlighting.html | 117 +++++++++++++++++++++ crates/ra_ide/test_data/rainbow_highlighting.html | 48 +++++++++ 14 files changed, 468 insertions(+), 468 deletions(-) delete mode 100644 crates/ra_ide/src/snapshots/highlight_doctest.html delete mode 100644 crates/ra_ide/src/snapshots/highlight_injection.html delete mode 100644 crates/ra_ide/src/snapshots/highlight_strings.html delete mode 100644 crates/ra_ide/src/snapshots/highlight_unsafe.html delete mode 100644 crates/ra_ide/src/snapshots/highlighting.html delete mode 100644 crates/ra_ide/src/snapshots/rainbow_highlighting.html create mode 100644 crates/ra_ide/test_data/highlight_doctest.html create mode 100644 crates/ra_ide/test_data/highlight_injection.html create mode 100644 crates/ra_ide/test_data/highlight_strings.html create mode 100644 crates/ra_ide/test_data/highlight_unsafe.html create mode 100644 crates/ra_ide/test_data/highlighting.html create mode 100644 crates/ra_ide/test_data/rainbow_highlighting.html (limited to 'crates') diff --git a/crates/expect/src/lib.rs b/crates/expect/src/lib.rs index 3f293f5d5..a5e26fade 100644 --- a/crates/expect/src/lib.rs +++ b/crates/expect/src/lib.rs @@ -39,7 +39,7 @@ macro_rules! expect { [[]] => { $crate::expect![[""]] }; } -/// expect_file!["/crates/foo/test_data/foo.rs"] +/// expect_file!["/crates/foo/test_data/bar.html"] #[macro_export] macro_rules! expect_file { [$path:literal] => {$crate::ExpectFile { path: $path }}; diff --git a/crates/ra_ide/src/snapshots/highlight_doctest.html b/crates/ra_ide/src/snapshots/highlight_doctest.html deleted file mode 100644 index e8155def7..000000000 --- a/crates/ra_ide/src/snapshots/highlight_doctest.html +++ /dev/null @@ -1,101 +0,0 @@ - - -
/// ```
-/// let _ = "early doctests should not go boom";
-/// ```
-struct Foo {
-    bar: bool,
-}
-
-impl Foo {
-    pub const bar: bool = true;
-
-    /// Constructs a new `Foo`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// # #![allow(unused_mut)]
-    /// let mut foo: Foo = Foo::new();
-    /// ```
-    pub const fn new() -> Foo {
-        Foo { bar: true }
-    }
-
-    /// `bar` method on `Foo`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use x::y;
-    ///
-    /// let foo = Foo::new();
-    ///
-    /// // calls bar on foo
-    /// assert!(foo.bar());
-    ///
-    /// let bar = foo.bar || Foo::bar;
-    ///
-    /// /* multi-line
-    ///        comment */
-    ///
-    /// let multi_line_string = "Foo
-    ///   bar
-    ///          ";
-    ///
-    /// ```
-    ///
-    /// ```rust,no_run
-    /// let foobar = Foo::new().bar();
-    /// ```
-    ///
-    /// ```sh
-    /// echo 1
-    /// ```
-    pub fn foo(&self) -> bool {
-        true
-    }
-}
-
-/// ```
-/// noop!(1);
-/// ```
-macro_rules! noop {
-    ($expr:expr) => {
-        $expr
-    }
-}
\ No newline at end of file diff --git a/crates/ra_ide/src/snapshots/highlight_injection.html b/crates/ra_ide/src/snapshots/highlight_injection.html deleted file mode 100644 index 1b0349bae..000000000 --- a/crates/ra_ide/src/snapshots/highlight_injection.html +++ /dev/null @@ -1,47 +0,0 @@ - - -
fn fixture(ra_fixture: &str) {}
-
-fn main() {
-    fixture(r#"
-        trait Foo {
-            fn foo() {
-                println!("2 + 2 = {}", 4);
-            }
-        }"#
-    );
-}
\ No newline at end of file diff --git a/crates/ra_ide/src/snapshots/highlight_strings.html b/crates/ra_ide/src/snapshots/highlight_strings.html deleted file mode 100644 index d184b5691..000000000 --- a/crates/ra_ide/src/snapshots/highlight_strings.html +++ /dev/null @@ -1,95 +0,0 @@ - - -
macro_rules! println {
-    ($($arg:tt)*) => ({
-        $crate::io::_print($crate::format_args_nl!($($arg)*));
-    })
-}
-#[rustc_builtin_macro]
-macro_rules! format_args_nl {
-    ($fmt:expr) => {{ /* compiler built-in */ }};
-    ($fmt:expr, $($args:tt)*) => {{ /* compiler built-in */ }};
-}
-
-fn main() {
-    // from https://doc.rust-lang.org/std/fmt/index.html
-    println!("Hello");                 // => "Hello"
-    println!("Hello, {}!", "world");   // => "Hello, world!"
-    println!("The number is {}", 1);   // => "The number is 1"
-    println!("{:?}", (3, 4));          // => "(3, 4)"
-    println!("{value}", value=4);      // => "4"
-    println!("{} {}", 1, 2);           // => "1 2"
-    println!("{:04}", 42);             // => "0042" with leading zerosV
-    println!("{1} {} {0} {}", 1, 2);   // => "2 1 1 2"
-    println!("{argument}", argument = "test");   // => "test"
-    println!("{name} {}", 1, name = 2);          // => "2 1"
-    println!("{a} {c} {b}", a="a", b='b', c=3);  // => "a 3 b"
-    println!("{{{}}}", 2);                       // => "{2}"
-    println!("Hello {:5}!", "x");
-    println!("Hello {:1$}!", "x", 5);
-    println!("Hello {1:0$}!", 5, "x");
-    println!("Hello {:width$}!", "x", width = 5);
-    println!("Hello {:<5}!", "x");
-    println!("Hello {:-<5}!", "x");
-    println!("Hello {:^5}!", "x");
-    println!("Hello {:>5}!", "x");
-    println!("Hello {:+}!", 5);
-    println!("{:#x}!", 27);
-    println!("Hello {:05}!", 5);
-    println!("Hello {:05}!", -5);
-    println!("{:#010x}!", 27);
-    println!("Hello {0} is {1:.5}", "x", 0.01);
-    println!("Hello {1} is {2:.0$}", 5, "x", 0.01);
-    println!("Hello {0} is {2:.1$}", "x", 5, 0.01);
-    println!("Hello {} is {:.*}",    "x", 5, 0.01);
-    println!("Hello {} is {2:.*}",   "x", 5, 0.01);
-    println!("Hello {} is {number:.prec$}", "x", prec = 5, number = 0.01);
-    println!("{}, `{name:.*}` has 3 fractional digits", "Hello", 3, name=1234.56);
-    println!("{}, `{name:.*}` has 3 characters", "Hello", 3, name="1234.56");
-    println!("{}, `{name:>8.*}` has 3 right-aligned characters", "Hello", 3, name="1234.56");
-    println!("Hello {{}}");
-    println!("{{ Hello");
-
-    println!(r"Hello, {}!", "world");
-
-    // escape sequences
-    println!("Hello\nWorld");
-    println!("\u{48}\x65\x6C\x6C\x6F World");
-
-    println!("{\x41}", A = 92);
-    println!("{ничоси}", ничоси = 92);
-}
\ No newline at end of file diff --git a/crates/ra_ide/src/snapshots/highlight_unsafe.html b/crates/ra_ide/src/snapshots/highlight_unsafe.html deleted file mode 100644 index 6936e949f..000000000 --- a/crates/ra_ide/src/snapshots/highlight_unsafe.html +++ /dev/null @@ -1,53 +0,0 @@ - - -
unsafe fn unsafe_fn() {}
-
-struct HasUnsafeFn;
-
-impl HasUnsafeFn {
-    unsafe fn unsafe_method(&self) {}
-}
-
-fn main() {
-    let x = &5 as *const usize;
-    unsafe {
-        unsafe_fn();
-        HasUnsafeFn.unsafe_method();
-        let y = *(x);
-        let z = -x;
-    }
-}
\ No newline at end of file diff --git a/crates/ra_ide/src/snapshots/highlighting.html b/crates/ra_ide/src/snapshots/highlighting.html deleted file mode 100644 index 8d0b38f95..000000000 --- a/crates/ra_ide/src/snapshots/highlighting.html +++ /dev/null @@ -1,117 +0,0 @@ - - -
#[derive(Clone, Debug)]
-struct Foo {
-    pub x: i32,
-    pub y: i32,
-}
-
-trait Bar {
-    fn bar(&self) -> i32;
-}
-
-impl Bar for Foo {
-    fn bar(&self) -> i32 {
-        self.x
-    }
-}
-
-static mut STATIC_MUT: i32 = 0;
-
-fn foo<'a, T>() -> T {
-    foo::<'a, i32>()
-}
-
-macro_rules! def_fn {
-    ($($tt:tt)*) => {$($tt)*}
-}
-
-def_fn! {
-    fn bar() -> u32 {
-        100
-    }
-}
-
-macro_rules! noop {
-    ($expr:expr) => {
-        $expr
-    }
-}
-
-// comment
-fn main() {
-    println!("Hello, {}!", 92);
-
-    let mut vec = Vec::new();
-    if true {
-        let x = 92;
-        vec.push(Foo { x, y: 1 });
-    }
-    unsafe {
-        vec.set_len(0);
-        STATIC_MUT = 1;
-    }
-
-    for e in vec {
-        // Do nothing
-    }
-
-    noop!(noop!(1));
-
-    let mut x = 42;
-    let y = &mut x;
-    let z = &y;
-
-    let Foo { x: z, y } = Foo { x: z, y };
-
-    y;
-}
-
-enum Option<T> {
-    Some(T),
-    None,
-}
-use Option::*;
-
-impl<T> Option<T> {
-    fn and<U>(self, other: Option<U>) -> Option<(T, U)> {
-        match other {
-            None => unimplemented!(),
-            Nope => Nope,
-        }
-    }
-}
\ No newline at end of file diff --git a/crates/ra_ide/src/snapshots/rainbow_highlighting.html b/crates/ra_ide/src/snapshots/rainbow_highlighting.html deleted file mode 100644 index 9516c7441..000000000 --- a/crates/ra_ide/src/snapshots/rainbow_highlighting.html +++ /dev/null @@ -1,48 +0,0 @@ - - -
fn main() {
-    let hello = "hello";
-    let x = hello.to_string();
-    let y = hello.to_string();
-
-    let x = "other color please!";
-    let y = x.to_string();
-}
-
-fn bar() {
-    let mut hello = "hello";
-}
\ No newline at end of file diff --git a/crates/ra_ide/src/syntax_highlighting/tests.rs b/crates/ra_ide/src/syntax_highlighting/tests.rs index f19628485..aa7c887d6 100644 --- a/crates/ra_ide/src/syntax_highlighting/tests.rs +++ b/crates/ra_ide/src/syntax_highlighting/tests.rs @@ -92,7 +92,7 @@ impl Option { } "# .trim(), - expect_file!["crates/ra_ide/src/snapshots/highlighting.html"], + expect_file!["crates/ra_ide/test_data/highlighting.html"], false, ); } @@ -115,7 +115,7 @@ fn bar() { } "# .trim(), - expect_file!["crates/ra_ide/src/snapshots/rainbow_highlighting.html"], + expect_file!["crates/ra_ide/test_data/rainbow_highlighting.html"], true, ); } @@ -168,7 +168,7 @@ fn main() { ); }"## .trim(), - expect_file!["crates/ra_ide/src/snapshots/highlight_injection.html"], + expect_file!["crates/ra_ide/test_data/highlight_injection.html"], false, ); } @@ -251,7 +251,7 @@ fn main() { println!("{ничоси}", ничоси = 92); }"# .trim(), - expect_file!["crates/ra_ide/src/snapshots/highlight_strings.html"], + expect_file!["crates/ra_ide/test_data/highlight_strings.html"], false, ); } @@ -279,7 +279,7 @@ fn main() { } "# .trim(), - expect_file!["crates/ra_ide/src/snapshots/highlight_unsafe.html"], + expect_file!["crates/ra_ide/test_data/highlight_unsafe.html"], false, ); } @@ -355,7 +355,7 @@ macro_rules! noop { } "# .trim(), - expect_file!["crates/ra_ide/src/snapshots/highlight_doctest.html"], + expect_file!["crates/ra_ide/test_data/highlight_doctest.html"], false, ); } diff --git a/crates/ra_ide/test_data/highlight_doctest.html b/crates/ra_ide/test_data/highlight_doctest.html new file mode 100644 index 000000000..e8155def7 --- /dev/null +++ b/crates/ra_ide/test_data/highlight_doctest.html @@ -0,0 +1,101 @@ + + +
/// ```
+/// let _ = "early doctests should not go boom";
+/// ```
+struct Foo {
+    bar: bool,
+}
+
+impl Foo {
+    pub const bar: bool = true;
+
+    /// Constructs a new `Foo`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// # #![allow(unused_mut)]
+    /// let mut foo: Foo = Foo::new();
+    /// ```
+    pub const fn new() -> Foo {
+        Foo { bar: true }
+    }
+
+    /// `bar` method on `Foo`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use x::y;
+    ///
+    /// let foo = Foo::new();
+    ///
+    /// // calls bar on foo
+    /// assert!(foo.bar());
+    ///
+    /// let bar = foo.bar || Foo::bar;
+    ///
+    /// /* multi-line
+    ///        comment */
+    ///
+    /// let multi_line_string = "Foo
+    ///   bar
+    ///          ";
+    ///
+    /// ```
+    ///
+    /// ```rust,no_run
+    /// let foobar = Foo::new().bar();
+    /// ```
+    ///
+    /// ```sh
+    /// echo 1
+    /// ```
+    pub fn foo(&self) -> bool {
+        true
+    }
+}
+
+/// ```
+/// noop!(1);
+/// ```
+macro_rules! noop {
+    ($expr:expr) => {
+        $expr
+    }
+}
\ No newline at end of file diff --git a/crates/ra_ide/test_data/highlight_injection.html b/crates/ra_ide/test_data/highlight_injection.html new file mode 100644 index 000000000..1b0349bae --- /dev/null +++ b/crates/ra_ide/test_data/highlight_injection.html @@ -0,0 +1,47 @@ + + +
fn fixture(ra_fixture: &str) {}
+
+fn main() {
+    fixture(r#"
+        trait Foo {
+            fn foo() {
+                println!("2 + 2 = {}", 4);
+            }
+        }"#
+    );
+}
\ No newline at end of file diff --git a/crates/ra_ide/test_data/highlight_strings.html b/crates/ra_ide/test_data/highlight_strings.html new file mode 100644 index 000000000..d184b5691 --- /dev/null +++ b/crates/ra_ide/test_data/highlight_strings.html @@ -0,0 +1,95 @@ + + +
macro_rules! println {
+    ($($arg:tt)*) => ({
+        $crate::io::_print($crate::format_args_nl!($($arg)*));
+    })
+}
+#[rustc_builtin_macro]
+macro_rules! format_args_nl {
+    ($fmt:expr) => {{ /* compiler built-in */ }};
+    ($fmt:expr, $($args:tt)*) => {{ /* compiler built-in */ }};
+}
+
+fn main() {
+    // from https://doc.rust-lang.org/std/fmt/index.html
+    println!("Hello");                 // => "Hello"
+    println!("Hello, {}!", "world");   // => "Hello, world!"
+    println!("The number is {}", 1);   // => "The number is 1"
+    println!("{:?}", (3, 4));          // => "(3, 4)"
+    println!("{value}", value=4);      // => "4"
+    println!("{} {}", 1, 2);           // => "1 2"
+    println!("{:04}", 42);             // => "0042" with leading zerosV
+    println!("{1} {} {0} {}", 1, 2);   // => "2 1 1 2"
+    println!("{argument}", argument = "test");   // => "test"
+    println!("{name} {}", 1, name = 2);          // => "2 1"
+    println!("{a} {c} {b}", a="a", b='b', c=3);  // => "a 3 b"
+    println!("{{{}}}", 2);                       // => "{2}"
+    println!("Hello {:5}!", "x");
+    println!("Hello {:1$}!", "x", 5);
+    println!("Hello {1:0$}!", 5, "x");
+    println!("Hello {:width$}!", "x", width = 5);
+    println!("Hello {:<5}!", "x");
+    println!("Hello {:-<5}!", "x");
+    println!("Hello {:^5}!", "x");
+    println!("Hello {:>5}!", "x");
+    println!("Hello {:+}!", 5);
+    println!("{:#x}!", 27);
+    println!("Hello {:05}!", 5);
+    println!("Hello {:05}!", -5);
+    println!("{:#010x}!", 27);
+    println!("Hello {0} is {1:.5}", "x", 0.01);
+    println!("Hello {1} is {2:.0$}", 5, "x", 0.01);
+    println!("Hello {0} is {2:.1$}", "x", 5, 0.01);
+    println!("Hello {} is {:.*}",    "x", 5, 0.01);
+    println!("Hello {} is {2:.*}",   "x", 5, 0.01);
+    println!("Hello {} is {number:.prec$}", "x", prec = 5, number = 0.01);
+    println!("{}, `{name:.*}` has 3 fractional digits", "Hello", 3, name=1234.56);
+    println!("{}, `{name:.*}` has 3 characters", "Hello", 3, name="1234.56");
+    println!("{}, `{name:>8.*}` has 3 right-aligned characters", "Hello", 3, name="1234.56");
+    println!("Hello {{}}");
+    println!("{{ Hello");
+
+    println!(r"Hello, {}!", "world");
+
+    // escape sequences
+    println!("Hello\nWorld");
+    println!("\u{48}\x65\x6C\x6C\x6F World");
+
+    println!("{\x41}", A = 92);
+    println!("{ничоси}", ничоси = 92);
+}
\ No newline at end of file diff --git a/crates/ra_ide/test_data/highlight_unsafe.html b/crates/ra_ide/test_data/highlight_unsafe.html new file mode 100644 index 000000000..6936e949f --- /dev/null +++ b/crates/ra_ide/test_data/highlight_unsafe.html @@ -0,0 +1,53 @@ + + +
unsafe fn unsafe_fn() {}
+
+struct HasUnsafeFn;
+
+impl HasUnsafeFn {
+    unsafe fn unsafe_method(&self) {}
+}
+
+fn main() {
+    let x = &5 as *const usize;
+    unsafe {
+        unsafe_fn();
+        HasUnsafeFn.unsafe_method();
+        let y = *(x);
+        let z = -x;
+    }
+}
\ No newline at end of file diff --git a/crates/ra_ide/test_data/highlighting.html b/crates/ra_ide/test_data/highlighting.html new file mode 100644 index 000000000..8d0b38f95 --- /dev/null +++ b/crates/ra_ide/test_data/highlighting.html @@ -0,0 +1,117 @@ + + +
#[derive(Clone, Debug)]
+struct Foo {
+    pub x: i32,
+    pub y: i32,
+}
+
+trait Bar {
+    fn bar(&self) -> i32;
+}
+
+impl Bar for Foo {
+    fn bar(&self) -> i32 {
+        self.x
+    }
+}
+
+static mut STATIC_MUT: i32 = 0;
+
+fn foo<'a, T>() -> T {
+    foo::<'a, i32>()
+}
+
+macro_rules! def_fn {
+    ($($tt:tt)*) => {$($tt)*}
+}
+
+def_fn! {
+    fn bar() -> u32 {
+        100
+    }
+}
+
+macro_rules! noop {
+    ($expr:expr) => {
+        $expr
+    }
+}
+
+// comment
+fn main() {
+    println!("Hello, {}!", 92);
+
+    let mut vec = Vec::new();
+    if true {
+        let x = 92;
+        vec.push(Foo { x, y: 1 });
+    }
+    unsafe {
+        vec.set_len(0);
+        STATIC_MUT = 1;
+    }
+
+    for e in vec {
+        // Do nothing
+    }
+
+    noop!(noop!(1));
+
+    let mut x = 42;
+    let y = &mut x;
+    let z = &y;
+
+    let Foo { x: z, y } = Foo { x: z, y };
+
+    y;
+}
+
+enum Option<T> {
+    Some(T),
+    None,
+}
+use Option::*;
+
+impl<T> Option<T> {
+    fn and<U>(self, other: Option<U>) -> Option<(T, U)> {
+        match other {
+            None => unimplemented!(),
+            Nope => Nope,
+        }
+    }
+}
\ No newline at end of file diff --git a/crates/ra_ide/test_data/rainbow_highlighting.html b/crates/ra_ide/test_data/rainbow_highlighting.html new file mode 100644 index 000000000..9516c7441 --- /dev/null +++ b/crates/ra_ide/test_data/rainbow_highlighting.html @@ -0,0 +1,48 @@ + + +
fn main() {
+    let hello = "hello";
+    let x = hello.to_string();
+    let y = hello.to_string();
+
+    let x = "other color please!";
+    let y = x.to_string();
+}
+
+fn bar() {
+    let mut hello = "hello";
+}
\ No newline at end of file -- cgit v1.2.3