Created
July 5, 2016 23:46
-
-
Save alexvictoor/c1ab713f05fd929d706415fa2abea39c to your computer and use it in GitHub Desktop.
Rx Observable FromEvent example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Reactive.Disposables; | |
using System.Reactive.Linq; | |
using System.Reactive.Subjects; | |
using System.Text; | |
using System.Threading.Tasks; | |
using NUnit.Framework; | |
namespace MarbleTest.Net.Test | |
{ | |
class ActivationService | |
{ | |
public event Action<bool> Activation; | |
public IObservable<bool> ActivationObservable | |
{ | |
get | |
{ | |
var activationStream = Observable.FromEvent<bool>( | |
handler => | |
{ | |
Activation += handler; | |
}, | |
handler => Activation -= handler); | |
var replaySubject = new ReplaySubject<bool>(1); | |
activationStream.DistinctUntilChanged().Subscribe(replaySubject); | |
return replaySubject; | |
} | |
} | |
public void Send(bool value) | |
{ | |
Activation(value); | |
} | |
} | |
class FromEventTest | |
{ | |
private ActivationService _service; | |
private MarbleScheduler _scheduler; | |
[SetUp] | |
public void SetUp() | |
{ | |
_service = new ActivationService(); | |
_scheduler = new MarbleScheduler(); | |
} | |
[TearDown] | |
public void TearDown() | |
{ | |
_scheduler.Flush(); | |
} | |
public void Schedule(string marbles, Action action) | |
{ | |
_scheduler.Schedule( | |
(Object)null, | |
_scheduler.CreateTime(marbles), | |
(sche, state) => | |
{ | |
action(); | |
return Disposable.Empty; | |
}); | |
} | |
[Test] | |
public void Should_pass_through() | |
{ | |
var filteredStream = _service.ActivationObservable; | |
Schedule("---|", () => _service.Send(true)); | |
_scheduler.ExpectObservable(filteredStream).ToBe("---a", new { a = true}); | |
} | |
[Test] | |
public void Should_remove_doubles() | |
{ | |
var filteredStream = _service.ActivationObservable; | |
Schedule("---|", () => _service.Send(true)); | |
Schedule("-----|", () => _service.Send(true)); | |
_scheduler.ExpectObservable(filteredStream).ToBe("---a", new { a = true }); | |
_scheduler.Flush(); | |
} | |
[Test] | |
public void Should_give_last_known_value() | |
{ | |
var filteredStream = _service.ActivationObservable; | |
Schedule("---|", () => _service.Send(false)); | |
Schedule("-----|", () => _service.Send(true)); | |
var lateStream | |
= _scheduler.CreateColdObservable<bool>("----------|").Concat(filteredStream); | |
filteredStream.Subscribe(); | |
_scheduler.ExpectObservable(lateStream).ToBe("----------a", new { a = true }); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment