Specify and test sorting behaviour

This commit is contained in:
Félix Saparelli 2021-12-08 21:43:10 +13:00
parent 89fd99a683
commit f229456f88
No known key found for this signature in database
GPG Key ID: B948C4BAE44FC474
2 changed files with 107 additions and 12 deletions

View File

@ -60,10 +60,10 @@ where
/// - `RENAMED` -> `Modify(Name(_))`
/// - `WRITTEN` -> `Modify(Data(_))`, `Access(Close(Write))`
/// - `OTHERWISE_CHANGED` -> anything else
/// - plus `COMMON_PATH` if there is a common prefix of all paths, in which case all paths are also
/// truncated to omit that common prefix.
/// - plus `COMMON_PATH` with the common prefix of all paths (even if there's only one path).
///
/// It ignores non-path events and pathed events without event kind.
/// It ignores non-path events and pathed events without event kind. Multiple events are sorted in
/// byte order and joined with the platform-specific path separator (`:` for unix, `;` for Windows).
pub fn summarise_events_to_env<'events>(
events: impl IntoIterator<Item = &'events Event>,
) -> HashMap<&'static OsStr, OsString> {
@ -141,16 +141,17 @@ pub fn summarise_events_to_env<'events>(
let mut res: HashMap<&'static OsStr, OsString> = grouped_buckets
.into_iter()
.map(|(kind, paths)| {
.map(|(kind, mut paths)| {
let mut joined =
OsString::with_capacity(paths.iter().map(|p| p.len()).sum::<usize>() + paths.len());
for (i, path) in paths.into_iter().enumerate() {
paths.sort();
paths.into_iter().enumerate().for_each(|(i, path)| {
if i > 0 {
joined.push(ENV_SEP);
}
joined.push(path);
}
});
(kind, joined)
})

View File

@ -25,12 +25,10 @@ fn ospath(path: &str) -> OsString {
}
fn event(path: &str, kind: FileEventKind) -> Event {
tracing_subscriber::fmt::try_init().ok();
let path = dunce::canonicalize(".").unwrap().join(path);
Event {
tags: vec![
Tag::Path {
path,
path: ospath(path).into(),
file_type: None,
},
Tag::FileEventKind(kind),
@ -177,9 +175,10 @@ fn single_type_multipath() {
OsStr::new("CREATED"),
OsString::from(
"".to_string()
+ "root.txt" + ENV_SEP + "sub/folder.txt"
+ "deeper/sub/folder.txt"
+ ENV_SEP + "dom/folder.txt"
+ ENV_SEP + "deeper/sub/folder.txt"
+ ENV_SEP + "root.txt" + ENV_SEP
+ "sub/folder.txt"
)
),
(OsStr::new("COMMON_PATH"), ospath("")),
@ -198,7 +197,7 @@ fn single_type_divergent_paths() {
HashMap::from([
(
OsStr::new("CREATED"),
OsString::from("".to_string() + "sub/folder.txt" + ENV_SEP + "dom/folder.txt")
OsString::from("".to_string() + "dom/folder.txt" + ENV_SEP + "sub/folder.txt")
),
(OsStr::new("COMMON_PATH"), ospath("")),
])
@ -234,3 +233,98 @@ fn multitype_multipath() {
])
);
}
#[test]
fn multiple_paths_in_one_event() {
let events = vec![Event {
tags: vec![
Tag::Path {
path: ospath("one.txt").into(),
file_type: None,
},
Tag::Path {
path: ospath("two.txt").into(),
file_type: None,
},
Tag::FileEventKind(FileEventKind::Any),
],
metadata: Default::default(),
}];
assert_eq!(
summarise_events_to_env(&events),
HashMap::from([
(
OsStr::new("OTHERWISE_CHANGED"),
OsString::from("".to_string() + "one.txt" + ENV_SEP + "two.txt")
),
(OsStr::new("COMMON_PATH"), ospath("")),
])
);
}
#[test]
fn mixed_non_paths_events() {
let events = vec![
event("one.txt", FileEventKind::Any),
Event {
tags: vec![Tag::Process(1234)],
metadata: Default::default(),
},
event("two.txt", FileEventKind::Any),
Event {
tags: vec![Tag::FileEventKind(FileEventKind::Any)],
metadata: Default::default(),
},
];
assert_eq!(
summarise_events_to_env(&events),
HashMap::from([
(
OsStr::new("OTHERWISE_CHANGED"),
OsString::from("".to_string() + "one.txt" + ENV_SEP + "two.txt")
),
(OsStr::new("COMMON_PATH"), ospath("")),
])
);
}
#[test]
fn only_non_paths_events() {
let events = vec![
Event {
tags: vec![Tag::Process(1234)],
metadata: Default::default(),
},
Event {
tags: vec![Tag::FileEventKind(FileEventKind::Any)],
metadata: Default::default(),
},
];
assert_eq!(summarise_events_to_env(&events), HashMap::new());
}
#[test]
fn multipath_is_sorted() {
let events = vec![
event("0123.txt", FileEventKind::Any),
event("a.txt", FileEventKind::Any),
event("b.txt", FileEventKind::Any),
event("c.txt", FileEventKind::Any),
event("ᄁ.txt", FileEventKind::Any),
];
assert_eq!(
summarise_events_to_env(&events),
HashMap::from([
(
OsStr::new("OTHERWISE_CHANGED"),
OsString::from(
"".to_string()
+ "0123.txt" + ENV_SEP + "a.txt"
+ ENV_SEP + "b.txt" + ENV_SEP
+ "c.txt" + ENV_SEP + "ᄁ.txt"
)
),
(OsStr::new("COMMON_PATH"), ospath("")),
])
);
}