Distinct.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Threading.Tasks;
  8. using Xunit;
  9. namespace Tests
  10. {
  11. public class Distinct : AsyncEnumerableTests
  12. {
  13. [Fact]
  14. public void Distinct_Null()
  15. {
  16. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Distinct<int>(default(IAsyncEnumerable<int>)));
  17. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Distinct<int>(default(IAsyncEnumerable<int>), EqualityComparer<int>.Default));
  18. AssertThrows<ArgumentNullException>(() => AsyncEnumerable.Distinct<int>(Return42, default(IEqualityComparer<int>)));
  19. }
  20. [Fact]
  21. public void Distinct1()
  22. {
  23. var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct();
  24. var e = xs.GetAsyncEnumerator();
  25. HasNext(e, 1);
  26. HasNext(e, 2);
  27. HasNext(e, 3);
  28. HasNext(e, 5);
  29. HasNext(e, 4);
  30. NoNext(e);
  31. }
  32. [Fact]
  33. public void Distinct2()
  34. {
  35. var xs = new[] { 1, -2, -1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct(new Eq());
  36. var e = xs.GetAsyncEnumerator();
  37. HasNext(e, 1);
  38. HasNext(e, -2);
  39. HasNext(e, 3);
  40. HasNext(e, 5);
  41. HasNext(e, 4);
  42. NoNext(e);
  43. }
  44. [Fact]
  45. public async Task Distinct3()
  46. {
  47. var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct();
  48. var res = new[] { 1, 2, 3, 5, 4 };
  49. Assert.True(res.SequenceEqual(await xs.ToArray()));
  50. }
  51. [Fact]
  52. public async Task Distinct4()
  53. {
  54. var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct();
  55. var res = new List<int> { 1, 2, 3, 5, 4 };
  56. Assert.True(res.SequenceEqual(await xs.ToList()));
  57. }
  58. [Fact]
  59. public async Task Distinct5()
  60. {
  61. var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct();
  62. Assert.Equal(5, await xs.Count());
  63. }
  64. [Fact]
  65. public async Task Distinct10()
  66. {
  67. var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct();
  68. await SequenceIdentity(xs);
  69. }
  70. [Fact]
  71. public void Distinct12()
  72. {
  73. var xs = AsyncEnumerable.Empty<int>().Distinct();
  74. var e = xs.GetAsyncEnumerator();
  75. NoNext(e);
  76. }
  77. private sealed class Eq : IEqualityComparer<int>
  78. {
  79. public bool Equals(int x, int y)
  80. {
  81. return EqualityComparer<int>.Default.Equals(Math.Abs(x), Math.Abs(y));
  82. }
  83. public int GetHashCode(int obj)
  84. {
  85. return EqualityComparer<int>.Default.GetHashCode(Math.Abs(obj));
  86. }
  87. }
  88. }
  89. }