Changelog
The breaking changes, features, bug fixes and performance improvements of each release, generated from the GitHub releases. Dependency updates and internal changes are left out.
Version 3
3.4.02026-10-17
- FeatureAdd
Percent()to interpret a number tolerance relative to the expected value #1840 - FeatureAdd
NormalizingWhiteSpace()to compare strings with collapsed whitespace #1842 - FeatureName members to ignore that matched no member in equivalency failures #1841
- FeatureApply
Percent()to ordering, range and collection expectations #1845 - FeatureSuggest the closest key or item when a string was not found #1847
- FeatureAdd
Allocates()to verify the allocations of a synchronous delegate #1848 - FeatureAdd a formatting option for complete output #1850
- FeatureCompare a pair of types by a predicate in equivalency #1851
- FeatureAdd
IsCollectedAfterandIsCollectedto detect memory leaks #1849 - FeatureMap differently named members in equivalency #1852
- FeatureFormat snapshots with hash-based collections in a stable order #1853
- FeatureRecognize compiler-generated records without reflection #1854
- FeatureMake the regex timeout configurable #1855
- FeatureLet a constraint act on the outcome of the whole expectation #1859
- FeatureLet callers leave out or replace nested values when formatting #1857
- FeatureUse the configurable regex timeout in aweXpect #1856
- FeatureWrite exceptions member-wise in snapshots #1862
- FixAppend the equivalency contexts of the evaluation that was compared #1846
3.3.02026-10-16
3.2.02026-10-16
- FeatureHint at
IgnoringNewlineStyle()when strings differ only in their newline style #1828 - FeatureGenerate expectations from a predicate with
[GenerateExpectation]#1830 - FeatureExplain why a block does not match in
AsBlock()failures #1829 - FeatureShow a line diff for multi-line strings with several differences #1832
3.1.02026-10-11
- PerformanceSkip the repeated check in
SatisfiesandCompliesWithwithout a timeout #1782 - PerformanceSpeed up
InAnyOrder()for collections of equal items #1783 - PerformanceSkip the failure texts of a met
InAnyOrder().IgnoringDuplicates()#1789 - PerformanceSpeed up
InAnyOrder()for collections of equal items #1790 - PerformanceKeep only the items that a quantifier can show #1784
- PerformanceCompare numbers without boxing in
IsEqualTo#1786 - PerformanceTrim the subject expression only when it is read #1787
- PerformanceShare parsed regexes between expectations #1788
- PerformanceKeep an
ActionorFunc<Task>subject without a wrapping closure #1785 - PerformanceAdd
Whichcontinuations without closures #1791 - PerformanceCompare enums and framework values without boxing #1794
- PerformanceCompare items synchronously in
InAnyOrder().IgnoringDuplicates()#1792 - PerformanceCopy arrays and lists at once in
IsEquivalentTo#1796 - PerformanceNormalize strings only when there is something to change #1795
- PerformanceShare parsed wildcard patterns between expectations #1798
- PerformanceSkip the reasons of a met expectation that nobody reads #1800
- PerformanceMatch items in any order without copying the expected items #1799
- PerformanceEvaluate the expectations of
ThatAllandThatAnywithout a task each #1802 - PerformanceFilter recorded events without a closure per event #1801
- PerformanceSize the collections of an in-order
IgnoringDuplicates()up front #1803 - PerformanceCreate the rarely used state of an evaluation context on demand #1805
- PerformanceSignal and count signals without LINQ or copies #1804
- PerformanceLet a consumer read a materialized sequence by position #1809
- PerformanceCount the items of
Containswith a string synchronously #1808 - PerformanceRead the exception of a faulted async delegate without rethrowing it #1811
- PerformanceFind values by their hash code in
InAnyOrder().IgnoringDuplicates()#1813 - PerformanceEvaluate a combination that completes synchronously without async state machines #1812
- PerformanceWrap the result of the expectations on a member only once #1814
- PerformanceLet the occurrences of a string be counted up to a maximum #1815
- PerformanceRead the items of a materialized sequence by position #1817
- PerformanceStop searching a string in
Containsonce the outcome is decided #1818 - PerformanceCompare booleans without boxing #1819
- PerformanceBind the value accessor of
ContainsKeyonly forWhoseValue#1820 - PerformanceCompare primitive items of
Containssynchronously #1821 - PerformanceSearch the strings of an array or a list directly in
Contains#1822 - PerformanceSearch the primitive items of an array or a list directly in
Contains#1823
3.0.02026-10-10
- BreakingFail the property and type expectations for a
nullsubject #1058 - BreakingFail the negated string expectations for a null subject #1063
- BreakingRun extension initialization from a module initializer #1064
- BreakingFail the negated boolean, number, enum and type expectations for a
nullsubject #1065 - BreakingTreat
IsSameAsas a comparison for anullsubject #1068 - BreakingReject a
nullor emptyexpectedinContains,StartsWithandEndsWith#1069 - BreakingFormat
KeyValuePairentries without reflection #1070 - BreakingFail the collection inspections for a
nullsubject #1073 - BreakingReject a
nullor empty needle in the dictionary key and value expectations #1075 - BreakingReject an empty needle in the
paramsoverloads ofStartsWithandEndsWith#1076 - BreakingDiscover the test framework adapter only from the registry #1066
- BreakingProvide equivalency members from a registry instead of reflection #1081
- BreakingReject a null list and a null subject in
IsContainedIn#1091 - BreakingMark
IsNotBetweenasGuaranteesNotNull#1092 - BreakingFail a null subject for the negated form of an expectation #1094
- BreakingAccept a null subject on the non-generic collection expectations #1096
- BreakingGenerate the type metadata registrations for equivalency from the marked call sites #1086
- BreakingName the collection result types after what they do #1121
- BreakingRemove the parameterless Exactly() match type #1123
- BreakingUnify member navigation on
Whose#1124 - BreakingRender tolerance as
± xeverywhere #1125 - BreakingRename
ThrowsException()toThrows()#1126 - BreakingReplace Approximately(expected, tolerance) with ExecutesIn(expected).Within(tolerance) #1128
- BreakingUnify numeric comparison vocabulary across result types #1127
- BreakingReplace the exception message and param name vocabularies with a string property continuation #1129
- BreakingRemove
DoesNotHaveCountin favour ofHasCount().NotEqualTo()#1132 - BreakingReplace
AreAllUniquewithElements.AreUnique()/AreNotUnique()#1136 - BreakingGive every scalar
Has…both shapes #1135 - BreakingAdd
KeysandValuesnavigation for dictionaries and remove the dictionary-specificAreAllUnique#1134 - BreakingLet
Withinwait out the timeout for an event expectation with an upper bound #1144 - BreakingAdd a parameterless
WithHResult()and let the structPropertyResultcontinuations carry their grammars #1150 - BreakingDeclare the libraries trimmable and AOT compatible #1156
- BreakingAlign the Core option types with the result vocabulary #1165
- BreakingLet member navigations fail a null subject also under
DoesNotComplyWith#1167 - BreakingSettle the naming and parameter outliers before v3 #1174
- BreakingReject empty member expectations with an ArgumentException #1183
- BreakingThrow an
ArgumentNullExceptionforHasFlag(null)andDoesNotHaveFlag(null)#1189 - BreakingLet async quantifier continuations fail a null subject also under
DoesNotComplyWith#1190 - BreakingFail the timing expectations of a delegate that throws #1231
- BreakingFail a further expectation on a stopped event recording #1235
- BreakingNever satisfy an expectation on all recursive inner exceptions with an exception that has none #1234
- BreakingReject a NaN expected value in the number ordering expectations #1236
- BreakingReject a date/time range whose maximum precedes its minimum #1237
- BreakingReport a member that does not exist on the actual object as missing #1240
- BreakingBind string patterns to the whole subject instead of to a single line #1233
- BreakingMatch a field against a property of the same name in an equivalency comparison #1243
- BreakingTreat a null or empty property name as a change of every property #1241
- BreakingLet the predicate decide about a
nullsubject inSatisfies#1247 - BreakingBind a collection expectation to the collection instead of to the struct or the predicate #1249
- BreakingIgnore the casing of a wildcard or regex pattern independent of the current culture #1250
- BreakingNegate the count after
DidNotTrigger#1251 - BreakingReject a null wildcard or regex pattern and an empty regex pattern #1253
- BreakingReject a
DateOnlytolerance that is not a whole number of days #1254 - BreakingRead the underlying enum value through a type that cannot overflow #1252
- BreakingCompare every type by its members instead of trusting a
truefromEquals#1256 - BreakingReject an empty prefix or suffix expectation #1258
- BreakingCompare the items of an untyped
IEnumerableinstead of the instances #1255 - BreakingApply the
DateTime.Kindcheck to every comparison, not only toIsEqualTo#1261 - BreakingTreat a dictionary as a keyed lookup instead of a sequence of pairs #1263
- BreakingFail
DateTimeordering checks for incompatible kinds #1262 - BreakingFail a negated string match type for a
nullsubject #1266 - BreakingReject an empty
IsOneOflist even when the subject is null #1265 - BreakingRemove the misleading
DoesNotExecuteWithin#1268 - BreakingExpose
ContainsKeys(…).WhoseValuesas a collection subject #1272 - BreakingRename the inner exception expectations to
HasInner/WithInner#1273 - BreakingKeep the subject type in
IsExactly/IsNotExactly#1271 - BreakingRequire the in-order
IsContainedInto be contiguous #1277 - BreakingRename
AndWhoseResulttoWhoseResult#1275 - BreakingStop offering equality options on element type checks #1276
- BreakingRename
SignalTimeoutResulttoDidNotSignalResult#1279 - BreakingName every
IsNotContainedInparameterunexpected#1280 - BreakingObserve a
TaskorValueTasksubject instead of the task object #1281 - BreakingStop offering equality options on the element ComplyWith #1282
- BreakingStop offering equality options on the async element ComplyWith #1284
- BreakingBind a collection argument of the untyped
StartsWithas the expected sequence #1296 - BreakingReject a
nulllist of expected values inIsOneOf#1290 - BreakingReject conflicting string equality options #1297
- BreakingCompare a set and a dictionary by content instead of by enumeration order #1295
- BreakingReject a duplicated key in the expected entries of a dictionary #1294
- BreakingServe both dictionary interfaces from one declaring type #1303
- BreakingReject invalid range, count and tolerance arguments consistently #1304
- BreakingPhrase equivalency where each expectation needs it #1305
- BreakingDrop the unused grammars parameter from quantifier factories and reject vacuous success on non-generic collections #1327
- BreakingRequire at least one recursive inner exception instead of rejecting vacuous success #1332
- BreakingBind string and untyped collection arguments of the untyped collection expectations by meaning #1328
- BreakingStop writing an
AsyncLocalon every awaited expectation #1334 - BreakingFail ordering and range expectations against a
nullvalue or bound in both forms #1347 - BreakingCompare by value in equivalency when either side is compared by value #1352
- BreakingKeep
IsGreaterThan/IsLessThanof numbers strict when a tolerance is set #1350 - BreakingLook dictionary keys up through the subject in equivalency #1353
- BreakingStop
For<T>comparison types from leaking into the members ofT#1357 - BreakingCount expected keys that collapse onto one subject key only once in dictionary
IsEqualTo#1358 - BreakingAnswer
ContainsandDoesNotContainon a set through the set's own lookup #1355 - BreakingMake negated time ordering and range expectations with a tolerance the exact inverse #1359
- BreakingAbandon an awaited task once the timeout or cancellation applies #1356
- BreakingBound each
Eventually()attempt by the retry timeout and observe abandoned async members #1361 - BreakingStop waiting for an async enumerable once the timeout or cancellation applies #1362
- BreakingSurface a cancellation between async enumerable items as a cancellation #1370
- BreakingHonour the subject's comparer in dictionary equivalency and set collection expectations #1369
- BreakingReject an empty
IsOneOfset when the expectation is built #1372 - BreakingApply and show the default time tolerance for collections and reject a sub-day DateOnly tolerance when it is specified #1373
- BreakingWait for recorded events asynchronously on netstandard2.0 and honour the evaluation's cancellation #1375
- BreakingName the caller's parameter at the remaining string option call sites #1379
- BreakingHonour StringComparison in polyfills, detect NaN via generic math and return the nullable subject from IsFinite on netstandard2.0 #1378
- BreakingUse ValueTask for the extension points and ValueTask subjects on every target framework #1380
- BreakingReport every exception from user code as a failed expectation #1383
- BreakingReject a null prefix or suffix and an invalid regex before the subject is inspected #1385
- BreakingReject conflicting and repeated options when the expectation is built #1386
- BreakingReject null predicates, member accessors, dictionary keys and inverted enum ranges when the expectation is built #1384
- BreakingReport a timeout as "did not finish within" and a caller cancellation as inconclusive everywhere #1387
- BreakingRender a placeholder instead of throwing when formatting a value calls throwing code #1388
- BreakingLet the tighter time limit win and validate every timeout when it is set #1391
- BreakingRemove
ExecutesWithinin favour ofExecutesIn().AtMost(…)#1396 - BreakingConfigure Eventually() with Within and CheckEvery and show default waits #1395
- BreakingHand out a non-null subject from every expectation that fails on null #1404
- BreakingName single count comparisons
expectedand member accessorsmemberAccessor#1402 - BreakingName the expression of every expected collection and keep a reference subject's type in IsOneOf #1405
- BreakingKeep the subject type after
HasMessageandHasRecursiveInnerExceptionsand addDoesNotHaveInner#1403 - BreakingGenerate every dictionary expectation per subject type and give value checks equality options #1411
- BreakingAdd
IgnoringCaseto char equality, typedVersionequality andHasSingle().MatchingExactly<T>()#1410 - BreakingLet a collection's own comparer decide every collection check and name it in the expectation #1412
- BreakingString match types on collection
StartsWith/EndsWithandAreEqualTo#1413 - BreakingCompare numbers and
StringBuilderby value in equivalency #1435 - BreakingRemove
IncludeMembers.Privatefrom equivalency #1436 - BreakingResolve
For<T>equivalency options lazily and prefer the expected type #1437 - BreakingCompare types implementing
IEqualityComparerby their members in equivalency #1439 - BreakingShare one polling loop for Satisfies and CompliesWith #1442
- BreakingIsolate customizations per async flow, restore only the changed setting and add global defaults #1441
- BreakingRemove unused MemberVisibilities and AnyButNotInDuplicatesAsync and rename the internal equivalency extensions #1454
- BreakingAlign the nullability of the Throws chain with the exception expectations #1455
- BreakingInclude protected internal members, close EnumerableQuantifier and fix negated DoesNotThrow #1473
- BreakingAccept a nullable expected count in
HasCount#1475 - BreakingReturn a not-null subject from nullable number ordering, format char numbers numerically and fail DateTime ranges with incompatible bounds #1481
- BreakingStore every customization value under its own key #1499
- BreakingValidate the formatting customization values and return a stored null #1503
- BreakingReport null and faulted subjects as failures instead of leaking internal exceptions #1529
- BreakingMake the string comparison options consistent #1531
- BreakingStop enumerating collections once the result is known and dispose their enumerators #1533
- BreakingCompose
And/Orfailure messages readably #1534 - BreakingKeep the concrete stream type through
Streamexpectations #1535 - BreakingTreat dictionary key comparers and the negation of ContainsKeys/ContainsValues consistently #1537
- BreakingUse a consistent default string order in ordering expectations #1538
- BreakingLet extensions built on aweXpect.Core add expectations on collection items and repeated checks #1547
- BreakingTreat combinations of flags as defined and take a non-nullable flag in
HasFlag#1553 - BreakingMake the equivalency options, member lookup and failure messages behave the same on every path #1554
- BreakingRemove the empty
aweXpect.ThatDelegateand align parameter names and summaries of the public API #1555 - BreakingJudge repeated checks by the effective timeout and share one polling loop #1556
- BreakingLet
IgnoringDuplicates()only care which items occur, and keep collection item expectations honest #1558 - BreakingGive dictionary values, integer items and string equality the same comparison options as their siblings #1559
- BreakingOffer no quantifiers after Signaled(times) #1580
- BreakingReturn a ValueTaskAwaiter from ExpectationResult<TType, TSelf>GetAwaiter #1583
- BreakingReturn a ValueTask from IAsyncConstraint and IAsyncContextConstraint #1586
- BreakingLet options be chained in any order and specified only once #1589
- BreakingRequire the delegate when creating a delegate subject #1594
- BreakingHide author-only properties from delegate subjects #1593
- BreakingShare one count model and one tolerance model #1599
- BreakingMake repeated checks behave like a fresh evaluation per attempt #1607
- BreakingReturn a ValueTask from the remaining evaluation APIs #1618
- BreakingCompare the items of collections with equivalency without writing a failure text #1624
- BreakingCompare duplicates with the expectation's comparison and stop Contains(...).InAnyOrder() once decided #1629
- BreakingReject
LessThan(0)andMoreThan(int.MaxValue), which no count can meet #1633 - BreakingKeep Within/OnlyIf off the .And/.Or continuation of Throws, stop typed DoesNotThrow from returning a fake result and validate delegate timeouts #1632
- BreakingLet type checks accept nullable and value-type subjects, and show the difference for numbers' IsNotBetween #1635
- BreakingIgnore whitespace only at the edges of the subject, let
?match a surrogate pair, escape multi-line formatted strings and report suffix differences "at index" #1628 - BreakingLet Whose continue from a converted value, fail an undecided expectation that nothing canceled and keep stored values within an item or member evaluation #1634
- BreakingReturn a ValueTask from the expectation text and repeated check callbacks, and complete the docs on dictionary Keys/Values, Quantifier exceptions and ForWhich #1637
- BreakingWord negated
Signaledresults correctly, return the subject fromCompliesWith, letIsParsableIntoexplain other operands, invert a set outcome ofExpectationOnly<T>, resetHasRecursiveInnerExceptionsper evaluation and indent combined and generic values consistently #1638 - BreakingTreat the same instance on both sides of an equivalency comparison as equivalent #1645
- BreakingFormat a task by its status and compare tasks by reference, so a pending
Task<T>no longer blocks a failure message or an equivalency comparison #1648 - BreakingMatch the items of a set subject through its own comparer in
IsEquivalentTo#1649 - BreakingLet
Because,WithTimeoutandWithCancellationbe used afterWhoseandAndWhoseof anAndOrWhoseResult#1651 - BreakingDo not offer
AsPrefixandAsSuffixon stringContains#1655 - BreakingValidate member names, predicates, event names and collections of expectations at the call #1656
- BreakingTreat a default
ImmutableArraylike anullcollection #1660 - BreakingDo not offer a second
Matchingon the result ofHasSingle().Matching…#1663 - BreakingReport an exception of a dictionary subject as a failed expectation in
Contains,ContainsValue(s)andIsEqualTo#1664 - BreakingReject a property expression of
TriggeredPropertyChangedForthat is no property of the subject #1665 - BreakingCompare the members that a collection type declares itself in
IsEquivalentTo#1669 - BreakingReject a repeated
IgnoringCaseon chars #1675 - BreakingReject a second
OnlyIfon the same expectation #1674 - BreakingReject a repeated
WithCancellation#1677 - BreakingAdd an optional
boolparameter toAllowingExceptions,IncludingUncasedLetters,IgnoringDuplicatesandIgnoringInterspersedItems#1682 - BreakingReject a repeated execution time limit #1680
- BreakingReject a repeated order comparer #1681
- BreakingReject a second
Matching…on the same result #1676 - BreakingHand out a non-null subject when awaiting
IsParsableIntoon a string #1691 - BreakingName the parameter of the negated ordering comparisons on the result types
unexpected#1700 - BreakingCompare the dimensions of multi-dimensional arrays in
IsEquivalentTo#1696 - BreakingReject an unusable pattern of a string
IsOneOfwhichever value the subject matches #1707 - BreakingCover the remaining result paths and remove dead result types #1708
- BreakingReject an unusable string pattern whichever subject it is verified for #1734
- BreakingCheck the kinds of
DateTimevalues in an untyped collection when verifying its order #1744 - BreakingPass a null argument to the predicate of the positional event filters #1747
- BreakingMatch the items of a sorted set subject through its own comparer in
IsEquivalentTo#1743 - BreakingLet a custom
IStringMatchTypevalidate the expected value and the options #1759 - FeatureAdd a
GuaranteesNotNullattribute for expectations #1048 - FeatureRecognise expectations that guarantee a not-null subject by attribute #1050
- FeatureRegister the generated test framework adapter via a module initializer #1054
- FeatureActivate the test framework adapter registration #1062
- FeatureAdd property expectations for Version #1061
- FeatureMark the expectations that a null subject now fails with
GuaranteesNotNull#1079 - FeatureAdd comparison expectations for Version #1085
- FeatureAdd the prefix and suffix vocabulary to the string property continuation #1130
- FeatureAdd a positional
DoesNotHaveItem#1138 - FeatureSupport
WithinonDoesNotSatisfy#1141 - FeatureAdd a positional
DidNotTrigger(eventName)#1140 - FeatureAdd
IsOneOf/IsNotOneOfforGuid#1145 - FeatureAdd analyzer rule
aweXpect0003for theWith…/Has…exception pairing #1146 - FeatureExpose the remaining
charpredicates #1151 - FeatureRender objects and boxed key-value pairs from the metadata registry #1149
- FeatureRegister the events of a recorded subject through the source generator #1148
- FeatureFormat exceptions as type name and message #1168
- FeatureAdd missing collection overloads for non-generic
IEnumerableandImmutableArray<T>#1199 - FeatureAwait
TaskandValueTaskmembers inWhose#1205 - FeatureReport a throwing member in
Whoseas a failed expectation #1208 - FeatureExpose
Tracing.WriteExceptionso extensions can trace exceptions #1232 - FeatureAdd an opt-in
AllowingExceptions()toExecutesIn#1270 - FeatureOffer a fluent
LimitingRecursionDepthfor equivalency #1289 - FeatureReject an object expectation on a delegate subject #1302
- FeatureGenerate collection overloads #1314
- FeatureGenerate the number overloads of the target frameworks without generic math #1317
- FeatureGenerate the IsOneOf overloads #1318
- FeatureGenerate the sign and classification overloads of the target frameworks without generic math #1319
- FeatureClose the ImmutableArray and time tolerance gaps in the collection expectations #1333
- FeatureAdd
IsNotPositiveandIsNotNegativefor numbers #1329 - FeatureAdd
IncludingUncasedLetters()to the string casing expectations #1331 - FeatureAdd negated comparisons for numbers #1360
- FeatureAdd DoesNotImply for bool and bool? #1389
- FeatureSupport
Withinon collection membership checks and forDateOnly/TimeOnlycollections #1409 - FeatureFlag Equals on expectation results and positional comparisons of unordered collections #1408
- FeatureAdd negated comparisons to the property, enum value and count builders #1407
- FeatureWarn about
ValueTaskdelegates that are never awaited #1426 - FeatureAdd WithoutInner as the negated WithInner twin on the Throws chain #1452
- FeatureHonour
[GuaranteesNotNull]on expectations of extension packages #1488 - FeatureLet extensions share the materialized subject of built-in collection expectations #1498
- FeatureMake QuantifiedCollectionConstraint public for extension expectations on collection items #1493
- FeatureMake DayTolerance public in aweXpect.Core #1492
- FeatureMake the repeated check loop of RepeatedCheckOptions public #1495
- FeatureLet results add the contexts that explain a failure #1562
- FeatureOffer the standard failure contexts and equivalency to Core-only extensions #1590
- FeatureMake extension helpers, CustomizationValue and a context-free IsMetBy public #1591
- FeatureInclude TUnit in the benchmarks and compare each library to aweXpect in the PR comment #1631
- FeatureWarn when the value of an expectation is used after an
Or(aweXpect0008) #1653 - FeatureAdd a guarded
SetMatchoverload toCollectionIndexOptions#1679 - FeatureEvaluate nested
It.Is…expectations as part of the evaluation and run its waits on the time system #1711 - FeatureLet tests run an expectation on another time system #1737
- FeatureAdd subject contexts to the expectation builder #1755
- FeatureLet extensions add values to the built-in customization groups #1760
- FeatureLet extensions evaluate nested expectations as part of their evaluation #1761
- FeatureLet a custom
IStringMatchTypereport a subject it cannot compare #1762 - FeatureLet extensions word a string member failure like core #1763
- FeatureName the member or item in the reason of a
NotComparablematch result #1767 - FixDo not throw when the subject of
IsEquatableToisnull#1047 - FixFail
HasValueon anullenum subject #1046 - FixRestore in
Debugbefore running the mutation tests #1049 - FixFail instead of silently succeeding when equivalency finds no members #1051
- FixDisplay the difference towards
MinValuein number failure messages #1059 - FixPrevent the mutation tests from exceeding the runner lifetime #1060
- FixResolve the packed README without relying on the solution directory #1072
- FixApply an expectation that is typed at the narrowed subject type #1080
- FixKeep the expectations combined with
And/Orinside aForMembercontinuation #1083 - FixKeep a runaway mutant from taking down the mutation runner #1093
- FixLet the dashboard pass a run that produced no mutation report #1137
- FixLet the reflective recorder release static handlers and name unbindable handlers #1159
- FixMark
IsNot<T>()andIsNotExactly<T>()with[GuaranteesNotNull]#1163 - FixRender collection equality as "is equal to collection" instead of "matches collection" #1164
- FixRender every equivalency member difference as a
differed:block #1169 - FixRender a negated scalar property as "does not have <Property> <comparison>" #1162
- FixUnify the text for a cancelled verification #1166
- FixDrop the leading dot from member paths in failure messages #1161
- FixRender every unexpected exception as type plus indented message #1172
- FixRender only the actual type in a failed type check #1175
- FixRender negated signaler and quantifier texts as readable English #1170
- FixDrop the
whichconnector before a nestedwhose#1173 - FixName the number of remaining items when a known-size collection is truncated #1176
- FixCorrect four grammar slips in collection failure messages #1177
- FixName the actual value in incomplete failure results #1179
- FixCorrect Core failure message slips #1178
- FixNegate the validation of an async member mapping like a sync one #1180
- FixAvoid a double negation when negating
NotEqualToon a struct property #1181 - FixEvaluate each nested collection instead of the first cached one #1184
- FixRender cast, identity, null-conditional and parenthesised
Whoseselectors readably #1182 - FixRender the equivalency failure prefix once when chaining
IsEquivalentTo#1186 - FixUse
whichas the connector for inner exception expectations #1187 - FixFail a negated
HasSingleon a null collection withit was <null>#1188 - FixState the missing keys and values in dictionary expectation results #1192
- FixRender an expected null as
<null>inAreEquivalentTofor collection items #1194 - FixReport the waited time in signaler and event recording results #1196
- FixRender
which differs bywhen the difference overflows the numeric type #1197 - FixRender a negated quantified
ComplyWithas a negated quantifier #1195 - FixRender a negated quantifier as
for not all items#1198 - FixRender every quantifier result as
N of M#1201 - FixReport the full value count for
ContainsKeys(…).WhoseValues#1203 - FixList the values of ContainsKeys(…).WhoseValues together with their keys #1204
- FixReject NaN bounds in
IsBetweenand compare infinite numbers correctly #1206 - FixOmit the Actual and Expected sections when the message shows the value completely #1207
- FixDrop the stale Actual and Expected sections from the Core test expectations #1211
- FixCompare an instance that is referenced twice against each counterpart #1210
- FixIndex abandoned partial matches by their own position #1209
- FixCount the matches of a regex or wildcard pattern instead of fixed-length windows #1212
- FixLimit the recursion depth of the equivalency comparison #1213
- FixMatch an ignored member name against whole path segments #1214
- FixReject a NaN tolerance with its own message #1215
- FixMatch an open generic type against the whole type hierarchy of the subject #1216
- FixDrop the deviations of an abandoned partial match once the collection match completes #1218
- FixCompare differences instead of shifted values in time comparisons with a tolerance #1219
- FixShort-circuit
Oronce a branch was met #1220 - FixFail the stream length and position expectations when the property cannot be read #1222
- FixApply the duration of a time-boxed delegate expectation as timeout #1217
- FixSkip an event the reflective recording cannot attach to #1221
- FixAwait the async
Becausereason only when a failure message is built #1224 - FixLet the
?wildcard match a newline like any other character #1225 - FixReject permutations in the in-order
IsContainedIn#1227 - FixCompare reflection handles by value in equivalency #1228
- FixNever consider a non-finite number within tolerance of a different value #1226
- FixTreat a
TimeOnlyas a clock face for equality and ranges, but as a linear value for ordering #1230 - FixSay "contiguous" when
Contains(subset)requires the items without other items in between #1238 - FixReject a non-property expression in
TriggeredPropertyChangedFor#1239 - FixCompare time span equality without computing the difference #1242
- FixCompare the items of a non-generic
IEnumerablewhose type differs from the expected item type #1257 - FixNever consider a non-finite collection element within tolerance of a different value #1259
- FixName the runtime type when the found and the expected value look the same #1264
- FixMatch unordered collection elements by equivalency instead of sorting them #1267
- FixPair leftover elements by the fewest differences #1269
- FixName the member of a nested
Whosein a collection expectation #1274 - FixRender the whole expectation of a
Whichin a manual evaluation #1278 - FixDo not repeat
whoseafter a connector that already introduced the subject #1283 - FixDetach the handlers of a recording that failed to be constructed #1287
- FixDistinguish a missing inner exception from a null subject and name the property in string property failures #1298
- FixApply the upper bound of
ExecutesInas timeout #1293 - FixReport the first real deviation of an in-order collection match #1299
- FixRender an anonymous object through the value formatters #1306
- FixFollow the expectation instead of scanning the statement in
aweXpect0001#1301 - FixKeep a dictionary key from forming a member path segment #1307
- FixMake per-call equivalency options keep the customized default, and let
For<T>match a derived type #1308 - FixKeep the interfaces that select the set and the dictionary comparison #1311
- FixSay the same thing the same way in every failure message #1312
- FixMake the collection matcher say what it found #1313
- FixLet a string match type agree with its subject and show the casing option #1315
- FixMake quantified collection results say what the reader sees #1316
- FixMake every expectation text mirror its method name #1320
- FixShow the value at hand and agree the verb with plural members #1321
- FixWarn about expectations in async void methods and local functions #1326
- FixCompare in-order equality position by position instead of restarting the match #1335
- FixReport inserted and removed items in in-order equality failures #1336
- FixShow the difference in time failures and keep tolerances next to the expected values #1337
- FixName the caller's parameter when a string pattern is rejected #1338
- FixDo not throw for timeouts beyond the range of the timers #1339
- FixPass the plain grammars to the inner exception constraint of
WithInner<T>(expectations)andWithInner(Type)#1340 - FixKeep the negation and skip the member expectations for an inner exception of another type in
WithInnerandHasInner#1341 - FixPrefer the
Taskdelegate overloads ofExpect.Thatfor lambdas that also fitValueTask#1344 - FixFormat only public instance fields and properties of an object #1349
- FixCompare dictionary values with the object equality of collection
Contains#1351 - FixCompare numbers of different types as
objectby value instead of wrapping on net8+ #1354 - FixSkip properties without a public getter when formatting by reflection #1367
- FixMatch explicitly implemented interface properties in equivalency #1368
- FixKeep the signaler expectation text stable when it is rendered more than once #1376
- FixUse one template for validation and argument messages #1382
- FixName members in lowercase and answer property checks with the expectation's own subject #1393
- FixReport every exception from user code as "<who> did throw a/an <Type>:" #1390
- FixUse restrictive "that", non-restrictive ", which" and an article for items in failure messages #1392
- FixRender values culture-invariant, unambiguous and on one line where they fit #1394
- FixShow the value or the state in negated results and answer "is not equal to dictionary" with "was" #1397
- FixInvert the quantifier in negated counts and name what
DoesNotContain…found #1399 - FixUse one verb per collection mismatch and name a shared subject only once in combined results #1398
- FixApply one layout rule to multi-part collection and equivalency results #1401
- FixOne order for expectation options, match types before the value and differences for number ordering #1400
- FixStabilize the CheckEvery test on slow runners and reduce the cognitive complexity of the retry loop #1406
- FixKeep the separator of a leading ForWhich in the failure message #1422
- FixSignaling after a wait for multiple signals no longer throws #1423
- FixTreat undecided expectations in ThatAll and ThatAny as inconclusive #1424
- FixFind a same-order contiguous match that starts inside an abandoned partial match #1425
- FixUse the De Morgan connector for negated per-item and AndWhose combinations #1431
- FixSync collection Contains and IsEqualTo honor cancellation and timeout #1433
- FixHasSingle().Which no longer enumerates the source a second time #1432
- FixDo not count additional/missing items as deviations for any-order Contains/IsContainedIn #1434
- FixMake the signaler safe for concurrent waits and signals #1440
- FixCollection expectations honor cancellation and timeout #1443
- FixHasSingle returns the item for object collections and HasCount uses the count of non-generic collections #1444
- FixNever render an empty reason for a combined expectation #1445
- FixEnumerate the subject and the expected sequence only once #1446
- FixNumber and select the contexts of nested ThatAll and ThatAny combinations correctly #1447
- FixReport a null task clearly, keep chained Within consistent and show the param name in the context #1449
- FixRender separators, reasons and negation in per-item expectation texts #1448
- FixName the right subject in nested property, single item and dictionary value results #1453
- FixReduce async member lambdas to their member path in failure messages #1451
- FixNegate nested quantifier texts once and show the relevant items under negation #1450
- FixFall back to the global customization once all lifetimes of a group in the flow are disposed #1457
- FixSurface the other exceptions of a faulted task in the failure message #1458
- FixAlign thrown exception messages and the whitespace spelling with the message conventions #1460
- FixMake formatter precedence deterministic, ignore late events in stopped recordings and avoid deadlocks when verifying synchronously #1461
- FixUnify failure message wording for cancellation, HasSingle, type mismatches and trimmed expressions #1459
- FixKeep generated expectations across incremental runs and narrow the metadata generator's semantic work #1456
- FixMake the aweXpect0001 code fix await the expectation in its innermost function and only offer it where the result compiles #1462
- FixMake the analyzers and the IsNotNull suppressor more precise #1463
- FixFollow-ups from negated signaler expectations, tracing, synchronous verification, async members, wording #1467
- FixClose the remaining analyzer gaps after #1463 #1471
- FixWord nested value quantifiers, negated quantified Contains and matched prefixes naturally #1474
- FixKeep forced outcomes and render the deciding result when negating after evaluation #1482
- FixValidate exception Type arguments and match open generic exception types #1483
- FixReject duplicate recorded event names and report null tasks outside delegates #1480
- FixReport throwing event filters, validate positions and times, and name all-property notifications #1484
- FixCompare null items, fail incompatible kinds under negation and handle default ImmutableArray in collection expectations #1486
- FixStop formatting cycles through collections and apply registered formatters to every value #1485
- FixReport Equals on delegate subjects and make aweXpect2001 suppressible by pragma #1490
- FixOffer the await and ValueTask code fixes only where the result compiles #1489
- FixDetect cycles that a registered formatter reaches by formatting nested values #1502
- FixEscape strings in failure messages like C# literals so that different values never look the same #1506
- FixFormat float and double values round-trippable so that different values never look the same #1505
- FixFail normally on decimal overflow and reject invalid tolerances and counts without storing them #1504
- FixClose registration gaps of the metadata generator and registry #1507
- FixKeep the string difference window and truncation faithful to the value #1508
- FixMatch newer runtime types by name in the netstandard2.0 build #1510
- FixMake registered and reflected equivalency members agree for hiding, setter-only overrides and ref properties #1511
- FixAlign collection failure messages across subject types and sync/async siblings #1512
- FixApply the default time tolerance to dictionary values and show the difference in number messages #1509
- FixEscape and truncate string keys and values of multi-line dictionary entries #1514
- FixSelect the formatted members of unregistered types like equivalency does #1515
- FixLay out non-nullable expected items of a nullable subject on one line #1516
- FixReport unmatched dictionary keys when the key comparer cannot be read #1519
- FixHonour the comparers of immutable and frozen sets in the netstandard2.0 build #1518
- FixKeep the string difference window from splitting a surrogate pair or a line break #1517
- FixReport a null expected collection of non-nullable items like the other overloads #1521
- FixApply the default time tolerance to dictionary entries and to an expected immutable array #1520
- FixKeep the exception type check of
Throws(Type)andThrowsExactlyin front ofOr#1525 - FixMake the generated code compile for every supported consumer #1527
- FixScope
WhichandWhoseValueto the preceding operand ofAnd/Or#1526 - FixKeep failures of nested member expectations failed under negation #1528
- FixMatch collection items correctly with
InAnyOrderandIgnoringDuplicates#1530 - FixValidate arguments and settings up front #1532
- FixJudge timeouts the same way for collections and scalars #1536
- FixFormat numbers, records, tuples, type names and dictionaries consistently #1539
- FixReport item expectations that fail both ways in
ComplyWith,HasItemThatand expectation-item collections #1540 - FixOnly offer compiling code fixes, and only suppress warnings for evaluated expectations #1541
- FixDescribe in-order collection mismatches from the exact matching #1542
- FixMake value formatting safe for deep graphs and fix the nested layout #1543
- FixCorrect nullable annotations and close the gaps in the
GuaranteesNotNullharness #1544 - FixReset QuantifiedCollectionConstraint between evaluations and let the built-in collection constraints use it #1545
- FixCorrect misleading and inconsistent failure messages #1546
- FixCompare JSON, regex, IP address, encoding and memory values by their content in equivalency #1549
- FixSaturate the upper bound of ExecutesIn(...).Within(...), fail negated string member checks for a null value, and show where suffixes and long strings differ #1550
- FixReset
StartsWith,EndsWithand ordering expectations between evaluations and stop reading after the verdict #1551 - FixKeep event recordings attached for the whole expectation and align the signaler's
Withinwith the other waits #1552 - FixName the member, the item and the key that a failure message is about #1557
- FixCompile aweXpect.Core.Tests in Release while the released aweXpect still declares the moved types #1567
- FixAccept string-valued dictionaries and immutable arrays of string without a nullability warning #1569
- FixKeep deep equivalency comparisons from overflowing the stack #1577
- FixLet a tighter timeout win over the bound of ExecutesIn and Throws().Within #1595
- FixReport a bare GetAwaiter(), keep primary-constructor parameters out of the suppressor and warn when no test framework adapter is registered #1600
- FixRemove helper copies that aweXpect.Core v3.0.0-pre.17 now provides #1604
- FixKeep an async
Becausereason when a met expectation is negated or combined afterwards #1606 - FixReset the per-evaluation state of reused constraints #1605
- FixStop HasItem at the single index and treat untyped in-memory sets as complete #1611
- FixStop collection expectations at unanswered items consistently and show their contexts #1610
- FixAlign argument validation and XML remarks of a few APIs with their siblings #1616
- FixClose gaps in the generated metadata registrations and framework adapters #1623
- FixRestore the build of main and resolve open Sonar findings in tests #1626
- FixKeep undefined status codes, blank reasons and thrown messages readable in failure messages #1630
- FixReport the deviation limit that was actually exceeded and list missing items above the limit for collection
IsEqualTo#1640 - FixGroup a negated
Andinside a negatedOrand restore the subject name after a nested member #1641 - FixAbandon an async
Whichmember when the evaluation times out or is canceled #1642 - FixConsider a
nullproperty value equal tonullinPropertyResult.EqualToandNotEqualTo#1643 - FixDo not await an async
Becausereason of an operand that is only evaluated for its expectation text #1644 - FixSkip an event with a ref-struct or pointer parameter instead of failing the recording of its whole type #1646
- FixReturn the value of the right operand when expectations are combined with
AndorOr#1650 - FixReturn the default value when a met expectation has no value of the awaited type #1652
- FixLet the expectations of one
ThatAll/ThatAnyshare an event recording #1647 - FixCompare objects that are shared in a graph once instead of once per path in
IsEquivalentTo#1657 - FixEnumerate the expected sequence of collection
IsEqualToandIsContainedInonly once per expectation #1668 - FixSkip every type that is compared by value or by content in the metadata generator #1667
- FixAccept finite numbers whose distance overflows in strict ordering with an infinite tolerance #1666
- FixWake a synchronous
Signaler.Waitwithout the thread pool #1684 - FixDescribe the last attempt in
IsOneOfandIsNotOneOfonDateTimeafter an earlier incompatible kind #1689 - FixBound the check of an attempt of
Eventually()by the retry budget #1695 - FixFail the expectation when the enumerator or the current item of a materialized subject throws #1697
- FixKeep the outcome of a quantified expectation when user code throws after the deciding item of a collection with a known count #1698
- FixFormat a collection whose
Countthrows instead of throwing from the formatter #1699 - FixFail the expectation when the count or the enumeration of a collection subject that is not materialized throws #1701
- FixReport the timeout when it cuts short a wait that started later in the evaluation #1694
- FixKeep and bound an async
Becausereason #1703 - FixKeep the outcome of an expectation when tracing throws #1702
- FixDo not report an item as in wrong order when a duplicate of it is in order for
ContainsandIsContainedIn#1704 - FixMake the equality of expectation nodes symmetric and consistent with their hash code #1706
- FixSkip the operands after a failed guard in an
Andchain that follows anOr#1705 - FixEvaluate a
Queue<T>, aStack<T>and anIReadOnlyCollection<T>like aList<T>#1709 - FixRender the overload resolution priority of generated collection expectations with the invariant culture #1712
- FixName the right item and position in the explanation of a failed collection comparison #1716
- FixTrace the value of a delegate without enumerating a lazy sequence #1713
- FixNegate a count that every amount meets with
notinstead of an empty range likefewer than 0 times#1733 - FixDescribe and trace a member of
ThatAllandThatAnylike a single expectation #1718 - FixUse consistent count rule in the remaining collection helpers #1736
- FixLet a nested
HasLinesread as a verb phrase that the expectation on the lines can attach to #1732 - FixName a member accessor from an expression that is no member path #1715
- FixKeep the failure when code of the caller throws while the failure message is built #1729
- FixStop waiting for user code when the timeout elapses or the evaluation is canceled #1735
- FixShow the whole string difference when the minimum number of characters after it is close to
int.MaxValue#1741 - FixDo not suppress nullability warnings when the statement of the expectation overwrites the subject #1742
- FixKeep an event recording running across the repeated checks of
CompliesWith(…).Within(…)#1745 - FixStop reading the source for the failure message of the synchronous
IsEmpty#1746 - FixCorrect five failure message texts of aweXpect.Core #1749
- FixAlign multi-line results in combinations and trim multi-line predicates #1750
- FixKeep the subject description of a constraint when its user code throws #1764
- FixCorrect four analyzer rules that reported too much or too little #1768
- FixBuild the analyzers and generators against Roslyn 4.8 #1769
- PerformanceAllocate less while a successful expectation is evaluated #1561
- PerformanceRemove more work that a successful expectation does not need #1563
- PerformanceStop quadratic and copying work in collection expectations #1564
- PerformanceDecide the type checks of equivalency once per type #1565
- PerformanceResolve the members of a type pair once and build member paths only when they are read #1570
- PerformanceEvaluate an expectation through a ValueTask chain and return a met result right away #1574
- PerformanceEvaluate a simple expectation synchronously when nothing in it waits #1578
- PerformancePass the values of a constraint as state to a static AddConstraint lambda #1579
- PerformanceLet Contains on collections allocate less #1587
- PerformanceLower the overhead that every expectation pays #1598
- PerformanceLet a met IsEqualTo on collections and dictionaries skip the failure report #1597
- PerformanceLet StartsWith, EndsWith, AreEqualTo and AreUnique on collections allocate less #1608
- PerformanceLet event recordings allocate less #1613
- PerformanceAvoid small allocations on common expectation paths #1620
- PerformanceLet the string difference of large values allocate less #1622
- PerformanceCompare null and value-compared members of equivalency without a state machine or boxes #1621
- PerformanceLet quantified collection expectations and the any-order and containment matchers allocate less #1619
- PerformanceAdd fast paths for a met
IsEqualToon collections, in order and in any order #1639