2019-10-20 07:54:01 +00:00
|
|
|
/// This is just a huge hack to make a test runner (with no test cases)
|
|
|
|
/// look as if it's running a bunch of (async) test cases.
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! async_tests {
|
|
|
|
( $runner:ident { $( $name:ident : async $eval:block, )* } ) => {
|
|
|
|
fn $runner(_: &[()]) {
|
2019-11-03 03:55:07 +00:00
|
|
|
env_logger::init();
|
2019-10-20 07:54:01 +00:00
|
|
|
|
|
|
|
std::process::exit({
|
2019-10-31 05:52:00 +00:00
|
|
|
let mut rt = tokio::runtime::current_thread::Runtime::new()
|
|
|
|
.expect("Failed to create runtime.");
|
2019-10-20 07:54:01 +00:00
|
|
|
|
|
|
|
let (_, errs) = rt.block_on(async {
|
|
|
|
println!();
|
|
|
|
println!("running tests");
|
|
|
|
println!();
|
|
|
|
let mut oks: u32 = 0;
|
|
|
|
let mut errs: u32 = 0;
|
|
|
|
$(
|
|
|
|
let $name = async {
|
2019-11-03 03:55:07 +00:00
|
|
|
let result: std::result::Result<(), String> = async {
|
2019-10-20 07:54:01 +00:00
|
|
|
$eval
|
|
|
|
}.await;
|
2019-11-03 03:55:07 +00:00
|
|
|
result
|
2019-10-20 07:54:01 +00:00
|
|
|
};
|
2019-11-03 03:55:07 +00:00
|
|
|
let $name = tokio::executor::Executor::spawn_with_handle(
|
|
|
|
&mut tokio::executor::DefaultExecutor::current(), $name)
|
|
|
|
.expect("Failed to spawn.");
|
2019-10-20 07:54:01 +00:00
|
|
|
)*
|
|
|
|
$(
|
|
|
|
let $name = $name.await;
|
2019-11-03 03:55:07 +00:00
|
|
|
)*
|
|
|
|
$(
|
|
|
|
print!("test {} ... ", stringify!($name));
|
|
|
|
match $name {
|
|
|
|
Ok(_) => {
|
|
|
|
println!("{}", "ok".green());
|
|
|
|
oks += 1;
|
|
|
|
}
|
|
|
|
Err(msg) => {
|
|
|
|
println!("{}", "error".bright_red());
|
|
|
|
println!("{}", msg);
|
|
|
|
errs += 1;
|
|
|
|
}
|
|
|
|
}
|
2019-10-20 07:54:01 +00:00
|
|
|
)*
|
|
|
|
println!();
|
|
|
|
print!("test result: {}. ", if errs > 0 { "error".bright_red() } else { "ok".green() });
|
|
|
|
println!("{} passed; {} failed; 0 ignored; 0 measured; 0 filtered out", oks, errs);
|
|
|
|
println!();
|
|
|
|
(oks, errs)
|
|
|
|
});
|
|
|
|
// Just returns #errs as exit code.
|
|
|
|
errs as i32
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! rassert {
|
|
|
|
( $x:expr ) => {
|
|
|
|
{
|
|
|
|
if $x { Ok(()) } else { Err(stringify!($x)) }?
|
|
|
|
}
|
|
|
|
};
|
2019-10-21 02:28:29 +00:00
|
|
|
( $x:expr, $format:expr $(, $arg:expr)* ) => {
|
|
|
|
{
|
|
|
|
if $x { Ok(()) } else { Err( format!($format, $( $arg )* ) ) }?
|
|
|
|
}
|
|
|
|
};
|
2019-10-20 07:54:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! rassert_eq {
|
|
|
|
( $a:expr, $b:expr ) => { rassert!($a == $b) };
|
2019-10-30 20:24:07 +00:00
|
|
|
( $a:expr, $b:expr, $format:expr $(, $arg:expr)* ) => {
|
2019-10-31 05:52:00 +00:00
|
|
|
rassert!($a == $b, $format $(, $arg )* )
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! rassert_ne {
|
|
|
|
( $a:expr, $b:expr ) => { rassert!($a != $b) };
|
|
|
|
( $a:expr, $b:expr, $format:expr $(, $arg:expr)* ) => {
|
|
|
|
rassert!($a != $b, $format $(, $arg )* )
|
2019-10-30 20:24:07 +00:00
|
|
|
};
|
2019-10-20 07:54:01 +00:00
|
|
|
}
|