ToDictionary.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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;
  8. using System.Threading.Tasks;
  9. using Xunit;
  10. namespace Tests
  11. {
  12. public class ToDictionary : AsyncEnumerableTests
  13. {
  14. [Fact]
  15. public async Task ToDictionary_Null()
  16. {
  17. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int>(default(IAsyncEnumerable<int>), x => 0));
  18. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int>(Return42, default(Func<int, int>)));
  19. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int>(default(IAsyncEnumerable<int>), x => 0, EqualityComparer<int>.Default));
  20. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int>(Return42, default(Func<int, int>), EqualityComparer<int>.Default));
  21. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int>(Return42, x => 0, default(IEqualityComparer<int>)));
  22. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int, int>(default(IAsyncEnumerable<int>), x => 0, x => 0));
  23. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int, int>(Return42, default(Func<int, int>), x => 0));
  24. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int, int>(Return42, x => 0, default(Func<int, int>)));
  25. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int, int>(default(IAsyncEnumerable<int>), x => 0, x => 0, EqualityComparer<int>.Default));
  26. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int, int>(Return42, default(Func<int, int>), x => 0, EqualityComparer<int>.Default));
  27. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int, int>(Return42, x => 0, default(Func<int, int>), EqualityComparer<int>.Default));
  28. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int, int>(Return42, x => 0, x => 0, default(IEqualityComparer<int>)));
  29. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int>(default(IAsyncEnumerable<int>), x => 0, CancellationToken.None));
  30. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int>(Return42, default(Func<int, int>), CancellationToken.None));
  31. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int>(default(IAsyncEnumerable<int>), x => 0, EqualityComparer<int>.Default, CancellationToken.None));
  32. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int>(Return42, default(Func<int, int>), EqualityComparer<int>.Default, CancellationToken.None));
  33. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int>(Return42, x => 0, default(IEqualityComparer<int>), CancellationToken.None));
  34. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int, int>(default(IAsyncEnumerable<int>), x => 0, x => 0, CancellationToken.None));
  35. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int, int>(Return42, default(Func<int, int>), x => 0, CancellationToken.None));
  36. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int, int>(Return42, x => 0, default(Func<int, int>), CancellationToken.None));
  37. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int, int>(default(IAsyncEnumerable<int>), x => 0, x => 0, EqualityComparer<int>.Default, CancellationToken.None));
  38. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int, int>(Return42, default(Func<int, int>), x => 0, EqualityComparer<int>.Default, CancellationToken.None));
  39. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int, int>(Return42, x => 0, default(Func<int, int>), EqualityComparer<int>.Default, CancellationToken.None));
  40. await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.ToDictionary<int, int, int>(Return42, x => 0, x => 0, default(IEqualityComparer<int>), CancellationToken.None));
  41. }
  42. [Fact]
  43. public void ToDictionary1()
  44. {
  45. var xs = new[] { 1, 4 }.ToAsyncEnumerable();
  46. var res = xs.ToDictionary(x => x % 2).Result;
  47. Assert.True(res[0] == 4);
  48. Assert.True(res[1] == 1);
  49. }
  50. [Fact]
  51. public void ToDictionary2()
  52. {
  53. var xs = new[] { 1, 4, 2 }.ToAsyncEnumerable();
  54. AssertThrows<Exception>(() => xs.ToDictionary(x => x % 2).Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() is ArgumentException);
  55. }
  56. [Fact]
  57. public void ToDictionary3()
  58. {
  59. var xs = new[] { 1, 4 }.ToAsyncEnumerable();
  60. var res = xs.ToDictionary(x => x % 2, x => x + 1).Result;
  61. Assert.True(res[0] == 5);
  62. Assert.True(res[1] == 2);
  63. }
  64. [Fact]
  65. public void ToDictionary4()
  66. {
  67. var xs = new[] { 1, 4, 2 }.ToAsyncEnumerable();
  68. AssertThrows<Exception>(() => xs.ToDictionary(x => x % 2, x => x + 1).Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() is ArgumentException);
  69. }
  70. [Fact]
  71. public void ToDictionary5()
  72. {
  73. var xs = new[] { 1, 4 }.ToAsyncEnumerable();
  74. var res = xs.ToDictionary(x => x % 2, new Eq()).Result;
  75. Assert.True(res[0] == 4);
  76. Assert.True(res[1] == 1);
  77. }
  78. [Fact]
  79. public void ToDictionary6()
  80. {
  81. var xs = new[] { 1, 4, 2 }.ToAsyncEnumerable();
  82. AssertThrows<Exception>(() => xs.ToDictionary(x => x % 2, new Eq()).Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() is ArgumentException);
  83. }
  84. [Fact]
  85. public void ToDictionary7()
  86. {
  87. var xs = new[] { 1, 4 }.ToAsyncEnumerable();
  88. var res = xs.ToDictionary(x => x % 2, x => x, new Eq()).Result;
  89. Assert.True(res[0] == 4);
  90. Assert.True(res[1] == 1);
  91. }
  92. private sealed class Eq : IEqualityComparer<int>
  93. {
  94. public bool Equals(int x, int y)
  95. {
  96. return EqualityComparer<int>.Default.Equals(Math.Abs(x), Math.Abs(y));
  97. }
  98. public int GetHashCode(int obj)
  99. {
  100. return EqualityComparer<int>.Default.GetHashCode(Math.Abs(obj));
  101. }
  102. }
  103. }
  104. }