public void ShouldPollForEvents() { var pollSequence = new Sequence(); var bufferSequence = new Sequence(); var gatingSequence = new Sequence(); var sequencerMock = new Mock <ISequencer>(); var sequencer = sequencerMock.Object; var handled = false; Func <object, long, bool, bool> handler = (ev, seq, end) => { handled = true; return(false); }; var providerMock = new Mock <IDataProvider <object> >(); var provider = providerMock.Object; var poller = EventPoller <object> .NewInstance(provider, sequencer, pollSequence, bufferSequence, gatingSequence); var @event = new object(); object states = PollState.Idle; sequencerMock.SetupGet(x => x.Cursor) .Returns(() => { switch ((PollState)states) { case PollState.Processing: return(0L); case PollState.Gating: return(0L); case PollState.Idle: return(-1L); default: throw new ArgumentOutOfRangeException(); } }); sequencerMock.Setup(x => x.GetHighestPublishedSequence(0L, -1L)).Returns(-1L); sequencerMock.Setup(x => x.GetHighestPublishedSequence(0L, 0L)).Returns(0L); providerMock.Setup(x => x[0]).Returns(() => (PollState)states == PollState.Processing ? @event : null); // Initial State - nothing published. states = PollState.Idle; Assert.That(poller.Poll(handler), Is.EqualTo(PollState.Idle)); // Publish Event. states = PollState.Gating; bufferSequence.IncrementAndGet(); Assert.That(poller.Poll(handler), Is.EqualTo(PollState.Gating)); states = PollState.Processing; gatingSequence.IncrementAndGet(); Assert.That(poller.Poll(handler), Is.EqualTo(PollState.Processing)); Assert.That(handled, Is.True); }
/// <summary> /// Creates an event poller for this sequence that will use the supplied data provider and /// gating sequences. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="provider">The data source for users of this event poller</param> /// <param name="gatingSequences">Sequence to be gated on.</param> /// <returns>A poller that will gate on this ring buffer and the supplied sequences.</returns> public EventPoller <T> NewPoller <T>(IDataProvider <T> provider, params ISequence[] gatingSequences) { return(EventPoller <T> .NewInstance(provider, this, new Sequence(), _cursor, gatingSequences)); }