#[macro_export]
macro_rules! assert_bag_subbag_as_result {
($a_collection:expr, $b_collection:expr $(,)?) => {
match (&$a_collection, &$b_collection) {
(a_collection, b_collection) => {
let a = $crate::assert_bag_impl_prep!(a_collection);
let b = $crate::assert_bag_impl_prep!(b_collection);
if a_collection.into_iter().all(|key| {
a.contains_key(&key)
&& b.contains_key(&key)
&& a.get_key_value(&key) <= b.get_key_value(&key)
}) {
Ok((a, b))
} else {
Err(format!(
concat!(
"assertion failed: `assert_bag_subbag!(a_collection, b_collection)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_bag_subbag.html\n",
" a label: `{}`,\n",
" a debug: `{:?}`,\n",
" b label: `{}`,\n",
" b debug: `{:?}`,\n",
" a bag: `{:?}`,\n",
" b bag: `{:?}`"
),
stringify!($a_collection),
a_collection,
stringify!($b_collection),
b_collection,
a,
b
))
}
}
}
};
}
#[cfg(test)]
mod test_assert_bag_subbag_as_result {
use std::collections::BTreeMap;
#[test]
fn success() {
let a = [1, 1];
let b = [1, 1, 1];
for _ in 0..1 {
let actual = assert_bag_subbag_as_result!(a, b);
assert_eq!(
actual.unwrap(),
(BTreeMap::from([(&1, 2)]), BTreeMap::from([(&1, 3)]))
);
}
}
#[test]
fn failure_because_key_is_missing() {
let a = [1, 1];
let b = [2, 2];
let actual = assert_bag_subbag_as_result!(a, b);
let message = concat!(
"assertion failed: `assert_bag_subbag!(a_collection, b_collection)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_bag_subbag.html\n",
" a label: `a`,\n",
" a debug: `[1, 1]`,\n",
" b label: `b`,\n",
" b debug: `[2, 2]`,\n",
" a bag: `{1: 2}`,\n",
" b bag: `{2: 2}`"
);
assert_eq!(actual.unwrap_err(), message);
}
#[test]
fn failure_because_val_count_is_excessive() {
let a = [1, 1, 1];
let b = [1, 1];
let actual = assert_bag_subbag_as_result!(a, b);
let message = concat!(
"assertion failed: `assert_bag_subbag!(a_collection, b_collection)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_bag_subbag.html\n",
" a label: `a`,\n",
" a debug: `[1, 1, 1]`,\n",
" b label: `b`,\n",
" b debug: `[1, 1]`,\n",
" a bag: `{1: 3}`,\n",
" b bag: `{1: 2}`"
);
assert_eq!(actual.unwrap_err(), message);
}
}
#[macro_export]
macro_rules! assert_bag_subbag {
($a_collection:expr, $b_collection:expr $(,)?) => {
match $crate::assert_bag_subbag_as_result!($a_collection, $b_collection) {
Ok(x) => x,
Err(err) => panic!("{}", err),
}
};
($a_collection:expr, $b_collection:expr, $($message:tt)+) => {
match $crate::assert_bag_subbag_as_result!($a_collection, $b_collection) {
Ok(x) => x,
Err(err) => panic!("{}\n{}", format_args!($($message)+), err),
}
};
}
#[cfg(test)]
mod test_assert_bag_subbag {
use std::collections::BTreeMap;
use std::panic;
#[test]
fn success() {
let a = [1, 1];
let b = [1, 1, 1];
for _ in 0..1 {
let actual = assert_bag_subbag!(a, b);
let expect = (BTreeMap::from([(&1, 2)]), BTreeMap::from([(&1, 3)]));
assert_eq!(actual, expect);
}
}
#[test]
fn failure_because_key_is_missing() {
let result = panic::catch_unwind(|| {
let a = [1, 1];
let b = [2, 2];
let _actual = assert_bag_subbag!(a, b);
});
let message = concat!(
"assertion failed: `assert_bag_subbag!(a_collection, b_collection)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_bag_subbag.html\n",
" a label: `a`,\n",
" a debug: `[1, 1]`,\n",
" b label: `b`,\n",
" b debug: `[2, 2]`,\n",
" a bag: `{1: 2}`,\n",
" b bag: `{2: 2}`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
#[test]
fn failure_because_val_count_is_excessive() {
let result = panic::catch_unwind(|| {
let a = [1, 1, 1];
let b = [1, 1];
let _actual = assert_bag_subbag!(a, b);
});
let message = concat!(
"assertion failed: `assert_bag_subbag!(a_collection, b_collection)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_bag_subbag.html\n",
" a label: `a`,\n",
" a debug: `[1, 1, 1]`,\n",
" b label: `b`,\n",
" b debug: `[1, 1]`,\n",
" a bag: `{1: 3}`,\n",
" b bag: `{1: 2}`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
#[macro_export]
macro_rules! debug_assert_bag_subbag {
($($arg:tt)*) => {
if cfg!(debug_assertions) {
$crate::assert_bag_subbag!($($arg)*);
}
};
}
#[cfg(test)]
mod test_debug_assert_bag_subbag {
use std::collections::BTreeMap;
use std::panic;
#[test]
fn success() {
let a = [1, 1];
let b = [1, 1, 1];
for _ in 0..1 {
let _actual = debug_assert_bag_subbag!(a, b);
let _expect = (BTreeMap::from([(&1, 2)]), BTreeMap::from([(&1, 3)]));
}
}
#[test]
fn failure_because_key_is_missing() {
let result = panic::catch_unwind(|| {
let a = [1, 1];
let b = [2, 2];
let _actual = debug_assert_bag_subbag!(a, b);
});
let message = concat!(
"assertion failed: `assert_bag_subbag!(a_collection, b_collection)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_bag_subbag.html\n",
" a label: `a`,\n",
" a debug: `[1, 1]`,\n",
" b label: `b`,\n",
" b debug: `[2, 2]`,\n",
" a bag: `{1: 2}`,\n",
" b bag: `{2: 2}`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
#[test]
fn failure_because_val_count_is_excessive() {
let result = panic::catch_unwind(|| {
let a = [1, 1, 1];
let b = [1, 1];
let _actual = debug_assert_bag_subbag!(a, b);
});
let message = concat!(
"assertion failed: `assert_bag_subbag!(a_collection, b_collection)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_bag_subbag.html\n",
" a label: `a`,\n",
" a debug: `[1, 1, 1]`,\n",
" b label: `b`,\n",
" b debug: `[1, 1]`,\n",
" a bag: `{1: 3}`,\n",
" b bag: `{1: 2}`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}