#![deny(missing_docs)]
#[macro_export]
macro_rules! collapsed_eq {
($input:expr, $output:expr) => {
assert_eq!(collapse($input), collapse($output));
};
($input:expr, $output:expr, $($arg:tt)+) => {
assert_eq!(collapse($input), collapse($output), $($arg)+);
};
}
#[macro_export]
macro_rules! collapsed_ne {
($input:expr, $output:expr) => {
assert_ne!(collapse($input), collapse($output));
};
($input:expr, $output:expr, $($arg:tt)+) => {
assert_ne!(collapse($input), collapse($output), $($arg)+);
};
}
pub fn collapse(s: &str) -> String {
let s = s.trim();
let mut collapsed = String::new();
for c in s.chars() {
if let Some(last) = collapsed.chars().last() {
if c.is_whitespace() {
if !last.is_whitespace() {
collapsed.push(' ');
}
} else {
collapsed.push(c);
}
} else {
collapsed.push(c);
}
}
collapsed
}
#[cfg(test)]
mod test {
use crate::*;
#[test]
fn macro_test() {
collapsed_eq!(
r#"CREATE TABLE "test" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT
)"#,
r#"CREATE TABLE "test" ( "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT )"#,
"This is a panic message you should never see"
);
collapsed_ne!(
"This is not the same...",
"...as this string.",
"You should never see this panic message either."
);
}
macro_rules! test {
($(#[$attr:meta])* $name:ident, $input:expr, $output:expr) => {
#[test]
$(#[$attr])*
fn $name() {
collapsed_eq!($input, $output);
}
}
}
test!(two_spaces, "two spaces", "two spaces");
test!(space_tab, "space tab", "space tab");
test!(line_space, "line\r\nspace", "line space");
test!(new_lines, "new\r\n
lines", "new lines");
test!(tabs, "some tabs\there", "some tabs here");
test!(no_change, "no change", "no change");
test!(all_whitespace, "\r\n\t ", " \n\r\t\n ");
test!(empty, "", "");
test!(empty1, " ", "");
test!(empty2, " ", "\n");
test!(empty3, " ", "\r\n");
test!(empty4, " ", " \t\t ");
test!(lead_tail, " lead \t tail \r", "lead tail");
test!(#[should_panic] should_fail1, "should fail", "SHOULD FAIL");
test!(#[should_panic] should_fail2, "should fail", "SHOULD FAIL");
test!(#[should_panic] should_fail3, "should\n fail", "SHOULD\n FAIL");
}