|
|
|
use googletest::description::Description;
|
|
|
|
use googletest::matcher::MatcherResult;
|
|
|
|
use googletest::prelude::*;
|
|
|
|
use protobuf::{AbsentField, Optional, PresentField, ProxiedWithPresence};
|
|
|
|
use std::marker::PhantomData;
|
|
|
|
|
|
|
|
/// ===============================
|
|
|
|
/// IS_UNSET
|
|
|
|
/// ===============================
|
|
|
|
pub fn is_unset<'a, T: std::fmt::Debug + ProxiedWithPresence + ?Sized + 'a>()
|
|
|
|
-> impl Matcher<ActualT = Optional<PresentField<'a, T>, AbsentField<'a, T>>> {
|
|
|
|
UnsetMatcher::<T> { _phantom: PhantomData }
|
|
|
|
}
|
|
|
|
|
|
|
|
struct UnsetMatcher<'a, T: ProxiedWithPresence + ?Sized> {
|
|
|
|
_phantom: PhantomData<PresentField<'a, T>>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a, T: std::fmt::Debug + ProxiedWithPresence + ?Sized> Matcher for UnsetMatcher<'a, T> {
|
|
|
|
type ActualT = Optional<PresentField<'a, T>, AbsentField<'a, T>>;
|
|
|
|
|
|
|
|
fn matches(&self, actual: &Self::ActualT) -> MatcherResult {
|
|
|
|
actual.is_unset().into()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn describe(&self, matcher_result: MatcherResult) -> Description {
|
|
|
|
match matcher_result {
|
|
|
|
MatcherResult::Match => "is not set".into(),
|
|
|
|
MatcherResult::NoMatch => "is set".into(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// ===============================
|
|
|
|
/// IS_SET
|
|
|
|
/// ===============================
|
|
|
|
pub fn is_set<'a, T: std::fmt::Debug + ProxiedWithPresence + ?Sized + 'a>()
|
|
|
|
-> impl Matcher<ActualT = Optional<PresentField<'a, T>, AbsentField<'a, T>>> {
|
|
|
|
SetMatcher::<T> { _phantom: PhantomData }
|
|
|
|
}
|
|
|
|
|
|
|
|
struct SetMatcher<'a, T: ProxiedWithPresence + ?Sized> {
|
|
|
|
_phantom: PhantomData<PresentField<'a, T>>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a, T: std::fmt::Debug + ProxiedWithPresence + ?Sized> Matcher for SetMatcher<'a, T> {
|
|
|
|
type ActualT = Optional<PresentField<'a, T>, AbsentField<'a, T>>;
|
|
|
|
|
|
|
|
fn matches(&self, actual: &Self::ActualT) -> MatcherResult {
|
|
|
|
actual.is_set().into()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn describe(&self, matcher_result: MatcherResult) -> Description {
|
|
|
|
match matcher_result {
|
|
|
|
MatcherResult::Match => "is set".into(),
|
|
|
|
MatcherResult::NoMatch => "is not set".into(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|