blob: 70bea18464b01ad606369932f5ea67a0edf5069d [file] [log] [blame] [edit]
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(),
}
}
}