From b6ba0dec0c08dd2afcda951b09966b457f2c8bc3 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 8 Mar 2021 17:20:36 +0300 Subject: Generalize file ensuring infrastructure --- crates/rust-analyzer/src/config.rs | 9 ++++----- crates/test_utils/src/lib.rs | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index 4dbabdba7..02468631b 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs @@ -859,12 +859,12 @@ fn manual(fields: &[(&'static str, &'static str, &[&str], &str)]) -> String { mod tests { use std::fs; - use test_utils::project_dir; + use test_utils::{ensure_file_contents, project_dir}; use super::*; #[test] - fn schema_in_sync_with_package_json() { + fn ensure_schema_in_package_json() { let s = Config::json_schema(); let schema = format!("{:#}", s); let mut schema = schema @@ -885,13 +885,12 @@ mod tests { let start = package_json.find(start_marker).unwrap() + start_marker.len(); let end = package_json.find(end_marker).unwrap(); + let p = remove_ws(&package_json[start..end]); let s = remove_ws(&schema); - if !p.contains(&s) { package_json.replace_range(start..end, &schema); - fs::write(&package_json_path, &mut package_json).unwrap(); - panic!("new config, updating package.json") + ensure_file_contents(&package_json_path, &package_json) } } diff --git a/crates/test_utils/src/lib.rs b/crates/test_utils/src/lib.rs index 27b05e34b..7f122b13e 100644 --- a/crates/test_utils/src/lib.rs +++ b/crates/test_utils/src/lib.rs @@ -14,7 +14,7 @@ mod fixture; use std::{ convert::{TryFrom, TryInto}, env, fs, - path::PathBuf, + path::{Path, PathBuf}, }; use profile::StopWatch; @@ -353,3 +353,36 @@ pub fn bench(label: &'static str) -> impl Drop { Bencher { sw: StopWatch::start(), label } } + +/// Checks that the `file` has the specified `contents`. If that is not the +/// case, updates the file and then fails the test. +pub fn ensure_file_contents(file: &Path, contents: &str) { + if let Err(()) = try_ensure_file_contents(file, contents) { + panic!("Some files were not up-to-date"); + } +} + +/// Checks that the `file` has the specified `contents`. If that is not the +/// case, updates the file and return an Error. +pub fn try_ensure_file_contents(file: &Path, contents: &str) -> Result<(), ()> { + match std::fs::read_to_string(file) { + Ok(old_contents) if normalize_newlines(&old_contents) == normalize_newlines(contents) => { + return Ok(()) + } + _ => (), + } + let display_path = file.strip_prefix(&project_dir()).unwrap_or(file); + eprintln!( + "\n\x1b[31;1merror\x1b[0m: {} was not up-to-date, updating\n", + display_path.display() + ); + if let Some(parent) = file.parent() { + let _ = std::fs::create_dir_all(parent); + } + std::fs::write(file, contents).unwrap(); + Err(()) +} + +fn normalize_newlines(s: &str) -> String { + s.replace("\r\n", "\n") +} -- cgit v1.2.3