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 Empty(IEnumerable actual, string message) { var empty = Enumerable.Empty(); WithMessage(() => Assert.Equal(empty, actual.ToArray()), message); } public static void WithMessage(Action assert, string message) { try { assert(); } catch(AssertException ex) { throw new Exception(message, ex); } } 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)); } } } }