better test, avoid duplicated events

This commit is contained in:
Bernardo 2019-01-22 18:38:34 +01:00 committed by Aleksey Kladov
parent 0a08650852
commit be14ab217c
3 changed files with 30 additions and 22 deletions

View file

@ -55,7 +55,12 @@ pub enum TaskResult {
impl fmt::Debug for TaskResult { impl fmt::Debug for TaskResult {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("TaskResult { ... }") match self {
TaskResult::AddRoot(..) => f.write_str("TaskResult::AddRoot(..)"),
TaskResult::HandleChange(c) => write!(f, "TaskResult::HandleChange({:?})", c),
TaskResult::LoadChange(c) => write!(f, "TaskResult::LoadChange({:?})", c),
TaskResult::NoOp => f.write_str("TaskResult::NoOp"),
}
} }
} }

View file

@ -100,8 +100,9 @@ impl Watcher {
log::warn!("could not watch \"{}\": {}", entry.path().display(), e) log::warn!("could not watch \"{}\": {}", entry.path().display(), e)
} }
} }
} } else {
if emit_for_contents && entry.depth() > 0 { if emit_for_contents && entry.depth() > 0 {
// emit only for files otherwise we will cause watch_recursive to be called again with a dir that we are already watching
// emit as create because we haven't seen it yet // emit as create because we haven't seen it yet
if let Err(e) = if let Err(e) =
self.sender self.sender
@ -113,6 +114,7 @@ impl Watcher {
} }
} }
} }
}
Err(e) => log::warn!("watcher error: {}", e), Err(e) => log::warn!("watcher error: {}", e),
} }
} }

View file

@ -1,12 +1,13 @@
use std::{collections::HashSet, fs}; use std::{collections::HashSet, fs};
// use flexi_logger::Logger; use flexi_logger::Logger;
use ra_vfs::{Vfs, VfsChange}; use ra_vfs::{Vfs, VfsChange};
use tempfile::tempdir; use tempfile::tempdir;
fn process_tasks(vfs: &mut Vfs, num_tasks: u32) { fn process_tasks(vfs: &mut Vfs, num_tasks: u32) {
for _ in 0..num_tasks { for _ in 0..num_tasks {
let task = vfs.task_receiver().recv().unwrap(); let task = vfs.task_receiver().recv().unwrap();
log::debug!("{:?}", task);
vfs.handle_task(task); vfs.handle_task(task);
} }
} }
@ -25,7 +26,7 @@ macro_rules! assert_match {
#[test] #[test]
fn test_vfs_works() -> std::io::Result<()> { fn test_vfs_works() -> std::io::Result<()> {
// Logger::with_str("vfs=debug,ra_vfs=debug").start().unwrap(); Logger::with_str("vfs=debug,ra_vfs=debug").start().unwrap();
let files = [ let files = [
("a/foo.rs", "hello"), ("a/foo.rs", "hello"),
@ -114,21 +115,21 @@ fn test_vfs_works() -> std::io::Result<()> {
assert_eq!(path, "spam.rs") assert_eq!(path, "spam.rs")
); );
fs::create_dir_all(dir.path().join("a/c")).unwrap(); fs::create_dir_all(dir.path().join("a/sub1/sub2")).unwrap();
fs::write(dir.path().join("a/c/new.rs"), "new hello").unwrap(); fs::write(dir.path().join("a/sub1/sub2/new.rs"), "new hello").unwrap();
process_tasks(&mut vfs, 4); process_tasks(&mut vfs, 4);
assert_match!( assert_match!(
vfs.commit_changes().as_slice(), vfs.commit_changes().as_slice(),
[VfsChange::AddFile { text, path, .. }], [VfsChange::AddFile { text, path, .. }],
{ {
assert_eq!(text.as_str(), "new hello"); assert_eq!(text.as_str(), "new hello");
assert_eq!(path, "c/new.rs"); assert_eq!(path, "sub1/sub2/new.rs");
} }
); );
fs::rename( fs::rename(
&dir.path().join("a/c/new.rs"), &dir.path().join("a/sub1/sub2/new.rs"),
&dir.path().join("a/c/new1.rs"), &dir.path().join("a/sub1/sub2/new1.rs"),
) )
.unwrap(); .unwrap();
process_tasks(&mut vfs, 4); process_tasks(&mut vfs, 4);
@ -142,18 +143,18 @@ fn test_vfs_works() -> std::io::Result<()> {
.. ..
}], }],
{ {
assert_eq!(removed_path, "c/new.rs"); assert_eq!(removed_path, "sub1/sub2/new.rs");
assert_eq!(added_path, "c/new1.rs"); assert_eq!(added_path, "sub1/sub2/new1.rs");
assert_eq!(text.as_str(), "new hello"); assert_eq!(text.as_str(), "new hello");
} }
); );
fs::remove_file(&dir.path().join("a/c/new1.rs")).unwrap(); fs::remove_file(&dir.path().join("a/sub1/sub2/new1.rs")).unwrap();
process_tasks(&mut vfs, 2); process_tasks(&mut vfs, 2);
assert_match!( assert_match!(
vfs.commit_changes().as_slice(), vfs.commit_changes().as_slice(),
[VfsChange::RemoveFile { path, .. }], [VfsChange::RemoveFile { path, .. }],
assert_eq!(path, "c/new1.rs") assert_eq!(path, "sub1/sub2/new1.rs")
); );
fs::create_dir_all(dir.path().join("a/target")).unwrap(); fs::create_dir_all(dir.path().join("a/target")).unwrap();