Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.59 KB | None | 0 0
  1. public sealed class ReactiveStubObserver : IStubObserver
  2. {
  3.  
  4. readonly ISubject<Tuple<Type, Delegate>> _subject1;
  5. readonly ISubject<Tuple<Type, Delegate, object>> _subject2;
  6. readonly ISubject<Tuple<Type, Delegate, object, object>> _subject3;
  7. readonly ISubject<Tuple<Type, Delegate, object, object, object>> _subject4;
  8. readonly ISubject<Tuple<Type, Delegate, object[]>> _subject5;
  9.  
  10. public ReactiveStubObserver(IObserver<Tuple<Type, Delegate, object[]>> observer) : this(CreateSubject(observer))
  11. {
  12. }
  13.  
  14. public ReactiveStubObserver(ISubject<Tuple<Type, Delegate, object[]>> subject) : this(ToSubject1(subject), ToSubject2(subject), ToSubject3(subject), ToSubject4(subject), subject)
  15. {
  16. }
  17.  
  18. 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)
  19. {
  20. _subject1 = subject1;
  21. _subject2 = subject2;
  22. _subject3 = subject3;
  23. _subject4 = subject4;
  24. _subject5 = subject5;
  25. }
  26.  
  27. public void Enter(Type stubbedType, Delegate stubCall)
  28. {
  29. _subject1.OnNext(new Tuple<Type, Delegate>(stubbedType, stubCall));
  30. }
  31.  
  32. public void Enter(Type stubbedType, Delegate stubCall, object arg1)
  33. {
  34. _subject2.OnNext(new Tuple<Type, Delegate, object>(stubbedType, stubCall, arg1));
  35. }
  36.  
  37. public void Enter(Type stubbedType, Delegate stubCall, object arg1, object arg2)
  38. {
  39. _subject3.OnNext(new Tuple<Type, Delegate, object, object>(stubbedType, stubCall, arg1, arg2));
  40. }
  41.  
  42. public void Enter(Type stubbedType, Delegate stubCall, object arg1, object arg2, object arg3)
  43. {
  44. _subject4.OnNext(new Tuple<Type, Delegate, object, object, object>(stubbedType, stubCall, arg1, arg2, arg3));
  45. }
  46.  
  47. public void Enter(Type stubbedType, Delegate stubCall, params object[] args)
  48. {
  49. _subject5.OnNext(new Tuple<Type, Delegate, object[]>(stubbedType, stubCall, args));
  50. }
  51.  
  52. static ISubject<Tuple<Type, Delegate, object[]>> CreateSubject(IObserver<Tuple<Type, Delegate, object[]>> observer)
  53. {
  54. var subject = new Subject<Tuple<Type, Delegate, object[]>>();
  55. subject.Subscribe(observer);
  56. return subject;
  57. }
  58.  
  59. static ISubject<Tuple<Type, Delegate>> ToSubject1(ISubject<Tuple<Type, Delegate, object[]>> subject)
  60. {
  61. var observer = Observer.Create<Tuple<Type, Delegate>>(value => subject.OnNext(new Tuple<Type, Delegate, object[]>(value.Item1, value.Item2, new object[0])));
  62. var observable = subject.Select(value => new Tuple<Type, Delegate>(value.Item1, value.Item2));
  63. return Subject.Create<Tuple<Type, Delegate>>(observer, observable);
  64. }
  65.  
  66. static ISubject<Tuple<Type, Delegate, object>> ToSubject2(ISubject<Tuple<Type, Delegate, object[]>> subject)
  67. {
  68. var observer = Observer.Create<Tuple<Type, Delegate, object>>(value => subject.OnNext(new Tuple<Type, Delegate, object[]>(value.Item1, value.Item2, new[] { value.Item3 })));
  69. var observable = subject.Select(value => new Tuple<Type, Delegate, object>(value.Item1, value.Item2, value.Item3.FirstOrDefault()));
  70. return Subject.Create<Tuple<Type, Delegate, object>>(observer, observable);
  71. }
  72.  
  73. static ISubject<Tuple<Type, Delegate, object, object>> ToSubject3(ISubject<Tuple<Type, Delegate, object[]>> subject)
  74. {
  75. 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 })));
  76. var observable = subject.Select(value => new Tuple<Type, Delegate, object, object>(value.Item1, value.Item2, value.Item3.FirstOrDefault(), value.Item3.Skip(1).FirstOrDefault()));
  77. return Subject.Create<Tuple<Type, Delegate, object, object>>(observer, observable);
  78. }
  79.  
  80. static ISubject<Tuple<Type, Delegate, object, object, object>> ToSubject4(ISubject<Tuple<Type, Delegate, object[]>> subject)
  81. {
  82. 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 })));
  83. 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()));
  84. return Subject.Create<Tuple<Type, Delegate, object, object, object>>(observer, observable);
  85. }
  86.  
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement