MockEnumerable.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the Apache 2.0 License.
  3. // See the LICENSE file in the project root for more information.
  4. using System.Collections.Generic;
  5. using System.Reactive.Concurrency;
  6. using Microsoft.Reactive.Testing;
  7. using System;
  8. namespace ReactiveTests
  9. {
  10. public class MockEnumerable<T> : IEnumerable<T>
  11. {
  12. public readonly TestScheduler Scheduler;
  13. public readonly List<Subscription> Subscriptions = new List<Subscription>();
  14. IEnumerable<T> underlyingEnumerable;
  15. public MockEnumerable(TestScheduler scheduler, IEnumerable<T> underlyingEnumerable)
  16. {
  17. if (scheduler == null)
  18. throw new ArgumentNullException(nameof(scheduler));
  19. if (underlyingEnumerable == null)
  20. throw new ArgumentNullException(nameof(underlyingEnumerable));
  21. Scheduler = scheduler;
  22. this.underlyingEnumerable = underlyingEnumerable;
  23. }
  24. public IEnumerator<T> GetEnumerator()
  25. {
  26. return new MockEnumerator(Scheduler, Subscriptions, underlyingEnumerable.GetEnumerator());
  27. }
  28. System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
  29. {
  30. return GetEnumerator();
  31. }
  32. class MockEnumerator : IEnumerator<T>
  33. {
  34. List<Subscription> subscriptions;
  35. IEnumerator<T> enumerator;
  36. TestScheduler scheduler;
  37. int index;
  38. bool disposed = false;
  39. public MockEnumerator(TestScheduler scheduler, List<Subscription> subscriptions, IEnumerator<T> enumerator)
  40. {
  41. this.subscriptions = subscriptions;
  42. this.enumerator = enumerator;
  43. this.scheduler = scheduler;
  44. index = subscriptions.Count;
  45. subscriptions.Add(new Subscription(scheduler.Clock));
  46. }
  47. public T Current
  48. {
  49. get
  50. {
  51. if (disposed)
  52. throw new ObjectDisposedException("this");
  53. return enumerator.Current;
  54. }
  55. }
  56. public void Dispose()
  57. {
  58. if (!disposed)
  59. {
  60. disposed = true;
  61. enumerator.Dispose();
  62. subscriptions[index] = new Subscription(subscriptions[index].Subscribe, scheduler.Clock);
  63. }
  64. }
  65. object System.Collections.IEnumerator.Current
  66. {
  67. get { return Current; }
  68. }
  69. public bool MoveNext()
  70. {
  71. if (disposed)
  72. throw new ObjectDisposedException("this");
  73. return enumerator.MoveNext();
  74. }
  75. public void Reset()
  76. {
  77. if (disposed)
  78. throw new ObjectDisposedException("this");
  79. enumerator.Reset();
  80. }
  81. }
  82. }
  83. }