135 lines
3.4 KiB
Rust
135 lines
3.4 KiB
Rust
|
|
#![allow(missing_docs, reason = "may be removed in the future")]
|
||
|
|
#![allow(
|
||
|
|
clippy::missing_const_for_fn,
|
||
|
|
clippy::std_instead_of_core,
|
||
|
|
clippy::std_instead_of_alloc,
|
||
|
|
clippy::alloc_instead_of_core,
|
||
|
|
reason = "irrelevant for tests"
|
||
|
|
)]
|
||
|
|
|
||
|
|
#[cfg(not(all(
|
||
|
|
feature = "default",
|
||
|
|
feature = "alloc",
|
||
|
|
feature = "formatting",
|
||
|
|
feature = "large-dates",
|
||
|
|
feature = "local-offset",
|
||
|
|
feature = "macros",
|
||
|
|
feature = "parsing",
|
||
|
|
feature = "quickcheck",
|
||
|
|
feature = "serde-human-readable",
|
||
|
|
feature = "serde-well-known",
|
||
|
|
feature = "std",
|
||
|
|
feature = "rand",
|
||
|
|
feature = "serde",
|
||
|
|
)))]
|
||
|
|
#[test]
|
||
|
|
fn run_with_all_features() -> Result<(), Box<dyn std::error::Error>> {
|
||
|
|
#[derive(Debug)]
|
||
|
|
struct Error(std::process::ExitStatus);
|
||
|
|
|
||
|
|
impl std::fmt::Display for Error {
|
||
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||
|
|
self.0.fmt(f)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
impl std::error::Error for Error {}
|
||
|
|
|
||
|
|
let status = std::process::Command::new("cargo")
|
||
|
|
.args(["test", "--all-features"])
|
||
|
|
.status()?;
|
||
|
|
|
||
|
|
return if status.success() {
|
||
|
|
Ok(())
|
||
|
|
} else {
|
||
|
|
Err(Box::new(Error(status)))
|
||
|
|
};
|
||
|
|
|
||
|
|
// Intentionally unreachable. This is to show the user a warning when they don't provide
|
||
|
|
// `--all-features`.
|
||
|
|
"Tests must be run with `--all-features`. Because the flag was not provided, `cargo test \
|
||
|
|
--all-features` is run.";
|
||
|
|
}
|
||
|
|
|
||
|
|
macro_rules! require_all_features {
|
||
|
|
($($x:item)*) => {$(
|
||
|
|
#[cfg(all(
|
||
|
|
feature = "default",
|
||
|
|
feature = "alloc",
|
||
|
|
feature = "formatting",
|
||
|
|
feature = "large-dates",
|
||
|
|
feature = "local-offset",
|
||
|
|
feature = "macros",
|
||
|
|
feature = "parsing",
|
||
|
|
feature = "quickcheck",
|
||
|
|
feature = "serde-human-readable",
|
||
|
|
feature = "serde-well-known",
|
||
|
|
feature = "std",
|
||
|
|
feature = "rand",
|
||
|
|
feature = "serde",
|
||
|
|
))]
|
||
|
|
$x
|
||
|
|
)*};
|
||
|
|
}
|
||
|
|
|
||
|
|
require_all_features! {
|
||
|
|
/// Assert that the given expression panics.
|
||
|
|
macro_rules! assert_panic {
|
||
|
|
($($x:tt)*) => {
|
||
|
|
assert!(std::panic::catch_unwind(|| {
|
||
|
|
$($x)*
|
||
|
|
})
|
||
|
|
.is_err())
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// `assert_eq!` or `assert_ne!` depending on the value of `$is_eq`.
|
||
|
|
///
|
||
|
|
/// This provides better diagnostics than `assert_eq!($left == $right, $is_eq)`.
|
||
|
|
macro_rules! assert_eq_ne {
|
||
|
|
($left:expr, $right:expr, $is_eq:expr $(, $($rest:tt)*)?) => {{
|
||
|
|
if $is_eq {
|
||
|
|
assert_eq!($left, $right $(, $($rest)*)?);
|
||
|
|
} else {
|
||
|
|
assert_ne!($left, $right $(, $($rest)*)?);
|
||
|
|
}
|
||
|
|
}}
|
||
|
|
}
|
||
|
|
|
||
|
|
mod convert;
|
||
|
|
mod date;
|
||
|
|
mod derives;
|
||
|
|
mod duration;
|
||
|
|
mod error;
|
||
|
|
mod ext;
|
||
|
|
mod format_description;
|
||
|
|
mod formatting;
|
||
|
|
mod instant;
|
||
|
|
mod macros;
|
||
|
|
mod meta;
|
||
|
|
mod month;
|
||
|
|
mod offset_date_time;
|
||
|
|
mod parse_format_description;
|
||
|
|
mod parsed;
|
||
|
|
mod parsing;
|
||
|
|
mod primitive_date_time;
|
||
|
|
#[path = "quickcheck.rs"]
|
||
|
|
mod quickcheck_mod;
|
||
|
|
mod rand;
|
||
|
|
mod serde;
|
||
|
|
mod serde_helpers;
|
||
|
|
mod time;
|
||
|
|
mod utc_date_time;
|
||
|
|
mod utc_offset;
|
||
|
|
mod util;
|
||
|
|
mod weekday;
|
||
|
|
|
||
|
|
#[cfg(__ui_tests)]
|
||
|
|
#[test]
|
||
|
|
fn compile_fail() {
|
||
|
|
let tests = trybuild::TestCases::new();
|
||
|
|
// Path is relative from `time/Cargo.toml`.
|
||
|
|
tests.compile_fail("./tests/integration/compile-fail/*.rs");
|
||
|
|
}
|
||
|
|
}
|