Skip to content

Instantly share code, notes, and snippets.

@GeorgeTsiokos
Created April 27, 2017 15:32
Show Gist options
  • Save GeorgeTsiokos/124a1ddde7c0a38c07660774b0bb5203 to your computer and use it in GitHub Desktop.
Save GeorgeTsiokos/124a1ddde7c0a38c07660774b0bb5203 to your computer and use it in GitHub Desktop.
public sealed class ReactiveStubObserver : IStubObserver
{
readonly ISubject<Tuple<Type, Delegate>> _subject1;
readonly ISubject<Tuple<Type, Delegate, object>> _subject2;
readonly ISubject<Tuple<Type, Delegate, object, object>> _subject3;
readonly ISubject<Tuple<Type, Delegate, object, object, object>> _subject4;
readonly ISubject<Tuple<Type, Delegate, object[]>> _subject5;
public ReactiveStubObserver(IObserver<Tuple<Type, Delegate, object[]>> observer) : this(CreateSubject(observer))
{
}
public ReactiveStubObserver(ISubject<Tuple<Type, Delegate, object[]>> subject) : this(ToSubject1(subject), ToSubject2(subject), ToSubject3(subject), ToSubject4(subject), subject)
{
}
public ReactiveStubObserver(ISubject<Tuple<Type, Delegate>> subject1, ISubject<Tuple<Type, Delegate, object>> subject2, ISubject<Tuple<Type, Delegate, object, object>> subject3, ISubject<Tuple<Type, Delegate, object, object, object>> subject4, ISubject<Tuple<Type, Delegate, object[]>> subject5)
{
_subject1 = subject1;
_subject2 = subject2;
_subject3 = subject3;
_subject4 = subject4;
_subject5 = subject5;
}
public void Enter(Type stubbedType, Delegate stubCall)
{
_subject1.OnNext(new Tuple<Type, Delegate>(stubbedType, stubCall));
}
public void Enter(Type stubbedType, Delegate stubCall, object arg1)
{
_subject2.OnNext(new Tuple<Type, Delegate, object>(stubbedType, stubCall, arg1));
}
public void Enter(Type stubbedType, Delegate stubCall, object arg1, object arg2)
{
_subject3.OnNext(new Tuple<Type, Delegate, object, object>(stubbedType, stubCall, arg1, arg2));
}
public void Enter(Type stubbedType, Delegate stubCall, object arg1, object arg2, object arg3)
{
_subject4.OnNext(new Tuple<Type, Delegate, object, object, object>(stubbedType, stubCall, arg1, arg2, arg3));
}
public void Enter(Type stubbedType, Delegate stubCall, params object[] args)
{
_subject5.OnNext(new Tuple<Type, Delegate, object[]>(stubbedType, stubCall, args));
}
static ISubject<Tuple<Type, Delegate, object[]>> CreateSubject(IObserver<Tuple<Type, Delegate, object[]>> observer)
{
var subject = new Subject<Tuple<Type, Delegate, object[]>>();
subject.Subscribe(observer);
return subject;
}
static ISubject<Tuple<Type, Delegate>> ToSubject1(ISubject<Tuple<Type, Delegate, object[]>> subject)
{
var observer = Observer.Create<Tuple<Type, Delegate>>(value => subject.OnNext(new Tuple<Type, Delegate, object[]>(value.Item1, value.Item2, new object[0])));
var observable = subject.Select(value => new Tuple<Type, Delegate>(value.Item1, value.Item2));
return Subject.Create<Tuple<Type, Delegate>>(observer, observable);
}
static ISubject<Tuple<Type, Delegate, object>> ToSubject2(ISubject<Tuple<Type, Delegate, object[]>> subject)
{
var observer = Observer.Create<Tuple<Type, Delegate, object>>(value => subject.OnNext(new Tuple<Type, Delegate, object[]>(value.Item1, value.Item2, new[] { value.Item3 })));
var observable = subject.Select(value => new Tuple<Type, Delegate, object>(value.Item1, value.Item2, value.Item3.FirstOrDefault()));
return Subject.Create<Tuple<Type, Delegate, object>>(observer, observable);
}
static ISubject<Tuple<Type, Delegate, object, object>> ToSubject3(ISubject<Tuple<Type, Delegate, object[]>> subject)
{
var observer = Observer.Create<Tuple<Type, Delegate, object, object>>(value => subject.OnNext(new Tuple<Type, Delegate, object[]>(value.Item1, value.Item2, new[] { value.Item3, value.Item4 })));
var observable = subject.Select(value => new Tuple<Type, Delegate, object, object>(value.Item1, value.Item2, value.Item3.FirstOrDefault(), value.Item3.Skip(1).FirstOrDefault()));
return Subject.Create<Tuple<Type, Delegate, object, object>>(observer, observable);
}
static ISubject<Tuple<Type, Delegate, object, object, object>> ToSubject4(ISubject<Tuple<Type, Delegate, object[]>> subject)
{
var observer = Observer.Create<Tuple<Type, Delegate, object, object, object>>(value => subject.OnNext(new Tuple<Type, Delegate, object[]>(value.Item1, value.Item2, new[] { value.Item3, value.Item4, value.Item5 })));
var observable = subject.Select(value => new Tuple<Type, Delegate, object, object, object>(value.Item1, value.Item2, value.Item3.FirstOrDefault(), value.Item3.Skip(1).FirstOrDefault(), value.Item3.Skip(2).FirstOrDefault()));
return Subject.Create<Tuple<Type, Delegate, object, object, object>>(observer, observable);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment