Git 客户端,采用 C# 编写。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

103 lines
3.6 KiB

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#nullable enable
using System.Collections;
using NUnit.Framework;
using NUnit.Framework.Constraints;
namespace CommonTestUtils
{
public static class AssertEx
{
public static async Task<Exception?> ThrowsAsync(IResolveConstraint expression, AsyncTestDelegate code, string message, params object?[] args)
{
Exception? caughtException = null;
try
{
await code();
}
catch (Exception e)
{
caughtException = e;
}
ClassicAssert.That<Exception?>(caughtException, expression, string.Format(message, args));
return caughtException;
}
public static async Task<Exception?> ThrowsAsync(Type expectedExceptionType, AsyncTestDelegate code, string message, params object?[] args)
{
return await ThrowsAsync(new ExceptionTypeConstraint(expectedExceptionType), code, message, args);
}
public static async Task<TActual?> ThrowsAsync<TActual>(AsyncTestDelegate code, string message, params object?[] args)
where TActual : Exception
{
return (TActual?)(await ThrowsAsync(typeof(TActual), code, message, args));
}
public static async Task<TActual?> ThrowsAsync<TActual>(AsyncTestDelegate code)
where TActual : Exception
{
return await ThrowsAsync<TActual>(code, string.Empty);
}
public static void SequenceEqual<T>(
IEnumerable<T> expected,
IEnumerable<T> actual,
IEqualityComparer<T>? comparer = null)
{
comparer ??= EqualityComparer<T>.Default;
if (expected is ICollection c1 && actual is ICollection c2)
{
ClassicAssert.AreEqual(c1.Count, c2.Count, "Invalid collection count");
}
int index = 0;
using IEnumerator<T> expectedEnumerator = expected.GetEnumerator();
using IEnumerator<T> actualEnumerator = actual.GetEnumerator();
while (true)
{
bool expectedHasNext = expectedEnumerator.MoveNext();
bool actualHasNext = actualEnumerator.MoveNext();
switch (expectedHasNext, actualHasNext)
{
case (false, false):
{
// Both sequences end at the same point. We are finished.
return;
}
case (false, true):
{
throw new($"Expected sequence ended at index {index} while actual sequence has more items.");
}
case (true, false):
{
throw new($"Actual sequence ended at index {index} while expected sequence has more items.");
}
case (true, true):
{
if (!comparer.Equals(expectedEnumerator.Current, actualEnumerator.Current))
{
throw new($"Sequences differ at index {index}.\nExpect: {expectedEnumerator.Current}\nActual: {actualEnumerator.Current}");
}
break;
}
}
index++;
}
}
}
}