Skip to main content

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 IsCollectedAfter and IsCollected to 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
  • BreakingMark the evaluation token of a generated expectation with [EvaluationCancellationToken] #1836
  • FeatureGenerate collection expectations with [GenerateCollectionExpectation] #1834
  • FeatureLet generated expectations explain why they cannot answer with PredicateResult #1835
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 Satisfies and CompliesWith without 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 Action or Func<Task> subject without a wrapping closure #1785
  • PerformanceAdd Which continuations 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 ThatAll and ThatAny without 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 Contains with 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 Contains once the outcome is decided #1818
  • PerformanceCompare booleans without boxing #1819
  • PerformanceBind the value accessor of ContainsKey only for WhoseValue #1820
  • PerformanceCompare primitive items of Contains synchronously #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 null subject #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 null subject #1065
  • BreakingTreat IsSameAs as a comparison for a null subject #1068
  • BreakingReject a null or empty expected in Contains, StartsWith and EndsWith #1069
  • BreakingFormat KeyValuePair entries without reflection #1070
  • BreakingFail the collection inspections for a null subject #1073
  • BreakingReject a null or empty needle in the dictionary key and value expectations #1075
  • BreakingReject an empty needle in the params overloads of StartsWith and EndsWith #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 IsNotBetween as GuaranteesNotNull #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 ± x everywhere #1125
  • BreakingRename ThrowsException() to Throws() #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 DoesNotHaveCount in favour of HasCount().NotEqualTo() #1132
  • BreakingReplace AreAllUnique with Elements.AreUnique() / AreNotUnique() #1136
  • BreakingGive every scalar Has… both shapes #1135
  • BreakingAdd Keys and Values navigation for dictionaries and remove the dictionary-specific AreAllUnique #1134
  • BreakingLet Within wait out the timeout for an event expectation with an upper bound #1144
  • BreakingAdd a parameterless WithHResult() and let the struct PropertyResult continuations 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 ArgumentNullException for HasFlag(null) and DoesNotHaveFlag(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 null subject in Satisfies #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 DateOnly tolerance 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 true from Equals #1256
  • BreakingReject an empty prefix or suffix expectation #1258
  • BreakingCompare the items of an untyped IEnumerable instead of the instances #1255
  • BreakingApply the DateTime.Kind check to every comparison, not only to IsEqualTo #1261
  • BreakingTreat a dictionary as a keyed lookup instead of a sequence of pairs #1263
  • BreakingFail DateTime ordering checks for incompatible kinds #1262
  • BreakingFail a negated string match type for a null subject #1266
  • BreakingReject an empty IsOneOf list even when the subject is null #1265
  • BreakingRemove the misleading DoesNotExecuteWithin #1268
  • BreakingExpose ContainsKeys(…).WhoseValues as 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 IsContainedIn to be contiguous #1277
  • BreakingRename AndWhoseResult to WhoseResult #1275
  • BreakingStop offering equality options on element type checks #1276
  • BreakingRename SignalTimeoutResult to DidNotSignalResult #1279
  • BreakingName every IsNotContainedIn parameter unexpected #1280
  • BreakingObserve a Task or ValueTask subject 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 StartsWith as the expected sequence #1296
  • BreakingReject a null list of expected values in IsOneOf #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 AsyncLocal on every awaited expectation #1334
  • BreakingFail ordering and range expectations against a null value or bound in both forms #1347
  • BreakingCompare by value in equivalency when either side is compared by value #1352
  • BreakingKeep IsGreaterThan/IsLessThan of 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 of T #1357
  • BreakingCount expected keys that collapse onto one subject key only once in dictionary IsEqualTo #1358
  • BreakingAnswer Contains and DoesNotContain on 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 IsOneOf set 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 ExecutesWithin in favour of ExecutesIn().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 expected and member accessors memberAccessor #1402
  • BreakingName the expression of every expected collection and keep a reference subject's type in IsOneOf #1405
  • BreakingKeep the subject type after HasMessage and HasRecursiveInnerExceptions and add DoesNotHaveInner #1403
  • BreakingGenerate every dictionary expectation per subject type and give value checks equality options #1411
  • BreakingAdd IgnoringCase to char equality, typed Version equality and HasSingle().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/EndsWith and AreEqualTo #1413
  • BreakingCompare numbers and StringBuilder by value in equivalency #1435
  • BreakingRemove IncludeMembers.Private from equivalency #1436
  • BreakingResolve For<T> equivalency options lazily and prefer the expected type #1437
  • BreakingCompare types implementing IEqualityComparer by 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/Or failure messages readably #1534
  • BreakingKeep the concrete stream type through Stream expectations #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.ThatDelegate and 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) and MoreThan(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 Signaled results correctly, return the subject from CompliesWith, let IsParsableInto explain other operands, invert a set outcome of ExpectationOnly<T>, reset HasRecursiveInnerExceptions per 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, WithTimeout and WithCancellation be used after Whose and AndWhose of an AndOrWhoseResult #1651
  • BreakingDo not offer AsPrefix and AsSuffix on string Contains #1655
  • BreakingValidate member names, predicates, event names and collections of expectations at the call #1656
  • BreakingTreat a default ImmutableArray like a null collection #1660
  • BreakingDo not offer a second Matching on the result of HasSingle().Matching… #1663
  • BreakingReport an exception of a dictionary subject as a failed expectation in Contains, ContainsValue(s) and IsEqualTo #1664
  • BreakingReject a property expression of TriggeredPropertyChangedFor that is no property of the subject #1665
  • BreakingCompare the members that a collection type declares itself in IsEquivalentTo #1669
  • BreakingReject a repeated IgnoringCase on chars #1675
  • BreakingReject a second OnlyIf on the same expectation #1674
  • BreakingReject a repeated WithCancellation #1677
  • BreakingAdd an optional bool parameter to AllowingExceptions, IncludingUncasedLetters, IgnoringDuplicates and IgnoringInterspersedItems #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 IsParsableInto on 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 IsOneOf whichever 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 DateTime values 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 IStringMatchType validate the expected value and the options #1759
  • FeatureAdd a GuaranteesNotNull attribute 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 Within on DoesNotSatisfy #1141
  • FeatureAdd a positional DidNotTrigger(eventName) #1140
  • FeatureAdd IsOneOf / IsNotOneOf for Guid #1145
  • FeatureAdd analyzer rule aweXpect0003 for the With…/Has… exception pairing #1146
  • FeatureExpose the remaining char predicates #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 IEnumerable and ImmutableArray<T> #1199
  • FeatureAwait Task and ValueTask members in Whose #1205
  • FeatureReport a throwing member in Whose as a failed expectation #1208
  • FeatureExpose Tracing.WriteException so extensions can trace exceptions #1232
  • FeatureAdd an opt-in AllowingExceptions() to ExecutesIn #1270
  • FeatureOffer a fluent LimitingRecursionDepth for 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 IsNotPositive and IsNotNegative for numbers #1329
  • FeatureAdd IncludingUncasedLetters() to the string casing expectations #1331
  • FeatureAdd negated comparisons for numbers #1360
  • FeatureAdd DoesNotImply for bool and bool? #1389
  • FeatureSupport Within on collection membership checks and for DateOnly/TimeOnly collections #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 ValueTask delegates 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 SetMatch overload to CollectionIndexOptions #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 IStringMatchType report 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 NotComparable match result #1767
  • FixDo not throw when the subject of IsEquatableTo is null #1047
  • FixFail HasValue on a null enum subject #1046
  • FixRestore in Debug before running the mutation tests #1049
  • FixFail instead of silently succeeding when equivalency finds no members #1051
  • FixDisplay the difference towards MinValue in 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/Or inside a ForMember continuation #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>() and IsNotExactly<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 which connector before a nested whose #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 NotEqualTo on a struct property #1181
  • FixEvaluate each nested collection instead of the first cached one #1184
  • FixRender cast, identity, null-conditional and parenthesised Whose selectors readably #1182
  • FixRender the equivalency failure prefix once when chaining IsEquivalentTo #1186
  • FixUse which as the connector for inner exception expectations #1187
  • FixFail a negated HasSingle on a null collection with it was <null> #1188
  • FixState the missing keys and values in dictionary expectation results #1192
  • FixRender an expected null as <null> in AreEquivalentTo for collection items #1194
  • FixReport the waited time in signaler and event recording results #1196
  • FixRender which differs by when the difference overflows the numeric type #1197
  • FixRender a negated quantified ComplyWith as 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 IsBetween and 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 Or once 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 Because reason 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 TimeOnly as 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 IEnumerable whose 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 Whose in a collection expectation #1274
  • FixRender the whole expectation of a Which in a manual evaluation #1278
  • FixDo not repeat whose after 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 ExecutesIn as 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) and WithInner(Type) #1340
  • FixKeep the negation and skip the member expectations for an inner exception of another type in WithInner and HasInner #1341
  • FixPrefer the Task delegate overloads of Expect.That for lambdas that also fit ValueTask #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 object by 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) and ThrowsExactly in front of Or #1525
  • FixMake the generated code compile for every supported consumer #1527
  • FixScope Which and WhoseValue to the preceding operand of And/Or #1526
  • FixKeep failures of nested member expectations failed under negation #1528
  • FixMatch collection items correctly with InAnyOrder and IgnoringDuplicates #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, HasItemThat and 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 GuaranteesNotNull harness #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, EndsWith and ordering expectations between evaluations and stop reading after the verdict #1551
  • FixKeep event recordings attached for the whole expectation and align the signaler's Within with 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 Because reason 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 And inside a negated Or and restore the subject name after a nested member #1641
  • FixAbandon an async Which member when the evaluation times out or is canceled #1642
  • FixConsider a null property value equal to null in PropertyResult.EqualTo and NotEqualTo #1643
  • FixDo not await an async Because reason 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 And or Or #1650
  • FixReturn the default value when a met expectation has no value of the awaited type #1652
  • FixLet the expectations of one ThatAll / ThatAny share 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 IsEqualTo and IsContainedIn only 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.Wait without the thread pool #1684
  • FixDescribe the last attempt in IsOneOf and IsNotOneOf on DateTime after 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 Count throws 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 Because reason #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 Contains and IsContainedIn #1704
  • FixMake the equality of expectation nodes symmetric and consistent with their hash code #1706
  • FixSkip the operands after a failed guard in an And chain that follows an Or #1705
  • FixEvaluate a Queue<T>, a Stack<T> and an IReadOnlyCollection<T> like a List<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 not instead of an empty range like fewer than 0 times #1733
  • FixDescribe and trace a member of ThatAll and ThatAny like a single expectation #1718
  • FixUse consistent count rule in the remaining collection helpers #1736
  • FixLet a nested HasLines read 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 IsEqualTo on collections, in order and in any order #1639

Version 2

Version 1

Version 0

Version core/v0