[][src]Struct cqrs_proptest::AggregateFromEventSequence

pub struct AggregateFromEventSequence<A, E> where
    A: Aggregate,
    E: AggregateEvent<A>, 
{ /* fields omitted */ }

A wrapper for an aggregate that was generated from an arbitrary sequence of events.

Examples

use cqrs_core::{Aggregate, AggregateEvent, Event};
use cqrs_proptest::AggregateFromEventSequence;
use proptest::{prelude::*, strategy::{LazyTupleUnion, ValueTree, WA}, test_runner::TestRunner, prop_oneof};

#[derive(Debug, Default)]
struct MyAggregate {
    active: bool
}

impl Aggregate for MyAggregate {
    fn aggregate_type() -> &'static str {
        "my_aggregate"
    }
}

#[derive(Clone, Copy, Debug)]
struct CreatedEvent{};

impl Event for CreatedEvent {
    fn event_type(&self) -> &'static str {
        "created"
    }
}

impl AggregateEvent<MyAggregate> for CreatedEvent {
    fn apply_to(self, aggregate: &mut MyAggregate) {
        aggregate.active = true;
    }
}

#[derive(Clone, Copy, Debug)]
struct DeletedEvent{};

impl Event for DeletedEvent {
    fn event_type(&self) -> &'static str {
        "deleted"
    }
}

impl AggregateEvent<MyAggregate> for DeletedEvent {
    fn apply_to(self, aggregate: &mut MyAggregate) {
        aggregate.active = false;
    }
}

#[derive(Clone, Copy, Debug)]
enum MyEvents {
    Created(CreatedEvent),
    Deleted(DeletedEvent),
}

impl Event for MyEvents {
    fn event_type(&self) -> &'static str {
        match *self {
            MyEvents::Created(ref e) => e.event_type(),
            MyEvents::Deleted(ref e) => e.event_type(),
        }
    }
}

impl AggregateEvent<MyAggregate> for MyEvents {
    fn apply_to(self, aggregate: &mut MyAggregate) {
        match self {
            MyEvents::Created(e) => e.apply_to(aggregate),
            MyEvents::Deleted(e) => e.apply_to(aggregate),
        }
    }
}

impl Arbitrary for MyEvents {
    type Parameters = ();

    fn arbitrary_with(_: Self::Parameters) -> Self::Strategy {
        prop_oneof![
            Just(MyEvents::Created(CreatedEvent{})),
            Just(MyEvents::Deleted(DeletedEvent{})),
        ]
    }

    type Strategy = LazyTupleUnion<(WA<Just<Self>>, WA<Just<Self>>)>;
}

any::<AggregateFromEventSequence<MyAggregate, MyEvents>>()
    .new_tree(&mut TestRunner::default())
    .unwrap()
    .current()
    .into_aggregate();

let parameters = (prop::collection::SizeRange::from(1..10), ());
any_with::<AggregateFromEventSequence<MyAggregate, MyEvents>>(parameters)
    .new_tree(&mut TestRunner::default())
    .unwrap()
    .current();

Methods

impl<A, E> AggregateFromEventSequence<A, E> where
    A: Aggregate,
    E: AggregateEvent<A>, 
[src]

pub fn into_aggregate(self) -> A[src]

Unwraps the generated aggregate.

Trait Implementations

impl<A: Copy, E: Copy> Copy for AggregateFromEventSequence<A, E> where
    A: Aggregate,
    E: AggregateEvent<A>, 
[src]

impl<A: Default, E: Default> Default for AggregateFromEventSequence<A, E> where
    A: Aggregate,
    E: AggregateEvent<A>, 
[src]

impl<A: Clone, E: Clone> Clone for AggregateFromEventSequence<A, E> where
    A: Aggregate,
    E: AggregateEvent<A>, 
[src]

fn clone_from(&mut self, source: &Self)1.0.0[src]

Performs copy-assignment from source. Read more

impl<A: PartialEq, E: PartialEq> PartialEq<AggregateFromEventSequence<A, E>> for AggregateFromEventSequence<A, E> where
    A: Aggregate,
    E: AggregateEvent<A>, 
[src]

impl<A, E> From<A> for AggregateFromEventSequence<A, E> where
    A: Aggregate,
    E: AggregateEvent<A>, 
[src]

impl<A: Eq, E: Eq> Eq for AggregateFromEventSequence<A, E> where
    A: Aggregate,
    E: AggregateEvent<A>, 
[src]

impl<A, E> Debug for AggregateFromEventSequence<A, E> where
    A: Aggregate + Debug,
    E: AggregateEvent<A>, 
[src]

impl<A: Hash, E: Hash> Hash for AggregateFromEventSequence<A, E> where
    A: Aggregate,
    E: AggregateEvent<A>, 
[src]

fn hash_slice<H>(data: &[Self], state: &mut H) where
    H: Hasher
1.3.0[src]

Feeds a slice of this type into the given [Hasher]. Read more

impl<A, E> Arbitrary for AggregateFromEventSequence<A, E> where
    A: Aggregate + Debug,
    E: AggregateEvent<A> + Arbitrary + 'static, 
[src]

type Parameters = (SizeRange, <E as Arbitrary>::Parameters)

The type of parameters that [arbitrary_with] accepts for configuration of the generated [Strategy]. Parameters must implement [Default]. Read more

type Strategy = BoxedStrategy<Self>

The type of [Strategy] used to generate values of type Self. Read more

fn arbitrary() -> Self::Strategy[src]

Generates a [Strategy] for producing arbitrary values of type the implementing type (Self). Read more

Auto Trait Implementations

impl<A, E> !Sync for AggregateFromEventSequence<A, E>

impl<A, E> Unpin for AggregateFromEventSequence<A, E> where
    A: Unpin,
    E: Unpin

impl<A, E> !Send for AggregateFromEventSequence<A, E>

impl<A, E> UnwindSafe for AggregateFromEventSequence<A, E> where
    A: UnwindSafe,
    E: RefUnwindSafe

impl<A, E> RefUnwindSafe for AggregateFromEventSequence<A, E> where
    A: RefUnwindSafe,
    E: RefUnwindSafe

Blanket Implementations

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T> From<T> for T[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<V, T> VZip<V> for T where
    V: MultiLane<T>,