From 9edb00267991045ab6f87fff1f82a36ef12a6f43 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Tue, 19 Jan 2021 12:36:01 +1000 Subject: [PATCH] fix deck and tag normalization The issue existed in the deck code as well; I've added a test for it. --- rslib/src/decks/mod.rs | 15 +++++++++++---- rslib/src/tags.rs | 18 +++++++++++++++--- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/rslib/src/decks/mod.rs b/rslib/src/decks/mod.rs index 596bda402..ff3c05dba 100644 --- a/rslib/src/decks/mod.rs +++ b/rslib/src/decks/mod.rs @@ -114,10 +114,11 @@ fn normalize_native_name(name: &str) -> Cow { .split('\x1f') .any(|comp| matches!(normalized_deck_name_component(comp), Cow::Owned(_))) { - name.split('\x1f') + let comps: Vec<_> = name + .split('\x1f') .map(normalized_deck_name_component) - .collect::() - .into() + .collect::>(); + comps.join("\x1f").into() } else { // no changes required name.into() @@ -525,7 +526,7 @@ impl Collection { #[cfg(test)] mod test { - use super::{human_deck_name_to_native, immediate_parent_name}; + use super::{human_deck_name_to_native, immediate_parent_name, normalize_native_name}; use crate::{ collection::{open_test_collection, Collection}, err::Result, @@ -562,6 +563,12 @@ mod test { ); } + #[test] + fn normalize() { + assert_eq!(&normalize_native_name("foo\x1fbar"), "foo\x1fbar"); + assert_eq!(&normalize_native_name("fo\u{a}o\x1fbar"), "foo\x1fbar"); + } + #[test] fn adding_updating() -> Result<()> { let mut col = open_test_collection(); diff --git a/rslib/src/tags.rs b/rslib/src/tags.rs index 6940fba8e..23b460685 100644 --- a/rslib/src/tags.rs +++ b/rslib/src/tags.rs @@ -91,10 +91,11 @@ fn normalize_tag_name(name: &str) -> Cow { .split("::") .any(|comp| matches!(normalized_tag_name_component(comp), Cow::Owned(_))) { - name.split("::") + let comps: Vec<_> = name + .split("::") .map(normalized_tag_name_component) - .collect::() - .into() + .collect::>(); + comps.join("::").into() } else { // no changes required name.into() @@ -419,6 +420,17 @@ mod test { col.update_note(&mut note)?; assert_eq!(¬e.tags, &["one", "two"]); + // blanks should be handled + note.tags = vec![ + "".into(), + "foo".into(), + " ".into(), + "::".into(), + "foo::".into(), + ]; + col.update_note(&mut note)?; + assert_eq!(¬e.tags, &["blank::blank", "foo", "foo::blank"]); + Ok(()) }