use super::ICacheEntryValidity;
static ALWAYS_VALID_INSTANCE: AlwaysValidCacheEntryValidity =
AlwaysValidCacheEntryValidity { _identity: 0 };
pub struct AlwaysValidCacheEntryValidity {
_identity: u8,
}
#[allow(clippy::new_without_default)]
impl AlwaysValidCacheEntryValidity {
pub const INSTANCE: &'static Self = &ALWAYS_VALID_INSTANCE;
#[must_use]
pub const fn new() -> Self {
Self { _identity: 0 }
}
#[must_use]
pub const fn is_cacheable(&self) -> bool {
true
}
#[must_use]
pub const fn is_cache_still_valid(&self) -> bool {
true
}
}
impl ICacheEntryValidity for AlwaysValidCacheEntryValidity {
fn is_cacheable(&self) -> bool {
Self::is_cacheable(self)
}
fn is_cache_still_valid(&self) -> bool {
Self::is_cache_still_valid(self)
}
}
#[cfg(test)]
mod tests {
use super::AlwaysValidCacheEntryValidity;
use crate::cache::ICacheEntryValidity;
#[test]
fn singleton_and_public_constructor_have_java_behavior() {
let first = AlwaysValidCacheEntryValidity::new();
let second = AlwaysValidCacheEntryValidity::new();
assert!(AlwaysValidCacheEntryValidity::INSTANCE.is_cacheable());
assert!(AlwaysValidCacheEntryValidity::INSTANCE.is_cache_still_valid());
assert!(!std::ptr::eq(&first, &second));
assert!(!std::ptr::eq(
&first,
AlwaysValidCacheEntryValidity::INSTANCE
));
assert!(std::ptr::eq(
AlwaysValidCacheEntryValidity::INSTANCE,
AlwaysValidCacheEntryValidity::INSTANCE
));
}
#[test]
fn dynamic_contract_also_returns_true() {
let validity: &dyn ICacheEntryValidity = AlwaysValidCacheEntryValidity::INSTANCE;
assert!(validity.is_cacheable());
assert!(validity.is_cache_still_valid());
}
}