using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Threading.Tasks; using Xunit; using Xunit.Sdk; namespace Octokit.Tests.Helpers { public static class AssertEx { public static void HasAttribute(MemberInfo memberInfo, bool inherit = false) where TAttribute : Attribute { Assert.True(memberInfo.IsDefined(typeof(TAttribute), inherit), memberInfo.ToString() + Environment.NewLine); } public async static Task Throws(Func testCode) where T : Exception { try { await testCode(); Assert.Throws(() => { }); // Use xUnit's default behavior. } catch (T exception) { return exception; } // We should never reach this line. It's here because the compiler doesn't know that // Assert.Throws above will always throw. return null; } static readonly string[] whitespaceArguments = { " ", "\t", "\n", "\n\r", " " }; public static async Task ThrowsWhenGivenWhitespaceArgument(Func action) { foreach (var argument in whitespaceArguments) { await Throws(async () => await action(argument)); } } public static void IsReadOnlyCollection(object instance) where T : class { var collection = instance as ICollection; // The collection == null case is for .NET 4.0 Assert.True(instance is IReadOnlyCollection && (collection == null || collection.IsReadOnly)); } } }