1 // -----------------------------------------------------------------------
\r
2 // Copyright (c) Microsoft Corporation. All rights reserved.
\r
3 // -----------------------------------------------------------------------
\r
5 using System.Collections.Generic;
\r
7 using System.Collections;
\r
8 using Microsoft.VisualStudio.TestTools.UnitTesting;
\r
9 using Microsoft.Internal.Collections;
\r
11 namespace System.UnitTesting
\r
13 public static class EnumerableAssert
\r
15 public static void IsTrueForAll<T>(IEnumerable<T> source, Predicate<T> predicate)
\r
17 IsTrueForAll(source, predicate, "IsTrueForAll Failed");
\r
20 public static void IsTrueForAll<T>(IEnumerable<T> source, Predicate<T> predicate, string message)
\r
22 Assert.IsNotNull(source, "Source should not be null!");
\r
24 foreach (T t in source)
\r
26 Assert.IsTrue(predicate(t), message);
\r
30 // Needed to prevent strings from matching to the plain IEnumerable overload
\r
31 public static void AreEqual(IEnumerable actual, params string[] expected)
\r
33 AreEqual((IEnumerable)expected, (IEnumerable)actual);
\r
36 public static void AreEqual(IEnumerable actual, params object[] expected)
\r
38 AreEqual((IEnumerable)expected, (IEnumerable)actual);
\r
41 public static void AreEqual<T>(IEnumerable<T> actual, params T[] expected)
\r
43 AreEqual<T>((IEnumerable<T>)expected, (IEnumerable<T>)actual);
\r
46 public static void AreEqual(IEnumerable expected, IEnumerable actual)
\r
48 Assert.AreEqual(expected.Count(), actual.Count(), "Enumerable should contain the correct number of items");
\r
50 List<object> actualList = actual.ToList();
\r
52 foreach (object value in expected)
\r
54 bool removed = actualList.Remove(value);
\r
56 Assert.IsTrue(removed, "Enumerable does not contain value {0}.", value);
\r
59 Assert.AreEqual(0, actualList.Count, "Enumerable contains extra values.");
\r
62 public static void AreEqual<T>(IEnumerable<T> expected, IEnumerable<T> actual)
\r
64 // First, test the IEnumerable implementation
\r
65 AreEqual((IEnumerable)expected, (IEnumerable)actual);
\r
67 // Second, test the IEnumerable<T> implementation
\r
68 Assert.AreEqual(expected.Count(), actual.Count(), "Enumerable should contain the correct number of items");
\r
70 List<T> actualList = actual.ToList();
\r
72 foreach (T value in expected)
\r
74 bool removed = actualList.Remove(value);
\r
76 Assert.IsTrue(removed, "Enumerable does not contain value {0}.", value);
\r
79 Assert.AreEqual(0, actualList.Count, "Enumerable contains extra values.");
\r
82 // Needed to prevent strings from matching to the plain IEnumerable overload
\r
83 public static void AreSequenceEqual(IEnumerable actual, params string[] expected)
\r
85 AreEqual((IEnumerable)expected, (IEnumerable)actual);
\r
88 public static void AreSequenceEqual(IEnumerable actual, params object[] expected)
\r
90 AreEqual((IEnumerable)expected, (IEnumerable)actual);
\r
93 public static void AreSequenceEqual(IEnumerable expected, IEnumerable actual)
\r
95 AreSequenceEqual(expected, actual, (Action<int, object, object>)null);
\r
98 public static void AreSequenceEqual(IEnumerable expected, IEnumerable actual, Action<int, object, object> comparer)
\r
100 if (comparer == null)
\r
102 comparer = (i, left, right) => Assert.AreEqual(left, right, "Enumerable at index {0} should have same value", i);
\r
105 int expectedCount = expected.Count();
\r
107 Assert.AreEqual(expectedCount, actual.Count(), "Enumerable should contain the correct number of items");
\r
109 IEnumerator actualEnumerator = actual.GetEnumerator();
\r
110 IEnumerator expectedEnumerator = expected.GetEnumerator();
\r
113 while (index < expectedCount)
\r
115 Assert.IsTrue(actualEnumerator.MoveNext());
\r
116 Assert.IsTrue(expectedEnumerator.MoveNext());
\r
118 comparer(index, expectedEnumerator.Current, actualEnumerator.Current);
\r
123 public static void AreSequenceEqual<T>(IEnumerable<T> actual, params T[] expected)
\r
125 AreSequenceEqual<T>((IEnumerable<T>)expected, (IEnumerable<T>)actual);
\r
128 public static void AreSequenceEqual<T>(IEnumerable<T> expected, IEnumerable<T> actual)
\r
130 AreSequenceEqual<T>(expected, actual, (Action<int, T, T>)null);
\r
133 public static void AreSequenceEqual<T>(IEnumerable<T> expected, IEnumerable<T> actual, Action<int, T, T> comparer)
\r
135 if (comparer == null)
\r
137 comparer = (i, left, right) => Assert.AreEqual(left, right, "Enumerable at index {0} should have same value", i);
\r
140 // First, test the IEnumerable implementation
\r
141 AreSequenceEqual((IEnumerable)expected, (IEnumerable)actual, (Action<int, object, object>)((currentIndex, left, right) => comparer(currentIndex, (T)left, (T)right)));
\r
143 // Second, test the IEnumerable<T> implementation
\r
144 int expectedCount = expected.Count();
\r
146 IEnumerator<T> actualEnumerator = actual.GetEnumerator();
\r
147 IEnumerator<T> expectedEnumerator = expected.GetEnumerator();
\r
150 while (index < expectedCount)
\r
152 Assert.IsTrue(actualEnumerator.MoveNext());
\r
153 Assert.IsTrue(expectedEnumerator.MoveNext());
\r
155 comparer(index, expectedEnumerator.Current, actualEnumerator.Current);
\r
160 public static void AreSequenceSame<T>(IEnumerable<T> expected, IEnumerable<T> actual)
\r
162 AreSequenceEqual<T>(expected, actual, (index, left, right) =>
\r
164 Assert.AreSame(left, right, "Enumerable at index {0} should have same value", index);
\r
168 public static void AreEqual<TKey, TValue>(IDictionary<TKey, TValue> expected, IDictionary<TKey, TValue> actual)
\r
170 Assert.AreEqual(expected.Count, actual.Count, "Dictionaries are different : first has '{0} elements, whereas second has '{1}", expected.Count, actual.Count);
\r
172 foreach (KeyValuePair<TKey, TValue> kvp in expected)
\r
174 TValue firstValue = kvp.Value;
\r
175 TValue secondValue = default(TValue);
\r
176 if (!actual.TryGetValue(kvp.Key, out secondValue))
\r
178 Assert.Fail("Dictionaries are different : There is no item with key '{0}' in the second dictionary", kvp.Key);
\r
181 if ((firstValue is IDictionary<TKey, TValue>) && (secondValue is IDictionary<TKey, TValue>))
\r
183 AreEqual((IDictionary<TKey, TValue>)firstValue, (IDictionary<TKey, TValue>)secondValue);
\r
187 Assert.AreEqual(kvp.Value, secondValue, "Dictionaries are different : values for key '{0}' are different - '{1}' vs '{2}'", kvp.Key, firstValue, secondValue);
\r
192 /// Verifies that the specified enumerable is empty.
\r
194 public static void IsEmpty(IEnumerable source)
\r
196 IsEmpty(source, null);
\r
199 public static void IsEmpty(IEnumerable source, string message)
\r
201 Assert.AreEqual(0, source.Count(), message);
\r