Defer.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT License.
  3. // See the LICENSE file in the project root for more information.
  4. using System;
  5. using System.Linq;
  6. using Xunit;
  7. namespace Tests
  8. {
  9. public class Defer: Tests
  10. {
  11. [Fact]
  12. public void Defer_Arguments()
  13. {
  14. AssertThrows<ArgumentNullException>(() => EnumerableEx.Defer<int>(null));
  15. }
  16. [Fact]
  17. public void Defer1()
  18. {
  19. var i = 0;
  20. var n = 5;
  21. var xs = EnumerableEx.Defer(() =>
  22. {
  23. i++;
  24. return Enumerable.Range(0, n);
  25. });
  26. Assert.Equal(0, i);
  27. Assert.True(Enumerable.SequenceEqual(xs, Enumerable.Range(0, n)));
  28. Assert.Equal(1, i);
  29. n = 3;
  30. Assert.True(Enumerable.SequenceEqual(xs, Enumerable.Range(0, n)));
  31. Assert.Equal(2, i);
  32. }
  33. [Fact]
  34. public void Defer2()
  35. {
  36. var xs = EnumerableEx.Defer<int>(() =>
  37. {
  38. throw new MyException();
  39. });
  40. AssertThrows<MyException>(() => xs.GetEnumerator().MoveNext());
  41. }
  42. private sealed class MyException : Exception
  43. {
  44. }
  45. }
  46. }