2021-02-23 09:10:59 +01:00
|
|
|
macro_rules! setup_test {
|
2021-09-21 04:42:00 +02:00
|
|
|
() => {{
|
|
|
|
/*
|
|
|
|
use env_logger;
|
2021-02-23 09:10:59 +01:00
|
|
|
::std::env::set_var("RUST_LOG", "actix_web=debug,kanidm=debug");
|
|
|
|
let _ = env_logger::builder()
|
|
|
|
.format_timestamp(None)
|
|
|
|
.format_level(false)
|
|
|
|
.is_test(true)
|
|
|
|
.try_init();
|
2021-09-21 04:42:00 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
let _ = crate::tracing_tree::test_init();
|
2021-02-23 09:10:59 +01:00
|
|
|
|
|
|
|
// Create an in memory BE
|
2021-09-21 04:42:00 +02:00
|
|
|
let schema_outer = Schema::new().expect("Failed to init schema");
|
2021-02-23 09:10:59 +01:00
|
|
|
let idxmeta = {
|
|
|
|
let schema_txn = schema_outer.write_blocking();
|
|
|
|
schema_txn.reload_idxmeta()
|
|
|
|
};
|
2021-09-21 04:42:00 +02:00
|
|
|
let be =
|
|
|
|
Backend::new(BackendConfig::new_test(), idxmeta, false).expect("Failed to init BE");
|
2021-02-23 09:10:59 +01:00
|
|
|
|
2022-02-15 07:17:43 +01:00
|
|
|
let qs = QueryServer::new(be, schema_outer, "example.com".to_string());
|
2021-09-21 04:42:00 +02:00
|
|
|
qs.initialise_helper(duration_from_epoch_now())
|
2021-02-23 09:10:59 +01:00
|
|
|
.expect("init failed!");
|
|
|
|
qs
|
|
|
|
}};
|
|
|
|
(
|
|
|
|
$preload_entries:expr
|
|
|
|
) => {{
|
|
|
|
use crate::utils::duration_from_epoch_now;
|
|
|
|
use async_std::task;
|
|
|
|
|
2021-09-21 04:42:00 +02:00
|
|
|
/*
|
|
|
|
use env_logger;
|
2021-02-23 09:10:59 +01:00
|
|
|
::std::env::set_var("RUST_LOG", "actix_web=debug,kanidm=debug");
|
|
|
|
let _ = env_logger::builder()
|
|
|
|
.format_timestamp(None)
|
|
|
|
.format_level(false)
|
|
|
|
.is_test(true)
|
|
|
|
.try_init();
|
2021-09-21 04:42:00 +02:00
|
|
|
*/
|
|
|
|
let _ = crate::tracing_tree::test_init();
|
2021-02-23 09:10:59 +01:00
|
|
|
|
|
|
|
// Create an in memory BE
|
2021-09-21 04:42:00 +02:00
|
|
|
let schema_outer = Schema::new().expect("Failed to init schema");
|
2021-02-23 09:10:59 +01:00
|
|
|
let idxmeta = {
|
|
|
|
let schema_txn = schema_outer.write_blocking();
|
|
|
|
schema_txn.reload_idxmeta()
|
|
|
|
};
|
2021-09-21 04:42:00 +02:00
|
|
|
let be =
|
|
|
|
Backend::new(BackendConfig::new_test(), idxmeta, false).expect("Failed to init BE");
|
2021-02-23 09:10:59 +01:00
|
|
|
|
2022-02-15 07:17:43 +01:00
|
|
|
let qs = QueryServer::new(be, schema_outer, "example.com".to_string());
|
2021-09-21 04:42:00 +02:00
|
|
|
qs.initialise_helper(duration_from_epoch_now())
|
2021-02-23 09:10:59 +01:00
|
|
|
.expect("init failed!");
|
|
|
|
|
|
|
|
if !$preload_entries.is_empty() {
|
|
|
|
let qs_write = task::block_on(qs.write_async(duration_from_epoch_now()));
|
|
|
|
qs_write
|
2021-09-21 04:42:00 +02:00
|
|
|
.internal_create($preload_entries)
|
2021-02-23 09:10:59 +01:00
|
|
|
.expect("Failed to preload entries");
|
2021-09-21 04:42:00 +02:00
|
|
|
assert!(qs_write.commit().is_ok());
|
2021-02-23 09:10:59 +01:00
|
|
|
}
|
|
|
|
qs
|
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
2020-06-07 01:53:10 +02:00
|
|
|
#[cfg(test)]
|
|
|
|
macro_rules! run_test_no_init {
|
|
|
|
($test_fn:expr) => {{
|
2021-04-14 01:56:40 +02:00
|
|
|
use crate::be::{Backend, BackendConfig};
|
2021-04-25 03:35:02 +02:00
|
|
|
use crate::prelude::*;
|
2020-06-07 01:53:10 +02:00
|
|
|
use crate::schema::Schema;
|
|
|
|
use crate::utils::duration_from_epoch_now;
|
|
|
|
|
2021-09-21 04:42:00 +02:00
|
|
|
let _ = crate::tracing_tree::test_init();
|
|
|
|
/*
|
2020-06-07 01:53:10 +02:00
|
|
|
use env_logger;
|
|
|
|
::std::env::set_var("RUST_LOG", "actix_web=debug,kanidm=debug");
|
|
|
|
let _ = env_logger::builder()
|
|
|
|
.format_timestamp(None)
|
|
|
|
.format_level(false)
|
|
|
|
.is_test(true)
|
|
|
|
.try_init();
|
2021-09-21 04:42:00 +02:00
|
|
|
*/
|
2020-06-07 01:53:10 +02:00
|
|
|
|
2021-09-21 04:42:00 +02:00
|
|
|
let schema_outer = Schema::new().expect("Failed to init schema");
|
2020-06-24 13:17:46 +02:00
|
|
|
let idxmeta = {
|
2020-09-06 00:44:35 +02:00
|
|
|
let schema_txn = schema_outer.write_blocking();
|
2020-06-24 13:17:46 +02:00
|
|
|
schema_txn.reload_idxmeta()
|
|
|
|
};
|
2021-09-21 04:42:00 +02:00
|
|
|
let be = match Backend::new(BackendConfig::new_test(), idxmeta, false) {
|
2020-06-07 01:53:10 +02:00
|
|
|
Ok(be) => be,
|
|
|
|
Err(e) => {
|
|
|
|
error!("{:?}", e);
|
|
|
|
panic!()
|
|
|
|
}
|
|
|
|
};
|
2022-02-15 07:17:43 +01:00
|
|
|
let test_server = QueryServer::new(be, schema_outer, "example.com".to_string());
|
2020-06-07 01:53:10 +02:00
|
|
|
|
2021-09-21 04:42:00 +02:00
|
|
|
$test_fn(&test_server);
|
2020-06-07 01:53:10 +02:00
|
|
|
// Any needed teardown?
|
|
|
|
// Make sure there are no errors.
|
2021-09-21 04:42:00 +02:00
|
|
|
// let verifications = test_server.verify();
|
2020-06-07 01:53:10 +02:00
|
|
|
// assert!(verifications.len() == 0);
|
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
2019-05-24 07:11:06 +02:00
|
|
|
#[cfg(test)]
|
|
|
|
macro_rules! run_test {
|
|
|
|
($test_fn:expr) => {{
|
2021-04-14 01:56:40 +02:00
|
|
|
use crate::be::{Backend, BackendConfig};
|
2021-04-25 03:35:02 +02:00
|
|
|
use crate::prelude::*;
|
2019-05-24 07:11:06 +02:00
|
|
|
use crate::schema::Schema;
|
2021-02-23 09:10:59 +01:00
|
|
|
#[allow(unused_imports)]
|
2020-03-22 02:31:02 +01:00
|
|
|
use crate::utils::duration_from_epoch_now;
|
2019-07-12 07:28:46 +02:00
|
|
|
|
2021-09-21 04:42:00 +02:00
|
|
|
let _ = crate::tracing_tree::test_init();
|
|
|
|
/*
|
2019-07-12 07:28:46 +02:00
|
|
|
use env_logger;
|
2019-09-14 15:44:08 +02:00
|
|
|
::std::env::set_var("RUST_LOG", "actix_web=debug,kanidm=debug");
|
2020-06-05 06:01:20 +02:00
|
|
|
let _ = env_logger::builder()
|
|
|
|
.format_timestamp(None)
|
|
|
|
.format_level(false)
|
|
|
|
.is_test(true)
|
|
|
|
.try_init();
|
2021-09-21 04:42:00 +02:00
|
|
|
*/
|
2019-05-24 07:11:06 +02:00
|
|
|
|
2021-09-21 04:42:00 +02:00
|
|
|
let test_server = setup_test!();
|
2019-05-24 07:11:06 +02:00
|
|
|
|
2021-09-21 04:42:00 +02:00
|
|
|
$test_fn(&test_server);
|
2019-05-24 07:11:06 +02:00
|
|
|
// Any needed teardown?
|
|
|
|
// Make sure there are no errors.
|
2021-09-21 04:42:00 +02:00
|
|
|
let verifications = test_server.verify();
|
|
|
|
trace!("Verification result: {:?}", verifications);
|
2019-08-27 01:36:54 +02:00
|
|
|
assert!(verifications.len() == 0);
|
2019-05-24 07:11:06 +02:00
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
2020-06-14 01:34:23 +02:00
|
|
|
#[cfg(test)]
|
|
|
|
macro_rules! entry_str_to_account {
|
|
|
|
($entry_str:expr) => {{
|
|
|
|
use crate::entry::{Entry, EntryInvalid, EntryNew};
|
|
|
|
use crate::idm::account::Account;
|
|
|
|
use crate::value::Value;
|
2021-07-30 01:45:25 +02:00
|
|
|
use std::iter::once;
|
2020-06-14 01:34:23 +02:00
|
|
|
|
|
|
|
let mut e: Entry<EntryInvalid, EntryNew> =
|
|
|
|
unsafe { Entry::unsafe_from_entry_str($entry_str).into_invalid_new() };
|
|
|
|
// Add spn, because normally this is generated but in tests we can't.
|
|
|
|
let spn = e
|
2022-05-24 02:49:34 +02:00
|
|
|
.get_ava_single_iname("name")
|
2020-06-14 01:34:23 +02:00
|
|
|
.map(|s| Value::new_spn_str(s, "example.com"))
|
|
|
|
.expect("Failed to munge spn from name!");
|
2021-07-30 01:45:25 +02:00
|
|
|
e.set_ava("spn", once(spn));
|
2020-06-14 01:34:23 +02:00
|
|
|
|
|
|
|
let e = unsafe { e.into_sealed_committed() };
|
|
|
|
|
2020-08-04 04:58:11 +02:00
|
|
|
Account::try_from_entry_no_groups(&e).expect("Account conversion failure")
|
2020-06-14 01:34:23 +02:00
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
2021-02-23 09:10:59 +01:00
|
|
|
macro_rules! run_idm_test_inner {
|
2020-06-14 01:34:23 +02:00
|
|
|
($test_fn:expr) => {{
|
2021-02-23 09:10:59 +01:00
|
|
|
#[allow(unused_imports)]
|
2021-04-14 01:56:40 +02:00
|
|
|
use crate::be::{Backend, BackendConfig};
|
2021-02-23 09:10:59 +01:00
|
|
|
#[allow(unused_imports)]
|
2020-08-24 04:15:21 +02:00
|
|
|
use crate::idm::server::{IdmServer, IdmServerDelayed};
|
2021-04-25 03:35:02 +02:00
|
|
|
use crate::prelude::*;
|
2021-02-23 09:10:59 +01:00
|
|
|
#[allow(unused_imports)]
|
2020-06-14 01:34:23 +02:00
|
|
|
use crate::schema::Schema;
|
2021-09-21 04:42:00 +02:00
|
|
|
/*
|
2020-06-14 01:34:23 +02:00
|
|
|
use env_logger;
|
|
|
|
::std::env::set_var("RUST_LOG", "actix_web=debug,kanidm=debug");
|
|
|
|
let _ = env_logger::builder()
|
|
|
|
.format_timestamp(None)
|
|
|
|
.format_level(false)
|
|
|
|
.is_test(true)
|
|
|
|
.try_init();
|
2021-09-21 04:42:00 +02:00
|
|
|
*/
|
2020-06-14 01:34:23 +02:00
|
|
|
|
2021-09-21 04:42:00 +02:00
|
|
|
let test_server = setup_test!();
|
2020-06-14 01:34:23 +02:00
|
|
|
|
2021-09-21 04:42:00 +02:00
|
|
|
let (test_idm_server, mut idms_delayed) =
|
2021-12-16 01:13:03 +01:00
|
|
|
IdmServer::new(test_server.clone(), "https://idm.example.com")
|
2021-09-21 04:42:00 +02:00
|
|
|
.expect("Failed to setup idms");
|
2020-06-14 01:34:23 +02:00
|
|
|
|
2021-09-21 04:42:00 +02:00
|
|
|
$test_fn(&test_server, &test_idm_server, &mut idms_delayed);
|
2020-06-14 01:34:23 +02:00
|
|
|
// Any needed teardown?
|
|
|
|
// Make sure there are no errors.
|
2021-09-21 04:42:00 +02:00
|
|
|
assert!(test_server.verify().len() == 0);
|
2022-06-28 01:22:31 +02:00
|
|
|
idms_delayed.check_is_empty_or_panic();
|
2021-02-23 09:10:59 +01:00
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
macro_rules! run_idm_test {
|
|
|
|
($test_fn:expr) => {{
|
2021-08-19 03:04:24 +02:00
|
|
|
let _ = crate::tracing_tree::test_init();
|
2021-09-21 04:42:00 +02:00
|
|
|
run_idm_test_inner!($test_fn);
|
2020-06-14 01:34:23 +02:00
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
2021-02-23 09:10:59 +01:00
|
|
|
pub fn run_idm_test_no_logging<F>(mut test_fn: F)
|
|
|
|
where
|
|
|
|
F: FnMut(
|
|
|
|
&crate::server::QueryServer,
|
|
|
|
&crate::idm::server::IdmServer,
|
|
|
|
&crate::idm::server::IdmServerDelayed,
|
|
|
|
),
|
|
|
|
{
|
2022-04-27 02:56:18 +02:00
|
|
|
let _ = crate::tracing_tree::test_level(tracing::Level::ERROR);
|
2021-02-23 09:10:59 +01:00
|
|
|
let _ = run_idm_test_inner!(test_fn);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Test helpers for all plugins.
|
2022-02-20 03:43:38 +01:00
|
|
|
// #[macro_export]
|
2021-02-23 09:10:59 +01:00
|
|
|
#[cfg(test)]
|
|
|
|
macro_rules! run_create_test {
|
|
|
|
(
|
|
|
|
$expect:expr,
|
|
|
|
$preload_entries:ident,
|
|
|
|
$create_entries:ident,
|
|
|
|
$internal:expr,
|
|
|
|
$check:expr
|
|
|
|
) => {{
|
2021-04-14 01:56:40 +02:00
|
|
|
use crate::be::{Backend, BackendConfig};
|
2021-02-23 09:10:59 +01:00
|
|
|
use crate::event::CreateEvent;
|
2021-04-25 03:35:02 +02:00
|
|
|
use crate::prelude::*;
|
2021-02-23 09:10:59 +01:00
|
|
|
use crate::schema::Schema;
|
|
|
|
use crate::utils::duration_from_epoch_now;
|
|
|
|
|
2021-09-21 04:42:00 +02:00
|
|
|
spanned!("plugins::macros::run_create_test", {
|
|
|
|
let qs = setup_test!($preload_entries);
|
2021-02-23 09:10:59 +01:00
|
|
|
|
|
|
|
let ce = match $internal {
|
|
|
|
None => CreateEvent::new_internal($create_entries.clone()),
|
|
|
|
Some(e_str) => unsafe {
|
|
|
|
CreateEvent::new_impersonate_entry_ser(e_str, $create_entries.clone())
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
{
|
|
|
|
let qs_write = qs.write(duration_from_epoch_now());
|
2021-09-21 04:42:00 +02:00
|
|
|
let r = qs_write.create(&ce);
|
2021-09-25 03:24:00 +02:00
|
|
|
trace!("test result: {:?}", r);
|
2021-02-23 09:10:59 +01:00
|
|
|
assert!(r == $expect);
|
2021-09-21 04:42:00 +02:00
|
|
|
$check(&qs_write);
|
2021-02-23 09:10:59 +01:00
|
|
|
match r {
|
|
|
|
Ok(_) => {
|
2021-09-21 04:42:00 +02:00
|
|
|
qs_write.commit().expect("commit failure!");
|
2021-02-23 09:10:59 +01:00
|
|
|
}
|
|
|
|
Err(e) => {
|
2021-09-21 04:42:00 +02:00
|
|
|
admin_error!("Rolling back => {:?}", e);
|
2021-02-23 09:10:59 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Make sure there are no errors.
|
2021-09-25 03:24:00 +02:00
|
|
|
trace!("starting verification");
|
2021-09-21 04:42:00 +02:00
|
|
|
let ver = qs.verify();
|
2021-09-25 03:24:00 +02:00
|
|
|
trace!("verification -> {:?}", ver);
|
2021-02-23 09:10:59 +01:00
|
|
|
assert!(ver.len() == 0);
|
|
|
|
});
|
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
2022-02-20 03:43:38 +01:00
|
|
|
// #[macro_export]
|
2021-02-23 09:10:59 +01:00
|
|
|
#[cfg(test)]
|
|
|
|
macro_rules! run_modify_test {
|
|
|
|
(
|
|
|
|
$expect:expr,
|
|
|
|
$preload_entries:ident,
|
|
|
|
$modify_filter:expr,
|
|
|
|
$modify_list:expr,
|
|
|
|
$internal:expr,
|
|
|
|
$check:expr
|
|
|
|
) => {{
|
2021-04-14 01:56:40 +02:00
|
|
|
use crate::be::{Backend, BackendConfig};
|
2021-02-23 09:10:59 +01:00
|
|
|
use crate::event::ModifyEvent;
|
2021-04-25 03:35:02 +02:00
|
|
|
use crate::prelude::*;
|
2021-02-23 09:10:59 +01:00
|
|
|
use crate::schema::Schema;
|
|
|
|
|
2021-09-21 04:42:00 +02:00
|
|
|
spanned!("plugins::macros::run_modify_test", {
|
|
|
|
let qs = setup_test!($preload_entries);
|
2021-02-23 09:10:59 +01:00
|
|
|
|
|
|
|
let me = match $internal {
|
|
|
|
None => unsafe { ModifyEvent::new_internal_invalid($modify_filter, $modify_list) },
|
|
|
|
Some(e_str) => unsafe {
|
|
|
|
ModifyEvent::new_impersonate_entry_ser(e_str, $modify_filter, $modify_list)
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
{
|
|
|
|
let qs_write = qs.write(duration_from_epoch_now());
|
2021-09-21 04:42:00 +02:00
|
|
|
let r = spanned!("plugins::macros::run_modify_test -> main_test", {
|
|
|
|
qs_write.modify(&me)
|
|
|
|
});
|
|
|
|
spanned!("plugins::macros::run_modify_test -> post_test check", {
|
|
|
|
$check(&qs_write)
|
|
|
|
});
|
2021-09-25 03:24:00 +02:00
|
|
|
trace!("test result: {:?}", r);
|
2021-02-23 09:10:59 +01:00
|
|
|
assert!(r == $expect);
|
|
|
|
match r {
|
|
|
|
Ok(_) => {
|
2021-09-21 04:42:00 +02:00
|
|
|
qs_write.commit().expect("commit failure!");
|
2021-02-23 09:10:59 +01:00
|
|
|
}
|
|
|
|
Err(e) => {
|
2021-09-21 04:42:00 +02:00
|
|
|
admin_error!("Rolling back => {:?}", e);
|
2021-02-23 09:10:59 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Make sure there are no errors.
|
2021-09-25 03:24:00 +02:00
|
|
|
trace!("starting verification");
|
2021-09-21 04:42:00 +02:00
|
|
|
let ver = qs.verify();
|
2021-09-25 03:24:00 +02:00
|
|
|
trace!("verification -> {:?}", ver);
|
2021-02-23 09:10:59 +01:00
|
|
|
assert!(ver.len() == 0);
|
|
|
|
});
|
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
2022-02-20 03:43:38 +01:00
|
|
|
// #[macro_export]
|
2021-02-23 09:10:59 +01:00
|
|
|
#[cfg(test)]
|
|
|
|
macro_rules! run_delete_test {
|
|
|
|
(
|
|
|
|
$expect:expr,
|
|
|
|
$preload_entries:ident,
|
|
|
|
$delete_filter:expr,
|
|
|
|
$internal:expr,
|
|
|
|
$check:expr
|
|
|
|
) => {{
|
2021-04-14 01:56:40 +02:00
|
|
|
use crate::be::{Backend, BackendConfig};
|
2021-02-23 09:10:59 +01:00
|
|
|
use crate::event::DeleteEvent;
|
2021-04-25 03:35:02 +02:00
|
|
|
use crate::prelude::*;
|
2021-02-23 09:10:59 +01:00
|
|
|
use crate::schema::Schema;
|
|
|
|
use crate::utils::duration_from_epoch_now;
|
|
|
|
|
2021-09-21 04:42:00 +02:00
|
|
|
spanned!("plugins::macros::run_delete_test", {
|
|
|
|
let qs = setup_test!($preload_entries);
|
2021-02-23 09:10:59 +01:00
|
|
|
|
|
|
|
let de = match $internal {
|
|
|
|
Some(e_str) => unsafe {
|
|
|
|
DeleteEvent::new_impersonate_entry_ser(e_str, $delete_filter.clone())
|
|
|
|
},
|
|
|
|
None => unsafe { DeleteEvent::new_internal_invalid($delete_filter.clone()) },
|
|
|
|
};
|
|
|
|
|
|
|
|
{
|
|
|
|
let qs_write = qs.write(duration_from_epoch_now());
|
2021-09-21 04:42:00 +02:00
|
|
|
let r = qs_write.delete(&de);
|
2021-09-25 03:24:00 +02:00
|
|
|
trace!("test result: {:?}", r);
|
2021-09-21 04:42:00 +02:00
|
|
|
$check(&qs_write);
|
2021-02-23 09:10:59 +01:00
|
|
|
assert!(r == $expect);
|
|
|
|
match r {
|
|
|
|
Ok(_) => {
|
2021-09-21 04:42:00 +02:00
|
|
|
qs_write.commit().expect("commit failure!");
|
2021-02-23 09:10:59 +01:00
|
|
|
}
|
|
|
|
Err(e) => {
|
2021-09-21 04:42:00 +02:00
|
|
|
admin_error!("Rolling back => {:?}", e);
|
2021-02-23 09:10:59 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Make sure there are no errors.
|
2021-09-25 03:24:00 +02:00
|
|
|
trace!("starting verification");
|
2021-09-21 04:42:00 +02:00
|
|
|
let ver = qs.verify();
|
2021-09-25 03:24:00 +02:00
|
|
|
trace!("verification -> {:?}", ver);
|
2021-02-23 09:10:59 +01:00
|
|
|
assert!(ver.len() == 0);
|
|
|
|
});
|
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
2019-06-07 11:19:09 +02:00
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! modlist {
|
|
|
|
(
|
|
|
|
$vs:expr
|
|
|
|
) => {{
|
|
|
|
let s: Box<[Modify]> = Box::new($vs);
|
|
|
|
ModifyList::new_list(s.into_vec())
|
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
2019-05-24 07:11:06 +02:00
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! f_and {
|
|
|
|
(
|
|
|
|
$vs:expr
|
|
|
|
) => {{
|
|
|
|
let s: Box<[FC]> = Box::new($vs);
|
|
|
|
f_and(s.into_vec())
|
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
2020-06-26 03:36:37 +02:00
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! f_inc {
|
|
|
|
(
|
|
|
|
$vs:expr
|
|
|
|
) => {{
|
|
|
|
let s: Box<[FC]> = Box::new($vs);
|
|
|
|
f_inc(s.into_vec())
|
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
2019-05-24 07:11:06 +02:00
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! f_or {
|
|
|
|
(
|
|
|
|
$vs:expr
|
|
|
|
) => {{
|
|
|
|
let s: Box<[FC]> = Box::new($vs);
|
|
|
|
f_or(s.into_vec())
|
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! filter {
|
|
|
|
(
|
|
|
|
$fc:expr
|
|
|
|
) => {{
|
|
|
|
Filter::new_ignore_hidden($fc)
|
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! filter_rec {
|
|
|
|
(
|
|
|
|
$fc:expr
|
|
|
|
) => {{
|
|
|
|
Filter::new_recycled($fc)
|
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! filter_all {
|
|
|
|
(
|
|
|
|
$fc:expr
|
|
|
|
) => {{
|
|
|
|
Filter::new($fc)
|
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! filter_valid {
|
|
|
|
(
|
|
|
|
$fc:expr
|
|
|
|
) => {{
|
|
|
|
let f: Filter<FilterInvalid> = Filter::new($fc);
|
|
|
|
// Create a resolved filter, via the most unsafe means possible!
|
2020-01-09 11:07:14 +01:00
|
|
|
f.into_valid()
|
2019-05-24 07:11:06 +02:00
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! filter_resolved {
|
|
|
|
(
|
|
|
|
$fc:expr
|
|
|
|
) => {{
|
|
|
|
let f: Filter<FilterInvalid> = Filter::new($fc);
|
|
|
|
// Create a resolved filter, via the most unsafe means possible!
|
2020-01-09 11:07:14 +01:00
|
|
|
f.into_valid_resolved()
|
2019-05-24 07:11:06 +02:00
|
|
|
}};
|
|
|
|
}
|
2019-08-27 01:36:54 +02:00
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! pvalue_utf8 {
|
|
|
|
(
|
|
|
|
$v:expr
|
|
|
|
) => {{
|
|
|
|
PartialValue::new_utf8(v.to_string())
|
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! pvalue_iutf8 {
|
|
|
|
(
|
|
|
|
$v:expr
|
|
|
|
) => {{
|
|
|
|
PartialValue::new_iutf8(v.to_string())
|
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! btreeset {
|
|
|
|
() => (
|
|
|
|
compile_error!("BTreeSet needs at least 1 element")
|
|
|
|
);
|
|
|
|
($e:expr) => ({
|
|
|
|
use std::collections::BTreeSet;
|
|
|
|
let mut x: BTreeSet<_> = BTreeSet::new();
|
|
|
|
assert!(x.insert($e));
|
|
|
|
x
|
|
|
|
});
|
|
|
|
($e:expr,) => ({
|
2021-09-15 00:24:37 +02:00
|
|
|
btreeset!($e)
|
|
|
|
});
|
|
|
|
($e:expr, $($item:expr),*) => ({
|
2019-08-27 01:36:54 +02:00
|
|
|
use std::collections::BTreeSet;
|
|
|
|
let mut x: BTreeSet<_> = BTreeSet::new();
|
|
|
|
assert!(x.insert($e));
|
2021-09-15 00:24:37 +02:00
|
|
|
$(assert!(x.insert($item));)*
|
|
|
|
x
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! smolset {
|
|
|
|
() => (
|
|
|
|
compile_error!("SmolSet needs at least 1 element")
|
|
|
|
);
|
|
|
|
($e:expr) => ({
|
|
|
|
use smolset::SmolSet;
|
|
|
|
let mut x: SmolSet<_> = SmolSet::new();
|
|
|
|
assert!(x.insert($e));
|
2019-08-27 01:36:54 +02:00
|
|
|
x
|
|
|
|
});
|
2021-09-15 00:24:37 +02:00
|
|
|
($e:expr,) => ({
|
|
|
|
smolset!($e)
|
|
|
|
});
|
2019-08-27 01:36:54 +02:00
|
|
|
($e:expr, $($item:expr),*) => ({
|
2021-09-15 00:24:37 +02:00
|
|
|
use smolset::SmolSet;
|
|
|
|
let mut x: SmolSet<_> = SmolSet::new();
|
2019-08-27 01:36:54 +02:00
|
|
|
assert!(x.insert($e));
|
|
|
|
$(assert!(x.insert($item));)*
|
|
|
|
x
|
|
|
|
});
|
|
|
|
}
|
2021-02-23 09:10:59 +01:00
|
|
|
|
2021-09-15 00:24:37 +02:00
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! btreemap {
|
|
|
|
() => (
|
|
|
|
compile_error!("BTreeSet needs at least 1 element")
|
|
|
|
);
|
|
|
|
($e:expr) => ({
|
|
|
|
use std::collections::BTreeMap;
|
|
|
|
let mut x: BTreeMap<_, _> = BTreeMap::new();
|
|
|
|
let (a, b) = $e;
|
|
|
|
x.insert(a, b);
|
|
|
|
x
|
|
|
|
});
|
|
|
|
($e:expr,) => ({
|
|
|
|
btreemap!($e)
|
|
|
|
});
|
|
|
|
($e:expr, $($item:expr),*) => ({
|
|
|
|
use std::collections::BTreeMap;
|
|
|
|
let mut x: BTreeMap<_, _> = BTreeMap::new();
|
|
|
|
let (a, b) = $e;
|
|
|
|
x.insert(a, b);
|
|
|
|
$(
|
|
|
|
let (a, b) = $item;
|
|
|
|
x.insert(a, b);
|
|
|
|
)*
|
|
|
|
x
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-02-23 09:10:59 +01:00
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! entry_init {
|
|
|
|
() => ({
|
|
|
|
let e1: Entry<EntryInit, EntryNew> = Entry::new();
|
|
|
|
e1
|
|
|
|
});
|
|
|
|
($ava:expr) => ({
|
|
|
|
let mut e1: Entry<EntryInit, EntryNew> = Entry::new();
|
|
|
|
e1.add_ava($ava.0, $ava.1);
|
|
|
|
e1
|
|
|
|
});
|
|
|
|
($ava:expr, $($item:expr),*) => ({
|
|
|
|
let mut e1: Entry<EntryInit, EntryNew> = Entry::new();
|
|
|
|
e1.add_ava($ava.0, $ava.1);
|
|
|
|
$(e1.add_ava($item.0, $item.1);)*
|
|
|
|
e1
|
|
|
|
});
|
|
|
|
}
|
2022-05-24 02:49:34 +02:00
|
|
|
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! mergesets {
|
|
|
|
(
|
|
|
|
$a:expr,
|
|
|
|
$b:expr
|
|
|
|
) => {{
|
|
|
|
$b.iter().for_each(|v| {
|
|
|
|
$a.insert(v.clone());
|
|
|
|
});
|
|
|
|
Ok(())
|
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! mergemaps {
|
|
|
|
(
|
|
|
|
$a:expr,
|
|
|
|
$b:expr
|
|
|
|
) => {{
|
|
|
|
$b.iter().for_each(|(k, v)| {
|
|
|
|
if !$a.contains_key(k) {
|
|
|
|
$a.insert(k.clone(), v.clone());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
Ok(())
|
|
|
|
}};
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! vs_utf8 {
|
|
|
|
() => (
|
|
|
|
compile_error!("ValueSetUtf8 needs at least 1 element")
|
|
|
|
);
|
|
|
|
($e:expr) => ({
|
|
|
|
ValueSetUtf8::new($e)
|
|
|
|
});
|
|
|
|
($e:expr, $($item:expr),*) => ({
|
|
|
|
let mut x = ValueSetUtf8::new($e);
|
|
|
|
$(assert!(x.push($item));)*
|
|
|
|
x
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! vs_iutf8 {
|
|
|
|
() => (
|
|
|
|
compile_error!("ValueSetIutf8 needs at least 1 element")
|
|
|
|
);
|
|
|
|
($e:expr) => ({
|
|
|
|
ValueSetIutf8::new($e)
|
|
|
|
});
|
|
|
|
($e:expr, $($item:expr),*) => ({
|
|
|
|
let mut x = ValueSetIutf8::new($e);
|
|
|
|
$(assert!(x.push($item));)*
|
|
|
|
x
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! vs_iname {
|
|
|
|
() => (
|
|
|
|
compile_error!("ValueSetIname needs at least 1 element")
|
|
|
|
);
|
|
|
|
($e:expr) => ({
|
|
|
|
ValueSetIname::new($e)
|
|
|
|
});
|
|
|
|
($e:expr, $($item:expr),*) => ({
|
|
|
|
let mut x = ValueSetIname::new($e);
|
|
|
|
$(assert!(x.push($item));)*
|
|
|
|
x
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! vs_uuid {
|
|
|
|
() => (
|
|
|
|
compile_error!("ValueSetUuid needs at least 1 element")
|
|
|
|
);
|
|
|
|
($e:expr) => ({
|
|
|
|
ValueSetUuid::new($e)
|
|
|
|
});
|
|
|
|
($e:expr, $($item:expr),*) => ({
|
|
|
|
let mut x = ValueSetUuid::new($e);
|
|
|
|
$(assert!(x.push($item));)*
|
|
|
|
x
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! vs_refer {
|
|
|
|
() => (
|
|
|
|
compile_error!("ValueSetRefer needs at least 1 element")
|
|
|
|
);
|
|
|
|
($e:expr) => ({
|
|
|
|
ValueSetRefer::new($e)
|
|
|
|
});
|
|
|
|
($e:expr, $($item:expr),*) => ({
|
|
|
|
let mut x = ValueSetRefer::new($e);
|
|
|
|
$(assert!(x.push($item));)*
|
|
|
|
x
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! vs_bool {
|
|
|
|
() => (
|
|
|
|
compile_error!("ValueSetBool needs at least 1 element")
|
|
|
|
);
|
|
|
|
($e:expr) => ({
|
|
|
|
ValueSetBool::new($e)
|
|
|
|
});
|
|
|
|
($e:expr, $($item:expr),*) => ({
|
|
|
|
let mut x = ValueSetBool::new($e);
|
|
|
|
$(assert!(x.push($item));)*
|
|
|
|
x
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! vs_syntax {
|
|
|
|
() => (
|
|
|
|
compile_error!("ValueSetSyntax needs at least 1 element")
|
|
|
|
);
|
|
|
|
($e:expr) => ({
|
|
|
|
ValueSetSyntax::new($e)
|
|
|
|
});
|
|
|
|
($e:expr, $($item:expr),*) => ({
|
|
|
|
let mut x = ValueSetSyntax::new($e);
|
|
|
|
$(assert!(x.push($item));)*
|
|
|
|
x
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! vs_index {
|
|
|
|
() => (
|
|
|
|
compile_error!("ValueSetIndex needs at least 1 element")
|
|
|
|
);
|
|
|
|
($e:expr) => ({
|
|
|
|
ValueSetIndex::new($e)
|
|
|
|
});
|
|
|
|
($e:expr, $($item:expr),*) => ({
|
|
|
|
let mut x = ValueSetIndex::new($e);
|
|
|
|
$(assert!(x.push($item));)*
|
|
|
|
x
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(unused_macros)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! vs_cid {
|
|
|
|
() => (
|
|
|
|
compile_error!("ValueSetCid needs at least 1 element")
|
|
|
|
);
|
|
|
|
($e:expr) => ({
|
|
|
|
ValueSetCid::new($e)
|
|
|
|
});
|
|
|
|
($e:expr, $($item:expr),*) => ({
|
|
|
|
let mut x = ValueSetCid::new($e);
|
|
|
|
$(assert!(x.push($item));)*
|
|
|
|
x
|
|
|
|
});
|
|
|
|
}
|