Skip to content

Instantly share code, notes, and snippets.

@alexvictoor
Created July 5, 2016 23:46
Show Gist options
  • Save alexvictoor/c1ab713f05fd929d706415fa2abea39c to your computer and use it in GitHub Desktop.
Save alexvictoor/c1ab713f05fd929d706415fa2abea39c to your computer and use it in GitHub Desktop.
Rx Observable FromEvent example
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