5278: expect should be a dev dep r=matklad a=matklad



bors r+
🤖

Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
bors[bot] 2020-07-09 09:01:45 +00:00 committed by GitHub
commit f9d41bd18f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 27 additions and 40 deletions

1
Cargo.lock generated
View File

@ -1262,6 +1262,7 @@ name = "ra_syntax"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"arrayvec", "arrayvec",
"expect",
"itertools", "itertools",
"once_cell", "once_cell",
"ra_parser", "ra_parser",

View File

@ -42,7 +42,9 @@ macro_rules! expect {
/// expect_file!["/crates/foo/test_data/bar.html"] /// expect_file!["/crates/foo/test_data/bar.html"]
#[macro_export] #[macro_export]
macro_rules! expect_file { macro_rules! expect_file {
[$path:literal] => {$crate::ExpectFile { path: $path }}; [$path:literal] => {$crate::ExpectFile {
path: $crate::ExpectFilePath::Static($path)
}};
} }
#[derive(Debug)] #[derive(Debug)]
@ -53,7 +55,13 @@ pub struct Expect {
#[derive(Debug)] #[derive(Debug)]
pub struct ExpectFile { pub struct ExpectFile {
pub path: &'static str, pub path: ExpectFilePath,
}
#[derive(Debug)]
pub enum ExpectFilePath {
Static(&'static str),
Dynamic(PathBuf),
} }
#[derive(Debug)] #[derive(Debug)]
@ -112,6 +120,9 @@ fn locate(&self, file: &str) -> Location {
} }
impl ExpectFile { impl ExpectFile {
pub fn new(path: PathBuf) -> ExpectFile {
ExpectFile { path: ExpectFilePath::Dynamic(path) }
}
pub fn assert_eq(&self, actual: &str) { pub fn assert_eq(&self, actual: &str) {
let expected = self.read(); let expected = self.read();
if actual == expected { if actual == expected {
@ -125,8 +136,14 @@ fn read(&self) -> String {
fn write(&self, contents: &str) { fn write(&self, contents: &str) {
fs::write(self.abs_path(), contents).unwrap() fs::write(self.abs_path(), contents).unwrap()
} }
fn path(&self) -> &Path {
match &self.path {
ExpectFilePath::Static(it) => it.as_ref(),
ExpectFilePath::Dynamic(it) => it.as_path(),
}
}
fn abs_path(&self) -> PathBuf { fn abs_path(&self) -> PathBuf {
workspace_root().join(self.path) workspace_root().join(self.path())
} }
} }
@ -154,11 +171,11 @@ fn fail_expect(expect: &Expect, expected: &str, actual: &str) {
fn fail_file(expect: &ExpectFile, expected: &str, actual: &str) { fn fail_file(expect: &ExpectFile, expected: &str, actual: &str) {
let mut rt = RT.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); let mut rt = RT.lock().unwrap_or_else(|poisoned| poisoned.into_inner());
if update_expect() { if update_expect() {
println!("\x1b[1m\x1b[92mupdating\x1b[0m: {}", expect.path); println!("\x1b[1m\x1b[92mupdating\x1b[0m: {}", expect.path().display());
expect.write(actual); expect.write(actual);
return; return;
} }
rt.panic(expect.path.to_string(), expected, actual); rt.panic(expect.path().display().to_string(), expected, actual);
} }
fn panic(&mut self, position: String, expected: &str, actual: &str) { fn panic(&mut self, position: String, expected: &str, actual: &str) {

View File

@ -28,7 +28,6 @@ ra_cfg = { path = "../ra_cfg" }
ra_fmt = { path = "../ra_fmt" } ra_fmt = { path = "../ra_fmt" }
ra_prof = { path = "../ra_prof" } ra_prof = { path = "../ra_prof" }
test_utils = { path = "../test_utils" } test_utils = { path = "../test_utils" }
expect = { path = "../expect" }
ra_assists = { path = "../ra_assists" } ra_assists = { path = "../ra_assists" }
ra_ssr = { path = "../ra_ssr" } ra_ssr = { path = "../ra_ssr" }
@ -38,3 +37,4 @@ hir = { path = "../ra_hir", package = "ra_hir" }
[dev-dependencies] [dev-dependencies]
insta = "0.16.0" insta = "0.16.0"
expect = { path = "../expect" }

View File

@ -31,4 +31,5 @@ serde = { version = "1.0.106", features = ["derive"] }
[dev-dependencies] [dev-dependencies]
test_utils = { path = "../test_utils" } test_utils = { path = "../test_utils" }
expect = { path = "../expect" }
walkdir = "2.3.1" walkdir = "2.3.1"

View File

@ -1,11 +1,10 @@
use std::{ use std::{
env,
fmt::Write, fmt::Write,
fs, fs,
path::{Component, Path, PathBuf}, path::{Component, Path, PathBuf},
}; };
use test_utils::{assert_eq_text, project_dir}; use test_utils::project_dir;
use crate::{fuzz, tokenize, SourceFile, SyntaxError, TextRange, TextSize, Token}; use crate::{fuzz, tokenize, SourceFile, SyntaxError, TextRange, TextSize, Token};
@ -218,15 +217,7 @@ fn dir_tests<F>(test_data_dir: &Path, paths: &[&str], outfile_extension: &str, f
for (path, input_code) in collect_rust_files(test_data_dir, paths) { for (path, input_code) in collect_rust_files(test_data_dir, paths) {
let actual = f(&input_code, &path); let actual = f(&input_code, &path);
let path = path.with_extension(outfile_extension); let path = path.with_extension(outfile_extension);
if !path.exists() { expect::ExpectFile::new(path).assert_eq(&actual)
println!("\nfile: {}", path.display());
println!("No .txt file with expected result, creating...\n");
println!("{}\n{}", input_code, actual);
fs::write(&path, &actual).unwrap();
panic!("No expected result");
}
let expected = read_text(&path);
assert_equal_text(&expected, &actual, &path);
} }
} }
@ -259,29 +250,6 @@ fn rust_files_in_dir(dir: &Path) -> Vec<PathBuf> {
acc acc
} }
/// Asserts that `expected` and `actual` strings are equal. If they differ only
/// in trailing or leading whitespace the test won't fail and
/// the contents of `actual` will be written to the file located at `path`.
fn assert_equal_text(expected: &str, actual: &str, path: &Path) {
if expected == actual {
return;
}
let dir = project_dir();
let pretty_path = path.strip_prefix(&dir).unwrap_or_else(|_| path);
if expected.trim() == actual.trim() {
println!("whitespace difference, rewriting");
println!("file: {}\n", pretty_path.display());
fs::write(path, actual).unwrap();
return;
}
if env::var("UPDATE_EXPECT").is_ok() {
println!("rewriting {}", pretty_path.display());
fs::write(path, actual).unwrap();
return;
}
assert_eq_text!(expected, actual, "file: {}", pretty_path.display());
}
/// Read file and normalize newlines. /// Read file and normalize newlines.
/// ///
/// `rustc` seems to always normalize `\r\n` newlines to `\n`: /// `rustc` seems to always normalize `\r\n` newlines to `\n`: