From 2e4c28b4ed77104b14edcc62c9c4f5f4eff52100 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Feb 2026 00:18:10 +0000 Subject: [PATCH 1/2] Initial plan From 6336076648b6cbe3e1cd42068c83047210ebae56 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Feb 2026 00:26:43 +0000 Subject: [PATCH 2/2] Add IsAssignableFrom and IsNotAssignableFrom assertions - Add IsAssignableFromAssertion and IsNotAssignableFromAssertion classes - Add IsAssignableFrom/IsNotAssignableFrom to IAssertionSource interface - Implement in all assertion source classes - Update public API snapshots Co-authored-by: thomhurst <30480171+thomhurst@users.noreply.github.com> --- .../Assertions/PropertyAssertion.cs | 12 +++ .../Assertions/Strings/ParseAssertions.cs | 12 +++ TUnit.Assertions/Conditions/ListAssertions.cs | 28 +++++ .../Conditions/MemberAssertion.cs | 12 +++ .../Conditions/ReadOnlyListAssertions.cs | 28 +++++ .../Conditions/TypeOfAssertion.cs | 100 ++++++++++++++++++ .../Conditions/Wrappers/CountWrapper.cs | 20 ++++ .../Conditions/Wrappers/LengthWrapper.cs | 20 ++++ TUnit.Assertions/Core/IAssertionSource.cs | 10 ++ .../Sources/AsyncDelegateAssertion.cs | 32 ++++++ .../Sources/AsyncEnumerableAssertionBase.cs | 14 +++ .../Sources/AsyncFuncAssertion.cs | 12 +++ .../Sources/CollectionAssertionBase.cs | 12 +++ TUnit.Assertions/Sources/DelegateAssertion.cs | 12 +++ TUnit.Assertions/Sources/FuncAssertion.cs | 12 +++ .../Sources/MemoryAssertionBase.cs | 12 +++ TUnit.Assertions/Sources/TaskAssertion.cs | 32 ++++++ TUnit.Assertions/Sources/ValueAssertion.cs | 22 ++++ ...Has_No_API_Changes.DotNet10_0.verified.txt | 46 ++++++++ ..._Has_No_API_Changes.DotNet8_0.verified.txt | 46 ++++++++ ..._Has_No_API_Changes.DotNet9_0.verified.txt | 46 ++++++++ ...ary_Has_No_API_Changes.Net4_7.verified.txt | 44 ++++++++ 22 files changed, 584 insertions(+) diff --git a/TUnit.Assertions/Assertions/PropertyAssertion.cs b/TUnit.Assertions/Assertions/PropertyAssertion.cs index 5b167cf11e..e756de2392 100644 --- a/TUnit.Assertions/Assertions/PropertyAssertion.cs +++ b/TUnit.Assertions/Assertions/PropertyAssertion.cs @@ -133,6 +133,18 @@ public IsNotAssignableToAssertion IsNotAssignableTo() return new IsNotAssignableToAssertion(Context); } + public IsAssignableFromAssertion IsAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsAssignableFromAssertion(Context); + } + + public IsNotAssignableFromAssertion IsNotAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsNotAssignableFromAssertion(Context); + } + /// /// Asserts that the parent object is NOT of the specified type. /// Example: await Assert.That(obj).HasProperty(x => x.Name).IsEqualTo("test").IsNotTypeOf(); diff --git a/TUnit.Assertions/Assertions/Strings/ParseAssertions.cs b/TUnit.Assertions/Assertions/Strings/ParseAssertions.cs index 6de293bcf0..47f2580e61 100644 --- a/TUnit.Assertions/Assertions/Strings/ParseAssertions.cs +++ b/TUnit.Assertions/Assertions/Strings/ParseAssertions.cs @@ -265,6 +265,18 @@ public IsNotAssignableToAssertion IsNotAssignableTo() return new IsNotAssignableToAssertion(Context); } + public IsAssignableFromAssertion IsAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsAssignableFromAssertion(Context); + } + + public IsNotAssignableFromAssertion IsNotAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsNotAssignableFromAssertion(Context); + } + /// /// Asserts that the parsed value is NOT of the specified type. /// Example: await Assert.That("123").WhenParsedInto().IsNotTypeOf(); diff --git a/TUnit.Assertions/Conditions/ListAssertions.cs b/TUnit.Assertions/Conditions/ListAssertions.cs index eee34331dc..0a7b0e9d6f 100644 --- a/TUnit.Assertions/Conditions/ListAssertions.cs +++ b/TUnit.Assertions/Conditions/ListAssertions.cs @@ -158,6 +158,20 @@ public IsNotAssignableToAssertion IsNotAssignableTo Context.ExpressionBuilder.Append($".IsNotAssignableTo<{typeof(TExpected).Name}>()"); return new IsNotAssignableToAssertion(Context); } + + /// + public IsAssignableFromAssertion IsAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TExpected).Name}>()"); + return new IsAssignableFromAssertion(Context); + } + + /// + public IsNotAssignableFromAssertion IsNotAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TExpected).Name}>()"); + return new IsNotAssignableFromAssertion(Context); + } } /// @@ -259,6 +273,20 @@ public IsNotAssignableToAssertion IsNotAssignableTo Context.ExpressionBuilder.Append($".IsNotAssignableTo<{typeof(TExpected).Name}>()"); return new IsNotAssignableToAssertion(Context); } + + /// + public IsAssignableFromAssertion IsAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TExpected).Name}>()"); + return new IsAssignableFromAssertion(Context); + } + + /// + public IsNotAssignableFromAssertion IsNotAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TExpected).Name}>()"); + return new IsNotAssignableFromAssertion(Context); + } } /// diff --git a/TUnit.Assertions/Conditions/MemberAssertion.cs b/TUnit.Assertions/Conditions/MemberAssertion.cs index 1e06c83f86..c1ef097170 100644 --- a/TUnit.Assertions/Conditions/MemberAssertion.cs +++ b/TUnit.Assertions/Conditions/MemberAssertion.cs @@ -169,6 +169,18 @@ public IsNotAssignableToAssertion IsNotAssignableTo() return new IsNotAssignableToAssertion(Context); } + public IsAssignableFromAssertion IsAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsAssignableFromAssertion(Context); + } + + public IsNotAssignableFromAssertion IsNotAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsNotAssignableFromAssertion(Context); + } + /// /// Asserts that the value is NOT of the specified type. /// Example: await Assert.That(obj).Member(x => x.Property).Satisfies(val => val.IsNotTypeOf()); diff --git a/TUnit.Assertions/Conditions/ReadOnlyListAssertions.cs b/TUnit.Assertions/Conditions/ReadOnlyListAssertions.cs index ead5c113ff..9cade6088f 100644 --- a/TUnit.Assertions/Conditions/ReadOnlyListAssertions.cs +++ b/TUnit.Assertions/Conditions/ReadOnlyListAssertions.cs @@ -160,6 +160,20 @@ public IsNotAssignableToAssertion IsNotAssignableTo Context.ExpressionBuilder.Append($".IsNotAssignableTo<{typeof(TExpected).Name}>()"); return new IsNotAssignableToAssertion(Context); } + + /// + public IsAssignableFromAssertion IsAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TExpected).Name}>()"); + return new IsAssignableFromAssertion(Context); + } + + /// + public IsNotAssignableFromAssertion IsNotAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TExpected).Name}>()"); + return new IsNotAssignableFromAssertion(Context); + } } /// @@ -261,6 +275,20 @@ public IsNotAssignableToAssertion IsNotAssignableTo Context.ExpressionBuilder.Append($".IsNotAssignableTo<{typeof(TExpected).Name}>()"); return new IsNotAssignableToAssertion(Context); } + + /// + public IsAssignableFromAssertion IsAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TExpected).Name}>()"); + return new IsAssignableFromAssertion(Context); + } + + /// + public IsNotAssignableFromAssertion IsNotAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TExpected).Name}>()"); + return new IsNotAssignableFromAssertion(Context); + } } /// diff --git a/TUnit.Assertions/Conditions/TypeOfAssertion.cs b/TUnit.Assertions/Conditions/TypeOfAssertion.cs index 50a1ebeb0a..f5261ec5b3 100644 --- a/TUnit.Assertions/Conditions/TypeOfAssertion.cs +++ b/TUnit.Assertions/Conditions/TypeOfAssertion.cs @@ -190,6 +190,106 @@ protected override Task CheckAsync(EvaluationMetadata m protected override string GetExpectation() => $"to not be assignable to {_targetType.Name}"; } +/// +/// Asserts that a value's type is assignable from a specific type (the value's type is a base type or same as TTarget). +/// Works with both direct value assertions and exception assertions (via .And after Throws). +/// +public class IsAssignableFromAssertion : Assertion +{ + private readonly Type _targetType; + + public IsAssignableFromAssertion( + AssertionContext context) + : base(context) + { + _targetType = typeof(TTarget); + } + + protected override Task CheckAsync(EvaluationMetadata metadata) + { + var value = metadata.Value; + var exception = metadata.Exception; + + object? objectToCheck = null; + + // If we have an exception (from Throws/ThrowsExactly), check that + if (exception != null) + { + objectToCheck = exception; + } + // Otherwise check the value + else if (value != null) + { + objectToCheck = value; + } + else + { + return Task.FromResult(AssertionResult.Failed("value was null")); + } + + var actualType = objectToCheck.GetType(); + + if (actualType.IsAssignableFrom(_targetType)) + { + return AssertionResult._passedTask; + } + + return Task.FromResult(AssertionResult.Failed($"type {actualType.Name} is not assignable from {_targetType.Name}")); + } + + protected override string GetExpectation() => $"to be assignable from {_targetType.Name}"; +} + +/// +/// Asserts that a value's type is NOT assignable from a specific type. +/// Works with both direct value assertions and exception assertions (via .And after Throws). +/// +public class IsNotAssignableFromAssertion : Assertion +{ + private readonly Type _targetType; + + public IsNotAssignableFromAssertion( + AssertionContext context) + : base(context) + { + _targetType = typeof(TTarget); + } + + protected override Task CheckAsync(EvaluationMetadata metadata) + { + var value = metadata.Value; + var exception = metadata.Exception; + + object? objectToCheck = null; + + // If we have an exception (from Throws/ThrowsExactly), check that + if (exception != null) + { + objectToCheck = exception; + } + // Otherwise check the value + else if (value != null) + { + objectToCheck = value; + } + else + { + return Task.FromResult(AssertionResult.Failed("value was null")); + } + + var actualType = objectToCheck.GetType(); + + if (!actualType.IsAssignableFrom(_targetType)) + { + return AssertionResult._passedTask; + } + + return Task.FromResult(AssertionResult.Failed($"type {actualType.Name} is assignable from {_targetType.Name}")); + } + + protected override string GetExpectation() => $"to not be assignable from {_targetType.Name}"; +} + /// /// Asserts that a value is exactly of the specified type (using runtime Type parameter). /// diff --git a/TUnit.Assertions/Conditions/Wrappers/CountWrapper.cs b/TUnit.Assertions/Conditions/Wrappers/CountWrapper.cs index f2b2ea3364..70eb43d4e1 100644 --- a/TUnit.Assertions/Conditions/Wrappers/CountWrapper.cs +++ b/TUnit.Assertions/Conditions/Wrappers/CountWrapper.cs @@ -53,6 +53,26 @@ IsNotAssignableToAssertion IAssertionSource.I "Use: Assert.That(value).IsNotAssignableTo>().HasCount().EqualTo(5)"); } + /// + /// Not supported on CountWrapper - use IsAssignableFrom on the assertion source before calling HasCount(). + /// + IsAssignableFromAssertion IAssertionSource.IsAssignableFrom() + { + throw new NotSupportedException( + "IsAssignableFrom is not supported after HasCount(). " + + "Use: Assert.That(value).IsAssignableFrom>().HasCount().EqualTo(5)"); + } + + /// + /// Not supported on CountWrapper - use IsNotAssignableFrom on the assertion source before calling HasCount(). + /// + IsNotAssignableFromAssertion IAssertionSource.IsNotAssignableFrom() + { + throw new NotSupportedException( + "IsNotAssignableFrom is not supported after HasCount(). " + + "Use: Assert.That(value).IsNotAssignableFrom>().HasCount().EqualTo(5)"); + } + /// /// Not supported on CountWrapper - use IsNotTypeOf on the assertion source before calling HasCount(). /// diff --git a/TUnit.Assertions/Conditions/Wrappers/LengthWrapper.cs b/TUnit.Assertions/Conditions/Wrappers/LengthWrapper.cs index c1d027bfcf..4518e6068f 100644 --- a/TUnit.Assertions/Conditions/Wrappers/LengthWrapper.cs +++ b/TUnit.Assertions/Conditions/Wrappers/LengthWrapper.cs @@ -50,6 +50,26 @@ IsNotAssignableToAssertion IAssertionSource.IsNotAssign "Use: Assert.That(value).IsNotAssignableTo().HasLength().EqualTo(5)"); } + /// + /// Not supported on LengthWrapper - use IsAssignableFrom on the assertion source before calling HasLength(). + /// + IsAssignableFromAssertion IAssertionSource.IsAssignableFrom() + { + throw new NotSupportedException( + "IsAssignableFrom is not supported after HasLength(). " + + "Use: Assert.That(value).IsAssignableFrom().HasLength().EqualTo(5)"); + } + + /// + /// Not supported on LengthWrapper - use IsNotAssignableFrom on the assertion source before calling HasLength(). + /// + IsNotAssignableFromAssertion IAssertionSource.IsNotAssignableFrom() + { + throw new NotSupportedException( + "IsNotAssignableFrom is not supported after HasLength(). " + + "Use: Assert.That(value).IsNotAssignableFrom().HasLength().EqualTo(5)"); + } + /// /// Not supported on LengthWrapper - use IsNotTypeOf on the assertion source before calling HasLength(). /// diff --git a/TUnit.Assertions/Core/IAssertionSource.cs b/TUnit.Assertions/Core/IAssertionSource.cs index 92a34e915a..719adddad7 100644 --- a/TUnit.Assertions/Core/IAssertionSource.cs +++ b/TUnit.Assertions/Core/IAssertionSource.cs @@ -42,4 +42,14 @@ public interface IAssertionSource : IAssertionSource /// Asserts that the value's type is NOT assignable to the specified type. /// IsNotAssignableToAssertion IsNotAssignableTo(); + + /// + /// Asserts that the value's type is assignable from the specified type. + /// + IsAssignableFromAssertion IsAssignableFrom(); + + /// + /// Asserts that the value's type is NOT assignable from the specified type. + /// + IsNotAssignableFromAssertion IsNotAssignableFrom(); } diff --git a/TUnit.Assertions/Sources/AsyncDelegateAssertion.cs b/TUnit.Assertions/Sources/AsyncDelegateAssertion.cs index 0d2ea6c352..8d3aa0f18d 100644 --- a/TUnit.Assertions/Sources/AsyncDelegateAssertion.cs +++ b/TUnit.Assertions/Sources/AsyncDelegateAssertion.cs @@ -153,6 +153,18 @@ TypeOfAssertion IAssertionSource.IsTypeOf() return new IsNotAssignableToAssertion(Context); } + public IsAssignableFromAssertion IsAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsAssignableFromAssertion(Context); + } + + public IsNotAssignableFromAssertion IsNotAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsNotAssignableFromAssertion(Context); + } + /// /// Explicit interface implementation for Task assignability checking. /// Asserts that the task itself is assignable to the specified type. @@ -173,6 +185,26 @@ IsNotAssignableToAssertion IAssertionSource.IsNotAssignable return new IsNotAssignableToAssertion(TaskContext); } + /// + /// Explicit interface implementation for Task assignability checking. + /// Asserts that the task itself is assignable from the specified type. + /// + IsAssignableFromAssertion IAssertionSource.IsAssignableFrom() + { + TaskContext.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsAssignableFromAssertion(TaskContext); + } + + /// + /// Explicit interface implementation for Task assignability checking. + /// Asserts that the task itself is not assignable from the specified type. + /// + IsNotAssignableFromAssertion IAssertionSource.IsNotAssignableFrom() + { + TaskContext.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsNotAssignableFromAssertion(TaskContext); + } + /// /// Asserts that the value is NOT of the specified type. /// Example: await Assert.That(async () => await SomeMethodAsync()).IsNotTypeOf(); diff --git a/TUnit.Assertions/Sources/AsyncEnumerableAssertionBase.cs b/TUnit.Assertions/Sources/AsyncEnumerableAssertionBase.cs index 2f2652b4f2..0d91f209fb 100644 --- a/TUnit.Assertions/Sources/AsyncEnumerableAssertionBase.cs +++ b/TUnit.Assertions/Sources/AsyncEnumerableAssertionBase.cs @@ -173,6 +173,20 @@ public IsNotAssignableToAssertion> IsNotAssig return new IsNotAssignableToAssertion>(Context); } + /// + public IsAssignableFromAssertion> IsAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TExpected).Name}>()"); + return new IsAssignableFromAssertion>(Context); + } + + /// + public IsNotAssignableFromAssertion> IsNotAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TExpected).Name}>()"); + return new IsNotAssignableFromAssertion>(Context); + } + // CheckAsync is not overridden here - it's abstract in Assertion // Each concrete assertion class will implement it } diff --git a/TUnit.Assertions/Sources/AsyncFuncAssertion.cs b/TUnit.Assertions/Sources/AsyncFuncAssertion.cs index 0c4484b04f..4b9bee1764 100644 --- a/TUnit.Assertions/Sources/AsyncFuncAssertion.cs +++ b/TUnit.Assertions/Sources/AsyncFuncAssertion.cs @@ -55,6 +55,18 @@ public IsNotAssignableToAssertion IsNotAssignableTo() return new IsNotAssignableToAssertion(Context); } + public IsAssignableFromAssertion IsAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsAssignableFromAssertion(Context); + } + + public IsNotAssignableFromAssertion IsNotAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsNotAssignableFromAssertion(Context); + } + /// /// Asserts that the async function result is NOT of the specified type. /// Example: await Assert.That(async () => await GetValueAsync()).IsNotTypeOf(); diff --git a/TUnit.Assertions/Sources/CollectionAssertionBase.cs b/TUnit.Assertions/Sources/CollectionAssertionBase.cs index 3025455b68..9d2111e07c 100644 --- a/TUnit.Assertions/Sources/CollectionAssertionBase.cs +++ b/TUnit.Assertions/Sources/CollectionAssertionBase.cs @@ -67,6 +67,18 @@ public IsNotAssignableToAssertion IsNotAssignableTo(Context); } + public IsAssignableFromAssertion IsAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsAssignableFromAssertion(Context); + } + + public IsNotAssignableFromAssertion IsNotAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsNotAssignableFromAssertion(Context); + } + /// /// Asserts that the collection is NOT of the specified type. /// This allows chaining additional assertions on the value. diff --git a/TUnit.Assertions/Sources/DelegateAssertion.cs b/TUnit.Assertions/Sources/DelegateAssertion.cs index 142aa6e0ee..0af64b8ed9 100644 --- a/TUnit.Assertions/Sources/DelegateAssertion.cs +++ b/TUnit.Assertions/Sources/DelegateAssertion.cs @@ -58,6 +58,18 @@ public DelegateAssertion(Action action, string? expression) return new IsNotAssignableToAssertion(Context); } + public IsAssignableFromAssertion IsAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsAssignableFromAssertion(Context); + } + + public IsNotAssignableFromAssertion IsNotAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsNotAssignableFromAssertion(Context); + } + /// /// Asserts that the value is NOT of the specified type. /// Example: await Assert.That(() => SomeMethod()).IsNotTypeOf(); diff --git a/TUnit.Assertions/Sources/FuncAssertion.cs b/TUnit.Assertions/Sources/FuncAssertion.cs index bcdf9a4450..352178097b 100644 --- a/TUnit.Assertions/Sources/FuncAssertion.cs +++ b/TUnit.Assertions/Sources/FuncAssertion.cs @@ -55,6 +55,18 @@ public IsNotAssignableToAssertion IsNotAssignableTo() return new IsNotAssignableToAssertion(Context); } + public IsAssignableFromAssertion IsAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsAssignableFromAssertion(Context); + } + + public IsNotAssignableFromAssertion IsNotAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsNotAssignableFromAssertion(Context); + } + /// /// Asserts that the value is NOT of the specified type. /// Example: await Assert.That(() => GetValue()).IsNotTypeOf(); diff --git a/TUnit.Assertions/Sources/MemoryAssertionBase.cs b/TUnit.Assertions/Sources/MemoryAssertionBase.cs index 20ba2d74fc..424bc1bdd7 100644 --- a/TUnit.Assertions/Sources/MemoryAssertionBase.cs +++ b/TUnit.Assertions/Sources/MemoryAssertionBase.cs @@ -67,6 +67,18 @@ public IsNotAssignableToAssertion IsNotAssignableTo() return new IsNotAssignableToAssertion(Context); } + public IsAssignableFromAssertion IsAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsAssignableFromAssertion(Context); + } + + public IsNotAssignableFromAssertion IsNotAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsNotAssignableFromAssertion(Context); + } + public IsNotTypeOfAssertion IsNotTypeOf() { Context.ExpressionBuilder.Append($".IsNotTypeOf<{typeof(TExpected).Name}>()"); diff --git a/TUnit.Assertions/Sources/TaskAssertion.cs b/TUnit.Assertions/Sources/TaskAssertion.cs index bfc7504263..abdab0f1c0 100644 --- a/TUnit.Assertions/Sources/TaskAssertion.cs +++ b/TUnit.Assertions/Sources/TaskAssertion.cs @@ -85,6 +85,18 @@ public IsNotAssignableToAssertion IsNotAssignableTo() return new IsNotAssignableToAssertion(Context); } + public IsAssignableFromAssertion IsAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsAssignableFromAssertion(Context); + } + + public IsNotAssignableFromAssertion IsNotAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsNotAssignableFromAssertion(Context); + } + /// /// Explicit interface implementation for Task<TValue?> assignability checking. /// Asserts that the task itself is assignable to the specified type. @@ -105,6 +117,26 @@ public IsNotAssignableToAssertion IsNotAssignableTo() return new IsNotAssignableToAssertion>(TaskContext); } + /// + /// Explicit interface implementation for Task<TValue?> assignability checking. + /// Asserts that the task itself is assignable from the specified type. + /// + IsAssignableFromAssertion> IAssertionSource>.IsAssignableFrom() + { + TaskContext.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsAssignableFromAssertion>(TaskContext); + } + + /// + /// Explicit interface implementation for Task<TValue?> assignability checking. + /// Asserts that the task itself is not assignable from the specified type. + /// + IsNotAssignableFromAssertion> IAssertionSource>.IsNotAssignableFrom() + { + TaskContext.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsNotAssignableFromAssertion>(TaskContext); + } + /// /// Asserts that the task result is NOT of the specified type. /// Example: await Assert.That(GetValueAsync()).IsNotTypeOf(); diff --git a/TUnit.Assertions/Sources/ValueAssertion.cs b/TUnit.Assertions/Sources/ValueAssertion.cs index b6ce07b451..12408ab3d9 100644 --- a/TUnit.Assertions/Sources/ValueAssertion.cs +++ b/TUnit.Assertions/Sources/ValueAssertion.cs @@ -78,6 +78,28 @@ public IsNotAssignableToAssertion IsNotAssignableTo() return new IsNotAssignableToAssertion(Context); } + /// + /// Asserts that the value's type is assignable from the specified type. + /// This instance method allows single type parameter usage without needing to specify the source type. + /// Example: await Assert.That(myObject).IsAssignableFrom<DerivedClass>(); + /// + public IsAssignableFromAssertion IsAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsAssignableFromAssertion(Context); + } + + /// + /// Asserts that the value's type is NOT assignable from the specified type. + /// This instance method allows single type parameter usage without needing to specify the source type. + /// Example: await Assert.That(myObject).IsNotAssignableFrom<DerivedClass>(); + /// + public IsNotAssignableFromAssertion IsNotAssignableFrom() + { + Context.ExpressionBuilder.Append($".IsNotAssignableFrom<{typeof(TTarget).Name}>()"); + return new IsNotAssignableFromAssertion(Context); + } + /// /// Asserts that the value is NOT of the specified type. /// This instance method allows single type parameter usage without needing to specify the source type. diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt index 59497a2138..cb6e575781 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -337,7 +337,9 @@ namespace .Assertions { public . Context { get; } public . GetAwaiter() { } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -409,7 +411,9 @@ namespace . public WhenParsedIntoAssertion(. stringContext, ? formatProvider = null) { } protected override .<.> CheckAsync(. metadata) { } protected override string GetExpectation() { } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -608,7 +612,9 @@ namespace .Conditions { public AssertionSourceAdapter(. context) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -1273,6 +1279,12 @@ namespace .Conditions protected override string GetExpectation() { } public . Within(int tolerance) { } } + public class IsAssignableFromAssertion : . + { + public IsAssignableFromAssertion(. context) { } + protected override .<.> CheckAsync(. metadata) { } + protected override string GetExpectation() { } + } public class IsAssignableToAssertion : . { public IsAssignableToAssertion(. context) { } @@ -1325,6 +1337,12 @@ namespace .Conditions public . Using(. comparer) { } public . Using( equalityPredicate) { } } + public class IsNotAssignableFromAssertion : . + { + public IsNotAssignableFromAssertion(. context) { } + protected override .<.> CheckAsync(. metadata) { } + protected override string GetExpectation() { } + } public class IsNotAssignableToAssertion : . { public IsNotAssignableToAssertion(. context) { } @@ -1416,8 +1434,10 @@ namespace .Conditions { public ListItemAtSource(. listContext, int index) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEqualTo(TItem expected, [.("expected")] string? expression = null) { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEqualTo(TItem expected, [.("expected")] string? expression = null) { } public . IsNotNull() { } @@ -1452,8 +1472,10 @@ namespace .Conditions { public ListLastItemSource(. listContext) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEqualTo(TItem expected, [.("expected")] string? expression = null) { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEqualTo(TItem expected, [.("expected")] string? expression = null) { } public . IsNotNull() { } @@ -1663,8 +1685,10 @@ namespace .Conditions { public ReadOnlyListItemAtSource(. listContext, int index) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEqualTo(TItem expected, [.("expected")] string? expression = null) { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEqualTo(TItem expected, [.("expected")] string? expression = null) { } public . IsNotNull() { } @@ -1699,8 +1723,10 @@ namespace .Conditions { public ReadOnlyListLastItemSource(. listContext) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEqualTo(TItem expected, [.("expected")] string? expression = null) { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEqualTo(TItem expected, [.("expected")] string? expression = null) { } public . IsNotNull() { } @@ -2344,7 +2370,9 @@ namespace .Core public interface IAssertionSource : . { . Context { get; } + . IsAssignableFrom(); . IsAssignableTo(); + . IsNotAssignableFrom(); . IsNotAssignableTo(); . IsNotTypeOf(); . IsTypeOf(); @@ -5561,11 +5589,13 @@ namespace .Sources { public AsyncDelegateAssertion(<.> action, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public .<.> IsCanceled() { } public .<.> IsCompleted() { } public .<.> IsCompletedSuccessfully() { } public .<.> IsFaulted() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public .<.> IsNotCanceled() { } public .<.> IsNotCompleted() { } @@ -5593,8 +5623,10 @@ namespace .Sources public . DoesNotContain(TItem expected, .? comparer = null, [.("expected")] string? expression = null) { } protected override string GetExpectation() { } public . HasCount(int expected, [.("expected")] string? expression = null) { } + public .> IsAssignableFrom() { } public .> IsAssignableTo() { } public . IsEmpty() { } + public .> IsNotAssignableFrom() { } public .> IsNotAssignableTo() { } public . IsNotEmpty() { } public .<., TExpected> IsNotTypeOf() { } @@ -5608,7 +5640,9 @@ namespace .Sources { public AsyncFuncAssertion(<.> func, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -5651,10 +5685,12 @@ namespace .Sources public . HasCount(int expectedCount, [.("expectedCount")] string? expression = null) { } public . HasDistinctItems() { } public . HasSingleItem() { } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEmpty() { } public . IsInDescendingOrder() { } public . IsInOrder() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEmpty() { } public . IsNotTypeOf() { } @@ -5672,7 +5708,9 @@ namespace .Sources { public DelegateAssertion( action, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -5709,7 +5747,9 @@ namespace .Sources { public FuncAssertion( func, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -5764,10 +5804,12 @@ namespace .Sources protected override string GetExpectation() { } public . HasDistinctItems() { } public . HasSingleItem() { } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEmpty() { } public . IsInDescendingOrder() { } public . IsInOrder() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEmpty() { } public . IsNotTypeOf() { } @@ -5866,11 +5908,13 @@ namespace .Sources { public TaskAssertion(. task, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public .<.> IsCanceled() { } public .<.> IsCompleted() { } public .<.> IsCompletedSuccessfully() { } public .<.> IsFaulted() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public .<.> IsNotCanceled() { } public .<.> IsNotCompleted() { } @@ -5888,7 +5932,9 @@ namespace .Sources protected ValueAssertion(. context) { } public ValueAssertion(TValue? value, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt index c01ad50b4b..d19099168f 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -320,7 +320,9 @@ namespace .Assertions { public . Context { get; } public . GetAwaiter() { } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -392,7 +394,9 @@ namespace . public WhenParsedIntoAssertion(. stringContext, ? formatProvider = null) { } protected override .<.> CheckAsync(. metadata) { } protected override string GetExpectation() { } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -591,7 +595,9 @@ namespace .Conditions { public AssertionSourceAdapter(. context) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -1256,6 +1262,12 @@ namespace .Conditions protected override string GetExpectation() { } public . Within(int tolerance) { } } + public class IsAssignableFromAssertion : . + { + public IsAssignableFromAssertion(. context) { } + protected override .<.> CheckAsync(. metadata) { } + protected override string GetExpectation() { } + } public class IsAssignableToAssertion : . { public IsAssignableToAssertion(. context) { } @@ -1308,6 +1320,12 @@ namespace .Conditions public . Using(. comparer) { } public . Using( equalityPredicate) { } } + public class IsNotAssignableFromAssertion : . + { + public IsNotAssignableFromAssertion(. context) { } + protected override .<.> CheckAsync(. metadata) { } + protected override string GetExpectation() { } + } public class IsNotAssignableToAssertion : . { public IsNotAssignableToAssertion(. context) { } @@ -1399,8 +1417,10 @@ namespace .Conditions { public ListItemAtSource(. listContext, int index) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEqualTo(TItem expected, [.("expected")] string? expression = null) { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEqualTo(TItem expected, [.("expected")] string? expression = null) { } public . IsNotNull() { } @@ -1435,8 +1455,10 @@ namespace .Conditions { public ListLastItemSource(. listContext) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEqualTo(TItem expected, [.("expected")] string? expression = null) { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEqualTo(TItem expected, [.("expected")] string? expression = null) { } public . IsNotNull() { } @@ -1646,8 +1668,10 @@ namespace .Conditions { public ReadOnlyListItemAtSource(. listContext, int index) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEqualTo(TItem expected, [.("expected")] string? expression = null) { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEqualTo(TItem expected, [.("expected")] string? expression = null) { } public . IsNotNull() { } @@ -1682,8 +1706,10 @@ namespace .Conditions { public ReadOnlyListLastItemSource(. listContext) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEqualTo(TItem expected, [.("expected")] string? expression = null) { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEqualTo(TItem expected, [.("expected")] string? expression = null) { } public . IsNotNull() { } @@ -2323,7 +2349,9 @@ namespace .Core public interface IAssertionSource : . { . Context { get; } + . IsAssignableFrom(); . IsAssignableTo(); + . IsNotAssignableFrom(); . IsNotAssignableTo(); . IsNotTypeOf(); . IsTypeOf(); @@ -5509,11 +5537,13 @@ namespace .Sources { public AsyncDelegateAssertion(<.> action, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public .<.> IsCanceled() { } public .<.> IsCompleted() { } public .<.> IsCompletedSuccessfully() { } public .<.> IsFaulted() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public .<.> IsNotCanceled() { } public .<.> IsNotCompleted() { } @@ -5541,8 +5571,10 @@ namespace .Sources public . DoesNotContain(TItem expected, .? comparer = null, [.("expected")] string? expression = null) { } protected override string GetExpectation() { } public . HasCount(int expected, [.("expected")] string? expression = null) { } + public .> IsAssignableFrom() { } public .> IsAssignableTo() { } public . IsEmpty() { } + public .> IsNotAssignableFrom() { } public .> IsNotAssignableTo() { } public . IsNotEmpty() { } public .<., TExpected> IsNotTypeOf() { } @@ -5556,7 +5588,9 @@ namespace .Sources { public AsyncFuncAssertion(<.> func, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -5598,10 +5632,12 @@ namespace .Sources public . HasCount(int expectedCount, [.("expectedCount")] string? expression = null) { } public . HasDistinctItems() { } public . HasSingleItem() { } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEmpty() { } public . IsInDescendingOrder() { } public . IsInOrder() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEmpty() { } public . IsNotTypeOf() { } @@ -5619,7 +5655,9 @@ namespace .Sources { public DelegateAssertion( action, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -5656,7 +5694,9 @@ namespace .Sources { public FuncAssertion( func, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -5711,10 +5751,12 @@ namespace .Sources protected override string GetExpectation() { } public . HasDistinctItems() { } public . HasSingleItem() { } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEmpty() { } public . IsInDescendingOrder() { } public . IsInOrder() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEmpty() { } public . IsNotTypeOf() { } @@ -5813,11 +5855,13 @@ namespace .Sources { public TaskAssertion(. task, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public .<.> IsCanceled() { } public .<.> IsCompleted() { } public .<.> IsCompletedSuccessfully() { } public .<.> IsFaulted() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public .<.> IsNotCanceled() { } public .<.> IsNotCompleted() { } @@ -5835,7 +5879,9 @@ namespace .Sources protected ValueAssertion(. context) { } public ValueAssertion(TValue? value, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt index 2a4e6c380f..cc57b1d110 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -337,7 +337,9 @@ namespace .Assertions { public . Context { get; } public . GetAwaiter() { } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -409,7 +411,9 @@ namespace . public WhenParsedIntoAssertion(. stringContext, ? formatProvider = null) { } protected override .<.> CheckAsync(. metadata) { } protected override string GetExpectation() { } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -608,7 +612,9 @@ namespace .Conditions { public AssertionSourceAdapter(. context) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -1273,6 +1279,12 @@ namespace .Conditions protected override string GetExpectation() { } public . Within(int tolerance) { } } + public class IsAssignableFromAssertion : . + { + public IsAssignableFromAssertion(. context) { } + protected override .<.> CheckAsync(. metadata) { } + protected override string GetExpectation() { } + } public class IsAssignableToAssertion : . { public IsAssignableToAssertion(. context) { } @@ -1325,6 +1337,12 @@ namespace .Conditions public . Using(. comparer) { } public . Using( equalityPredicate) { } } + public class IsNotAssignableFromAssertion : . + { + public IsNotAssignableFromAssertion(. context) { } + protected override .<.> CheckAsync(. metadata) { } + protected override string GetExpectation() { } + } public class IsNotAssignableToAssertion : . { public IsNotAssignableToAssertion(. context) { } @@ -1416,8 +1434,10 @@ namespace .Conditions { public ListItemAtSource(. listContext, int index) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEqualTo(TItem expected, [.("expected")] string? expression = null) { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEqualTo(TItem expected, [.("expected")] string? expression = null) { } public . IsNotNull() { } @@ -1452,8 +1472,10 @@ namespace .Conditions { public ListLastItemSource(. listContext) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEqualTo(TItem expected, [.("expected")] string? expression = null) { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEqualTo(TItem expected, [.("expected")] string? expression = null) { } public . IsNotNull() { } @@ -1663,8 +1685,10 @@ namespace .Conditions { public ReadOnlyListItemAtSource(. listContext, int index) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEqualTo(TItem expected, [.("expected")] string? expression = null) { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEqualTo(TItem expected, [.("expected")] string? expression = null) { } public . IsNotNull() { } @@ -1699,8 +1723,10 @@ namespace .Conditions { public ReadOnlyListLastItemSource(. listContext) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEqualTo(TItem expected, [.("expected")] string? expression = null) { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEqualTo(TItem expected, [.("expected")] string? expression = null) { } public . IsNotNull() { } @@ -2344,7 +2370,9 @@ namespace .Core public interface IAssertionSource : . { . Context { get; } + . IsAssignableFrom(); . IsAssignableTo(); + . IsNotAssignableFrom(); . IsNotAssignableTo(); . IsNotTypeOf(); . IsTypeOf(); @@ -5561,11 +5589,13 @@ namespace .Sources { public AsyncDelegateAssertion(<.> action, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public .<.> IsCanceled() { } public .<.> IsCompleted() { } public .<.> IsCompletedSuccessfully() { } public .<.> IsFaulted() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public .<.> IsNotCanceled() { } public .<.> IsNotCompleted() { } @@ -5593,8 +5623,10 @@ namespace .Sources public . DoesNotContain(TItem expected, .? comparer = null, [.("expected")] string? expression = null) { } protected override string GetExpectation() { } public . HasCount(int expected, [.("expected")] string? expression = null) { } + public .> IsAssignableFrom() { } public .> IsAssignableTo() { } public . IsEmpty() { } + public .> IsNotAssignableFrom() { } public .> IsNotAssignableTo() { } public . IsNotEmpty() { } public .<., TExpected> IsNotTypeOf() { } @@ -5608,7 +5640,9 @@ namespace .Sources { public AsyncFuncAssertion(<.> func, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -5651,10 +5685,12 @@ namespace .Sources public . HasCount(int expectedCount, [.("expectedCount")] string? expression = null) { } public . HasDistinctItems() { } public . HasSingleItem() { } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEmpty() { } public . IsInDescendingOrder() { } public . IsInOrder() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEmpty() { } public . IsNotTypeOf() { } @@ -5672,7 +5708,9 @@ namespace .Sources { public DelegateAssertion( action, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -5709,7 +5747,9 @@ namespace .Sources { public FuncAssertion( func, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -5764,10 +5804,12 @@ namespace .Sources protected override string GetExpectation() { } public . HasDistinctItems() { } public . HasSingleItem() { } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEmpty() { } public . IsInDescendingOrder() { } public . IsInOrder() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEmpty() { } public . IsNotTypeOf() { } @@ -5866,11 +5908,13 @@ namespace .Sources { public TaskAssertion(. task, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public .<.> IsCanceled() { } public .<.> IsCompleted() { } public .<.> IsCompletedSuccessfully() { } public .<.> IsFaulted() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public .<.> IsNotCanceled() { } public .<.> IsNotCompleted() { } @@ -5888,7 +5932,9 @@ namespace .Sources protected ValueAssertion(. context) { } public ValueAssertion(TValue? value, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt index d8f7e630fd..0e750b0ef9 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -279,7 +279,9 @@ namespace .Assertions { public . Context { get; } public . GetAwaiter() { } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -351,7 +353,9 @@ namespace . public WhenParsedIntoAssertion(. stringContext, ? formatProvider = null) { } protected override .<.> CheckAsync(. metadata) { } protected override string GetExpectation() { } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -462,7 +466,9 @@ namespace .Conditions { public AssertionSourceAdapter(. context) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -1102,6 +1108,12 @@ namespace .Conditions protected override string GetExpectation() { } public . Within(int tolerance) { } } + public class IsAssignableFromAssertion : . + { + public IsAssignableFromAssertion(. context) { } + protected override .<.> CheckAsync(. metadata) { } + protected override string GetExpectation() { } + } public class IsAssignableToAssertion : . { public IsAssignableToAssertion(. context) { } @@ -1152,6 +1164,12 @@ namespace .Conditions public . Using(. comparer) { } public . Using( equalityPredicate) { } } + public class IsNotAssignableFromAssertion : . + { + public IsNotAssignableFromAssertion(. context) { } + protected override .<.> CheckAsync(. metadata) { } + protected override string GetExpectation() { } + } public class IsNotAssignableToAssertion : . { public IsNotAssignableToAssertion(. context) { } @@ -1243,8 +1261,10 @@ namespace .Conditions { public ListItemAtSource(. listContext, int index) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEqualTo(TItem expected, [.("expected")] string? expression = null) { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEqualTo(TItem expected, [.("expected")] string? expression = null) { } public . IsNotNull() { } @@ -1279,8 +1299,10 @@ namespace .Conditions { public ListLastItemSource(. listContext) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEqualTo(TItem expected, [.("expected")] string? expression = null) { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEqualTo(TItem expected, [.("expected")] string? expression = null) { } public . IsNotNull() { } @@ -1487,8 +1509,10 @@ namespace .Conditions { public ReadOnlyListItemAtSource(. listContext, int index) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEqualTo(TItem expected, [.("expected")] string? expression = null) { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEqualTo(TItem expected, [.("expected")] string? expression = null) { } public . IsNotNull() { } @@ -1523,8 +1547,10 @@ namespace .Conditions { public ReadOnlyListLastItemSource(. listContext) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEqualTo(TItem expected, [.("expected")] string? expression = null) { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEqualTo(TItem expected, [.("expected")] string? expression = null) { } public . IsNotNull() { } @@ -2105,7 +2131,9 @@ namespace .Core public interface IAssertionSource : . { . Context { get; } + . IsAssignableFrom(); . IsAssignableTo(); + . IsNotAssignableFrom(); . IsNotAssignableTo(); . IsNotTypeOf(); . IsTypeOf(); @@ -4849,10 +4877,12 @@ namespace .Sources { public AsyncDelegateAssertion(<.> action, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public .<.> IsCanceled() { } public .<.> IsCompleted() { } public .<.> IsFaulted() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public .<.> IsNotCanceled() { } public .<.> IsNotCompleted() { } @@ -4879,8 +4909,10 @@ namespace .Sources public . DoesNotContain(TItem expected, .? comparer = null, [.("expected")] string? expression = null) { } protected override string GetExpectation() { } public . HasCount(int expected, [.("expected")] string? expression = null) { } + public .> IsAssignableFrom() { } public .> IsAssignableTo() { } public . IsEmpty() { } + public .> IsNotAssignableFrom() { } public .> IsNotAssignableTo() { } public . IsNotEmpty() { } public .<., TExpected> IsNotTypeOf() { } @@ -4894,7 +4926,9 @@ namespace .Sources { public AsyncFuncAssertion(<.> func, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -4936,10 +4970,12 @@ namespace .Sources public . HasCount(int expectedCount, [.("expectedCount")] string? expression = null) { } public . HasDistinctItems() { } public . HasSingleItem() { } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public . IsEmpty() { } public . IsInDescendingOrder() { } public . IsInOrder() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotEmpty() { } public . IsNotTypeOf() { } @@ -4957,7 +4993,9 @@ namespace .Sources { public DelegateAssertion( action, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -4994,7 +5032,9 @@ namespace .Sources { public FuncAssertion( func, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { } @@ -5105,10 +5145,12 @@ namespace .Sources { public TaskAssertion(. task, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } public .<.> IsCanceled() { } public .<.> IsCompleted() { } public .<.> IsFaulted() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public .<.> IsNotCanceled() { } public .<.> IsNotCompleted() { } @@ -5125,7 +5167,9 @@ namespace .Sources protected ValueAssertion(. context) { } public ValueAssertion(TValue? value, string? expression) { } public . Context { get; } + public . IsAssignableFrom() { } public . IsAssignableTo() { } + public . IsNotAssignableFrom() { } public . IsNotAssignableTo() { } public . IsNotTypeOf() { } public . IsTypeOf() { }