From 536649c7737972d3f0abd48159f3bff705fe448c Mon Sep 17 00:00:00 2001 From: Frederic BIDON Date: Mon, 7 Sep 2026 16:47:02 +0200 Subject: [PATCH 1/3] feat(assertions): add options to assert.New and require.New assert.New(t) and require.New(t) now accept Option values. WithHunkSize is the only one so far: it sets how many unchanged lines the diff shows around each change in the failure message of Equal, EqualT, EqualValues, EqualExportedValues and Exactly. The default stays 1. BuildOptions folds the options into an unexported options value that the forward methods append to msgAndArgs, and splitArgs pulls it back out before the message is formatted, so it never reaches the reader. The same door would let a caller pass an Option straight to a top-level function; that case is left commented out in splitArgs, so assert.Equal(t, ...) keeps its signature and a hunk size of 1. Codegen: - the forward and format templates render the o field, the opts parameter on New, and the call carrying a.o; forwardArgs takes variadic extras; - a new "excluded:" comment tag keeps a function out of the generated packages, the domain pages and the metrics. BuildOptions carries it, since it returns an opaque any and has no business in assert/require. Refers to stretchr/testify#1878. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_015qDqrLvtn2K5uA6RpSoHvR Signed-off-by: Frederic BIDON --- assert/assert_format.go | 7 +- assert/assert_forward.go | 347 +++++++++--------- assert/assert_forward_go127.go | 220 +++++------ assert/assert_helpers.go | 7 + assert/assert_helpers_test.go | 12 +- assert/assert_options_test.go | 142 +++++++ assert/assert_types.go | 8 + codegen/internal/generator/doc_generator.go | 3 + codegen/internal/generator/domains/domains.go | 4 + .../generator/forward_generics_test.go | 4 +- .../templates/assertion_format.gotmpl | 7 +- .../templates/assertion_forward.gotmpl | 11 +- .../templates/assertion_helpers_test.gotmpl | 6 +- .../generator/templates/doc_metrics.md.gotmpl | 11 +- .../templates/requirement_format.gotmpl | 7 +- .../templates/requirement_forward.gotmpl | 15 +- codegen/internal/model/model.go | 22 +- .../internal/scanner/comments-parser/tags.go | 6 + codegen/internal/scanner/scanner.go | 14 +- docs/doc-site/api/_index.md | 2 +- docs/doc-site/api/common.md | 36 +- docs/doc-site/api/equality.md | 6 +- docs/doc-site/api/http.md | 1 - docs/doc-site/api/metrics.md | 10 +- docs/doc-site/api/testing.md | 2 +- hack/doc-site/hugo/metrics.yaml | 6 +- internal/assertions/diff.go | 4 +- internal/assertions/diff_test.go | 14 +- internal/assertions/equal.go | 9 +- internal/assertions/number_test.go | 3 +- internal/assertions/options.go | 75 ++++ internal/assertions/options_test.go | 194 ++++++++++ internal/assertions/testing.go | 1 + internal/assertions/type_test.go | 3 +- require/require_format.go | 7 +- require/require_forward.go | 347 +++++++++--------- require/require_forward_go127.go | 220 +++++------ require/require_helpers.go | 7 + require/require_helpers_test.go | 12 +- require/require_options_test.go | 145 ++++++++ require/require_types.go | 8 + 41 files changed, 1332 insertions(+), 633 deletions(-) create mode 100644 assert/assert_options_test.go create mode 100644 internal/assertions/options.go create mode 100644 internal/assertions/options_test.go create mode 100644 require/require_options_test.go diff --git a/assert/assert_format.go b/assert/assert_format.go index 5f4caa9a8..b071335c0 100644 --- a/assert/assert_format.go +++ b/assert/assert_format.go @@ -1415,10 +1415,13 @@ func Zerof(t T, i any, msg string, args ...any) bool { return assertions.Zero(t, i, forwardArgs(msg, args)...) } -func forwardArgs(msg string, args []any) []any { - result := make([]any, len(args)+1) +func forwardArgs(msg string, args []any, extras ...any) []any { + result := make([]any, len(args)+len(extras)+1) result[0] = msg copy(result[1:], args) + for i, extra := range extras { + result[len(args)+i+1] = extra + } return result } diff --git a/assert/assert_forward.go b/assert/assert_forward.go index 2b9504c90..f1fd0dd39 100644 --- a/assert/assert_forward.go +++ b/assert/assert_forward.go @@ -22,12 +22,17 @@ import ( // Upon failure, the test [T] is marked as failed and continues execution. type Assertions struct { T + + o any } // New makes a new [Assertions] object for the specified [T] (e.g. [testing.T]). -func New(t T) *Assertions { +// +// It may be tuned using [Option]. +func New(t T, opts ...Option) *Assertions { return &Assertions{ T: t, + o: assertions.BuildOptions(opts), } } @@ -38,7 +43,7 @@ func (a *Assertions) Blocked(ch any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Blocked(a.T, ch, msgAndArgs...) + return assertions.Blocked(a.T, ch, append(msgAndArgs, a.o)...) } // Blockedf is the same as [Assertions.Blocked], but it accepts a format string to format arguments like [fmt.Printf]. @@ -48,7 +53,7 @@ func (a *Assertions) Blockedf(ch any, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Blocked(a.T, ch, forwardArgs(msg, args)...) + return assertions.Blocked(a.T, ch, forwardArgs(msg, args, a.o)...) } // Condition is the same as [Condition], as a method rather than a package-level function. @@ -58,7 +63,7 @@ func (a *Assertions) Condition(comp func() bool, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Condition(a.T, comp, msgAndArgs...) + return assertions.Condition(a.T, comp, append(msgAndArgs, a.o)...) } // Conditionf is the same as [Assertions.Condition], but it accepts a format string to format arguments like [fmt.Printf]. @@ -68,7 +73,7 @@ func (a *Assertions) Conditionf(comp func() bool, msg string, args ...any) bool if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Condition(a.T, comp, forwardArgs(msg, args)...) + return assertions.Condition(a.T, comp, forwardArgs(msg, args, a.o)...) } // Contains is the same as [Contains], as a method rather than a package-level function. @@ -78,7 +83,7 @@ func (a *Assertions) Contains(s any, contains any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Contains(a.T, s, contains, msgAndArgs...) + return assertions.Contains(a.T, s, contains, append(msgAndArgs, a.o)...) } // Containsf is the same as [Assertions.Contains], but it accepts a format string to format arguments like [fmt.Printf]. @@ -88,7 +93,7 @@ func (a *Assertions) Containsf(s any, contains any, msg string, args ...any) boo if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Contains(a.T, s, contains, forwardArgs(msg, args)...) + return assertions.Contains(a.T, s, contains, forwardArgs(msg, args, a.o)...) } // DirExists is the same as [DirExists], as a method rather than a package-level function. @@ -98,7 +103,7 @@ func (a *Assertions) DirExists(path string, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.DirExists(a.T, path, msgAndArgs...) + return assertions.DirExists(a.T, path, append(msgAndArgs, a.o)...) } // DirExistsf is the same as [Assertions.DirExists], but it accepts a format string to format arguments like [fmt.Printf]. @@ -108,7 +113,7 @@ func (a *Assertions) DirExistsf(path string, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.DirExists(a.T, path, forwardArgs(msg, args)...) + return assertions.DirExists(a.T, path, forwardArgs(msg, args, a.o)...) } // DirNotExists is the same as [DirNotExists], as a method rather than a package-level function. @@ -118,7 +123,7 @@ func (a *Assertions) DirNotExists(path string, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.DirNotExists(a.T, path, msgAndArgs...) + return assertions.DirNotExists(a.T, path, append(msgAndArgs, a.o)...) } // DirNotExistsf is the same as [Assertions.DirNotExists], but it accepts a format string to format arguments like [fmt.Printf]. @@ -128,7 +133,7 @@ func (a *Assertions) DirNotExistsf(path string, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.DirNotExists(a.T, path, forwardArgs(msg, args)...) + return assertions.DirNotExists(a.T, path, forwardArgs(msg, args, a.o)...) } // ElementsMatch is the same as [ElementsMatch], as a method rather than a package-level function. @@ -138,7 +143,7 @@ func (a *Assertions) ElementsMatch(listA any, listB any, msgAndArgs ...any) (ok if h, ok := a.T.(H); ok { h.Helper() } - return assertions.ElementsMatch(a.T, listA, listB, msgAndArgs...) + return assertions.ElementsMatch(a.T, listA, listB, append(msgAndArgs, a.o)...) } // ElementsMatchf is the same as [Assertions.ElementsMatch], but it accepts a format string to format arguments like [fmt.Printf]. @@ -148,7 +153,7 @@ func (a *Assertions) ElementsMatchf(listA any, listB any, msg string, args ...an if h, ok := a.T.(H); ok { h.Helper() } - return assertions.ElementsMatch(a.T, listA, listB, forwardArgs(msg, args)...) + return assertions.ElementsMatch(a.T, listA, listB, forwardArgs(msg, args, a.o)...) } // Empty is the same as [Empty], as a method rather than a package-level function. @@ -158,7 +163,7 @@ func (a *Assertions) Empty(object any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Empty(a.T, object, msgAndArgs...) + return assertions.Empty(a.T, object, append(msgAndArgs, a.o)...) } // Emptyf is the same as [Assertions.Empty], but it accepts a format string to format arguments like [fmt.Printf]. @@ -168,7 +173,7 @@ func (a *Assertions) Emptyf(object any, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Empty(a.T, object, forwardArgs(msg, args)...) + return assertions.Empty(a.T, object, forwardArgs(msg, args, a.o)...) } // Equal is the same as [Equal], as a method rather than a package-level function. @@ -178,7 +183,7 @@ func (a *Assertions) Equal(expected any, actual any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Equal(a.T, expected, actual, msgAndArgs...) + return assertions.Equal(a.T, expected, actual, append(msgAndArgs, a.o)...) } // Equalf is the same as [Assertions.Equal], but it accepts a format string to format arguments like [fmt.Printf]. @@ -188,7 +193,7 @@ func (a *Assertions) Equalf(expected any, actual any, msg string, args ...any) b if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Equal(a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.Equal(a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // EqualError is the same as [EqualError], as a method rather than a package-level function. @@ -198,7 +203,7 @@ func (a *Assertions) EqualError(err error, errString string, msgAndArgs ...any) if h, ok := a.T.(H); ok { h.Helper() } - return assertions.EqualError(a.T, err, errString, msgAndArgs...) + return assertions.EqualError(a.T, err, errString, append(msgAndArgs, a.o)...) } // EqualErrorf is the same as [Assertions.EqualError], but it accepts a format string to format arguments like [fmt.Printf]. @@ -208,7 +213,7 @@ func (a *Assertions) EqualErrorf(err error, errString string, msg string, args . if h, ok := a.T.(H); ok { h.Helper() } - return assertions.EqualError(a.T, err, errString, forwardArgs(msg, args)...) + return assertions.EqualError(a.T, err, errString, forwardArgs(msg, args, a.o)...) } // EqualExportedValues is the same as [EqualExportedValues], as a method rather than a package-level function. @@ -218,7 +223,7 @@ func (a *Assertions) EqualExportedValues(expected any, actual any, msgAndArgs .. if h, ok := a.T.(H); ok { h.Helper() } - return assertions.EqualExportedValues(a.T, expected, actual, msgAndArgs...) + return assertions.EqualExportedValues(a.T, expected, actual, append(msgAndArgs, a.o)...) } // EqualExportedValuesf is the same as [Assertions.EqualExportedValues], but it accepts a format string to format arguments like [fmt.Printf]. @@ -228,7 +233,7 @@ func (a *Assertions) EqualExportedValuesf(expected any, actual any, msg string, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.EqualExportedValues(a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.EqualExportedValues(a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // EqualValues is the same as [EqualValues], as a method rather than a package-level function. @@ -238,7 +243,7 @@ func (a *Assertions) EqualValues(expected any, actual any, msgAndArgs ...any) bo if h, ok := a.T.(H); ok { h.Helper() } - return assertions.EqualValues(a.T, expected, actual, msgAndArgs...) + return assertions.EqualValues(a.T, expected, actual, append(msgAndArgs, a.o)...) } // EqualValuesf is the same as [Assertions.EqualValues], but it accepts a format string to format arguments like [fmt.Printf]. @@ -248,7 +253,7 @@ func (a *Assertions) EqualValuesf(expected any, actual any, msg string, args ... if h, ok := a.T.(H); ok { h.Helper() } - return assertions.EqualValues(a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.EqualValues(a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // Error is the same as [Error], as a method rather than a package-level function. @@ -258,7 +263,7 @@ func (a *Assertions) Error(err error, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Error(a.T, err, msgAndArgs...) + return assertions.Error(a.T, err, append(msgAndArgs, a.o)...) } // Errorf is the same as [Assertions.Error], but it accepts a format string to format arguments like [fmt.Printf]. @@ -268,7 +273,7 @@ func (a *Assertions) Errorf(err error, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Error(a.T, err, forwardArgs(msg, args)...) + return assertions.Error(a.T, err, forwardArgs(msg, args, a.o)...) } // ErrorAs is the same as [ErrorAs], as a method rather than a package-level function. @@ -278,7 +283,7 @@ func (a *Assertions) ErrorAs(err error, target any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.ErrorAs(a.T, err, target, msgAndArgs...) + return assertions.ErrorAs(a.T, err, target, append(msgAndArgs, a.o)...) } // ErrorAsf is the same as [Assertions.ErrorAs], but it accepts a format string to format arguments like [fmt.Printf]. @@ -288,7 +293,7 @@ func (a *Assertions) ErrorAsf(err error, target any, msg string, args ...any) bo if h, ok := a.T.(H); ok { h.Helper() } - return assertions.ErrorAs(a.T, err, target, forwardArgs(msg, args)...) + return assertions.ErrorAs(a.T, err, target, forwardArgs(msg, args, a.o)...) } // ErrorContains is the same as [ErrorContains], as a method rather than a package-level function. @@ -298,7 +303,7 @@ func (a *Assertions) ErrorContains(err error, contains string, msgAndArgs ...any if h, ok := a.T.(H); ok { h.Helper() } - return assertions.ErrorContains(a.T, err, contains, msgAndArgs...) + return assertions.ErrorContains(a.T, err, contains, append(msgAndArgs, a.o)...) } // ErrorContainsf is the same as [Assertions.ErrorContains], but it accepts a format string to format arguments like [fmt.Printf]. @@ -308,7 +313,7 @@ func (a *Assertions) ErrorContainsf(err error, contains string, msg string, args if h, ok := a.T.(H); ok { h.Helper() } - return assertions.ErrorContains(a.T, err, contains, forwardArgs(msg, args)...) + return assertions.ErrorContains(a.T, err, contains, forwardArgs(msg, args, a.o)...) } // ErrorIs is the same as [ErrorIs], as a method rather than a package-level function. @@ -318,7 +323,7 @@ func (a *Assertions) ErrorIs(err error, target error, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.ErrorIs(a.T, err, target, msgAndArgs...) + return assertions.ErrorIs(a.T, err, target, append(msgAndArgs, a.o)...) } // ErrorIsf is the same as [Assertions.ErrorIs], but it accepts a format string to format arguments like [fmt.Printf]. @@ -328,7 +333,7 @@ func (a *Assertions) ErrorIsf(err error, target error, msg string, args ...any) if h, ok := a.T.(H); ok { h.Helper() } - return assertions.ErrorIs(a.T, err, target, forwardArgs(msg, args)...) + return assertions.ErrorIs(a.T, err, target, forwardArgs(msg, args, a.o)...) } // ErrorNotContains is the same as [ErrorNotContains], as a method rather than a package-level function. @@ -338,7 +343,7 @@ func (a *Assertions) ErrorNotContains(err error, contains string, msgAndArgs ... if h, ok := a.T.(H); ok { h.Helper() } - return assertions.ErrorNotContains(a.T, err, contains, msgAndArgs...) + return assertions.ErrorNotContains(a.T, err, contains, append(msgAndArgs, a.o)...) } // ErrorNotContainsf is the same as [Assertions.ErrorNotContains], but it accepts a format string to format arguments like [fmt.Printf]. @@ -348,7 +353,7 @@ func (a *Assertions) ErrorNotContainsf(err error, contains string, msg string, a if h, ok := a.T.(H); ok { h.Helper() } - return assertions.ErrorNotContains(a.T, err, contains, forwardArgs(msg, args)...) + return assertions.ErrorNotContains(a.T, err, contains, forwardArgs(msg, args, a.o)...) } // Exactly is the same as [Exactly], as a method rather than a package-level function. @@ -358,7 +363,7 @@ func (a *Assertions) Exactly(expected any, actual any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Exactly(a.T, expected, actual, msgAndArgs...) + return assertions.Exactly(a.T, expected, actual, append(msgAndArgs, a.o)...) } // Exactlyf is the same as [Assertions.Exactly], but it accepts a format string to format arguments like [fmt.Printf]. @@ -368,7 +373,7 @@ func (a *Assertions) Exactlyf(expected any, actual any, msg string, args ...any) if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Exactly(a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.Exactly(a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // Fail is the same as [Fail], as a method rather than a package-level function. @@ -378,7 +383,7 @@ func (a *Assertions) Fail(failureMessage string, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Fail(a.T, failureMessage, msgAndArgs...) + return assertions.Fail(a.T, failureMessage, append(msgAndArgs, a.o)...) } // Failf is the same as [Assertions.Fail], but it accepts a format string to format arguments like [fmt.Printf]. @@ -388,7 +393,7 @@ func (a *Assertions) Failf(failureMessage string, msg string, args ...any) bool if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Fail(a.T, failureMessage, forwardArgs(msg, args)...) + return assertions.Fail(a.T, failureMessage, forwardArgs(msg, args, a.o)...) } // FailNow is the same as [FailNow], as a method rather than a package-level function. @@ -398,7 +403,7 @@ func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.FailNow(a.T, failureMessage, msgAndArgs...) + return assertions.FailNow(a.T, failureMessage, append(msgAndArgs, a.o)...) } // FailNowf is the same as [Assertions.FailNow], but it accepts a format string to format arguments like [fmt.Printf]. @@ -408,7 +413,7 @@ func (a *Assertions) FailNowf(failureMessage string, msg string, args ...any) bo if h, ok := a.T.(H); ok { h.Helper() } - return assertions.FailNow(a.T, failureMessage, forwardArgs(msg, args)...) + return assertions.FailNow(a.T, failureMessage, forwardArgs(msg, args, a.o)...) } // False is the same as [False], as a method rather than a package-level function. @@ -418,7 +423,7 @@ func (a *Assertions) False(value bool, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.False(a.T, value, msgAndArgs...) + return assertions.False(a.T, value, append(msgAndArgs, a.o)...) } // Falsef is the same as [Assertions.False], but it accepts a format string to format arguments like [fmt.Printf]. @@ -428,7 +433,7 @@ func (a *Assertions) Falsef(value bool, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.False(a.T, value, forwardArgs(msg, args)...) + return assertions.False(a.T, value, forwardArgs(msg, args, a.o)...) } // FileEmpty is the same as [FileEmpty], as a method rather than a package-level function. @@ -438,7 +443,7 @@ func (a *Assertions) FileEmpty(path string, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.FileEmpty(a.T, path, msgAndArgs...) + return assertions.FileEmpty(a.T, path, append(msgAndArgs, a.o)...) } // FileEmptyf is the same as [Assertions.FileEmpty], but it accepts a format string to format arguments like [fmt.Printf]. @@ -448,7 +453,7 @@ func (a *Assertions) FileEmptyf(path string, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.FileEmpty(a.T, path, forwardArgs(msg, args)...) + return assertions.FileEmpty(a.T, path, forwardArgs(msg, args, a.o)...) } // FileExists is the same as [FileExists], as a method rather than a package-level function. @@ -458,7 +463,7 @@ func (a *Assertions) FileExists(path string, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.FileExists(a.T, path, msgAndArgs...) + return assertions.FileExists(a.T, path, append(msgAndArgs, a.o)...) } // FileExistsf is the same as [Assertions.FileExists], but it accepts a format string to format arguments like [fmt.Printf]. @@ -468,7 +473,7 @@ func (a *Assertions) FileExistsf(path string, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.FileExists(a.T, path, forwardArgs(msg, args)...) + return assertions.FileExists(a.T, path, forwardArgs(msg, args, a.o)...) } // FileNotEmpty is the same as [FileNotEmpty], as a method rather than a package-level function. @@ -478,7 +483,7 @@ func (a *Assertions) FileNotEmpty(path string, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.FileNotEmpty(a.T, path, msgAndArgs...) + return assertions.FileNotEmpty(a.T, path, append(msgAndArgs, a.o)...) } // FileNotEmptyf is the same as [Assertions.FileNotEmpty], but it accepts a format string to format arguments like [fmt.Printf]. @@ -488,7 +493,7 @@ func (a *Assertions) FileNotEmptyf(path string, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.FileNotEmpty(a.T, path, forwardArgs(msg, args)...) + return assertions.FileNotEmpty(a.T, path, forwardArgs(msg, args, a.o)...) } // FileNotExists is the same as [FileNotExists], as a method rather than a package-level function. @@ -498,7 +503,7 @@ func (a *Assertions) FileNotExists(path string, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.FileNotExists(a.T, path, msgAndArgs...) + return assertions.FileNotExists(a.T, path, append(msgAndArgs, a.o)...) } // FileNotExistsf is the same as [Assertions.FileNotExists], but it accepts a format string to format arguments like [fmt.Printf]. @@ -508,7 +513,7 @@ func (a *Assertions) FileNotExistsf(path string, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.FileNotExists(a.T, path, forwardArgs(msg, args)...) + return assertions.FileNotExists(a.T, path, forwardArgs(msg, args, a.o)...) } // Greater is the same as [Greater], as a method rather than a package-level function. @@ -518,7 +523,7 @@ func (a *Assertions) Greater(e1 any, e2 any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Greater(a.T, e1, e2, msgAndArgs...) + return assertions.Greater(a.T, e1, e2, append(msgAndArgs, a.o)...) } // Greaterf is the same as [Assertions.Greater], but it accepts a format string to format arguments like [fmt.Printf]. @@ -528,7 +533,7 @@ func (a *Assertions) Greaterf(e1 any, e2 any, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Greater(a.T, e1, e2, forwardArgs(msg, args)...) + return assertions.Greater(a.T, e1, e2, forwardArgs(msg, args, a.o)...) } // GreaterOrEqual is the same as [GreaterOrEqual], as a method rather than a package-level function. @@ -538,7 +543,7 @@ func (a *Assertions) GreaterOrEqual(e1 any, e2 any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.GreaterOrEqual(a.T, e1, e2, msgAndArgs...) + return assertions.GreaterOrEqual(a.T, e1, e2, append(msgAndArgs, a.o)...) } // GreaterOrEqualf is the same as [Assertions.GreaterOrEqual], but it accepts a format string to format arguments like [fmt.Printf]. @@ -548,7 +553,7 @@ func (a *Assertions) GreaterOrEqualf(e1 any, e2 any, msg string, args ...any) bo if h, ok := a.T.(H); ok { h.Helper() } - return assertions.GreaterOrEqual(a.T, e1, e2, forwardArgs(msg, args)...) + return assertions.GreaterOrEqual(a.T, e1, e2, forwardArgs(msg, args, a.o)...) } // HTTPBodyContains is the same as [HTTPBodyContains], as a method rather than a package-level function. @@ -558,7 +563,7 @@ func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, u if h, ok := a.T.(H); ok { h.Helper() } - return assertions.HTTPBodyContains(a.T, handler, method, url, values, str, msgAndArgs...) + return assertions.HTTPBodyContains(a.T, handler, method, url, values, str, append(msgAndArgs, a.o)...) } // HTTPBodyContainsf is the same as [Assertions.HTTPBodyContains], but it accepts a format string to format arguments like [fmt.Printf]. @@ -568,7 +573,7 @@ func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.HTTPBodyContains(a.T, handler, method, url, values, str, forwardArgs(msg, args)...) + return assertions.HTTPBodyContains(a.T, handler, method, url, values, str, forwardArgs(msg, args, a.o)...) } // HTTPBodyNotContains is the same as [HTTPBodyNotContains], as a method rather than a package-level function. @@ -578,7 +583,7 @@ func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string if h, ok := a.T.(H); ok { h.Helper() } - return assertions.HTTPBodyNotContains(a.T, handler, method, url, values, str, msgAndArgs...) + return assertions.HTTPBodyNotContains(a.T, handler, method, url, values, str, append(msgAndArgs, a.o)...) } // HTTPBodyNotContainsf is the same as [Assertions.HTTPBodyNotContains], but it accepts a format string to format arguments like [fmt.Printf]. @@ -588,7 +593,7 @@ func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method strin if h, ok := a.T.(H); ok { h.Helper() } - return assertions.HTTPBodyNotContains(a.T, handler, method, url, values, str, forwardArgs(msg, args)...) + return assertions.HTTPBodyNotContains(a.T, handler, method, url, values, str, forwardArgs(msg, args, a.o)...) } // HTTPError is the same as [HTTPError], as a method rather than a package-level function. @@ -598,7 +603,7 @@ func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url stri if h, ok := a.T.(H); ok { h.Helper() } - return assertions.HTTPError(a.T, handler, method, url, values, msgAndArgs...) + return assertions.HTTPError(a.T, handler, method, url, values, append(msgAndArgs, a.o)...) } // HTTPErrorf is the same as [Assertions.HTTPError], but it accepts a format string to format arguments like [fmt.Printf]. @@ -608,7 +613,7 @@ func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url str if h, ok := a.T.(H); ok { h.Helper() } - return assertions.HTTPError(a.T, handler, method, url, values, forwardArgs(msg, args)...) + return assertions.HTTPError(a.T, handler, method, url, values, forwardArgs(msg, args, a.o)...) } // HTTPRedirect is the same as [HTTPRedirect], as a method rather than a package-level function. @@ -618,7 +623,7 @@ func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url s if h, ok := a.T.(H); ok { h.Helper() } - return assertions.HTTPRedirect(a.T, handler, method, url, values, msgAndArgs...) + return assertions.HTTPRedirect(a.T, handler, method, url, values, append(msgAndArgs, a.o)...) } // HTTPRedirectf is the same as [Assertions.HTTPRedirect], but it accepts a format string to format arguments like [fmt.Printf]. @@ -628,7 +633,7 @@ func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url if h, ok := a.T.(H); ok { h.Helper() } - return assertions.HTTPRedirect(a.T, handler, method, url, values, forwardArgs(msg, args)...) + return assertions.HTTPRedirect(a.T, handler, method, url, values, forwardArgs(msg, args, a.o)...) } // HTTPStatusCode is the same as [HTTPStatusCode], as a method rather than a package-level function. @@ -638,7 +643,7 @@ func (a *Assertions) HTTPStatusCode(handler http.HandlerFunc, method string, url if h, ok := a.T.(H); ok { h.Helper() } - return assertions.HTTPStatusCode(a.T, handler, method, url, values, statuscode, msgAndArgs...) + return assertions.HTTPStatusCode(a.T, handler, method, url, values, statuscode, append(msgAndArgs, a.o)...) } // HTTPStatusCodef is the same as [Assertions.HTTPStatusCode], but it accepts a format string to format arguments like [fmt.Printf]. @@ -648,7 +653,7 @@ func (a *Assertions) HTTPStatusCodef(handler http.HandlerFunc, method string, ur if h, ok := a.T.(H); ok { h.Helper() } - return assertions.HTTPStatusCode(a.T, handler, method, url, values, statuscode, forwardArgs(msg, args)...) + return assertions.HTTPStatusCode(a.T, handler, method, url, values, statuscode, forwardArgs(msg, args, a.o)...) } // HTTPSuccess is the same as [HTTPSuccess], as a method rather than a package-level function. @@ -658,7 +663,7 @@ func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url st if h, ok := a.T.(H); ok { h.Helper() } - return assertions.HTTPSuccess(a.T, handler, method, url, values, msgAndArgs...) + return assertions.HTTPSuccess(a.T, handler, method, url, values, append(msgAndArgs, a.o)...) } // HTTPSuccessf is the same as [Assertions.HTTPSuccess], but it accepts a format string to format arguments like [fmt.Printf]. @@ -668,7 +673,7 @@ func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url s if h, ok := a.T.(H); ok { h.Helper() } - return assertions.HTTPSuccess(a.T, handler, method, url, values, forwardArgs(msg, args)...) + return assertions.HTTPSuccess(a.T, handler, method, url, values, forwardArgs(msg, args, a.o)...) } // Implements is the same as [Implements], as a method rather than a package-level function. @@ -678,7 +683,7 @@ func (a *Assertions) Implements(interfaceObject any, object any, msgAndArgs ...a if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Implements(a.T, interfaceObject, object, msgAndArgs...) + return assertions.Implements(a.T, interfaceObject, object, append(msgAndArgs, a.o)...) } // Implementsf is the same as [Assertions.Implements], but it accepts a format string to format arguments like [fmt.Printf]. @@ -688,7 +693,7 @@ func (a *Assertions) Implementsf(interfaceObject any, object any, msg string, ar if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Implements(a.T, interfaceObject, object, forwardArgs(msg, args)...) + return assertions.Implements(a.T, interfaceObject, object, forwardArgs(msg, args, a.o)...) } // InDelta is the same as [InDelta], as a method rather than a package-level function. @@ -698,7 +703,7 @@ func (a *Assertions) InDelta(expected any, actual any, delta float64, msgAndArgs if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InDelta(a.T, expected, actual, delta, msgAndArgs...) + return assertions.InDelta(a.T, expected, actual, delta, append(msgAndArgs, a.o)...) } // InDeltaf is the same as [Assertions.InDelta], but it accepts a format string to format arguments like [fmt.Printf]. @@ -708,7 +713,7 @@ func (a *Assertions) InDeltaf(expected any, actual any, delta float64, msg strin if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InDelta(a.T, expected, actual, delta, forwardArgs(msg, args)...) + return assertions.InDelta(a.T, expected, actual, delta, forwardArgs(msg, args, a.o)...) } // InDeltaMapValues is the same as [InDeltaMapValues], as a method rather than a package-level function. @@ -718,7 +723,7 @@ func (a *Assertions) InDeltaMapValues(expected any, actual any, delta float64, m if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InDeltaMapValues(a.T, expected, actual, delta, msgAndArgs...) + return assertions.InDeltaMapValues(a.T, expected, actual, delta, append(msgAndArgs, a.o)...) } // InDeltaMapValuesf is the same as [Assertions.InDeltaMapValues], but it accepts a format string to format arguments like [fmt.Printf]. @@ -728,7 +733,7 @@ func (a *Assertions) InDeltaMapValuesf(expected any, actual any, delta float64, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InDeltaMapValues(a.T, expected, actual, delta, forwardArgs(msg, args)...) + return assertions.InDeltaMapValues(a.T, expected, actual, delta, forwardArgs(msg, args, a.o)...) } // InDeltaSlice is the same as [InDeltaSlice], as a method rather than a package-level function. @@ -738,7 +743,7 @@ func (a *Assertions) InDeltaSlice(expected any, actual any, delta float64, msgAn if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InDeltaSlice(a.T, expected, actual, delta, msgAndArgs...) + return assertions.InDeltaSlice(a.T, expected, actual, delta, append(msgAndArgs, a.o)...) } // InDeltaSlicef is the same as [Assertions.InDeltaSlice], but it accepts a format string to format arguments like [fmt.Printf]. @@ -748,7 +753,7 @@ func (a *Assertions) InDeltaSlicef(expected any, actual any, delta float64, msg if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InDeltaSlice(a.T, expected, actual, delta, forwardArgs(msg, args)...) + return assertions.InDeltaSlice(a.T, expected, actual, delta, forwardArgs(msg, args, a.o)...) } // InEpsilon is the same as [InEpsilon], as a method rather than a package-level function. @@ -758,7 +763,7 @@ func (a *Assertions) InEpsilon(expected any, actual any, epsilon float64, msgAnd if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InEpsilon(a.T, expected, actual, epsilon, msgAndArgs...) + return assertions.InEpsilon(a.T, expected, actual, epsilon, append(msgAndArgs, a.o)...) } // InEpsilonf is the same as [Assertions.InEpsilon], but it accepts a format string to format arguments like [fmt.Printf]. @@ -768,7 +773,7 @@ func (a *Assertions) InEpsilonf(expected any, actual any, epsilon float64, msg s if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InEpsilon(a.T, expected, actual, epsilon, forwardArgs(msg, args)...) + return assertions.InEpsilon(a.T, expected, actual, epsilon, forwardArgs(msg, args, a.o)...) } // InEpsilonSlice is the same as [InEpsilonSlice], as a method rather than a package-level function. @@ -778,7 +783,7 @@ func (a *Assertions) InEpsilonSlice(expected any, actual any, epsilon float64, m if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InEpsilonSlice(a.T, expected, actual, epsilon, msgAndArgs...) + return assertions.InEpsilonSlice(a.T, expected, actual, epsilon, append(msgAndArgs, a.o)...) } // InEpsilonSlicef is the same as [Assertions.InEpsilonSlice], but it accepts a format string to format arguments like [fmt.Printf]. @@ -788,7 +793,7 @@ func (a *Assertions) InEpsilonSlicef(expected any, actual any, epsilon float64, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InEpsilonSlice(a.T, expected, actual, epsilon, forwardArgs(msg, args)...) + return assertions.InEpsilonSlice(a.T, expected, actual, epsilon, forwardArgs(msg, args, a.o)...) } // InEpsilonSymmetric is the same as [InEpsilonSymmetric], as a method rather than a package-level function. @@ -798,7 +803,7 @@ func (a *Assertions) InEpsilonSymmetric(x any, y any, epsilon float64, msgAndArg if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InEpsilonSymmetric(a.T, x, y, epsilon, msgAndArgs...) + return assertions.InEpsilonSymmetric(a.T, x, y, epsilon, append(msgAndArgs, a.o)...) } // InEpsilonSymmetricf is the same as [Assertions.InEpsilonSymmetric], but it accepts a format string to format arguments like [fmt.Printf]. @@ -808,7 +813,7 @@ func (a *Assertions) InEpsilonSymmetricf(x any, y any, epsilon float64, msg stri if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InEpsilonSymmetric(a.T, x, y, epsilon, forwardArgs(msg, args)...) + return assertions.InEpsilonSymmetric(a.T, x, y, epsilon, forwardArgs(msg, args, a.o)...) } // IsDecreasing is the same as [IsDecreasing], as a method rather than a package-level function. @@ -818,7 +823,7 @@ func (a *Assertions) IsDecreasing(collection any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsDecreasing(a.T, collection, msgAndArgs...) + return assertions.IsDecreasing(a.T, collection, append(msgAndArgs, a.o)...) } // IsDecreasingf is the same as [Assertions.IsDecreasing], but it accepts a format string to format arguments like [fmt.Printf]. @@ -828,7 +833,7 @@ func (a *Assertions) IsDecreasingf(collection any, msg string, args ...any) bool if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsDecreasing(a.T, collection, forwardArgs(msg, args)...) + return assertions.IsDecreasing(a.T, collection, forwardArgs(msg, args, a.o)...) } // IsIncreasing is the same as [IsIncreasing], as a method rather than a package-level function. @@ -838,7 +843,7 @@ func (a *Assertions) IsIncreasing(collection any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsIncreasing(a.T, collection, msgAndArgs...) + return assertions.IsIncreasing(a.T, collection, append(msgAndArgs, a.o)...) } // IsIncreasingf is the same as [Assertions.IsIncreasing], but it accepts a format string to format arguments like [fmt.Printf]. @@ -848,7 +853,7 @@ func (a *Assertions) IsIncreasingf(collection any, msg string, args ...any) bool if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsIncreasing(a.T, collection, forwardArgs(msg, args)...) + return assertions.IsIncreasing(a.T, collection, forwardArgs(msg, args, a.o)...) } // IsNonDecreasing is the same as [IsNonDecreasing], as a method rather than a package-level function. @@ -858,7 +863,7 @@ func (a *Assertions) IsNonDecreasing(collection any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsNonDecreasing(a.T, collection, msgAndArgs...) + return assertions.IsNonDecreasing(a.T, collection, append(msgAndArgs, a.o)...) } // IsNonDecreasingf is the same as [Assertions.IsNonDecreasing], but it accepts a format string to format arguments like [fmt.Printf]. @@ -868,7 +873,7 @@ func (a *Assertions) IsNonDecreasingf(collection any, msg string, args ...any) b if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsNonDecreasing(a.T, collection, forwardArgs(msg, args)...) + return assertions.IsNonDecreasing(a.T, collection, forwardArgs(msg, args, a.o)...) } // IsNonIncreasing is the same as [IsNonIncreasing], as a method rather than a package-level function. @@ -878,7 +883,7 @@ func (a *Assertions) IsNonIncreasing(collection any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsNonIncreasing(a.T, collection, msgAndArgs...) + return assertions.IsNonIncreasing(a.T, collection, append(msgAndArgs, a.o)...) } // IsNonIncreasingf is the same as [Assertions.IsNonIncreasing], but it accepts a format string to format arguments like [fmt.Printf]. @@ -888,7 +893,7 @@ func (a *Assertions) IsNonIncreasingf(collection any, msg string, args ...any) b if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsNonIncreasing(a.T, collection, forwardArgs(msg, args)...) + return assertions.IsNonIncreasing(a.T, collection, forwardArgs(msg, args, a.o)...) } // IsNotType is the same as [IsNotType], as a method rather than a package-level function. @@ -898,7 +903,7 @@ func (a *Assertions) IsNotType(theType any, object any, msgAndArgs ...any) bool if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsNotType(a.T, theType, object, msgAndArgs...) + return assertions.IsNotType(a.T, theType, object, append(msgAndArgs, a.o)...) } // IsNotTypef is the same as [Assertions.IsNotType], but it accepts a format string to format arguments like [fmt.Printf]. @@ -908,7 +913,7 @@ func (a *Assertions) IsNotTypef(theType any, object any, msg string, args ...any if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsNotType(a.T, theType, object, forwardArgs(msg, args)...) + return assertions.IsNotType(a.T, theType, object, forwardArgs(msg, args, a.o)...) } // IsType is the same as [IsType], as a method rather than a package-level function. @@ -918,7 +923,7 @@ func (a *Assertions) IsType(expectedType any, object any, msgAndArgs ...any) boo if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsType(a.T, expectedType, object, msgAndArgs...) + return assertions.IsType(a.T, expectedType, object, append(msgAndArgs, a.o)...) } // IsTypef is the same as [Assertions.IsType], but it accepts a format string to format arguments like [fmt.Printf]. @@ -928,7 +933,7 @@ func (a *Assertions) IsTypef(expectedType any, object any, msg string, args ...a if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsType(a.T, expectedType, object, forwardArgs(msg, args)...) + return assertions.IsType(a.T, expectedType, object, forwardArgs(msg, args, a.o)...) } // JSONEq is the same as [JSONEq], as a method rather than a package-level function. @@ -938,7 +943,7 @@ func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...any) b if h, ok := a.T.(H); ok { h.Helper() } - return assertions.JSONEq(a.T, expected, actual, msgAndArgs...) + return assertions.JSONEq(a.T, expected, actual, append(msgAndArgs, a.o)...) } // JSONEqf is the same as [Assertions.JSONEq], but it accepts a format string to format arguments like [fmt.Printf]. @@ -948,7 +953,7 @@ func (a *Assertions) JSONEqf(expected string, actual string, msg string, args .. if h, ok := a.T.(H); ok { h.Helper() } - return assertions.JSONEq(a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.JSONEq(a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // JSONEqBytes is the same as [JSONEqBytes], as a method rather than a package-level function. @@ -958,7 +963,7 @@ func (a *Assertions) JSONEqBytes(expected []byte, actual []byte, msgAndArgs ...a if h, ok := a.T.(H); ok { h.Helper() } - return assertions.JSONEqBytes(a.T, expected, actual, msgAndArgs...) + return assertions.JSONEqBytes(a.T, expected, actual, append(msgAndArgs, a.o)...) } // JSONEqBytesf is the same as [Assertions.JSONEqBytes], but it accepts a format string to format arguments like [fmt.Printf]. @@ -968,7 +973,7 @@ func (a *Assertions) JSONEqBytesf(expected []byte, actual []byte, msg string, ar if h, ok := a.T.(H); ok { h.Helper() } - return assertions.JSONEqBytes(a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.JSONEqBytes(a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // Kind is the same as [Kind], as a method rather than a package-level function. @@ -978,7 +983,7 @@ func (a *Assertions) Kind(expectedKind reflect.Kind, object any, msgAndArgs ...a if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Kind(a.T, expectedKind, object, msgAndArgs...) + return assertions.Kind(a.T, expectedKind, object, append(msgAndArgs, a.o)...) } // Kindf is the same as [Assertions.Kind], but it accepts a format string to format arguments like [fmt.Printf]. @@ -988,7 +993,7 @@ func (a *Assertions) Kindf(expectedKind reflect.Kind, object any, msg string, ar if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Kind(a.T, expectedKind, object, forwardArgs(msg, args)...) + return assertions.Kind(a.T, expectedKind, object, forwardArgs(msg, args, a.o)...) } // Len is the same as [Len], as a method rather than a package-level function. @@ -998,7 +1003,7 @@ func (a *Assertions) Len(object any, length int, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Len(a.T, object, length, msgAndArgs...) + return assertions.Len(a.T, object, length, append(msgAndArgs, a.o)...) } // Lenf is the same as [Assertions.Len], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1008,7 +1013,7 @@ func (a *Assertions) Lenf(object any, length int, msg string, args ...any) bool if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Len(a.T, object, length, forwardArgs(msg, args)...) + return assertions.Len(a.T, object, length, forwardArgs(msg, args, a.o)...) } // Less is the same as [Less], as a method rather than a package-level function. @@ -1018,7 +1023,7 @@ func (a *Assertions) Less(e1 any, e2 any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Less(a.T, e1, e2, msgAndArgs...) + return assertions.Less(a.T, e1, e2, append(msgAndArgs, a.o)...) } // Lessf is the same as [Assertions.Less], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1028,7 +1033,7 @@ func (a *Assertions) Lessf(e1 any, e2 any, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Less(a.T, e1, e2, forwardArgs(msg, args)...) + return assertions.Less(a.T, e1, e2, forwardArgs(msg, args, a.o)...) } // LessOrEqual is the same as [LessOrEqual], as a method rather than a package-level function. @@ -1038,7 +1043,7 @@ func (a *Assertions) LessOrEqual(e1 any, e2 any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.LessOrEqual(a.T, e1, e2, msgAndArgs...) + return assertions.LessOrEqual(a.T, e1, e2, append(msgAndArgs, a.o)...) } // LessOrEqualf is the same as [Assertions.LessOrEqual], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1048,7 +1053,7 @@ func (a *Assertions) LessOrEqualf(e1 any, e2 any, msg string, args ...any) bool if h, ok := a.T.(H); ok { h.Helper() } - return assertions.LessOrEqual(a.T, e1, e2, forwardArgs(msg, args)...) + return assertions.LessOrEqual(a.T, e1, e2, forwardArgs(msg, args, a.o)...) } // Negative is the same as [Negative], as a method rather than a package-level function. @@ -1058,7 +1063,7 @@ func (a *Assertions) Negative(e any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Negative(a.T, e, msgAndArgs...) + return assertions.Negative(a.T, e, append(msgAndArgs, a.o)...) } // Negativef is the same as [Assertions.Negative], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1068,7 +1073,7 @@ func (a *Assertions) Negativef(e any, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Negative(a.T, e, forwardArgs(msg, args)...) + return assertions.Negative(a.T, e, forwardArgs(msg, args, a.o)...) } // Nil is the same as [Nil], as a method rather than a package-level function. @@ -1078,7 +1083,7 @@ func (a *Assertions) Nil(object any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Nil(a.T, object, msgAndArgs...) + return assertions.Nil(a.T, object, append(msgAndArgs, a.o)...) } // Nilf is the same as [Assertions.Nil], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1088,7 +1093,7 @@ func (a *Assertions) Nilf(object any, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Nil(a.T, object, forwardArgs(msg, args)...) + return assertions.Nil(a.T, object, forwardArgs(msg, args, a.o)...) } // NoError is the same as [NoError], as a method rather than a package-level function. @@ -1098,7 +1103,7 @@ func (a *Assertions) NoError(err error, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NoError(a.T, err, msgAndArgs...) + return assertions.NoError(a.T, err, append(msgAndArgs, a.o)...) } // NoErrorf is the same as [Assertions.NoError], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1108,7 +1113,7 @@ func (a *Assertions) NoErrorf(err error, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NoError(a.T, err, forwardArgs(msg, args)...) + return assertions.NoError(a.T, err, forwardArgs(msg, args, a.o)...) } // NoFileDescriptorLeak is the same as [NoFileDescriptorLeak], as a method rather than a package-level function. @@ -1118,7 +1123,7 @@ func (a *Assertions) NoFileDescriptorLeak(tested func(), msgAndArgs ...any) bool if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NoFileDescriptorLeak(a.T, tested, msgAndArgs...) + return assertions.NoFileDescriptorLeak(a.T, tested, append(msgAndArgs, a.o)...) } // NoFileDescriptorLeakf is the same as [Assertions.NoFileDescriptorLeak], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1128,7 +1133,7 @@ func (a *Assertions) NoFileDescriptorLeakf(tested func(), msg string, args ...an if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NoFileDescriptorLeak(a.T, tested, forwardArgs(msg, args)...) + return assertions.NoFileDescriptorLeak(a.T, tested, forwardArgs(msg, args, a.o)...) } // NoGoRoutineLeak is the same as [NoGoRoutineLeak], as a method rather than a package-level function. @@ -1138,7 +1143,7 @@ func (a *Assertions) NoGoRoutineLeak(tested func(), msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NoGoRoutineLeak(a.T, tested, msgAndArgs...) + return assertions.NoGoRoutineLeak(a.T, tested, append(msgAndArgs, a.o)...) } // NoGoRoutineLeakf is the same as [Assertions.NoGoRoutineLeak], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1148,7 +1153,7 @@ func (a *Assertions) NoGoRoutineLeakf(tested func(), msg string, args ...any) bo if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NoGoRoutineLeak(a.T, tested, forwardArgs(msg, args)...) + return assertions.NoGoRoutineLeak(a.T, tested, forwardArgs(msg, args, a.o)...) } // NotBlocked is the same as [NotBlocked], as a method rather than a package-level function. @@ -1158,7 +1163,7 @@ func (a *Assertions) NotBlocked(ch any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotBlocked(a.T, ch, msgAndArgs...) + return assertions.NotBlocked(a.T, ch, append(msgAndArgs, a.o)...) } // NotBlockedf is the same as [Assertions.NotBlocked], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1168,7 +1173,7 @@ func (a *Assertions) NotBlockedf(ch any, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotBlocked(a.T, ch, forwardArgs(msg, args)...) + return assertions.NotBlocked(a.T, ch, forwardArgs(msg, args, a.o)...) } // NotContains is the same as [NotContains], as a method rather than a package-level function. @@ -1178,7 +1183,7 @@ func (a *Assertions) NotContains(s any, contains any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotContains(a.T, s, contains, msgAndArgs...) + return assertions.NotContains(a.T, s, contains, append(msgAndArgs, a.o)...) } // NotContainsf is the same as [Assertions.NotContains], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1188,7 +1193,7 @@ func (a *Assertions) NotContainsf(s any, contains any, msg string, args ...any) if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotContains(a.T, s, contains, forwardArgs(msg, args)...) + return assertions.NotContains(a.T, s, contains, forwardArgs(msg, args, a.o)...) } // NotElementsMatch is the same as [NotElementsMatch], as a method rather than a package-level function. @@ -1198,7 +1203,7 @@ func (a *Assertions) NotElementsMatch(listA any, listB any, msgAndArgs ...any) ( if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotElementsMatch(a.T, listA, listB, msgAndArgs...) + return assertions.NotElementsMatch(a.T, listA, listB, append(msgAndArgs, a.o)...) } // NotElementsMatchf is the same as [Assertions.NotElementsMatch], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1208,7 +1213,7 @@ func (a *Assertions) NotElementsMatchf(listA any, listB any, msg string, args .. if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotElementsMatch(a.T, listA, listB, forwardArgs(msg, args)...) + return assertions.NotElementsMatch(a.T, listA, listB, forwardArgs(msg, args, a.o)...) } // NotEmpty is the same as [NotEmpty], as a method rather than a package-level function. @@ -1218,7 +1223,7 @@ func (a *Assertions) NotEmpty(object any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotEmpty(a.T, object, msgAndArgs...) + return assertions.NotEmpty(a.T, object, append(msgAndArgs, a.o)...) } // NotEmptyf is the same as [Assertions.NotEmpty], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1228,7 +1233,7 @@ func (a *Assertions) NotEmptyf(object any, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotEmpty(a.T, object, forwardArgs(msg, args)...) + return assertions.NotEmpty(a.T, object, forwardArgs(msg, args, a.o)...) } // NotEqual is the same as [NotEqual], as a method rather than a package-level function. @@ -1238,7 +1243,7 @@ func (a *Assertions) NotEqual(expected any, actual any, msgAndArgs ...any) bool if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotEqual(a.T, expected, actual, msgAndArgs...) + return assertions.NotEqual(a.T, expected, actual, append(msgAndArgs, a.o)...) } // NotEqualf is the same as [Assertions.NotEqual], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1248,7 +1253,7 @@ func (a *Assertions) NotEqualf(expected any, actual any, msg string, args ...any if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotEqual(a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.NotEqual(a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // NotEqualValues is the same as [NotEqualValues], as a method rather than a package-level function. @@ -1258,7 +1263,7 @@ func (a *Assertions) NotEqualValues(expected any, actual any, msgAndArgs ...any) if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotEqualValues(a.T, expected, actual, msgAndArgs...) + return assertions.NotEqualValues(a.T, expected, actual, append(msgAndArgs, a.o)...) } // NotEqualValuesf is the same as [Assertions.NotEqualValues], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1268,7 +1273,7 @@ func (a *Assertions) NotEqualValuesf(expected any, actual any, msg string, args if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotEqualValues(a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.NotEqualValues(a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // NotErrorAs is the same as [NotErrorAs], as a method rather than a package-level function. @@ -1278,7 +1283,7 @@ func (a *Assertions) NotErrorAs(err error, target any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotErrorAs(a.T, err, target, msgAndArgs...) + return assertions.NotErrorAs(a.T, err, target, append(msgAndArgs, a.o)...) } // NotErrorAsf is the same as [Assertions.NotErrorAs], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1288,7 +1293,7 @@ func (a *Assertions) NotErrorAsf(err error, target any, msg string, args ...any) if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotErrorAs(a.T, err, target, forwardArgs(msg, args)...) + return assertions.NotErrorAs(a.T, err, target, forwardArgs(msg, args, a.o)...) } // NotErrorIs is the same as [NotErrorIs], as a method rather than a package-level function. @@ -1298,7 +1303,7 @@ func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...any) bool if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotErrorIs(a.T, err, target, msgAndArgs...) + return assertions.NotErrorIs(a.T, err, target, append(msgAndArgs, a.o)...) } // NotErrorIsf is the same as [Assertions.NotErrorIs], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1308,7 +1313,7 @@ func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...an if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotErrorIs(a.T, err, target, forwardArgs(msg, args)...) + return assertions.NotErrorIs(a.T, err, target, forwardArgs(msg, args, a.o)...) } // NotImplements is the same as [NotImplements], as a method rather than a package-level function. @@ -1318,7 +1323,7 @@ func (a *Assertions) NotImplements(interfaceObject any, object any, msgAndArgs . if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotImplements(a.T, interfaceObject, object, msgAndArgs...) + return assertions.NotImplements(a.T, interfaceObject, object, append(msgAndArgs, a.o)...) } // NotImplementsf is the same as [Assertions.NotImplements], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1328,7 +1333,7 @@ func (a *Assertions) NotImplementsf(interfaceObject any, object any, msg string, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotImplements(a.T, interfaceObject, object, forwardArgs(msg, args)...) + return assertions.NotImplements(a.T, interfaceObject, object, forwardArgs(msg, args, a.o)...) } // NotKind is the same as [NotKind], as a method rather than a package-level function. @@ -1338,7 +1343,7 @@ func (a *Assertions) NotKind(expectedKind reflect.Kind, object any, msgAndArgs . if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotKind(a.T, expectedKind, object, msgAndArgs...) + return assertions.NotKind(a.T, expectedKind, object, append(msgAndArgs, a.o)...) } // NotKindf is the same as [Assertions.NotKind], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1348,7 +1353,7 @@ func (a *Assertions) NotKindf(expectedKind reflect.Kind, object any, msg string, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotKind(a.T, expectedKind, object, forwardArgs(msg, args)...) + return assertions.NotKind(a.T, expectedKind, object, forwardArgs(msg, args, a.o)...) } // NotNil is the same as [NotNil], as a method rather than a package-level function. @@ -1358,7 +1363,7 @@ func (a *Assertions) NotNil(object any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotNil(a.T, object, msgAndArgs...) + return assertions.NotNil(a.T, object, append(msgAndArgs, a.o)...) } // NotNilf is the same as [Assertions.NotNil], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1368,7 +1373,7 @@ func (a *Assertions) NotNilf(object any, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotNil(a.T, object, forwardArgs(msg, args)...) + return assertions.NotNil(a.T, object, forwardArgs(msg, args, a.o)...) } // NotPanics is the same as [NotPanics], as a method rather than a package-level function. @@ -1378,7 +1383,7 @@ func (a *Assertions) NotPanics(f func(), msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotPanics(a.T, f, msgAndArgs...) + return assertions.NotPanics(a.T, f, append(msgAndArgs, a.o)...) } // NotPanicsf is the same as [Assertions.NotPanics], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1388,7 +1393,7 @@ func (a *Assertions) NotPanicsf(f func(), msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotPanics(a.T, f, forwardArgs(msg, args)...) + return assertions.NotPanics(a.T, f, forwardArgs(msg, args, a.o)...) } // NotRegexp is the same as [NotRegexp], as a method rather than a package-level function. @@ -1398,7 +1403,7 @@ func (a *Assertions) NotRegexp(rx any, actual any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotRegexp(a.T, rx, actual, msgAndArgs...) + return assertions.NotRegexp(a.T, rx, actual, append(msgAndArgs, a.o)...) } // NotRegexpf is the same as [Assertions.NotRegexp], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1408,7 +1413,7 @@ func (a *Assertions) NotRegexpf(rx any, actual any, msg string, args ...any) boo if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotRegexp(a.T, rx, actual, forwardArgs(msg, args)...) + return assertions.NotRegexp(a.T, rx, actual, forwardArgs(msg, args, a.o)...) } // NotSame is the same as [NotSame], as a method rather than a package-level function. @@ -1418,7 +1423,7 @@ func (a *Assertions) NotSame(expected any, actual any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotSame(a.T, expected, actual, msgAndArgs...) + return assertions.NotSame(a.T, expected, actual, append(msgAndArgs, a.o)...) } // NotSamef is the same as [Assertions.NotSame], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1428,7 +1433,7 @@ func (a *Assertions) NotSamef(expected any, actual any, msg string, args ...any) if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotSame(a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.NotSame(a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // NotSubset is the same as [NotSubset], as a method rather than a package-level function. @@ -1438,7 +1443,7 @@ func (a *Assertions) NotSubset(list any, subset any, msgAndArgs ...any) (ok bool if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotSubset(a.T, list, subset, msgAndArgs...) + return assertions.NotSubset(a.T, list, subset, append(msgAndArgs, a.o)...) } // NotSubsetf is the same as [Assertions.NotSubset], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1448,7 +1453,7 @@ func (a *Assertions) NotSubsetf(list any, subset any, msg string, args ...any) ( if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotSubset(a.T, list, subset, forwardArgs(msg, args)...) + return assertions.NotSubset(a.T, list, subset, forwardArgs(msg, args, a.o)...) } // NotZero is the same as [NotZero], as a method rather than a package-level function. @@ -1458,7 +1463,7 @@ func (a *Assertions) NotZero(i any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotZero(a.T, i, msgAndArgs...) + return assertions.NotZero(a.T, i, append(msgAndArgs, a.o)...) } // NotZerof is the same as [Assertions.NotZero], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1468,7 +1473,7 @@ func (a *Assertions) NotZerof(i any, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotZero(a.T, i, forwardArgs(msg, args)...) + return assertions.NotZero(a.T, i, forwardArgs(msg, args, a.o)...) } // Panics is the same as [Panics], as a method rather than a package-level function. @@ -1478,7 +1483,7 @@ func (a *Assertions) Panics(f func(), msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Panics(a.T, f, msgAndArgs...) + return assertions.Panics(a.T, f, append(msgAndArgs, a.o)...) } // Panicsf is the same as [Assertions.Panics], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1488,7 +1493,7 @@ func (a *Assertions) Panicsf(f func(), msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Panics(a.T, f, forwardArgs(msg, args)...) + return assertions.Panics(a.T, f, forwardArgs(msg, args, a.o)...) } // PanicsWithError is the same as [PanicsWithError], as a method rather than a package-level function. @@ -1498,7 +1503,7 @@ func (a *Assertions) PanicsWithError(errString string, f func(), msgAndArgs ...a if h, ok := a.T.(H); ok { h.Helper() } - return assertions.PanicsWithError(a.T, errString, f, msgAndArgs...) + return assertions.PanicsWithError(a.T, errString, f, append(msgAndArgs, a.o)...) } // PanicsWithErrorf is the same as [Assertions.PanicsWithError], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1508,7 +1513,7 @@ func (a *Assertions) PanicsWithErrorf(errString string, f func(), msg string, ar if h, ok := a.T.(H); ok { h.Helper() } - return assertions.PanicsWithError(a.T, errString, f, forwardArgs(msg, args)...) + return assertions.PanicsWithError(a.T, errString, f, forwardArgs(msg, args, a.o)...) } // PanicsWithValue is the same as [PanicsWithValue], as a method rather than a package-level function. @@ -1518,7 +1523,7 @@ func (a *Assertions) PanicsWithValue(expected any, f func(), msgAndArgs ...any) if h, ok := a.T.(H); ok { h.Helper() } - return assertions.PanicsWithValue(a.T, expected, f, msgAndArgs...) + return assertions.PanicsWithValue(a.T, expected, f, append(msgAndArgs, a.o)...) } // PanicsWithValuef is the same as [Assertions.PanicsWithValue], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1528,7 +1533,7 @@ func (a *Assertions) PanicsWithValuef(expected any, f func(), msg string, args . if h, ok := a.T.(H); ok { h.Helper() } - return assertions.PanicsWithValue(a.T, expected, f, forwardArgs(msg, args)...) + return assertions.PanicsWithValue(a.T, expected, f, forwardArgs(msg, args, a.o)...) } // Positive is the same as [Positive], as a method rather than a package-level function. @@ -1538,7 +1543,7 @@ func (a *Assertions) Positive(e any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Positive(a.T, e, msgAndArgs...) + return assertions.Positive(a.T, e, append(msgAndArgs, a.o)...) } // Positivef is the same as [Assertions.Positive], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1548,7 +1553,7 @@ func (a *Assertions) Positivef(e any, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Positive(a.T, e, forwardArgs(msg, args)...) + return assertions.Positive(a.T, e, forwardArgs(msg, args, a.o)...) } // Regexp is the same as [Regexp], as a method rather than a package-level function. @@ -1558,7 +1563,7 @@ func (a *Assertions) Regexp(rx any, actual any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Regexp(a.T, rx, actual, msgAndArgs...) + return assertions.Regexp(a.T, rx, actual, append(msgAndArgs, a.o)...) } // Regexpf is the same as [Assertions.Regexp], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1568,7 +1573,7 @@ func (a *Assertions) Regexpf(rx any, actual any, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Regexp(a.T, rx, actual, forwardArgs(msg, args)...) + return assertions.Regexp(a.T, rx, actual, forwardArgs(msg, args, a.o)...) } // Same is the same as [Same], as a method rather than a package-level function. @@ -1578,7 +1583,7 @@ func (a *Assertions) Same(expected any, actual any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Same(a.T, expected, actual, msgAndArgs...) + return assertions.Same(a.T, expected, actual, append(msgAndArgs, a.o)...) } // Samef is the same as [Assertions.Same], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1588,7 +1593,7 @@ func (a *Assertions) Samef(expected any, actual any, msg string, args ...any) bo if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Same(a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.Same(a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // Subset is the same as [Subset], as a method rather than a package-level function. @@ -1598,7 +1603,7 @@ func (a *Assertions) Subset(list any, subset any, msgAndArgs ...any) (ok bool) { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Subset(a.T, list, subset, msgAndArgs...) + return assertions.Subset(a.T, list, subset, append(msgAndArgs, a.o)...) } // Subsetf is the same as [Assertions.Subset], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1608,7 +1613,7 @@ func (a *Assertions) Subsetf(list any, subset any, msg string, args ...any) (ok if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Subset(a.T, list, subset, forwardArgs(msg, args)...) + return assertions.Subset(a.T, list, subset, forwardArgs(msg, args, a.o)...) } // True is the same as [True], as a method rather than a package-level function. @@ -1618,7 +1623,7 @@ func (a *Assertions) True(value bool, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.True(a.T, value, msgAndArgs...) + return assertions.True(a.T, value, append(msgAndArgs, a.o)...) } // Truef is the same as [Assertions.True], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1628,7 +1633,7 @@ func (a *Assertions) Truef(value bool, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.True(a.T, value, forwardArgs(msg, args)...) + return assertions.True(a.T, value, forwardArgs(msg, args, a.o)...) } // WithinDuration is the same as [WithinDuration], as a method rather than a package-level function. @@ -1638,7 +1643,7 @@ func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta if h, ok := a.T.(H); ok { h.Helper() } - return assertions.WithinDuration(a.T, expected, actual, delta, msgAndArgs...) + return assertions.WithinDuration(a.T, expected, actual, delta, append(msgAndArgs, a.o)...) } // WithinDurationf is the same as [Assertions.WithinDuration], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1648,7 +1653,7 @@ func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta if h, ok := a.T.(H); ok { h.Helper() } - return assertions.WithinDuration(a.T, expected, actual, delta, forwardArgs(msg, args)...) + return assertions.WithinDuration(a.T, expected, actual, delta, forwardArgs(msg, args, a.o)...) } // WithinRange is the same as [WithinRange], as a method rather than a package-level function. @@ -1658,7 +1663,7 @@ func (a *Assertions) WithinRange(actual time.Time, start time.Time, end time.Tim if h, ok := a.T.(H); ok { h.Helper() } - return assertions.WithinRange(a.T, actual, start, end, msgAndArgs...) + return assertions.WithinRange(a.T, actual, start, end, append(msgAndArgs, a.o)...) } // WithinRangef is the same as [Assertions.WithinRange], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1668,7 +1673,7 @@ func (a *Assertions) WithinRangef(actual time.Time, start time.Time, end time.Ti if h, ok := a.T.(H); ok { h.Helper() } - return assertions.WithinRange(a.T, actual, start, end, forwardArgs(msg, args)...) + return assertions.WithinRange(a.T, actual, start, end, forwardArgs(msg, args, a.o)...) } // YAMLEq is the same as [YAMLEq], as a method rather than a package-level function. @@ -1678,7 +1683,7 @@ func (a *Assertions) YAMLEq(expected string, actual string, msgAndArgs ...any) b if h, ok := a.T.(H); ok { h.Helper() } - return assertions.YAMLEq(a.T, expected, actual, msgAndArgs...) + return assertions.YAMLEq(a.T, expected, actual, append(msgAndArgs, a.o)...) } // YAMLEqf is the same as [Assertions.YAMLEq], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1688,7 +1693,7 @@ func (a *Assertions) YAMLEqf(expected string, actual string, msg string, args .. if h, ok := a.T.(H); ok { h.Helper() } - return assertions.YAMLEq(a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.YAMLEq(a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // YAMLEqBytes is the same as [YAMLEqBytes], as a method rather than a package-level function. @@ -1698,7 +1703,7 @@ func (a *Assertions) YAMLEqBytes(expected []byte, actual []byte, msgAndArgs ...a if h, ok := a.T.(H); ok { h.Helper() } - return assertions.YAMLEqBytes(a.T, expected, actual, msgAndArgs...) + return assertions.YAMLEqBytes(a.T, expected, actual, append(msgAndArgs, a.o)...) } // YAMLEqBytesf is the same as [Assertions.YAMLEqBytes], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1708,7 +1713,7 @@ func (a *Assertions) YAMLEqBytesf(expected []byte, actual []byte, msg string, ar if h, ok := a.T.(H); ok { h.Helper() } - return assertions.YAMLEqBytes(a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.YAMLEqBytes(a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // Zero is the same as [Zero], as a method rather than a package-level function. @@ -1718,7 +1723,7 @@ func (a *Assertions) Zero(i any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Zero(a.T, i, msgAndArgs...) + return assertions.Zero(a.T, i, append(msgAndArgs, a.o)...) } // Zerof is the same as [Assertions.Zero], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1728,5 +1733,5 @@ func (a *Assertions) Zerof(i any, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Zero(a.T, i, forwardArgs(msg, args)...) + return assertions.Zero(a.T, i, forwardArgs(msg, args, a.o)...) } diff --git a/assert/assert_forward_go127.go b/assert/assert_forward_go127.go index cf7e695a4..5f05f6ffe 100644 --- a/assert/assert_forward_go127.go +++ b/assert/assert_forward_go127.go @@ -21,7 +21,7 @@ func (a *Assertions) BlockedT[E any, CHAN ~chan E](ch CHAN, msgAndArgs ...any) b if h, ok := a.T.(H); ok { h.Helper() } - return assertions.BlockedT[E, CHAN](a.T, ch, msgAndArgs...) + return assertions.BlockedT[E, CHAN](a.T, ch, append(msgAndArgs, a.o)...) } // BlockedTf is the same as [Assertions.BlockedT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -31,7 +31,7 @@ func (a *Assertions) BlockedTf[E any, CHAN ~chan E](ch CHAN, msg string, args .. if h, ok := a.T.(H); ok { h.Helper() } - return assertions.BlockedT[E, CHAN](a.T, ch, forwardArgs(msg, args)...) + return assertions.BlockedT[E, CHAN](a.T, ch, forwardArgs(msg, args, a.o)...) } // Consistently is the same as [Consistently], as a method rather than a package-level function. @@ -41,7 +41,7 @@ func (a *Assertions) Consistently[C Conditioner](condition C, timeout time.Durat if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Consistently[C](a.T, condition, timeout, tick, msgAndArgs...) + return assertions.Consistently[C](a.T, condition, timeout, tick, append(msgAndArgs, a.o)...) } // Consistentlyf is the same as [Assertions.Consistently], but it accepts a format string to format arguments like [fmt.Printf]. @@ -51,7 +51,7 @@ func (a *Assertions) Consistentlyf[C Conditioner](condition C, timeout time.Dura if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Consistently[C](a.T, condition, timeout, tick, forwardArgs(msg, args)...) + return assertions.Consistently[C](a.T, condition, timeout, tick, forwardArgs(msg, args, a.o)...) } // ElementsMatchT is the same as [ElementsMatchT], as a method rather than a package-level function. @@ -61,7 +61,7 @@ func (a *Assertions) ElementsMatchT[E comparable](listA []E, listB []E, msgAndAr if h, ok := a.T.(H); ok { h.Helper() } - return assertions.ElementsMatchT[E](a.T, listA, listB, msgAndArgs...) + return assertions.ElementsMatchT[E](a.T, listA, listB, append(msgAndArgs, a.o)...) } // ElementsMatchTf is the same as [Assertions.ElementsMatchT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -71,7 +71,7 @@ func (a *Assertions) ElementsMatchTf[E comparable](listA []E, listB []E, msg str if h, ok := a.T.(H); ok { h.Helper() } - return assertions.ElementsMatchT[E](a.T, listA, listB, forwardArgs(msg, args)...) + return assertions.ElementsMatchT[E](a.T, listA, listB, forwardArgs(msg, args, a.o)...) } // EqualT is the same as [EqualT], as a method rather than a package-level function. @@ -81,7 +81,7 @@ func (a *Assertions) EqualT[V comparable](expected V, actual V, msgAndArgs ...an if h, ok := a.T.(H); ok { h.Helper() } - return assertions.EqualT[V](a.T, expected, actual, msgAndArgs...) + return assertions.EqualT[V](a.T, expected, actual, append(msgAndArgs, a.o)...) } // EqualTf is the same as [Assertions.EqualT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -91,7 +91,7 @@ func (a *Assertions) EqualTf[V comparable](expected V, actual V, msg string, arg if h, ok := a.T.(H); ok { h.Helper() } - return assertions.EqualT[V](a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.EqualT[V](a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // ErrorAsType is the same as [ErrorAsType], as a method rather than a package-level function. @@ -101,7 +101,7 @@ func (a *Assertions) ErrorAsType[E error](err error, target *E, msgAndArgs ...an if h, ok := a.T.(H); ok { h.Helper() } - return assertions.ErrorAsType[E](a.T, err, target, msgAndArgs...) + return assertions.ErrorAsType[E](a.T, err, target, append(msgAndArgs, a.o)...) } // ErrorAsTypef is the same as [Assertions.ErrorAsType], but it accepts a format string to format arguments like [fmt.Printf]. @@ -111,7 +111,7 @@ func (a *Assertions) ErrorAsTypef[E error](err error, target *E, msg string, arg if h, ok := a.T.(H); ok { h.Helper() } - return assertions.ErrorAsType[E](a.T, err, target, forwardArgs(msg, args)...) + return assertions.ErrorAsType[E](a.T, err, target, forwardArgs(msg, args, a.o)...) } // Eventually is the same as [Eventually], as a method rather than a package-level function. @@ -121,7 +121,7 @@ func (a *Assertions) Eventually[C Conditioner](condition C, timeout time.Duratio if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Eventually[C](a.T, condition, timeout, tick, msgAndArgs...) + return assertions.Eventually[C](a.T, condition, timeout, tick, append(msgAndArgs, a.o)...) } // Eventuallyf is the same as [Assertions.Eventually], but it accepts a format string to format arguments like [fmt.Printf]. @@ -131,7 +131,7 @@ func (a *Assertions) Eventuallyf[C Conditioner](condition C, timeout time.Durati if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Eventually[C](a.T, condition, timeout, tick, forwardArgs(msg, args)...) + return assertions.Eventually[C](a.T, condition, timeout, tick, forwardArgs(msg, args, a.o)...) } // EventuallyWith is the same as [EventuallyWith], as a method rather than a package-level function. @@ -141,7 +141,7 @@ func (a *Assertions) EventuallyWith[C CollectibleConditioner](condition C, timeo if h, ok := a.T.(H); ok { h.Helper() } - return assertions.EventuallyWith[C](a.T, condition, timeout, tick, msgAndArgs...) + return assertions.EventuallyWith[C](a.T, condition, timeout, tick, append(msgAndArgs, a.o)...) } // EventuallyWithf is the same as [Assertions.EventuallyWith], but it accepts a format string to format arguments like [fmt.Printf]. @@ -151,7 +151,7 @@ func (a *Assertions) EventuallyWithf[C CollectibleConditioner](condition C, time if h, ok := a.T.(H); ok { h.Helper() } - return assertions.EventuallyWith[C](a.T, condition, timeout, tick, forwardArgs(msg, args)...) + return assertions.EventuallyWith[C](a.T, condition, timeout, tick, forwardArgs(msg, args, a.o)...) } // FalseT is the same as [FalseT], as a method rather than a package-level function. @@ -161,7 +161,7 @@ func (a *Assertions) FalseT[B Boolean](value B, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.FalseT[B](a.T, value, msgAndArgs...) + return assertions.FalseT[B](a.T, value, append(msgAndArgs, a.o)...) } // FalseTf is the same as [Assertions.FalseT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -171,7 +171,7 @@ func (a *Assertions) FalseTf[B Boolean](value B, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.FalseT[B](a.T, value, forwardArgs(msg, args)...) + return assertions.FalseT[B](a.T, value, forwardArgs(msg, args, a.o)...) } // GreaterOrEqualT is the same as [GreaterOrEqualT], as a method rather than a package-level function. @@ -181,7 +181,7 @@ func (a *Assertions) GreaterOrEqualT[Orderable Ordered](e1 Orderable, e2 Orderab if h, ok := a.T.(H); ok { h.Helper() } - return assertions.GreaterOrEqualT[Orderable](a.T, e1, e2, msgAndArgs...) + return assertions.GreaterOrEqualT[Orderable](a.T, e1, e2, append(msgAndArgs, a.o)...) } // GreaterOrEqualTf is the same as [Assertions.GreaterOrEqualT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -191,7 +191,7 @@ func (a *Assertions) GreaterOrEqualTf[Orderable Ordered](e1 Orderable, e2 Ordera if h, ok := a.T.(H); ok { h.Helper() } - return assertions.GreaterOrEqualT[Orderable](a.T, e1, e2, forwardArgs(msg, args)...) + return assertions.GreaterOrEqualT[Orderable](a.T, e1, e2, forwardArgs(msg, args, a.o)...) } // GreaterT is the same as [GreaterT], as a method rather than a package-level function. @@ -201,7 +201,7 @@ func (a *Assertions) GreaterT[Orderable Ordered](e1 Orderable, e2 Orderable, msg if h, ok := a.T.(H); ok { h.Helper() } - return assertions.GreaterT[Orderable](a.T, e1, e2, msgAndArgs...) + return assertions.GreaterT[Orderable](a.T, e1, e2, append(msgAndArgs, a.o)...) } // GreaterTf is the same as [Assertions.GreaterT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -211,7 +211,7 @@ func (a *Assertions) GreaterTf[Orderable Ordered](e1 Orderable, e2 Orderable, ms if h, ok := a.T.(H); ok { h.Helper() } - return assertions.GreaterT[Orderable](a.T, e1, e2, forwardArgs(msg, args)...) + return assertions.GreaterT[Orderable](a.T, e1, e2, forwardArgs(msg, args, a.o)...) } // InDeltaT is the same as [InDeltaT], as a method rather than a package-level function. @@ -221,7 +221,7 @@ func (a *Assertions) InDeltaT[Number Measurable](expected Number, actual Number, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InDeltaT[Number](a.T, expected, actual, delta, msgAndArgs...) + return assertions.InDeltaT[Number](a.T, expected, actual, delta, append(msgAndArgs, a.o)...) } // InDeltaTf is the same as [Assertions.InDeltaT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -231,7 +231,7 @@ func (a *Assertions) InDeltaTf[Number Measurable](expected Number, actual Number if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InDeltaT[Number](a.T, expected, actual, delta, forwardArgs(msg, args)...) + return assertions.InDeltaT[Number](a.T, expected, actual, delta, forwardArgs(msg, args, a.o)...) } // InEpsilonSymmetricT is the same as [InEpsilonSymmetricT], as a method rather than a package-level function. @@ -241,7 +241,7 @@ func (a *Assertions) InEpsilonSymmetricT[Number Measurable](x Number, y Number, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InEpsilonSymmetricT[Number](a.T, x, y, epsilon, msgAndArgs...) + return assertions.InEpsilonSymmetricT[Number](a.T, x, y, epsilon, append(msgAndArgs, a.o)...) } // InEpsilonSymmetricTf is the same as [Assertions.InEpsilonSymmetricT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -251,7 +251,7 @@ func (a *Assertions) InEpsilonSymmetricTf[Number Measurable](x Number, y Number, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InEpsilonSymmetricT[Number](a.T, x, y, epsilon, forwardArgs(msg, args)...) + return assertions.InEpsilonSymmetricT[Number](a.T, x, y, epsilon, forwardArgs(msg, args, a.o)...) } // InEpsilonT is the same as [InEpsilonT], as a method rather than a package-level function. @@ -261,7 +261,7 @@ func (a *Assertions) InEpsilonT[Number Measurable](expected Number, actual Numbe if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InEpsilonT[Number](a.T, expected, actual, epsilon, msgAndArgs...) + return assertions.InEpsilonT[Number](a.T, expected, actual, epsilon, append(msgAndArgs, a.o)...) } // InEpsilonTf is the same as [Assertions.InEpsilonT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -271,7 +271,7 @@ func (a *Assertions) InEpsilonTf[Number Measurable](expected Number, actual Numb if h, ok := a.T.(H); ok { h.Helper() } - return assertions.InEpsilonT[Number](a.T, expected, actual, epsilon, forwardArgs(msg, args)...) + return assertions.InEpsilonT[Number](a.T, expected, actual, epsilon, forwardArgs(msg, args, a.o)...) } // IsDecreasingT is the same as [IsDecreasingT], as a method rather than a package-level function. @@ -281,7 +281,7 @@ func (a *Assertions) IsDecreasingT[OrderedSlice ~[]E, E Ordered](collection Orde if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsDecreasingT[OrderedSlice, E](a.T, collection, msgAndArgs...) + return assertions.IsDecreasingT[OrderedSlice, E](a.T, collection, append(msgAndArgs, a.o)...) } // IsDecreasingTf is the same as [Assertions.IsDecreasingT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -291,7 +291,7 @@ func (a *Assertions) IsDecreasingTf[OrderedSlice ~[]E, E Ordered](collection Ord if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsDecreasingT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args)...) + return assertions.IsDecreasingT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args, a.o)...) } // IsIncreasingT is the same as [IsIncreasingT], as a method rather than a package-level function. @@ -301,7 +301,7 @@ func (a *Assertions) IsIncreasingT[OrderedSlice ~[]E, E Ordered](collection Orde if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsIncreasingT[OrderedSlice, E](a.T, collection, msgAndArgs...) + return assertions.IsIncreasingT[OrderedSlice, E](a.T, collection, append(msgAndArgs, a.o)...) } // IsIncreasingTf is the same as [Assertions.IsIncreasingT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -311,7 +311,7 @@ func (a *Assertions) IsIncreasingTf[OrderedSlice ~[]E, E Ordered](collection Ord if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsIncreasingT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args)...) + return assertions.IsIncreasingT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args, a.o)...) } // IsNonDecreasingT is the same as [IsNonDecreasingT], as a method rather than a package-level function. @@ -321,7 +321,7 @@ func (a *Assertions) IsNonDecreasingT[OrderedSlice ~[]E, E Ordered](collection O if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsNonDecreasingT[OrderedSlice, E](a.T, collection, msgAndArgs...) + return assertions.IsNonDecreasingT[OrderedSlice, E](a.T, collection, append(msgAndArgs, a.o)...) } // IsNonDecreasingTf is the same as [Assertions.IsNonDecreasingT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -331,7 +331,7 @@ func (a *Assertions) IsNonDecreasingTf[OrderedSlice ~[]E, E Ordered](collection if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsNonDecreasingT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args)...) + return assertions.IsNonDecreasingT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args, a.o)...) } // IsNonIncreasingT is the same as [IsNonIncreasingT], as a method rather than a package-level function. @@ -341,7 +341,7 @@ func (a *Assertions) IsNonIncreasingT[OrderedSlice ~[]E, E Ordered](collection O if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsNonIncreasingT[OrderedSlice, E](a.T, collection, msgAndArgs...) + return assertions.IsNonIncreasingT[OrderedSlice, E](a.T, collection, append(msgAndArgs, a.o)...) } // IsNonIncreasingTf is the same as [Assertions.IsNonIncreasingT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -351,7 +351,7 @@ func (a *Assertions) IsNonIncreasingTf[OrderedSlice ~[]E, E Ordered](collection if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsNonIncreasingT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args)...) + return assertions.IsNonIncreasingT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args, a.o)...) } // IsNotOfTypeT is the same as [IsNotOfTypeT], as a method rather than a package-level function. @@ -361,7 +361,7 @@ func (a *Assertions) IsNotOfTypeT[EType any](object any, msgAndArgs ...any) bool if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsNotOfTypeT[EType](a.T, object, msgAndArgs...) + return assertions.IsNotOfTypeT[EType](a.T, object, append(msgAndArgs, a.o)...) } // IsNotOfTypeTf is the same as [Assertions.IsNotOfTypeT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -371,7 +371,7 @@ func (a *Assertions) IsNotOfTypeTf[EType any](object any, msg string, args ...an if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsNotOfTypeT[EType](a.T, object, forwardArgs(msg, args)...) + return assertions.IsNotOfTypeT[EType](a.T, object, forwardArgs(msg, args, a.o)...) } // IsOfTypeT is the same as [IsOfTypeT], as a method rather than a package-level function. @@ -381,7 +381,7 @@ func (a *Assertions) IsOfTypeT[EType any](object any, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsOfTypeT[EType](a.T, object, msgAndArgs...) + return assertions.IsOfTypeT[EType](a.T, object, append(msgAndArgs, a.o)...) } // IsOfTypeTf is the same as [Assertions.IsOfTypeT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -391,7 +391,7 @@ func (a *Assertions) IsOfTypeTf[EType any](object any, msg string, args ...any) if h, ok := a.T.(H); ok { h.Helper() } - return assertions.IsOfTypeT[EType](a.T, object, forwardArgs(msg, args)...) + return assertions.IsOfTypeT[EType](a.T, object, forwardArgs(msg, args, a.o)...) } // JSONEqT is the same as [JSONEqT], as a method rather than a package-level function. @@ -401,7 +401,7 @@ func (a *Assertions) JSONEqT[EDoc, ADoc RText](expected EDoc, actual ADoc, msgAn if h, ok := a.T.(H); ok { h.Helper() } - return assertions.JSONEqT[EDoc, ADoc](a.T, expected, actual, msgAndArgs...) + return assertions.JSONEqT[EDoc, ADoc](a.T, expected, actual, append(msgAndArgs, a.o)...) } // JSONEqTf is the same as [Assertions.JSONEqT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -411,7 +411,7 @@ func (a *Assertions) JSONEqTf[EDoc, ADoc RText](expected EDoc, actual ADoc, msg if h, ok := a.T.(H); ok { h.Helper() } - return assertions.JSONEqT[EDoc, ADoc](a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.JSONEqT[EDoc, ADoc](a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // JSONMarshalAsT is the same as [JSONMarshalAsT], as a method rather than a package-level function. @@ -421,7 +421,7 @@ func (a *Assertions) JSONMarshalAsT[EDoc RText](expected EDoc, object any, msgAn if h, ok := a.T.(H); ok { h.Helper() } - return assertions.JSONMarshalAsT[EDoc](a.T, expected, object, msgAndArgs...) + return assertions.JSONMarshalAsT[EDoc](a.T, expected, object, append(msgAndArgs, a.o)...) } // JSONMarshalAsTf is the same as [Assertions.JSONMarshalAsT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -431,7 +431,7 @@ func (a *Assertions) JSONMarshalAsTf[EDoc RText](expected EDoc, object any, msg if h, ok := a.T.(H); ok { h.Helper() } - return assertions.JSONMarshalAsT[EDoc](a.T, expected, object, forwardArgs(msg, args)...) + return assertions.JSONMarshalAsT[EDoc](a.T, expected, object, forwardArgs(msg, args, a.o)...) } // JSONUnmarshalAsT is the same as [JSONUnmarshalAsT], as a method rather than a package-level function. @@ -441,7 +441,7 @@ func (a *Assertions) JSONUnmarshalAsT[Object any, ADoc RText](expected Object, j if h, ok := a.T.(H); ok { h.Helper() } - return assertions.JSONUnmarshalAsT[Object, ADoc](a.T, expected, jazon, msgAndArgs...) + return assertions.JSONUnmarshalAsT[Object, ADoc](a.T, expected, jazon, append(msgAndArgs, a.o)...) } // JSONUnmarshalAsTf is the same as [Assertions.JSONUnmarshalAsT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -451,7 +451,7 @@ func (a *Assertions) JSONUnmarshalAsTf[Object any, ADoc RText](expected Object, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.JSONUnmarshalAsT[Object, ADoc](a.T, expected, jazon, forwardArgs(msg, args)...) + return assertions.JSONUnmarshalAsT[Object, ADoc](a.T, expected, jazon, forwardArgs(msg, args, a.o)...) } // LessOrEqualT is the same as [LessOrEqualT], as a method rather than a package-level function. @@ -461,7 +461,7 @@ func (a *Assertions) LessOrEqualT[Orderable Ordered](e1 Orderable, e2 Orderable, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.LessOrEqualT[Orderable](a.T, e1, e2, msgAndArgs...) + return assertions.LessOrEqualT[Orderable](a.T, e1, e2, append(msgAndArgs, a.o)...) } // LessOrEqualTf is the same as [Assertions.LessOrEqualT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -471,7 +471,7 @@ func (a *Assertions) LessOrEqualTf[Orderable Ordered](e1 Orderable, e2 Orderable if h, ok := a.T.(H); ok { h.Helper() } - return assertions.LessOrEqualT[Orderable](a.T, e1, e2, forwardArgs(msg, args)...) + return assertions.LessOrEqualT[Orderable](a.T, e1, e2, forwardArgs(msg, args, a.o)...) } // LessT is the same as [LessT], as a method rather than a package-level function. @@ -481,7 +481,7 @@ func (a *Assertions) LessT[Orderable Ordered](e1 Orderable, e2 Orderable, msgAnd if h, ok := a.T.(H); ok { h.Helper() } - return assertions.LessT[Orderable](a.T, e1, e2, msgAndArgs...) + return assertions.LessT[Orderable](a.T, e1, e2, append(msgAndArgs, a.o)...) } // LessTf is the same as [Assertions.LessT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -491,7 +491,7 @@ func (a *Assertions) LessTf[Orderable Ordered](e1 Orderable, e2 Orderable, msg s if h, ok := a.T.(H); ok { h.Helper() } - return assertions.LessT[Orderable](a.T, e1, e2, forwardArgs(msg, args)...) + return assertions.LessT[Orderable](a.T, e1, e2, forwardArgs(msg, args, a.o)...) } // MapContainsT is the same as [MapContainsT], as a method rather than a package-level function. @@ -501,7 +501,7 @@ func (a *Assertions) MapContainsT[Map ~map[K]V, K comparable, V any](m Map, key if h, ok := a.T.(H); ok { h.Helper() } - return assertions.MapContainsT[Map, K, V](a.T, m, key, msgAndArgs...) + return assertions.MapContainsT[Map, K, V](a.T, m, key, append(msgAndArgs, a.o)...) } // MapContainsTf is the same as [Assertions.MapContainsT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -511,7 +511,7 @@ func (a *Assertions) MapContainsTf[Map ~map[K]V, K comparable, V any](m Map, key if h, ok := a.T.(H); ok { h.Helper() } - return assertions.MapContainsT[Map, K, V](a.T, m, key, forwardArgs(msg, args)...) + return assertions.MapContainsT[Map, K, V](a.T, m, key, forwardArgs(msg, args, a.o)...) } // MapEqualT is the same as [MapEqualT], as a method rather than a package-level function. @@ -521,7 +521,7 @@ func (a *Assertions) MapEqualT[K, V comparable](listA map[K]V, listB map[K]V, ms if h, ok := a.T.(H); ok { h.Helper() } - return assertions.MapEqualT[K, V](a.T, listA, listB, msgAndArgs...) + return assertions.MapEqualT[K, V](a.T, listA, listB, append(msgAndArgs, a.o)...) } // MapEqualTf is the same as [Assertions.MapEqualT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -531,7 +531,7 @@ func (a *Assertions) MapEqualTf[K, V comparable](listA map[K]V, listB map[K]V, m if h, ok := a.T.(H); ok { h.Helper() } - return assertions.MapEqualT[K, V](a.T, listA, listB, forwardArgs(msg, args)...) + return assertions.MapEqualT[K, V](a.T, listA, listB, forwardArgs(msg, args, a.o)...) } // MapNotContainsT is the same as [MapNotContainsT], as a method rather than a package-level function. @@ -541,7 +541,7 @@ func (a *Assertions) MapNotContainsT[Map ~map[K]V, K comparable, V any](m Map, k if h, ok := a.T.(H); ok { h.Helper() } - return assertions.MapNotContainsT[Map, K, V](a.T, m, key, msgAndArgs...) + return assertions.MapNotContainsT[Map, K, V](a.T, m, key, append(msgAndArgs, a.o)...) } // MapNotContainsTf is the same as [Assertions.MapNotContainsT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -551,7 +551,7 @@ func (a *Assertions) MapNotContainsTf[Map ~map[K]V, K comparable, V any](m Map, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.MapNotContainsT[Map, K, V](a.T, m, key, forwardArgs(msg, args)...) + return assertions.MapNotContainsT[Map, K, V](a.T, m, key, forwardArgs(msg, args, a.o)...) } // MapNotEqualT is the same as [MapNotEqualT], as a method rather than a package-level function. @@ -561,7 +561,7 @@ func (a *Assertions) MapNotEqualT[K, V comparable](listA map[K]V, listB map[K]V, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.MapNotEqualT[K, V](a.T, listA, listB, msgAndArgs...) + return assertions.MapNotEqualT[K, V](a.T, listA, listB, append(msgAndArgs, a.o)...) } // MapNotEqualTf is the same as [Assertions.MapNotEqualT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -571,7 +571,7 @@ func (a *Assertions) MapNotEqualTf[K, V comparable](listA map[K]V, listB map[K]V if h, ok := a.T.(H); ok { h.Helper() } - return assertions.MapNotEqualT[K, V](a.T, listA, listB, forwardArgs(msg, args)...) + return assertions.MapNotEqualT[K, V](a.T, listA, listB, forwardArgs(msg, args, a.o)...) } // NegativeT is the same as [NegativeT], as a method rather than a package-level function. @@ -581,7 +581,7 @@ func (a *Assertions) NegativeT[SignedNumber SignedNumeric](e SignedNumber, msgAn if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NegativeT[SignedNumber](a.T, e, msgAndArgs...) + return assertions.NegativeT[SignedNumber](a.T, e, append(msgAndArgs, a.o)...) } // NegativeTf is the same as [Assertions.NegativeT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -591,7 +591,7 @@ func (a *Assertions) NegativeTf[SignedNumber SignedNumeric](e SignedNumber, msg if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NegativeT[SignedNumber](a.T, e, forwardArgs(msg, args)...) + return assertions.NegativeT[SignedNumber](a.T, e, forwardArgs(msg, args, a.o)...) } // Never is the same as [Never], as a method rather than a package-level function. @@ -601,7 +601,7 @@ func (a *Assertions) Never[C NeverConditioner](condition C, timeout time.Duratio if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Never[C](a.T, condition, timeout, tick, msgAndArgs...) + return assertions.Never[C](a.T, condition, timeout, tick, append(msgAndArgs, a.o)...) } // Neverf is the same as [Assertions.Never], but it accepts a format string to format arguments like [fmt.Printf]. @@ -611,7 +611,7 @@ func (a *Assertions) Neverf[C NeverConditioner](condition C, timeout time.Durati if h, ok := a.T.(H); ok { h.Helper() } - return assertions.Never[C](a.T, condition, timeout, tick, forwardArgs(msg, args)...) + return assertions.Never[C](a.T, condition, timeout, tick, forwardArgs(msg, args, a.o)...) } // NotBlockedT is the same as [NotBlockedT], as a method rather than a package-level function. @@ -621,7 +621,7 @@ func (a *Assertions) NotBlockedT[E any, CHAN ~chan E](ch CHAN, msgAndArgs ...any if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotBlockedT[E, CHAN](a.T, ch, msgAndArgs...) + return assertions.NotBlockedT[E, CHAN](a.T, ch, append(msgAndArgs, a.o)...) } // NotBlockedTf is the same as [Assertions.NotBlockedT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -631,7 +631,7 @@ func (a *Assertions) NotBlockedTf[E any, CHAN ~chan E](ch CHAN, msg string, args if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotBlockedT[E, CHAN](a.T, ch, forwardArgs(msg, args)...) + return assertions.NotBlockedT[E, CHAN](a.T, ch, forwardArgs(msg, args, a.o)...) } // NotElementsMatchT is the same as [NotElementsMatchT], as a method rather than a package-level function. @@ -641,7 +641,7 @@ func (a *Assertions) NotElementsMatchT[E comparable](listA []E, listB []E, msgAn if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotElementsMatchT[E](a.T, listA, listB, msgAndArgs...) + return assertions.NotElementsMatchT[E](a.T, listA, listB, append(msgAndArgs, a.o)...) } // NotElementsMatchTf is the same as [Assertions.NotElementsMatchT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -651,7 +651,7 @@ func (a *Assertions) NotElementsMatchTf[E comparable](listA []E, listB []E, msg if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotElementsMatchT[E](a.T, listA, listB, forwardArgs(msg, args)...) + return assertions.NotElementsMatchT[E](a.T, listA, listB, forwardArgs(msg, args, a.o)...) } // NotEqualT is the same as [NotEqualT], as a method rather than a package-level function. @@ -661,7 +661,7 @@ func (a *Assertions) NotEqualT[V comparable](expected V, actual V, msgAndArgs .. if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotEqualT[V](a.T, expected, actual, msgAndArgs...) + return assertions.NotEqualT[V](a.T, expected, actual, append(msgAndArgs, a.o)...) } // NotEqualTf is the same as [Assertions.NotEqualT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -671,7 +671,7 @@ func (a *Assertions) NotEqualTf[V comparable](expected V, actual V, msg string, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotEqualT[V](a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.NotEqualT[V](a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // NotErrorAsType is the same as [NotErrorAsType], as a method rather than a package-level function. @@ -681,7 +681,7 @@ func (a *Assertions) NotErrorAsType[E error](err error, target *E, msgAndArgs .. if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotErrorAsType[E](a.T, err, target, msgAndArgs...) + return assertions.NotErrorAsType[E](a.T, err, target, append(msgAndArgs, a.o)...) } // NotErrorAsTypef is the same as [Assertions.NotErrorAsType], but it accepts a format string to format arguments like [fmt.Printf]. @@ -691,7 +691,7 @@ func (a *Assertions) NotErrorAsTypef[E error](err error, target *E, msg string, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotErrorAsType[E](a.T, err, target, forwardArgs(msg, args)...) + return assertions.NotErrorAsType[E](a.T, err, target, forwardArgs(msg, args, a.o)...) } // NotRegexpT is the same as [NotRegexpT], as a method rather than a package-level function. @@ -701,7 +701,7 @@ func (a *Assertions) NotRegexpT[Rex RegExp, ADoc Text](rx Rex, actual ADoc, msgA if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotRegexpT[Rex, ADoc](a.T, rx, actual, msgAndArgs...) + return assertions.NotRegexpT[Rex, ADoc](a.T, rx, actual, append(msgAndArgs, a.o)...) } // NotRegexpTf is the same as [Assertions.NotRegexpT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -711,7 +711,7 @@ func (a *Assertions) NotRegexpTf[Rex RegExp, ADoc Text](rx Rex, actual ADoc, msg if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotRegexpT[Rex, ADoc](a.T, rx, actual, forwardArgs(msg, args)...) + return assertions.NotRegexpT[Rex, ADoc](a.T, rx, actual, forwardArgs(msg, args, a.o)...) } // NotSameT is the same as [NotSameT], as a method rather than a package-level function. @@ -721,7 +721,7 @@ func (a *Assertions) NotSameT[P any](expected *P, actual *P, msgAndArgs ...any) if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotSameT[P](a.T, expected, actual, msgAndArgs...) + return assertions.NotSameT[P](a.T, expected, actual, append(msgAndArgs, a.o)...) } // NotSameTf is the same as [Assertions.NotSameT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -731,7 +731,7 @@ func (a *Assertions) NotSameTf[P any](expected *P, actual *P, msg string, args . if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotSameT[P](a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.NotSameT[P](a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // NotSortedT is the same as [NotSortedT], as a method rather than a package-level function. @@ -741,7 +741,7 @@ func (a *Assertions) NotSortedT[OrderedSlice ~[]E, E Ordered](collection Ordered if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotSortedT[OrderedSlice, E](a.T, collection, msgAndArgs...) + return assertions.NotSortedT[OrderedSlice, E](a.T, collection, append(msgAndArgs, a.o)...) } // NotSortedTf is the same as [Assertions.NotSortedT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -751,7 +751,7 @@ func (a *Assertions) NotSortedTf[OrderedSlice ~[]E, E Ordered](collection Ordere if h, ok := a.T.(H); ok { h.Helper() } - return assertions.NotSortedT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args)...) + return assertions.NotSortedT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args, a.o)...) } // PositiveT is the same as [PositiveT], as a method rather than a package-level function. @@ -761,7 +761,7 @@ func (a *Assertions) PositiveT[SignedNumber SignedNumeric](e SignedNumber, msgAn if h, ok := a.T.(H); ok { h.Helper() } - return assertions.PositiveT[SignedNumber](a.T, e, msgAndArgs...) + return assertions.PositiveT[SignedNumber](a.T, e, append(msgAndArgs, a.o)...) } // PositiveTf is the same as [Assertions.PositiveT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -771,7 +771,7 @@ func (a *Assertions) PositiveTf[SignedNumber SignedNumeric](e SignedNumber, msg if h, ok := a.T.(H); ok { h.Helper() } - return assertions.PositiveT[SignedNumber](a.T, e, forwardArgs(msg, args)...) + return assertions.PositiveT[SignedNumber](a.T, e, forwardArgs(msg, args, a.o)...) } // RegexpT is the same as [RegexpT], as a method rather than a package-level function. @@ -781,7 +781,7 @@ func (a *Assertions) RegexpT[Rex RegExp, ADoc Text](rx Rex, actual ADoc, msgAndA if h, ok := a.T.(H); ok { h.Helper() } - return assertions.RegexpT[Rex, ADoc](a.T, rx, actual, msgAndArgs...) + return assertions.RegexpT[Rex, ADoc](a.T, rx, actual, append(msgAndArgs, a.o)...) } // RegexpTf is the same as [Assertions.RegexpT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -791,7 +791,7 @@ func (a *Assertions) RegexpTf[Rex RegExp, ADoc Text](rx Rex, actual ADoc, msg st if h, ok := a.T.(H); ok { h.Helper() } - return assertions.RegexpT[Rex, ADoc](a.T, rx, actual, forwardArgs(msg, args)...) + return assertions.RegexpT[Rex, ADoc](a.T, rx, actual, forwardArgs(msg, args, a.o)...) } // SameT is the same as [SameT], as a method rather than a package-level function. @@ -801,7 +801,7 @@ func (a *Assertions) SameT[P any](expected *P, actual *P, msgAndArgs ...any) boo if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SameT[P](a.T, expected, actual, msgAndArgs...) + return assertions.SameT[P](a.T, expected, actual, append(msgAndArgs, a.o)...) } // SameTf is the same as [Assertions.SameT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -811,7 +811,7 @@ func (a *Assertions) SameTf[P any](expected *P, actual *P, msg string, args ...a if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SameT[P](a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.SameT[P](a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // SeqContainsT is the same as [SeqContainsT], as a method rather than a package-level function. @@ -821,7 +821,7 @@ func (a *Assertions) SeqContainsT[E comparable](iter iter.Seq[E], element E, msg if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SeqContainsT[E](a.T, iter, element, msgAndArgs...) + return assertions.SeqContainsT[E](a.T, iter, element, append(msgAndArgs, a.o)...) } // SeqContainsTf is the same as [Assertions.SeqContainsT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -831,7 +831,7 @@ func (a *Assertions) SeqContainsTf[E comparable](iter iter.Seq[E], element E, ms if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SeqContainsT[E](a.T, iter, element, forwardArgs(msg, args)...) + return assertions.SeqContainsT[E](a.T, iter, element, forwardArgs(msg, args, a.o)...) } // SeqNotContainsT is the same as [SeqNotContainsT], as a method rather than a package-level function. @@ -841,7 +841,7 @@ func (a *Assertions) SeqNotContainsT[E comparable](iter iter.Seq[E], element E, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SeqNotContainsT[E](a.T, iter, element, msgAndArgs...) + return assertions.SeqNotContainsT[E](a.T, iter, element, append(msgAndArgs, a.o)...) } // SeqNotContainsTf is the same as [Assertions.SeqNotContainsT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -851,7 +851,7 @@ func (a *Assertions) SeqNotContainsTf[E comparable](iter iter.Seq[E], element E, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SeqNotContainsT[E](a.T, iter, element, forwardArgs(msg, args)...) + return assertions.SeqNotContainsT[E](a.T, iter, element, forwardArgs(msg, args, a.o)...) } // SliceContainsT is the same as [SliceContainsT], as a method rather than a package-level function. @@ -861,7 +861,7 @@ func (a *Assertions) SliceContainsT[Slice ~[]E, E comparable](s Slice, element E if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SliceContainsT[Slice, E](a.T, s, element, msgAndArgs...) + return assertions.SliceContainsT[Slice, E](a.T, s, element, append(msgAndArgs, a.o)...) } // SliceContainsTf is the same as [Assertions.SliceContainsT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -871,7 +871,7 @@ func (a *Assertions) SliceContainsTf[Slice ~[]E, E comparable](s Slice, element if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SliceContainsT[Slice, E](a.T, s, element, forwardArgs(msg, args)...) + return assertions.SliceContainsT[Slice, E](a.T, s, element, forwardArgs(msg, args, a.o)...) } // SliceEqualT is the same as [SliceEqualT], as a method rather than a package-level function. @@ -881,7 +881,7 @@ func (a *Assertions) SliceEqualT[E comparable](listA []E, listB []E, msgAndArgs if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SliceEqualT[E](a.T, listA, listB, msgAndArgs...) + return assertions.SliceEqualT[E](a.T, listA, listB, append(msgAndArgs, a.o)...) } // SliceEqualTf is the same as [Assertions.SliceEqualT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -891,7 +891,7 @@ func (a *Assertions) SliceEqualTf[E comparable](listA []E, listB []E, msg string if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SliceEqualT[E](a.T, listA, listB, forwardArgs(msg, args)...) + return assertions.SliceEqualT[E](a.T, listA, listB, forwardArgs(msg, args, a.o)...) } // SliceNotContainsT is the same as [SliceNotContainsT], as a method rather than a package-level function. @@ -901,7 +901,7 @@ func (a *Assertions) SliceNotContainsT[Slice ~[]E, E comparable](s Slice, elemen if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SliceNotContainsT[Slice, E](a.T, s, element, msgAndArgs...) + return assertions.SliceNotContainsT[Slice, E](a.T, s, element, append(msgAndArgs, a.o)...) } // SliceNotContainsTf is the same as [Assertions.SliceNotContainsT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -911,7 +911,7 @@ func (a *Assertions) SliceNotContainsTf[Slice ~[]E, E comparable](s Slice, eleme if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SliceNotContainsT[Slice, E](a.T, s, element, forwardArgs(msg, args)...) + return assertions.SliceNotContainsT[Slice, E](a.T, s, element, forwardArgs(msg, args, a.o)...) } // SliceNotEqualT is the same as [SliceNotEqualT], as a method rather than a package-level function. @@ -921,7 +921,7 @@ func (a *Assertions) SliceNotEqualT[E comparable](listA []E, listB []E, msgAndAr if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SliceNotEqualT[E](a.T, listA, listB, msgAndArgs...) + return assertions.SliceNotEqualT[E](a.T, listA, listB, append(msgAndArgs, a.o)...) } // SliceNotEqualTf is the same as [Assertions.SliceNotEqualT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -931,7 +931,7 @@ func (a *Assertions) SliceNotEqualTf[E comparable](listA []E, listB []E, msg str if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SliceNotEqualT[E](a.T, listA, listB, forwardArgs(msg, args)...) + return assertions.SliceNotEqualT[E](a.T, listA, listB, forwardArgs(msg, args, a.o)...) } // SliceNotSubsetT is the same as [SliceNotSubsetT], as a method rather than a package-level function. @@ -941,7 +941,7 @@ func (a *Assertions) SliceNotSubsetT[Slice ~[]E, E comparable](list Slice, subse if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SliceNotSubsetT[Slice, E](a.T, list, subset, msgAndArgs...) + return assertions.SliceNotSubsetT[Slice, E](a.T, list, subset, append(msgAndArgs, a.o)...) } // SliceNotSubsetTf is the same as [Assertions.SliceNotSubsetT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -951,7 +951,7 @@ func (a *Assertions) SliceNotSubsetTf[Slice ~[]E, E comparable](list Slice, subs if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SliceNotSubsetT[Slice, E](a.T, list, subset, forwardArgs(msg, args)...) + return assertions.SliceNotSubsetT[Slice, E](a.T, list, subset, forwardArgs(msg, args, a.o)...) } // SliceSubsetT is the same as [SliceSubsetT], as a method rather than a package-level function. @@ -961,7 +961,7 @@ func (a *Assertions) SliceSubsetT[Slice ~[]E, E comparable](list Slice, subset S if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SliceSubsetT[Slice, E](a.T, list, subset, msgAndArgs...) + return assertions.SliceSubsetT[Slice, E](a.T, list, subset, append(msgAndArgs, a.o)...) } // SliceSubsetTf is the same as [Assertions.SliceSubsetT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -971,7 +971,7 @@ func (a *Assertions) SliceSubsetTf[Slice ~[]E, E comparable](list Slice, subset if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SliceSubsetT[Slice, E](a.T, list, subset, forwardArgs(msg, args)...) + return assertions.SliceSubsetT[Slice, E](a.T, list, subset, forwardArgs(msg, args, a.o)...) } // SortedT is the same as [SortedT], as a method rather than a package-level function. @@ -981,7 +981,7 @@ func (a *Assertions) SortedT[OrderedSlice ~[]E, E Ordered](collection OrderedSli if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SortedT[OrderedSlice, E](a.T, collection, msgAndArgs...) + return assertions.SortedT[OrderedSlice, E](a.T, collection, append(msgAndArgs, a.o)...) } // SortedTf is the same as [Assertions.SortedT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -991,7 +991,7 @@ func (a *Assertions) SortedTf[OrderedSlice ~[]E, E Ordered](collection OrderedSl if h, ok := a.T.(H); ok { h.Helper() } - return assertions.SortedT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args)...) + return assertions.SortedT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args, a.o)...) } // StringContainsT is the same as [StringContainsT], as a method rather than a package-level function. @@ -1001,7 +1001,7 @@ func (a *Assertions) StringContainsT[ADoc, EDoc Text](str ADoc, substring EDoc, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.StringContainsT[ADoc, EDoc](a.T, str, substring, msgAndArgs...) + return assertions.StringContainsT[ADoc, EDoc](a.T, str, substring, append(msgAndArgs, a.o)...) } // StringContainsTf is the same as [Assertions.StringContainsT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1011,7 +1011,7 @@ func (a *Assertions) StringContainsTf[ADoc, EDoc Text](str ADoc, substring EDoc, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.StringContainsT[ADoc, EDoc](a.T, str, substring, forwardArgs(msg, args)...) + return assertions.StringContainsT[ADoc, EDoc](a.T, str, substring, forwardArgs(msg, args, a.o)...) } // StringNotContainsT is the same as [StringNotContainsT], as a method rather than a package-level function. @@ -1021,7 +1021,7 @@ func (a *Assertions) StringNotContainsT[ADoc, EDoc Text](str ADoc, substring EDo if h, ok := a.T.(H); ok { h.Helper() } - return assertions.StringNotContainsT[ADoc, EDoc](a.T, str, substring, msgAndArgs...) + return assertions.StringNotContainsT[ADoc, EDoc](a.T, str, substring, append(msgAndArgs, a.o)...) } // StringNotContainsTf is the same as [Assertions.StringNotContainsT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1031,7 +1031,7 @@ func (a *Assertions) StringNotContainsTf[ADoc, EDoc Text](str ADoc, substring ED if h, ok := a.T.(H); ok { h.Helper() } - return assertions.StringNotContainsT[ADoc, EDoc](a.T, str, substring, forwardArgs(msg, args)...) + return assertions.StringNotContainsT[ADoc, EDoc](a.T, str, substring, forwardArgs(msg, args, a.o)...) } // TrueT is the same as [TrueT], as a method rather than a package-level function. @@ -1041,7 +1041,7 @@ func (a *Assertions) TrueT[B Boolean](value B, msgAndArgs ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.TrueT[B](a.T, value, msgAndArgs...) + return assertions.TrueT[B](a.T, value, append(msgAndArgs, a.o)...) } // TrueTf is the same as [Assertions.TrueT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1051,7 +1051,7 @@ func (a *Assertions) TrueTf[B Boolean](value B, msg string, args ...any) bool { if h, ok := a.T.(H); ok { h.Helper() } - return assertions.TrueT[B](a.T, value, forwardArgs(msg, args)...) + return assertions.TrueT[B](a.T, value, forwardArgs(msg, args, a.o)...) } // YAMLEqT is the same as [YAMLEqT], as a method rather than a package-level function. @@ -1061,7 +1061,7 @@ func (a *Assertions) YAMLEqT[EDoc, ADoc RText](expected EDoc, actual ADoc, msgAn if h, ok := a.T.(H); ok { h.Helper() } - return assertions.YAMLEqT[EDoc, ADoc](a.T, expected, actual, msgAndArgs...) + return assertions.YAMLEqT[EDoc, ADoc](a.T, expected, actual, append(msgAndArgs, a.o)...) } // YAMLEqTf is the same as [Assertions.YAMLEqT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1071,7 +1071,7 @@ func (a *Assertions) YAMLEqTf[EDoc, ADoc RText](expected EDoc, actual ADoc, msg if h, ok := a.T.(H); ok { h.Helper() } - return assertions.YAMLEqT[EDoc, ADoc](a.T, expected, actual, forwardArgs(msg, args)...) + return assertions.YAMLEqT[EDoc, ADoc](a.T, expected, actual, forwardArgs(msg, args, a.o)...) } // YAMLMarshalAsT is the same as [YAMLMarshalAsT], as a method rather than a package-level function. @@ -1081,7 +1081,7 @@ func (a *Assertions) YAMLMarshalAsT[EDoc RText](expected EDoc, object any, msgAn if h, ok := a.T.(H); ok { h.Helper() } - return assertions.YAMLMarshalAsT[EDoc](a.T, expected, object, msgAndArgs...) + return assertions.YAMLMarshalAsT[EDoc](a.T, expected, object, append(msgAndArgs, a.o)...) } // YAMLMarshalAsTf is the same as [Assertions.YAMLMarshalAsT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1091,7 +1091,7 @@ func (a *Assertions) YAMLMarshalAsTf[EDoc RText](expected EDoc, object any, msg if h, ok := a.T.(H); ok { h.Helper() } - return assertions.YAMLMarshalAsT[EDoc](a.T, expected, object, forwardArgs(msg, args)...) + return assertions.YAMLMarshalAsT[EDoc](a.T, expected, object, forwardArgs(msg, args, a.o)...) } // YAMLUnmarshalAsT is the same as [YAMLUnmarshalAsT], as a method rather than a package-level function. @@ -1101,7 +1101,7 @@ func (a *Assertions) YAMLUnmarshalAsT[Object any, ADoc RText](expected Object, y if h, ok := a.T.(H); ok { h.Helper() } - return assertions.YAMLUnmarshalAsT[Object, ADoc](a.T, expected, yamlDoc, msgAndArgs...) + return assertions.YAMLUnmarshalAsT[Object, ADoc](a.T, expected, yamlDoc, append(msgAndArgs, a.o)...) } // YAMLUnmarshalAsTf is the same as [Assertions.YAMLUnmarshalAsT], but it accepts a format string to format arguments like [fmt.Printf]. @@ -1111,5 +1111,5 @@ func (a *Assertions) YAMLUnmarshalAsTf[Object any, ADoc RText](expected Object, if h, ok := a.T.(H); ok { h.Helper() } - return assertions.YAMLUnmarshalAsT[Object, ADoc](a.T, expected, yamlDoc, forwardArgs(msg, args)...) + return assertions.YAMLUnmarshalAsT[Object, ADoc](a.T, expected, yamlDoc, forwardArgs(msg, args, a.o)...) } diff --git a/assert/assert_helpers.go b/assert/assert_helpers.go index 0e742c1c1..ce4243047 100644 --- a/assert/assert_helpers.go +++ b/assert/assert_helpers.go @@ -37,3 +37,10 @@ func ObjectsAreEqual(expected any, actual any) bool { func ObjectsAreEqualValues(expected any, actual any) bool { return assertions.ObjectsAreEqualValues(expected, actual) } + +// WithHunkSize modifies the size of the hunk context in diff. +// +// The default is 1. +func WithHunkSize(n int) Option { + return assertions.WithHunkSize(n) +} diff --git a/assert/assert_helpers_test.go b/assert/assert_helpers_test.go index 14286d463..98d7120ac 100644 --- a/assert/assert_helpers_test.go +++ b/assert/assert_helpers_test.go @@ -9,18 +9,22 @@ import ( "testing" ) -func TestCallerInfof(t *testing.T) { +func TestCallerInfo(t *testing.T) { t.Skip() // this function doesn't have tests yet } -func TestHTTPBodyf(t *testing.T) { +func TestHTTPBody(t *testing.T) { t.Skip() // this function doesn't have tests yet } -func TestObjectsAreEqualf(t *testing.T) { +func TestObjectsAreEqual(t *testing.T) { t.Skip() // this function doesn't have tests yet } -func TestObjectsAreEqualValuesf(t *testing.T) { +func TestObjectsAreEqualValues(t *testing.T) { + t.Skip() // this function doesn't have tests yet +} + +func TestWithHunkSize(t *testing.T) { t.Skip() // this function doesn't have tests yet } diff --git a/assert/assert_options_test.go b/assert/assert_options_test.go new file mode 100644 index 000000000..0c8a9916b --- /dev/null +++ b/assert/assert_options_test.go @@ -0,0 +1,142 @@ +// SPDX-FileCopyrightText: Copyright 2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + +package assert + +import ( + "fmt" + "strings" + "testing" +) + +// capturingT is a [T] that keeps the last failure message. +type capturingT struct { + message string + failed bool +} + +func (capturingT) Helper() {} + +func (m *capturingT) Errorf(format string, args ...any) { + m.message = fmt.Sprintf(format, args...) + m.failed = true +} + +// TestNewWithHunkSize demonstrates how [WithHunkSize] widens the diff reported by [Assertions.Equal]. +// +// The two values differ on their last element only, so the diff holds a single hunk and the +// option decides how many unchanged lines precede the change. +func TestNewWithHunkSize(t *testing.T) { + t.Parallel() + + expected := []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"} + actual := []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "z"} + + for _, toPin := range []struct { + name string + options []Option + wantContext int // unchanged lines of the diff + wantFirst string // first unchanged line of the hunk + }{ + {name: "default", options: nil, wantContext: 2, wantFirst: `(string) (len=1) "i",`}, + {name: "hunk size 1", options: []Option{WithHunkSize(1)}, wantContext: 2, wantFirst: `(string) (len=1) "i",`}, + {name: "hunk size 3", options: []Option{WithHunkSize(3)}, wantContext: 4, wantFirst: `(string) (len=1) "g",`}, + {name: "hunk size 5", options: []Option{WithHunkSize(5)}, wantContext: 6, wantFirst: `(string) (len=1) "e",`}, + {name: "hunk size 100", options: []Option{WithHunkSize(100)}, wantContext: 11, wantFirst: `([]string) (len=10) {`}, + } { + t.Run(toPin.name, func(t *testing.T) { + t.Parallel() + + mock := new(capturingT) + a := New(mock, toPin.options...) + + if a.Equal(expected, actual) { + t.Fatal("Equal should return false on different values") + } + + if !mock.failed { + t.Fatal("Equal should mark the test as failed") + } + + if got := countDiffContextLines(mock.message); got != toPin.wantContext { + t.Errorf("expected %d unchanged lines in the diff, got %d in:\n%s", + toPin.wantContext, got, mock.message) + } + + if got := firstDiffContextLine(mock.message); got != toPin.wantFirst { + t.Errorf("expected the hunk to start at %q, got %q in:\n%s", + toPin.wantFirst, got, mock.message) + } + + if strings.Contains(mock.message, "hunkSize") || strings.Contains(mock.message, "Messages:") { + t.Errorf("expected the option not to leak into the message, got:\n%s", mock.message) + } + }) + } + + t.Run("the format variant should keep its message", func(t *testing.T) { + t.Parallel() + + mock := new(capturingT) + a := New(mock, WithHunkSize(5)) + + if a.Equalf(expected, actual, "values differ at index %d", 9) { + t.Fatal("Equalf should return false on different values") + } + + if !strings.Contains(mock.message, "values differ at index 9") { + t.Errorf("expected the formatted message to be reported, got:\n%s", mock.message) + } + + if got := countDiffContextLines(mock.message); got != 6 { + t.Errorf("expected 6 unchanged lines in the diff, got %d in:\n%s", got, mock.message) + } + }) +} + +// diffLines returns the lines of the "Diff:" section of a failure message, stripped from +// the "\t\t" indentation that labeledOutput adds to continuation lines. +func diffLines(message string) []string { + _, unified, found := strings.Cut(message, "Diff:\n") + if !found { + return nil + } + + var lines []string + + for line := range strings.SplitSeq(unified, "\n") { + parts := strings.SplitN(line, "\t", 3) + if len(parts) < 3 { + continue + } + + lines = append(lines, parts[2]) + } + + return lines +} + +// countDiffContextLines counts the unchanged lines of the diff, i.e. those prefixed with a space. +func countDiffContextLines(message string) int { + var count int + + for _, line := range diffLines(message) { + if strings.HasPrefix(line, " ") && strings.TrimSpace(line) != "" { + count++ + } + } + + return count +} + +// firstDiffContextLine returns the first unchanged line of the diff, which tells how far +// back the hunk reaches. +func firstDiffContextLine(message string) string { + for _, line := range diffLines(message) { + if strings.HasPrefix(line, " ") && strings.TrimSpace(line) != "" { + return strings.TrimSpace(line) + } + } + + return "" +} diff --git a/assert/assert_types.go b/assert/assert_types.go index 634aaca0c..f99dd44dd 100644 --- a/assert/assert_types.go +++ b/assert/assert_types.go @@ -75,6 +75,14 @@ type ( // The [WithSynctest] wrapper opts a call into fake-time polling. NeverConditioner = assertions.NeverConditioner + // Option to modify the behavior of an assertion. + // + // Options are specified when building an assertion type with [New]. + // + // At this moment, the only supported option is to modify the context-width ("hunk") of the diff + // reported on the family of Equal assertions. + Option = assertions.Option + // Ordered is a standard ordered type (i.e. types that support "<": [cmp.Ordered]) plus []byte and [time.Time]. // // This is used by [GreaterT], [GreaterOrEqualT], [LessT], [LessOrEqualT], [IsIncreasingT], [IsDecreasingT]. diff --git a/codegen/internal/generator/doc_generator.go b/codegen/internal/generator/doc_generator.go index face2093a..2fd7359a0 100644 --- a/codegen/internal/generator/doc_generator.go +++ b/codegen/internal/generator/doc_generator.go @@ -218,6 +218,9 @@ func (d *DocGenerator) buildMetrics(docsByDomain iter.Seq2[string, model.Documen var domainMetrics model.DomainMetrics domainMetrics.Name = doc.Title for _, fn := range doc.Package.Functions { + if fn.IsExcluded { + continue + } metrics.Functions++ if fn.IsHelper { diff --git a/codegen/internal/generator/domains/domains.go b/codegen/internal/generator/domains/domains.go index e57853b9d..8c0c33b49 100644 --- a/codegen/internal/generator/domains/domains.go +++ b/codegen/internal/generator/domains/domains.go @@ -204,6 +204,10 @@ func findDescribedDomains(data *model.AssertionPackage, describedDomains map[str func discoverDomainsInFunctions(pkg string, data *model.AssertionPackage, discoveredDomains map[string]Entry) { for _, fn := range data.Functions { + if fn.IsExcluded { + continue + } + domain := fn.Domain if domain == "" { entry := discoveredDomains[nodomain] diff --git a/codegen/internal/generator/forward_generics_test.go b/codegen/internal/generator/forward_generics_test.go index 412c69496..1ab03ee5b 100644 --- a/codegen/internal/generator/forward_generics_test.go +++ b/codegen/internal/generator/forward_generics_test.go @@ -92,7 +92,7 @@ func TestForwardGenericsAssert(t *testing.T) { for _, want := range []string{ "//go:build go1.27", "func (a *Assertions) EqualT[V comparable](expected V, actual V, msgAndArgs ...any) bool {", - "return assertions.EqualT[V](a.T, expected, actual, msgAndArgs...)", + "return assertions.EqualT[V](a.T, expected, actual, append(msgAndArgs, a.o)...)", "func (a *Assertions) EqualTf[V comparable](expected V, actual V, msg string, args ...any) bool {", } { if !strings.Contains(guarded, want) { @@ -133,7 +133,7 @@ func TestForwardGenericsRequire(t *testing.T) { for _, want := range []string{ "//go:build go1.27", "func (a *Assertions) EqualT[V comparable](expected V, actual V, msgAndArgs ...any) {", - "if assertions.EqualT[V](a.T, expected, actual, msgAndArgs...) {", + "if assertions.EqualT[V](a.T, expected, actual, append(msgAndArgs, a.o)...) {", "a.T.FailNow()", } { if !strings.Contains(guarded, want) { diff --git a/codegen/internal/generator/templates/assertion_format.gotmpl b/codegen/internal/generator/templates/assertion_format.gotmpl index 05f69d54d..41a59e813 100644 --- a/codegen/internal/generator/templates/assertion_format.gotmpl +++ b/codegen/internal/generator/templates/assertion_format.gotmpl @@ -21,10 +21,13 @@ func {{ .GenericName "f" }}(t T, {{ params .Params }}, msg string, args ...any) {{- end }} {{- if not .BuildConstraint }}{{/* package-level boilerplate belongs only to the default (unguarded) file */}} -func forwardArgs(msg string, args []any) []any { - result := make([]any, len(args)+1) +func forwardArgs(msg string, args []any, extras ...any) []any { + result := make([]any, len(args)+len(extras)+1) result[0]=msg copy(result[1:], args) + for i, extra := range extras { + result[len(args)+i+1] = extra + } return result } diff --git a/codegen/internal/generator/templates/assertion_forward.gotmpl b/codegen/internal/generator/templates/assertion_forward.gotmpl index 6e558a34e..78e9446a3 100644 --- a/codegen/internal/generator/templates/assertion_forward.gotmpl +++ b/codegen/internal/generator/templates/assertion_forward.gotmpl @@ -18,12 +18,17 @@ import ( {{ docStringPackage .Package }} type {{ .Receiver }} struct { T + + o any } // New makes a new [{{ .Receiver }}] object for the specified [T] (e.g. [testing.T]). -func New(t T) *{{ .Receiver }} { +// +// It may be tuned using [Option]. +func New(t T, opts ...Option) *{{ .Receiver }} { return &{{ .Receiver }}{ T: t, + o: assertions.BuildOptions(opts), } } {{- end }} @@ -35,7 +40,7 @@ func New(t T) *{{ .Receiver }} { {{ docStringPackage $.Package }} func (a *{{ $.Receiver }}) {{ .GenericName }}({{ params .Params }}, msgAndArgs ...any) {{ returns .Returns }} { if h, ok := a.T.(H); ok { h.Helper() } - return {{ .TargetPackage }}.{{ .GenericCallName }}(a.T, {{ forward .Params }}, msgAndArgs...) + return {{ .TargetPackage }}.{{ .GenericCallName }}(a.T, {{ forward .Params }}, append(msgAndArgs, a.o)...) } {{- if $.EnableFormat }} @@ -44,7 +49,7 @@ func (a *{{ $.Receiver }}) {{ .GenericName }}({{ params .Params }}, msgAndArgs . {{ docStringPackage $.Package }} func (a *{{ $.Receiver }}) {{ .GenericName "f" }}({{ params .Params }}, msg string, args ...any) {{ returns .Returns }} { if h, ok := a.T.(H); ok { h.Helper() } - return {{ .TargetPackage }}.{{ .GenericCallName }}(a.T, {{ forward .Params }}, forwardArgs(msg, args)...) + return {{ .TargetPackage }}.{{ .GenericCallName }}(a.T, {{ forward .Params }}, forwardArgs(msg, args, a.o)...) } {{- end }} {{- end }} diff --git a/codegen/internal/generator/templates/assertion_helpers_test.gotmpl b/codegen/internal/generator/templates/assertion_helpers_test.gotmpl index 8205dade8..d433d2ed7 100644 --- a/codegen/internal/generator/templates/assertion_helpers_test.gotmpl +++ b/codegen/internal/generator/templates/assertion_helpers_test.gotmpl @@ -10,15 +10,13 @@ import ( ) {{- end }} -{{- range .Functions }} - {{- if .IsHelper }} +{{- range .Functions.Scope "only-helpers" . }} -func Test{{ .Name }}f(t *testing.T) { +func Test{{ .Name }}(t *testing.T) { {{- if (not .HasTest) }} t.Skip() // this function doesn't have tests yet {{- else }} // TODO {{- end }} } - {{- end }} {{- end }} diff --git a/codegen/internal/generator/templates/doc_metrics.md.gotmpl b/codegen/internal/generator/templates/doc_metrics.md.gotmpl index 8af896c15..307cba391 100644 --- a/codegen/internal/generator/templates/doc_metrics.md.gotmpl +++ b/codegen/internal/generator/templates/doc_metrics.md.gotmpl @@ -21,14 +21,15 @@ on methods; on go1.26 those two variants per generic assertion are excluded by t | Kind | Count | Note | | ------------------------- | ----------------- | ---- | -| All core functions | {{ .Functions }} | Maintained core | -| All core assertions | {{ .Assertions }} | Usage with `*testing.T` | -| Generic assertions | {{ .Generics }} | Type-safe assertions ("T" suffix) | -| Helpers (not assertions) | {{ .Helpers }} | General-purpose utilities, not assertions | +| All core functions | {{ .Functions }} | Maintained core (internal) | +| All core assertions | {{ .Assertions }} | Usage with `*testing.T` (per package) | +| Generic assertions | {{ .Generics }} | Type-safe assertions ("T" suffix) (per package) | +| Helpers (not assertions) | {{ .Helpers }} | General-purpose utilities, not assertions (per package) | | Others | {{ .Others }} | | | assert/require variants | {{ .PackageVariants }} | Generated variants | | Total assertions variants | {{ .TotalVariants }} | Available assertions API | -| Total API surface | {{ .TotalFunctions }} | | +| Constructors | 2 | Builders of Assertion values | +| Total API surface | {{ .TotalFunctions }} | All variants, constructors and helpers over all packages | {{- end }} diff --git a/codegen/internal/generator/templates/requirement_format.gotmpl b/codegen/internal/generator/templates/requirement_format.gotmpl index 17f3a9b21..c37e52e4a 100644 --- a/codegen/internal/generator/templates/requirement_format.gotmpl +++ b/codegen/internal/generator/templates/requirement_format.gotmpl @@ -33,10 +33,13 @@ func {{ .GenericName "f" }}(t T, {{ params .Params }}, msg string, args ...any) {{- end }} {{- if not .BuildConstraint }}{{/* package-level boilerplate belongs only to the default (unguarded) file */}} -func forwardArgs(msg string, args []any) []any { - result := make([]any, len(args)+1) +func forwardArgs(msg string, args []any, extras ...any) []any { + result := make([]any, len(args)+len(extras)+1) result[0]=msg copy(result[1:], args) + for i, extra := range extras { + result[len(args)+i+1] = extra + } return result } diff --git a/codegen/internal/generator/templates/requirement_forward.gotmpl b/codegen/internal/generator/templates/requirement_forward.gotmpl index 654a441a3..098e6183e 100644 --- a/codegen/internal/generator/templates/requirement_forward.gotmpl +++ b/codegen/internal/generator/templates/requirement_forward.gotmpl @@ -18,12 +18,17 @@ import ( {{ docStringPackage .Package }} type {{ .Receiver }} struct { T + + o any } // New makes a new [{{ .Receiver }}] object for the specified [T] (e.g. [testing.T]). -func New(t T) *{{ .Receiver }} { +// +// It may be tuned using [Option]. +func New(t T, opts ...Option) *{{ .Receiver }} { return &{{ .Receiver }}{ T: t, + o: assertions.BuildOptions(opts), } } {{- end }} @@ -36,9 +41,9 @@ func New(t T) *{{ .Receiver }} { func (a *{{ $.Receiver }}) {{ .GenericName }}({{ params .Params }}, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } {{- if or (eq .Name "Fail") (eq .Name "FailNow") }}{{/* special sema.Tics for these two, which can only fail */}} - _ = {{ .TargetPackage }}.{{ .GenericCallName }}(a.T, {{ forward .Params }}, msgAndArgs...) + _ = {{ .TargetPackage }}.{{ .GenericCallName }}(a.T, {{ forward .Params }}, append(msgAndArgs, a.o)...) {{- else }} - if {{ .TargetPackage }}.{{ .GenericCallName }}(a.T, {{ forward .Params }}, msgAndArgs...) { + if {{ .TargetPackage }}.{{ .GenericCallName }}(a.T, {{ forward .Params }}, append(msgAndArgs, a.o)...) { return } {{- end }} @@ -55,9 +60,9 @@ func (a *{{ $.Receiver }}) {{ .GenericName "f" }}({{ params .Params }}, msg stri h.Helper() } {{- if or (eq .Name "Fail") (eq .Name "FailNow") }}{{/* special sema.Tics for these two, which can only fail */}} - _ = {{ .TargetPackage }}.{{ .GenericCallName }}(a.T, {{ forward .Params }}, forwardArgs(msg, args)...) + _ = {{ .TargetPackage }}.{{ .GenericCallName }}(a.T, {{ forward .Params }}, forwardArgs(msg, args, a.o)...) {{- else }} - if {{ .TargetPackage }}.{{ .GenericCallName }}(a.T, {{ forward .Params }}, forwardArgs(msg, args)...) { + if {{ .TargetPackage }}.{{ .GenericCallName }}(a.T, {{ forward .Params }}, forwardArgs(msg, args, a.o)...) { return } {{- end }} diff --git a/codegen/internal/model/model.go b/codegen/internal/model/model.go index 53e3e3dbd..385ebff0d 100644 --- a/codegen/internal/model/model.go +++ b/codegen/internal/model/model.go @@ -59,7 +59,7 @@ func (a *AssertionPackage) WithTestPackage() *AssertionPackage { func (a *AssertionPackage) HasHelpers() (ok bool) { for _, fn := range a.Functions { - if fn.IsHelper || fn.IsConstructor { + if (fn.IsHelper || fn.IsConstructor) && !fn.IsExcluded { return true } } @@ -101,11 +101,15 @@ func (a *AssertionPackage) Clone() *AssertionPackage { func (a *AssertionPackage) Names() iter.Seq[string] { return func(yield func(string) bool) { for _, fn := range a.Functions { + if fn.IsExcluded { + continue + } + if !yield(fn.Name) { return } - if !a.EnableFormat { + if !a.EnableFormat || fn.IsHelper || fn.IsConstructor { continue } @@ -152,7 +156,7 @@ func (f Functions) Scope(scope ScopeKind, ctx *AssertionPackage) (iter.Seq[Funct func (f Functions) iterScopeWithGenerics(ctx *AssertionPackage) func(func(Function) bool) { return func(yield func(Function) bool) { for _, fn := range f { - if fn.IsConstructor || fn.IsHelper || (fn.IsGeneric && !ctx.EnableGenerics) { + if fn.IsConstructor || fn.IsHelper || (fn.IsGeneric && !ctx.EnableGenerics) || fn.IsExcluded { continue } @@ -165,7 +169,7 @@ func (f Functions) iterScopeWithGenerics(ctx *AssertionPackage) func(func(Functi func (f Functions) iterScopeWithoutGenerics(yield func(Function) bool) { for _, fn := range f { - if fn.IsConstructor || fn.IsHelper || fn.IsGeneric { + if fn.IsConstructor || fn.IsHelper || fn.IsGeneric || fn.IsExcluded { continue } @@ -177,7 +181,7 @@ func (f Functions) iterScopeWithoutGenerics(yield func(Function) bool) { func (f Functions) iterScopeHelpers(yield func(Function) bool) { for _, fn := range f { - if !fn.IsHelper { + if !fn.IsHelper || fn.IsExcluded { continue } @@ -208,6 +212,7 @@ type Function struct { IsHelper bool IsDeprecated bool IsConstructor bool + IsExcluded bool Tests []Test // extraneous information when scanning in collectDoc mode Domain string @@ -435,6 +440,8 @@ func (t CommentTag) String() string { return "comment-tag-domain-description" case CommentTagOpposite: return "comment-tag-opposite" + case CommentTagExcluded: + return "comment-tag-excluded" default: return "invalid-value" } @@ -448,6 +455,7 @@ const ( CommentTagNote CommentTagDomainDescription CommentTagOpposite + CommentTagExcluded ) type ExtraComment struct { @@ -475,3 +483,7 @@ func (c ExtraComment) Opposite() string { return c.Text } + +func (c ExtraComment) IsExcluded() bool { + return c.Tag == CommentTagExcluded +} diff --git a/codegen/internal/scanner/comments-parser/tags.go b/codegen/internal/scanner/comments-parser/tags.go index e6b52f415..b748447b2 100644 --- a/codegen/internal/scanner/comments-parser/tags.go +++ b/codegen/internal/scanner/comments-parser/tags.go @@ -28,6 +28,7 @@ func ParseTaggedComments(text string) []model.ExtraComment { notePrefix = "note" mentionPrefix = "mention" oppositePrefix = "opposite" + excludedPrefix = "excluded" ) inValue := false @@ -36,6 +37,7 @@ func ParseTaggedComments(text string) []model.ExtraComment { startValueNote := StartValueFunc(notePrefix) startValueMention := StartValueFunc(mentionPrefix) startValueOpposite := StartValueFunc(oppositePrefix) + startValueExcluded := StartValueFunc(excludedPrefix) startTaggedValue := func(line string) (key string, val string, tag model.CommentTag, multiline bool, ok bool) { val, ok = startValueDomain(line) @@ -58,6 +60,10 @@ func ParseTaggedComments(text string) []model.ExtraComment { if ok { return "", val, model.CommentTagOpposite, false, true } + val, ok = startValueExcluded(line) + if ok { + return "", val, model.CommentTagExcluded, false, true + } return "", "", model.CommentTagNone, false, false } diff --git a/codegen/internal/scanner/scanner.go b/codegen/internal/scanner/scanner.go index 8f096e253..9212a71de 100644 --- a/codegen/internal/scanner/scanner.go +++ b/codegen/internal/scanner/scanner.go @@ -225,7 +225,9 @@ func (s *Scanner) addFunction(object *types.Func) { function.SourceLink = &pos function.Domain = parser.DomainFromExtraComments(function.ExtraComments) } + function.IsDeprecated = isDeprecated(function.DocString) + function.IsExcluded = isExcluded(function.ExtraComments) s.result.Functions = append(s.result.Functions, function) } @@ -295,10 +297,10 @@ func (s *Scanner) addNamedType(object *types.TypeName) { namedType.Function = &fn } + namedType.ExtraComments = s.commentExtractor.ExtractExtraComments(object) if s.collectDoc { pos := s.fileSet.Position(object.Pos()) namedType.SourceLink = &pos - namedType.ExtraComments = s.commentExtractor.ExtractExtraComments(object) namedType.Domain = parser.DomainFromExtraComments(namedType.ExtraComments) } @@ -314,3 +316,13 @@ var deprecatedRx = regexp.MustCompile(`(^|\n\s*\n)\s*Deprecated:`) func isDeprecated(comment string) bool { return deprecatedRx.MatchString(comment) } + +func isExcluded(extras []model.ExtraComment) bool { + for _, extra := range extras { + if extra.IsExcluded() { + return true + } + } + + return false +} diff --git a/docs/doc-site/api/_index.md b/docs/doc-site/api/_index.md index 57ad75b96..db866f256 100644 --- a/docs/doc-site/api/_index.md +++ b/docs/doc-site/api/_index.md @@ -50,7 +50,7 @@ Each domain contains assertions regrouped by their use case (e.g. http, json, er - [Time](./time.md) - Asserting Times And Durations (2) - [Type](./type.md) - Asserting Types Rather Than Values (10) - [Yaml](./yaml.md) - Asserting Yaml Documents (5) -- [Common](./common.md) - Other Uncategorized Helpers (3) +- [Common](./common.md) - Other Uncategorized Helpers (4) --- diff --git a/docs/doc-site/api/common.md b/docs/doc-site/api/common.md index c396e11f4..ff7fe940e 100644 --- a/docs/doc-site/api/common.md +++ b/docs/doc-site/api/common.md @@ -6,11 +6,9 @@ domains: - "common" keywords: - "CallerInfo" - - "CallerInfof" - "ObjectsAreEqual" - - "ObjectsAreEqualf" - "ObjectsAreEqualValues" - - "ObjectsAreEqualValuesf" + - "WithHunkSize" --- Other Uncategorized Helpers @@ -22,7 +20,7 @@ Other Uncategorized Helpers _All links point to _ -This domain exposes 3 functionalities. +This domain exposes 4 functionalities. ```tree ``` @@ -55,7 +53,7 @@ failed. |--|--| | [`assertions.CallerInfo() []string`](https://pkg.go.dev/github.com/go-openapi/testify/v2/internal/assertions#CallerInfo) | internal implementation | -**Source:** [github.com/go-openapi/testify/v2/internal/assertions#CallerInfo](https://github.com/go-openapi/testify/blob/master/internal/assertions/testing.go#L70) +**Source:** [github.com/go-openapi/testify/v2/internal/assertions#CallerInfo](https://github.com/go-openapi/testify/blob/master/internal/assertions/testing.go#L71) > **Maintainer Note** > @@ -119,6 +117,34 @@ values are equal. {{% /tab %}} {{< /tabs >}} +### WithHunkSize{#withhunksize} +WithHunkSize modifies the size of the hunk context in diff. + +The default is 1. + + +{{< tabs >}} + +{{% tab title="assert" style="secondary" %}} +| Signature | Usage | +|--|--| +| [`assert.WithHunkSize(n int) Option`](https://pkg.go.dev/github.com/go-openapi/testify/v2/assert#WithHunkSize) | package-level function | +{{% /tab %}} +{{% tab title="require" style="secondary" %}} +| Signature | Usage | +|--|--| +| [`require.WithHunkSize(n int) Option`](https://pkg.go.dev/github.com/go-openapi/testify/v2/require#WithHunkSize) | package-level function | +{{% /tab %}} + +{{% tab title="internal" style="accent" icon="wrench" %}} +| Signature | Usage | +|--|--| +| [`assertions.WithHunkSize(n int) Option`](https://pkg.go.dev/github.com/go-openapi/testify/v2/internal/assertions#WithHunkSize) | internal implementation | + +**Source:** [github.com/go-openapi/testify/v2/internal/assertions#WithHunkSize](https://github.com/go-openapi/testify/blob/master/internal/assertions/options.go#L35) +{{% /tab %}} +{{< /tabs >}} + --- Generated with github.com/go-openapi/testify/codegen/v2 diff --git a/docs/doc-site/api/equality.md b/docs/doc-site/api/equality.md index 09e85dc23..b7b7809c7 100644 --- a/docs/doc-site/api/equality.md +++ b/docs/doc-site/api/equality.md @@ -437,7 +437,7 @@ type dummyStruct struct { |--|--| | [`assertions.EqualExportedValues(t T, expected any, actual any, msgAndArgs ...any) bool`](https://pkg.go.dev/github.com/go-openapi/testify/v2/internal/assertions#EqualExportedValues) | internal implementation | -**Source:** [github.com/go-openapi/testify/v2/internal/assertions#EqualExportedValues](https://github.com/go-openapi/testify/blob/master/internal/assertions/equal.go#L220) +**Source:** [github.com/go-openapi/testify/v2/internal/assertions#EqualExportedValues](https://github.com/go-openapi/testify/blob/master/internal/assertions/equal.go#L221) {{% /tab %}} {{< /tabs >}} @@ -780,7 +780,7 @@ func main() { |--|--| | [`assertions.Exactly(t T, expected any, actual any, msgAndArgs ...any) bool`](https://pkg.go.dev/github.com/go-openapi/testify/v2/internal/assertions#Exactly) | internal implementation | -**Source:** [github.com/go-openapi/testify/v2/internal/assertions#Exactly](https://github.com/go-openapi/testify/blob/master/internal/assertions/equal.go#L270) +**Source:** [github.com/go-openapi/testify/v2/internal/assertions#Exactly](https://github.com/go-openapi/testify/blob/master/internal/assertions/equal.go#L272) {{% /tab %}} {{< /tabs >}} @@ -1344,7 +1344,7 @@ func main() { |--|--| | [`assertions.NotEqualValues(t T, expected any, actual any, msgAndArgs ...any) bool`](https://pkg.go.dev/github.com/go-openapi/testify/v2/internal/assertions#NotEqualValues) | internal implementation | -**Source:** [github.com/go-openapi/testify/v2/internal/assertions#NotEqualValues](https://github.com/go-openapi/testify/blob/master/internal/assertions/equal.go#L182) +**Source:** [github.com/go-openapi/testify/v2/internal/assertions#NotEqualValues](https://github.com/go-openapi/testify/blob/master/internal/assertions/equal.go#L183) {{% /tab %}} {{< /tabs >}} diff --git a/docs/doc-site/api/http.md b/docs/doc-site/api/http.md index b6daee20d..55dd95f52 100644 --- a/docs/doc-site/api/http.md +++ b/docs/doc-site/api/http.md @@ -6,7 +6,6 @@ domains: - "http" keywords: - "HTTPBody" - - "HTTPBodyf" - "HTTPBodyContains" - "HTTPBodyContainsf" - "HTTPBodyNotContains" diff --git a/docs/doc-site/api/metrics.md b/docs/doc-site/api/metrics.md index 2638c8767..41806828e 100644 --- a/docs/doc-site/api/metrics.md +++ b/docs/doc-site/api/metrics.md @@ -19,14 +19,15 @@ on methods; on go1.26 those two variants per generic assertion are excluded by t | Kind | Count | Note | | ------------------------- | ----------------- | ---- | -| All core functions | 144 | Maintained core | +| All core functions | 145 | Maintained core | | All core assertions | 140 | Usage with `*testing.T` | -| Generic assertions | 55 | Type-safe assertions ("T" suffix) | -| Helpers (not assertions) | 4 | General-purpose utilities, not assertions | +| Generic assertions | 55 | Type-safe assertions ("T" suffix) (per package)| +| Helpers (not assertions) | 5 | General-purpose utilities, not assertions (per package)| | Others | 0 | | | assert/require variants | 560 | Generated variants | | Total assertions variants | 1120 | Available assertions API | -| Total API surface | 1130 | | +| Constructors | 2 | Builders of Assertion values | +| Total API surface | 1132 | All variants, constructors and helpers | ## Quick index @@ -119,6 +120,7 @@ Table of core assertions, excluding variants. Each function is side by side with | [Subset](collection/#subset) | [NotSubset](collection/#notsubset) | collection | | | [True](boolean/#true) | [False](boolean/#false) | boolean | | | [TrueT[B Boolean]](boolean/#truetb-boolean) {{% icon icon="star" color=orange %}} | [FalseT](boolean/#falsetb-boolean) | boolean | | +| [WithHunkSize](common/#withhunksize) | | common | helper | | [WithinDuration](time/#withinduration) | | time | | | [WithinRange](time/#withinrange) | | time | | | [YAMLEq](yaml/#yamleq) | | yaml | | diff --git a/docs/doc-site/api/testing.md b/docs/doc-site/api/testing.md index a1c899464..9ab202df3 100644 --- a/docs/doc-site/api/testing.md +++ b/docs/doc-site/api/testing.md @@ -115,7 +115,7 @@ FailNow fails test. |--|--| | [`assertions.FailNow(t T, failureMessage string, msgAndArgs ...any) bool`](https://pkg.go.dev/github.com/go-openapi/testify/v2/internal/assertions#FailNow) | internal implementation | -**Source:** [github.com/go-openapi/testify/v2/internal/assertions#FailNow](https://github.com/go-openapi/testify/blob/master/internal/assertions/testing.go#L45) +**Source:** [github.com/go-openapi/testify/v2/internal/assertions#FailNow](https://github.com/go-openapi/testify/blob/master/internal/assertions/testing.go#L46) {{% /tab %}} {{< /tabs >}} diff --git a/hack/doc-site/hugo/metrics.yaml b/hack/doc-site/hugo/metrics.yaml index ab0bb6989..33ad74f92 100644 --- a/hack/doc-site/hugo/metrics.yaml +++ b/hack/doc-site/hugo/metrics.yaml @@ -1,11 +1,11 @@ params: metrics: domains: 20 - functions: 144 + functions: 145 assertions: 140 generics: 55 nongeneric_assertions: 85 - helpers: 4 + helpers: 5 others: 0 by_domain: async: @@ -70,4 +70,4 @@ params: count: 5 package_variants: 560 total_variants: 1120 - total_functions: 1130 + total_functions: 1132 diff --git a/internal/assertions/diff.go b/internal/assertions/diff.go index cc3fbad3b..b4f167de6 100644 --- a/internal/assertions/diff.go +++ b/internal/assertions/diff.go @@ -12,7 +12,7 @@ import ( // diff returns a diff of both values as long as both are of the same type and // are a struct, map, slice, array or string. Otherwise it returns an empty string. -func diff(expected any, actual any) string { +func diff(expected any, actual any, o options) string { if expected == nil || actual == nil { return "" } @@ -47,7 +47,7 @@ func diff(expected any, actual any) string { FromDate: "", ToFile: "Actual", ToDate: "", - Context: 1, + Context: max(o.hunkSize, 1), } if colors.Enabled() { diff --git a/internal/assertions/diff_test.go b/internal/assertions/diff_test.go index cf5c4e3fb..bdfcd2589 100644 --- a/internal/assertions/diff_test.go +++ b/internal/assertions/diff_test.go @@ -24,9 +24,10 @@ func TestDiff(t *testing.T) { type myTime time.Time t0 := time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC) t1 := t0.Add(time.Second) + var opt options t.Run("diff should render time with stringer", func(t *testing.T) { - diffResult := diff(t0, t1) + diffResult := diff(t0, t1, opt) if strings.Contains(diffResult, "-(time.Time) 2026-01-01 00:00:00 +0000 UTC") && strings.Contains(diffResult, "+(time.Time) 2026-01-01 00:00:01 +0000 UTC") { return @@ -52,7 +53,7 @@ func TestDiff(t *testing.T) { C: &t1, } - diffResult := diff(expected, actual) + diffResult := diff(expected, actual, opt) if strings.Contains(diffResult, "- A: (time.Time) 2026-01-01 00:00:00 +0000 UTC") && strings.Contains(diffResult, "- B: (assertions.myTime) 2026-01-01 00:00:00 +0000 UTC") && strings.Contains(diffResult, "- C: (*time.Time)(2026-01-01 00:00:00 +0000 UTC)") && @@ -68,12 +69,12 @@ func TestDiff(t *testing.T) { t.Run("diff on nil/nil interface types should render empty", func(t *testing.T) { var a, b error - diffResult := diff(a, &b) + diffResult := diff(a, &b, opt) if diffResult != "" { t.Errorf("expected an empty string to render the diff") } - diffResult = diff((*error)(nil), (*error)(nil)) + diffResult = diff((*error)(nil), (*error)(nil), opt) if diffResult != "" { t.Errorf("expected an empty string to render the diff") } @@ -110,6 +111,7 @@ func TestTypeDiffRace(t *testing.T) { "e": "E", "f": "F", } + var opt options // run diffs in parallel simulating tests with t.Parallel() numRoutines := 10 @@ -118,7 +120,7 @@ func TestTypeDiffRace(t *testing.T) { rChans[idx] = make(chan string) go func(ch chan string) { defer close(ch) - ch <- diff(expected, actual) + ch <- diff(expected, actual, opt) }(rChans[idx]) } @@ -140,9 +142,11 @@ func testDiff() func(*testing.T) { t.Parallel() for range min(1, tt.repeat) { // for tests on maps, need to verify the ordering is stable + var opts options actual := diff( tt.valueA, tt.valueB, + opts, ) if tt.expected != actual { t.Errorf("expected diff:\n%s\ngot:\n%s", tt.expected, actual) diff --git a/internal/assertions/equal.go b/internal/assertions/equal.go index a4b5e0742..50f0c4078 100644 --- a/internal/assertions/equal.go +++ b/internal/assertions/equal.go @@ -157,7 +157,8 @@ func EqualValues(t T, expected, actual any, msgAndArgs ...any) bool { } if !ObjectsAreEqualValues(expected, actual) { - diff := diff(expected, actual) + msgAndArgs, o := splitArgs(msgAndArgs) + diff := diff(expected, actual, o) expected, actual = formatUnequalValues(expected, actual) return Fail(t, fmt.Sprintf("Not equal: \n"+ "expected: %s\n"+ @@ -247,7 +248,8 @@ func EqualExportedValues(t T, expected, actual any, msgAndArgs ...any) bool { } if !ObjectsAreEqualValues(thisExpected, thisActual) { - diff := diff(thisExpected, thisActual) + msgAndArgs, o := splitArgs(msgAndArgs) + diff := diff(thisExpected, thisActual, o) thisExpected, thisActual = formatUnequalValues(thisExpected, thisActual) return Fail(t, fmt.Sprintf("Not equal (comparing only exported fields): \n"+ "expected: %s\n"+ @@ -288,7 +290,8 @@ func failWithDiff(t T, expected, actual any, msgAndArgs ...any) bool { h.Helper() } - diff := diff(expected, actual) + msgAndArgs, o := splitArgs(msgAndArgs) + diff := diff(expected, actual, o) expectedStr, actualStr := formatUnequalValues(expected, actual) if colors.Enabled() { diff --git a/internal/assertions/number_test.go b/internal/assertions/number_test.go index 1eabbaa98..5a5f1ac7f 100644 --- a/internal/assertions/number_test.go +++ b/internal/assertions/number_test.go @@ -66,12 +66,13 @@ func TestNumberInDeltaSlice(t *testing.T) { func TestNumberInDeltaMapValues(t *testing.T) { t.Parallel() mock := new(mockT) + var opts options // only have a reflection-based assertion here for tc := range numberInDeltaMapCases() { result := InDeltaMapValues(mock, tc.expect, tc.actual, tc.delta) if result != tc.shouldPass { - t.Errorf("%s: expected result=%v, got %v\n%s", tc.name, tc.shouldPass, result, diff(tc.expect, tc.actual)) + t.Errorf("%s: expected result=%v, got %v\n%s", tc.name, tc.shouldPass, result, diff(tc.expect, tc.actual, opts)) } } } diff --git a/internal/assertions/options.go b/internal/assertions/options.go new file mode 100644 index 000000000..88e872d58 --- /dev/null +++ b/internal/assertions/options.go @@ -0,0 +1,75 @@ +// SPDX-FileCopyrightText: Copyright 2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + +package assertions + +import "slices" + +// Option to modify the behavior of an assertion. +// +// Options are specified when building an assertion type with [New]. +// +// At this moment, the only supported option is to modify the context-width ("hunk") of the diff +// reported on the family of Equal assertions. +type Option func(o options) options + +type options struct { + hunkSize int +} + +// BuildOptions compound multiple options. +// +// The result is an opaque "any" on purpose: options remain unexported. +func BuildOptions(opts []Option) any { + // excluded: don't re-export this function in generated packages. + var o options + + for _, apply := range opts { + o = apply(o) + } + + return o +} + +// WithHunkSize modifies the size of the hunk context in diff. +// +// The default is 1. +func WithHunkSize(n int) Option { + return func(o options) options { + o.hunkSize = n + + return o + } +} + +// splitArgs extracts options from variadic arguments to assertions. +// +// Forward methods ([Assertions]) append the value built by [BuildOptions] to msgAndArgs. +// splitArgs pulls it back out, so it never reaches the failure message. +// +// A later option overrides an earlier one. The returned msgAndArgs aliases args +// when there is no option to remove. +func splitArgs(args []any) (msgAndArgs []any, opts options) { + msgAndArgs = args + + for i := 0; i < len(msgAndArgs); i++ { + switch opt := msgAndArgs[i].(type) { // the switch remains, even though it is now reduced to one single case. + case options: + opts = opt + msgAndArgs = slices.Delete(slices.Clone(msgAndArgs), i, i+1) + i-- // the deletion shifted the remaining arguments down + + // This case is left disabled for now: this would allow for injecting options directly on top-level functions + // by hijacking args. This works, but we prefer for now to maintain this door closed. + // + // case Option: + // opts = opt(opts) + // msgAndArgs = slices.Delete(slices.Clone(msgAndArgs), i, i+1) + // i-- + default: + // noop + } + } + + return msgAndArgs, opts +} diff --git a/internal/assertions/options_test.go b/internal/assertions/options_test.go new file mode 100644 index 000000000..2dd82c184 --- /dev/null +++ b/internal/assertions/options_test.go @@ -0,0 +1,194 @@ +// SPDX-FileCopyrightText: Copyright 2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + +package assertions + +import ( + "strings" + "testing" +) + +// hunkFixture is a 10-element slice with a single difference on the last element. +// A diff of expected against actual therefore has one hunk, whose size is driven by [WithHunkSize]. +func hunkFixture() (expected, actual []string) { + expected = []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"} + actual = []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "z"} + + return expected, actual +} + +// countContextLines counts the unchanged lines of a unified diff, i.e. the lines prefixed with a space. +func countContextLines(unified string) int { + var count int + + for line := range strings.SplitSeq(unified, "\n") { + if strings.HasPrefix(line, " ") && strings.TrimSpace(line) != "" { + count++ + } + } + + return count +} + +func TestWithHunkSize(t *testing.T) { + t.Parallel() + + expected, actual := hunkFixture() + + t.Run("hunk size should widen the diff context", func(t *testing.T) { + t.Parallel() + + // the changed element is last, so the widening only shows up before it: + // context lines = min(hunkSize, 9 preceding lines) + the closing "}" line. + for _, toPin := range []struct { + name string + hunkSize int + wantContext int + wantLastLine string + }{ + {name: "default (unset) clamps to 1", hunkSize: 0, wantContext: 2, wantLastLine: `(string) (len=1) "i",`}, + {name: "negative clamps to 1", hunkSize: -5, wantContext: 2, wantLastLine: `(string) (len=1) "i",`}, + {name: "explicit 1", hunkSize: 1, wantContext: 2, wantLastLine: `(string) (len=1) "i",`}, + {name: "3 shows two more lines", hunkSize: 3, wantContext: 4, wantLastLine: `(string) (len=1) "g",`}, + {name: "5 shows four more lines", hunkSize: 5, wantContext: 6, wantLastLine: `(string) (len=1) "e",`}, + {name: "larger than the value shows it whole", hunkSize: 100, wantContext: 11, wantLastLine: `([]string) (len=10) {`}, + } { + t.Run(toPin.name, func(t *testing.T) { + t.Parallel() + + o := buildOptions(WithHunkSize(toPin.hunkSize)) + unified := diff(expected, actual, o) + + if got := countContextLines(unified); got != toPin.wantContext { + t.Errorf("expected %d context lines with hunk size %d, got %d in:\n%s", + toPin.wantContext, toPin.hunkSize, got, unified) + } + + // the first context line tells how far back the hunk reaches + lines := strings.Split(strings.TrimPrefix(unified, "\n\nDiff:\n"), "\n") + first := strings.TrimSpace(lines[3]) // skip "--- Expected", "+++ Actual", "@@ ... @@" + if first != toPin.wantLastLine { + t.Errorf("expected the hunk to start at %q, got %q in:\n%s", toPin.wantLastLine, first, unified) + } + }) + } + }) + + t.Run("a wider hunk should widen the reported failure", func(t *testing.T) { + t.Parallel() + + narrow := new(mockT) + Equal(narrow, expected, actual, buildOptions(WithHunkSize(1))) + + wide := new(mockT) + Equal(wide, expected, actual, buildOptions(WithHunkSize(5))) + + if !narrow.Failed() || !wide.Failed() { + t.Fatal("expected both assertions to fail") + } + + narrowLines := strings.Count(narrow.errorString(), "\n") + wideLines := strings.Count(wide.errorString(), "\n") + + if wideLines <= narrowLines { + t.Errorf("expected the wider hunk to report more lines, got %d with hunk size 5 and %d with hunk size 1", + wideLines, narrowLines) + } + }) + + t.Run("the injected option should not show up in the message", func(t *testing.T) { + t.Parallel() + + mock := new(mockT) + Equal(mock, expected, actual, buildOptions(WithHunkSize(5))) + + if strings.Contains(mock.errorString(), "hunkSize") { + t.Errorf("expected the option to be stripped from the message, got:\n%s", mock.errorString()) + } + + if strings.Contains(mock.errorString(), "Messages:") { + t.Errorf("expected no Messages section when only an option is passed, got:\n%s", mock.errorString()) + } + }) + + t.Run("a message passed alongside an option should survive", func(t *testing.T) { + t.Parallel() + + mock := new(mockT) + Equal(mock, expected, actual, "context %d", 42, buildOptions(WithHunkSize(5))) + + if !strings.Contains(mock.errorString(), "context 42") { + t.Errorf("expected the formatted message to be preserved, got:\n%s", mock.errorString()) + } + }) +} + +func TestSplitArgs(t *testing.T) { + t.Parallel() + + t.Run("should leave plain arguments alone", func(t *testing.T) { + t.Parallel() + + msgAndArgs, opts := splitArgs([]any{"msg", 1, true}) + + if len(msgAndArgs) != 3 { + t.Errorf("expected 3 arguments, got %d: %v", len(msgAndArgs), msgAndArgs) + } + + if opts.hunkSize != 0 { + t.Errorf("expected a zero hunk size, got %d", opts.hunkSize) + } + }) + + t.Run("should extract the option and keep the message", func(t *testing.T) { + t.Parallel() + + args := []any{"msg %d", 1, buildOptions(WithHunkSize(7))} + msgAndArgs, opts := splitArgs(args) + + if opts.hunkSize != 7 { + t.Errorf("expected a hunk size of 7, got %d", opts.hunkSize) + } + + if len(msgAndArgs) != 2 || msgAndArgs[0] != "msg %d" || msgAndArgs[1] != 1 { + t.Errorf("expected the message arguments to be preserved, got %v", msgAndArgs) + } + + if len(args) != 3 { + t.Errorf("expected the input slice to be left untouched, got %v", args) + } + }) + + t.Run("should extract an option in any position", func(t *testing.T) { + t.Parallel() + + msgAndArgs, opts := splitArgs([]any{buildOptions(WithHunkSize(2)), "msg"}) + + if opts.hunkSize != 2 { + t.Errorf("expected a hunk size of 2, got %d", opts.hunkSize) + } + + if len(msgAndArgs) != 1 || msgAndArgs[0] != "msg" { + t.Errorf("expected only the message to remain, got %v", msgAndArgs) + } + }) + + t.Run("should keep the last option when several are injected", func(t *testing.T) { + t.Parallel() + + msgAndArgs, opts := splitArgs([]any{buildOptions(WithHunkSize(2)), buildOptions(WithHunkSize(9))}) + + if opts.hunkSize != 9 { + t.Errorf("expected the last option to win with a hunk size of 9, got %d", opts.hunkSize) + } + + if len(msgAndArgs) != 0 { + t.Errorf("expected all options to be removed, got %v", msgAndArgs) + } + }) +} + +// buildOptions is the test-side shorthand for [BuildOptions], which returns an opaque any. +func buildOptions(opts ...Option) options { + return BuildOptions(opts).(options) //nolint:forcetypeassert // BuildOptions always returns options +} diff --git a/internal/assertions/testing.go b/internal/assertions/testing.go index 6dda3a4a3..78d8292e0 100644 --- a/internal/assertions/testing.go +++ b/internal/assertions/testing.go @@ -26,6 +26,7 @@ func Fail(t T, failureMessage string, msgAndArgs ...any) bool { h.Helper() } + msgAndArgs, _ = splitArgs(msgAndArgs) // strip possible injected option if failureMessage != "" || len(msgAndArgs) > 0 { errorWithCallerInfo(t, 1, failureMessage, msgAndArgs...) } diff --git a/internal/assertions/type_test.go b/internal/assertions/type_test.go index 3006cefff..264ee685c 100644 --- a/internal/assertions/type_test.go +++ b/internal/assertions/type_test.go @@ -163,6 +163,7 @@ func TestTypeKind(t *testing.T) { func TestTypeDiffEmptyCases(t *testing.T) { t.Parallel() + var opts options cases := []struct { a, b any }{ @@ -174,7 +175,7 @@ func TestTypeDiffEmptyCases(t *testing.T) { {[]int{1}, []bool{true}}, } for _, tc := range cases { - if result := diff(tc.a, tc.b); result != "" { + if result := diff(tc.a, tc.b, opts); result != "" { t.Errorf("expected empty diff for (%v, %v), got %q", tc.a, tc.b, result) } } diff --git a/require/require_format.go b/require/require_format.go index 3e0ba22c2..706ce6aaf 100644 --- a/require/require_format.go +++ b/require/require_format.go @@ -1971,10 +1971,13 @@ func Zerof(t T, i any, msg string, args ...any) { t.FailNow() } -func forwardArgs(msg string, args []any) []any { - result := make([]any, len(args)+1) +func forwardArgs(msg string, args []any, extras ...any) []any { + result := make([]any, len(args)+len(extras)+1) result[0] = msg copy(result[1:], args) + for i, extra := range extras { + result[len(args)+i+1] = extra + } return result } diff --git a/require/require_forward.go b/require/require_forward.go index 4185b822a..d5898d2f6 100644 --- a/require/require_forward.go +++ b/require/require_forward.go @@ -22,12 +22,17 @@ import ( // Upon failure, the test [T] is marked as failed and stops execution. type Assertions struct { T + + o any } // New makes a new [Assertions] object for the specified [T] (e.g. [testing.T]). -func New(t T) *Assertions { +// +// It may be tuned using [Option]. +func New(t T, opts ...Option) *Assertions { return &Assertions{ T: t, + o: assertions.BuildOptions(opts), } } @@ -38,7 +43,7 @@ func (a *Assertions) Blocked(ch any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Blocked(a.T, ch, msgAndArgs...) { + if assertions.Blocked(a.T, ch, append(msgAndArgs, a.o)...) { return } @@ -52,7 +57,7 @@ func (a *Assertions) Blockedf(ch any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Blocked(a.T, ch, forwardArgs(msg, args)...) { + if assertions.Blocked(a.T, ch, forwardArgs(msg, args, a.o)...) { return } @@ -66,7 +71,7 @@ func (a *Assertions) Condition(comp func() bool, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Condition(a.T, comp, msgAndArgs...) { + if assertions.Condition(a.T, comp, append(msgAndArgs, a.o)...) { return } @@ -80,7 +85,7 @@ func (a *Assertions) Conditionf(comp func() bool, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Condition(a.T, comp, forwardArgs(msg, args)...) { + if assertions.Condition(a.T, comp, forwardArgs(msg, args, a.o)...) { return } @@ -94,7 +99,7 @@ func (a *Assertions) Contains(s any, contains any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Contains(a.T, s, contains, msgAndArgs...) { + if assertions.Contains(a.T, s, contains, append(msgAndArgs, a.o)...) { return } @@ -108,7 +113,7 @@ func (a *Assertions) Containsf(s any, contains any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Contains(a.T, s, contains, forwardArgs(msg, args)...) { + if assertions.Contains(a.T, s, contains, forwardArgs(msg, args, a.o)...) { return } @@ -122,7 +127,7 @@ func (a *Assertions) DirExists(path string, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.DirExists(a.T, path, msgAndArgs...) { + if assertions.DirExists(a.T, path, append(msgAndArgs, a.o)...) { return } @@ -136,7 +141,7 @@ func (a *Assertions) DirExistsf(path string, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.DirExists(a.T, path, forwardArgs(msg, args)...) { + if assertions.DirExists(a.T, path, forwardArgs(msg, args, a.o)...) { return } @@ -150,7 +155,7 @@ func (a *Assertions) DirNotExists(path string, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.DirNotExists(a.T, path, msgAndArgs...) { + if assertions.DirNotExists(a.T, path, append(msgAndArgs, a.o)...) { return } @@ -164,7 +169,7 @@ func (a *Assertions) DirNotExistsf(path string, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.DirNotExists(a.T, path, forwardArgs(msg, args)...) { + if assertions.DirNotExists(a.T, path, forwardArgs(msg, args, a.o)...) { return } @@ -178,7 +183,7 @@ func (a *Assertions) ElementsMatch(listA any, listB any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.ElementsMatch(a.T, listA, listB, msgAndArgs...) { + if assertions.ElementsMatch(a.T, listA, listB, append(msgAndArgs, a.o)...) { return } @@ -192,7 +197,7 @@ func (a *Assertions) ElementsMatchf(listA any, listB any, msg string, args ...an if h, ok := a.T.(H); ok { h.Helper() } - if assertions.ElementsMatch(a.T, listA, listB, forwardArgs(msg, args)...) { + if assertions.ElementsMatch(a.T, listA, listB, forwardArgs(msg, args, a.o)...) { return } @@ -206,7 +211,7 @@ func (a *Assertions) Empty(object any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Empty(a.T, object, msgAndArgs...) { + if assertions.Empty(a.T, object, append(msgAndArgs, a.o)...) { return } @@ -220,7 +225,7 @@ func (a *Assertions) Emptyf(object any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Empty(a.T, object, forwardArgs(msg, args)...) { + if assertions.Empty(a.T, object, forwardArgs(msg, args, a.o)...) { return } @@ -234,7 +239,7 @@ func (a *Assertions) Equal(expected any, actual any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Equal(a.T, expected, actual, msgAndArgs...) { + if assertions.Equal(a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -248,7 +253,7 @@ func (a *Assertions) Equalf(expected any, actual any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Equal(a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.Equal(a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -262,7 +267,7 @@ func (a *Assertions) EqualError(err error, errString string, msgAndArgs ...any) if h, ok := a.T.(H); ok { h.Helper() } - if assertions.EqualError(a.T, err, errString, msgAndArgs...) { + if assertions.EqualError(a.T, err, errString, append(msgAndArgs, a.o)...) { return } @@ -276,7 +281,7 @@ func (a *Assertions) EqualErrorf(err error, errString string, msg string, args . if h, ok := a.T.(H); ok { h.Helper() } - if assertions.EqualError(a.T, err, errString, forwardArgs(msg, args)...) { + if assertions.EqualError(a.T, err, errString, forwardArgs(msg, args, a.o)...) { return } @@ -290,7 +295,7 @@ func (a *Assertions) EqualExportedValues(expected any, actual any, msgAndArgs .. if h, ok := a.T.(H); ok { h.Helper() } - if assertions.EqualExportedValues(a.T, expected, actual, msgAndArgs...) { + if assertions.EqualExportedValues(a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -304,7 +309,7 @@ func (a *Assertions) EqualExportedValuesf(expected any, actual any, msg string, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.EqualExportedValues(a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.EqualExportedValues(a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -318,7 +323,7 @@ func (a *Assertions) EqualValues(expected any, actual any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.EqualValues(a.T, expected, actual, msgAndArgs...) { + if assertions.EqualValues(a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -332,7 +337,7 @@ func (a *Assertions) EqualValuesf(expected any, actual any, msg string, args ... if h, ok := a.T.(H); ok { h.Helper() } - if assertions.EqualValues(a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.EqualValues(a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -346,7 +351,7 @@ func (a *Assertions) Error(err error, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Error(a.T, err, msgAndArgs...) { + if assertions.Error(a.T, err, append(msgAndArgs, a.o)...) { return } @@ -360,7 +365,7 @@ func (a *Assertions) Errorf(err error, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Error(a.T, err, forwardArgs(msg, args)...) { + if assertions.Error(a.T, err, forwardArgs(msg, args, a.o)...) { return } @@ -374,7 +379,7 @@ func (a *Assertions) ErrorAs(err error, target any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.ErrorAs(a.T, err, target, msgAndArgs...) { + if assertions.ErrorAs(a.T, err, target, append(msgAndArgs, a.o)...) { return } @@ -388,7 +393,7 @@ func (a *Assertions) ErrorAsf(err error, target any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.ErrorAs(a.T, err, target, forwardArgs(msg, args)...) { + if assertions.ErrorAs(a.T, err, target, forwardArgs(msg, args, a.o)...) { return } @@ -402,7 +407,7 @@ func (a *Assertions) ErrorContains(err error, contains string, msgAndArgs ...any if h, ok := a.T.(H); ok { h.Helper() } - if assertions.ErrorContains(a.T, err, contains, msgAndArgs...) { + if assertions.ErrorContains(a.T, err, contains, append(msgAndArgs, a.o)...) { return } @@ -416,7 +421,7 @@ func (a *Assertions) ErrorContainsf(err error, contains string, msg string, args if h, ok := a.T.(H); ok { h.Helper() } - if assertions.ErrorContains(a.T, err, contains, forwardArgs(msg, args)...) { + if assertions.ErrorContains(a.T, err, contains, forwardArgs(msg, args, a.o)...) { return } @@ -430,7 +435,7 @@ func (a *Assertions) ErrorIs(err error, target error, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.ErrorIs(a.T, err, target, msgAndArgs...) { + if assertions.ErrorIs(a.T, err, target, append(msgAndArgs, a.o)...) { return } @@ -444,7 +449,7 @@ func (a *Assertions) ErrorIsf(err error, target error, msg string, args ...any) if h, ok := a.T.(H); ok { h.Helper() } - if assertions.ErrorIs(a.T, err, target, forwardArgs(msg, args)...) { + if assertions.ErrorIs(a.T, err, target, forwardArgs(msg, args, a.o)...) { return } @@ -458,7 +463,7 @@ func (a *Assertions) ErrorNotContains(err error, contains string, msgAndArgs ... if h, ok := a.T.(H); ok { h.Helper() } - if assertions.ErrorNotContains(a.T, err, contains, msgAndArgs...) { + if assertions.ErrorNotContains(a.T, err, contains, append(msgAndArgs, a.o)...) { return } @@ -472,7 +477,7 @@ func (a *Assertions) ErrorNotContainsf(err error, contains string, msg string, a if h, ok := a.T.(H); ok { h.Helper() } - if assertions.ErrorNotContains(a.T, err, contains, forwardArgs(msg, args)...) { + if assertions.ErrorNotContains(a.T, err, contains, forwardArgs(msg, args, a.o)...) { return } @@ -486,7 +491,7 @@ func (a *Assertions) Exactly(expected any, actual any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Exactly(a.T, expected, actual, msgAndArgs...) { + if assertions.Exactly(a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -500,7 +505,7 @@ func (a *Assertions) Exactlyf(expected any, actual any, msg string, args ...any) if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Exactly(a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.Exactly(a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -514,7 +519,7 @@ func (a *Assertions) Fail(failureMessage string, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - _ = assertions.Fail(a.T, failureMessage, msgAndArgs...) + _ = assertions.Fail(a.T, failureMessage, append(msgAndArgs, a.o)...) a.T.FailNow() } @@ -526,7 +531,7 @@ func (a *Assertions) Failf(failureMessage string, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - _ = assertions.Fail(a.T, failureMessage, forwardArgs(msg, args)...) + _ = assertions.Fail(a.T, failureMessage, forwardArgs(msg, args, a.o)...) a.T.FailNow() } @@ -538,7 +543,7 @@ func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - _ = assertions.FailNow(a.T, failureMessage, msgAndArgs...) + _ = assertions.FailNow(a.T, failureMessage, append(msgAndArgs, a.o)...) a.T.FailNow() } @@ -550,7 +555,7 @@ func (a *Assertions) FailNowf(failureMessage string, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - _ = assertions.FailNow(a.T, failureMessage, forwardArgs(msg, args)...) + _ = assertions.FailNow(a.T, failureMessage, forwardArgs(msg, args, a.o)...) a.T.FailNow() } @@ -562,7 +567,7 @@ func (a *Assertions) False(value bool, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.False(a.T, value, msgAndArgs...) { + if assertions.False(a.T, value, append(msgAndArgs, a.o)...) { return } @@ -576,7 +581,7 @@ func (a *Assertions) Falsef(value bool, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.False(a.T, value, forwardArgs(msg, args)...) { + if assertions.False(a.T, value, forwardArgs(msg, args, a.o)...) { return } @@ -590,7 +595,7 @@ func (a *Assertions) FileEmpty(path string, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.FileEmpty(a.T, path, msgAndArgs...) { + if assertions.FileEmpty(a.T, path, append(msgAndArgs, a.o)...) { return } @@ -604,7 +609,7 @@ func (a *Assertions) FileEmptyf(path string, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.FileEmpty(a.T, path, forwardArgs(msg, args)...) { + if assertions.FileEmpty(a.T, path, forwardArgs(msg, args, a.o)...) { return } @@ -618,7 +623,7 @@ func (a *Assertions) FileExists(path string, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.FileExists(a.T, path, msgAndArgs...) { + if assertions.FileExists(a.T, path, append(msgAndArgs, a.o)...) { return } @@ -632,7 +637,7 @@ func (a *Assertions) FileExistsf(path string, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.FileExists(a.T, path, forwardArgs(msg, args)...) { + if assertions.FileExists(a.T, path, forwardArgs(msg, args, a.o)...) { return } @@ -646,7 +651,7 @@ func (a *Assertions) FileNotEmpty(path string, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.FileNotEmpty(a.T, path, msgAndArgs...) { + if assertions.FileNotEmpty(a.T, path, append(msgAndArgs, a.o)...) { return } @@ -660,7 +665,7 @@ func (a *Assertions) FileNotEmptyf(path string, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.FileNotEmpty(a.T, path, forwardArgs(msg, args)...) { + if assertions.FileNotEmpty(a.T, path, forwardArgs(msg, args, a.o)...) { return } @@ -674,7 +679,7 @@ func (a *Assertions) FileNotExists(path string, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.FileNotExists(a.T, path, msgAndArgs...) { + if assertions.FileNotExists(a.T, path, append(msgAndArgs, a.o)...) { return } @@ -688,7 +693,7 @@ func (a *Assertions) FileNotExistsf(path string, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.FileNotExists(a.T, path, forwardArgs(msg, args)...) { + if assertions.FileNotExists(a.T, path, forwardArgs(msg, args, a.o)...) { return } @@ -702,7 +707,7 @@ func (a *Assertions) Greater(e1 any, e2 any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Greater(a.T, e1, e2, msgAndArgs...) { + if assertions.Greater(a.T, e1, e2, append(msgAndArgs, a.o)...) { return } @@ -716,7 +721,7 @@ func (a *Assertions) Greaterf(e1 any, e2 any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Greater(a.T, e1, e2, forwardArgs(msg, args)...) { + if assertions.Greater(a.T, e1, e2, forwardArgs(msg, args, a.o)...) { return } @@ -730,7 +735,7 @@ func (a *Assertions) GreaterOrEqual(e1 any, e2 any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.GreaterOrEqual(a.T, e1, e2, msgAndArgs...) { + if assertions.GreaterOrEqual(a.T, e1, e2, append(msgAndArgs, a.o)...) { return } @@ -744,7 +749,7 @@ func (a *Assertions) GreaterOrEqualf(e1 any, e2 any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.GreaterOrEqual(a.T, e1, e2, forwardArgs(msg, args)...) { + if assertions.GreaterOrEqual(a.T, e1, e2, forwardArgs(msg, args, a.o)...) { return } @@ -758,7 +763,7 @@ func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, u if h, ok := a.T.(H); ok { h.Helper() } - if assertions.HTTPBodyContains(a.T, handler, method, url, values, str, msgAndArgs...) { + if assertions.HTTPBodyContains(a.T, handler, method, url, values, str, append(msgAndArgs, a.o)...) { return } @@ -772,7 +777,7 @@ func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.HTTPBodyContains(a.T, handler, method, url, values, str, forwardArgs(msg, args)...) { + if assertions.HTTPBodyContains(a.T, handler, method, url, values, str, forwardArgs(msg, args, a.o)...) { return } @@ -786,7 +791,7 @@ func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string if h, ok := a.T.(H); ok { h.Helper() } - if assertions.HTTPBodyNotContains(a.T, handler, method, url, values, str, msgAndArgs...) { + if assertions.HTTPBodyNotContains(a.T, handler, method, url, values, str, append(msgAndArgs, a.o)...) { return } @@ -800,7 +805,7 @@ func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method strin if h, ok := a.T.(H); ok { h.Helper() } - if assertions.HTTPBodyNotContains(a.T, handler, method, url, values, str, forwardArgs(msg, args)...) { + if assertions.HTTPBodyNotContains(a.T, handler, method, url, values, str, forwardArgs(msg, args, a.o)...) { return } @@ -814,7 +819,7 @@ func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url stri if h, ok := a.T.(H); ok { h.Helper() } - if assertions.HTTPError(a.T, handler, method, url, values, msgAndArgs...) { + if assertions.HTTPError(a.T, handler, method, url, values, append(msgAndArgs, a.o)...) { return } @@ -828,7 +833,7 @@ func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url str if h, ok := a.T.(H); ok { h.Helper() } - if assertions.HTTPError(a.T, handler, method, url, values, forwardArgs(msg, args)...) { + if assertions.HTTPError(a.T, handler, method, url, values, forwardArgs(msg, args, a.o)...) { return } @@ -842,7 +847,7 @@ func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url s if h, ok := a.T.(H); ok { h.Helper() } - if assertions.HTTPRedirect(a.T, handler, method, url, values, msgAndArgs...) { + if assertions.HTTPRedirect(a.T, handler, method, url, values, append(msgAndArgs, a.o)...) { return } @@ -856,7 +861,7 @@ func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url if h, ok := a.T.(H); ok { h.Helper() } - if assertions.HTTPRedirect(a.T, handler, method, url, values, forwardArgs(msg, args)...) { + if assertions.HTTPRedirect(a.T, handler, method, url, values, forwardArgs(msg, args, a.o)...) { return } @@ -870,7 +875,7 @@ func (a *Assertions) HTTPStatusCode(handler http.HandlerFunc, method string, url if h, ok := a.T.(H); ok { h.Helper() } - if assertions.HTTPStatusCode(a.T, handler, method, url, values, statuscode, msgAndArgs...) { + if assertions.HTTPStatusCode(a.T, handler, method, url, values, statuscode, append(msgAndArgs, a.o)...) { return } @@ -884,7 +889,7 @@ func (a *Assertions) HTTPStatusCodef(handler http.HandlerFunc, method string, ur if h, ok := a.T.(H); ok { h.Helper() } - if assertions.HTTPStatusCode(a.T, handler, method, url, values, statuscode, forwardArgs(msg, args)...) { + if assertions.HTTPStatusCode(a.T, handler, method, url, values, statuscode, forwardArgs(msg, args, a.o)...) { return } @@ -898,7 +903,7 @@ func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url st if h, ok := a.T.(H); ok { h.Helper() } - if assertions.HTTPSuccess(a.T, handler, method, url, values, msgAndArgs...) { + if assertions.HTTPSuccess(a.T, handler, method, url, values, append(msgAndArgs, a.o)...) { return } @@ -912,7 +917,7 @@ func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url s if h, ok := a.T.(H); ok { h.Helper() } - if assertions.HTTPSuccess(a.T, handler, method, url, values, forwardArgs(msg, args)...) { + if assertions.HTTPSuccess(a.T, handler, method, url, values, forwardArgs(msg, args, a.o)...) { return } @@ -926,7 +931,7 @@ func (a *Assertions) Implements(interfaceObject any, object any, msgAndArgs ...a if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Implements(a.T, interfaceObject, object, msgAndArgs...) { + if assertions.Implements(a.T, interfaceObject, object, append(msgAndArgs, a.o)...) { return } @@ -940,7 +945,7 @@ func (a *Assertions) Implementsf(interfaceObject any, object any, msg string, ar if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Implements(a.T, interfaceObject, object, forwardArgs(msg, args)...) { + if assertions.Implements(a.T, interfaceObject, object, forwardArgs(msg, args, a.o)...) { return } @@ -954,7 +959,7 @@ func (a *Assertions) InDelta(expected any, actual any, delta float64, msgAndArgs if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InDelta(a.T, expected, actual, delta, msgAndArgs...) { + if assertions.InDelta(a.T, expected, actual, delta, append(msgAndArgs, a.o)...) { return } @@ -968,7 +973,7 @@ func (a *Assertions) InDeltaf(expected any, actual any, delta float64, msg strin if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InDelta(a.T, expected, actual, delta, forwardArgs(msg, args)...) { + if assertions.InDelta(a.T, expected, actual, delta, forwardArgs(msg, args, a.o)...) { return } @@ -982,7 +987,7 @@ func (a *Assertions) InDeltaMapValues(expected any, actual any, delta float64, m if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InDeltaMapValues(a.T, expected, actual, delta, msgAndArgs...) { + if assertions.InDeltaMapValues(a.T, expected, actual, delta, append(msgAndArgs, a.o)...) { return } @@ -996,7 +1001,7 @@ func (a *Assertions) InDeltaMapValuesf(expected any, actual any, delta float64, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InDeltaMapValues(a.T, expected, actual, delta, forwardArgs(msg, args)...) { + if assertions.InDeltaMapValues(a.T, expected, actual, delta, forwardArgs(msg, args, a.o)...) { return } @@ -1010,7 +1015,7 @@ func (a *Assertions) InDeltaSlice(expected any, actual any, delta float64, msgAn if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InDeltaSlice(a.T, expected, actual, delta, msgAndArgs...) { + if assertions.InDeltaSlice(a.T, expected, actual, delta, append(msgAndArgs, a.o)...) { return } @@ -1024,7 +1029,7 @@ func (a *Assertions) InDeltaSlicef(expected any, actual any, delta float64, msg if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InDeltaSlice(a.T, expected, actual, delta, forwardArgs(msg, args)...) { + if assertions.InDeltaSlice(a.T, expected, actual, delta, forwardArgs(msg, args, a.o)...) { return } @@ -1038,7 +1043,7 @@ func (a *Assertions) InEpsilon(expected any, actual any, epsilon float64, msgAnd if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InEpsilon(a.T, expected, actual, epsilon, msgAndArgs...) { + if assertions.InEpsilon(a.T, expected, actual, epsilon, append(msgAndArgs, a.o)...) { return } @@ -1052,7 +1057,7 @@ func (a *Assertions) InEpsilonf(expected any, actual any, epsilon float64, msg s if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InEpsilon(a.T, expected, actual, epsilon, forwardArgs(msg, args)...) { + if assertions.InEpsilon(a.T, expected, actual, epsilon, forwardArgs(msg, args, a.o)...) { return } @@ -1066,7 +1071,7 @@ func (a *Assertions) InEpsilonSlice(expected any, actual any, epsilon float64, m if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InEpsilonSlice(a.T, expected, actual, epsilon, msgAndArgs...) { + if assertions.InEpsilonSlice(a.T, expected, actual, epsilon, append(msgAndArgs, a.o)...) { return } @@ -1080,7 +1085,7 @@ func (a *Assertions) InEpsilonSlicef(expected any, actual any, epsilon float64, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InEpsilonSlice(a.T, expected, actual, epsilon, forwardArgs(msg, args)...) { + if assertions.InEpsilonSlice(a.T, expected, actual, epsilon, forwardArgs(msg, args, a.o)...) { return } @@ -1094,7 +1099,7 @@ func (a *Assertions) InEpsilonSymmetric(x any, y any, epsilon float64, msgAndArg if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InEpsilonSymmetric(a.T, x, y, epsilon, msgAndArgs...) { + if assertions.InEpsilonSymmetric(a.T, x, y, epsilon, append(msgAndArgs, a.o)...) { return } @@ -1108,7 +1113,7 @@ func (a *Assertions) InEpsilonSymmetricf(x any, y any, epsilon float64, msg stri if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InEpsilonSymmetric(a.T, x, y, epsilon, forwardArgs(msg, args)...) { + if assertions.InEpsilonSymmetric(a.T, x, y, epsilon, forwardArgs(msg, args, a.o)...) { return } @@ -1122,7 +1127,7 @@ func (a *Assertions) IsDecreasing(collection any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsDecreasing(a.T, collection, msgAndArgs...) { + if assertions.IsDecreasing(a.T, collection, append(msgAndArgs, a.o)...) { return } @@ -1136,7 +1141,7 @@ func (a *Assertions) IsDecreasingf(collection any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsDecreasing(a.T, collection, forwardArgs(msg, args)...) { + if assertions.IsDecreasing(a.T, collection, forwardArgs(msg, args, a.o)...) { return } @@ -1150,7 +1155,7 @@ func (a *Assertions) IsIncreasing(collection any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsIncreasing(a.T, collection, msgAndArgs...) { + if assertions.IsIncreasing(a.T, collection, append(msgAndArgs, a.o)...) { return } @@ -1164,7 +1169,7 @@ func (a *Assertions) IsIncreasingf(collection any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsIncreasing(a.T, collection, forwardArgs(msg, args)...) { + if assertions.IsIncreasing(a.T, collection, forwardArgs(msg, args, a.o)...) { return } @@ -1178,7 +1183,7 @@ func (a *Assertions) IsNonDecreasing(collection any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsNonDecreasing(a.T, collection, msgAndArgs...) { + if assertions.IsNonDecreasing(a.T, collection, append(msgAndArgs, a.o)...) { return } @@ -1192,7 +1197,7 @@ func (a *Assertions) IsNonDecreasingf(collection any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsNonDecreasing(a.T, collection, forwardArgs(msg, args)...) { + if assertions.IsNonDecreasing(a.T, collection, forwardArgs(msg, args, a.o)...) { return } @@ -1206,7 +1211,7 @@ func (a *Assertions) IsNonIncreasing(collection any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsNonIncreasing(a.T, collection, msgAndArgs...) { + if assertions.IsNonIncreasing(a.T, collection, append(msgAndArgs, a.o)...) { return } @@ -1220,7 +1225,7 @@ func (a *Assertions) IsNonIncreasingf(collection any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsNonIncreasing(a.T, collection, forwardArgs(msg, args)...) { + if assertions.IsNonIncreasing(a.T, collection, forwardArgs(msg, args, a.o)...) { return } @@ -1234,7 +1239,7 @@ func (a *Assertions) IsNotType(theType any, object any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsNotType(a.T, theType, object, msgAndArgs...) { + if assertions.IsNotType(a.T, theType, object, append(msgAndArgs, a.o)...) { return } @@ -1248,7 +1253,7 @@ func (a *Assertions) IsNotTypef(theType any, object any, msg string, args ...any if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsNotType(a.T, theType, object, forwardArgs(msg, args)...) { + if assertions.IsNotType(a.T, theType, object, forwardArgs(msg, args, a.o)...) { return } @@ -1262,7 +1267,7 @@ func (a *Assertions) IsType(expectedType any, object any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsType(a.T, expectedType, object, msgAndArgs...) { + if assertions.IsType(a.T, expectedType, object, append(msgAndArgs, a.o)...) { return } @@ -1276,7 +1281,7 @@ func (a *Assertions) IsTypef(expectedType any, object any, msg string, args ...a if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsType(a.T, expectedType, object, forwardArgs(msg, args)...) { + if assertions.IsType(a.T, expectedType, object, forwardArgs(msg, args, a.o)...) { return } @@ -1290,7 +1295,7 @@ func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.JSONEq(a.T, expected, actual, msgAndArgs...) { + if assertions.JSONEq(a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -1304,7 +1309,7 @@ func (a *Assertions) JSONEqf(expected string, actual string, msg string, args .. if h, ok := a.T.(H); ok { h.Helper() } - if assertions.JSONEq(a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.JSONEq(a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -1318,7 +1323,7 @@ func (a *Assertions) JSONEqBytes(expected []byte, actual []byte, msgAndArgs ...a if h, ok := a.T.(H); ok { h.Helper() } - if assertions.JSONEqBytes(a.T, expected, actual, msgAndArgs...) { + if assertions.JSONEqBytes(a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -1332,7 +1337,7 @@ func (a *Assertions) JSONEqBytesf(expected []byte, actual []byte, msg string, ar if h, ok := a.T.(H); ok { h.Helper() } - if assertions.JSONEqBytes(a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.JSONEqBytes(a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -1346,7 +1351,7 @@ func (a *Assertions) Kind(expectedKind reflect.Kind, object any, msgAndArgs ...a if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Kind(a.T, expectedKind, object, msgAndArgs...) { + if assertions.Kind(a.T, expectedKind, object, append(msgAndArgs, a.o)...) { return } @@ -1360,7 +1365,7 @@ func (a *Assertions) Kindf(expectedKind reflect.Kind, object any, msg string, ar if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Kind(a.T, expectedKind, object, forwardArgs(msg, args)...) { + if assertions.Kind(a.T, expectedKind, object, forwardArgs(msg, args, a.o)...) { return } @@ -1374,7 +1379,7 @@ func (a *Assertions) Len(object any, length int, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Len(a.T, object, length, msgAndArgs...) { + if assertions.Len(a.T, object, length, append(msgAndArgs, a.o)...) { return } @@ -1388,7 +1393,7 @@ func (a *Assertions) Lenf(object any, length int, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Len(a.T, object, length, forwardArgs(msg, args)...) { + if assertions.Len(a.T, object, length, forwardArgs(msg, args, a.o)...) { return } @@ -1402,7 +1407,7 @@ func (a *Assertions) Less(e1 any, e2 any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Less(a.T, e1, e2, msgAndArgs...) { + if assertions.Less(a.T, e1, e2, append(msgAndArgs, a.o)...) { return } @@ -1416,7 +1421,7 @@ func (a *Assertions) Lessf(e1 any, e2 any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Less(a.T, e1, e2, forwardArgs(msg, args)...) { + if assertions.Less(a.T, e1, e2, forwardArgs(msg, args, a.o)...) { return } @@ -1430,7 +1435,7 @@ func (a *Assertions) LessOrEqual(e1 any, e2 any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.LessOrEqual(a.T, e1, e2, msgAndArgs...) { + if assertions.LessOrEqual(a.T, e1, e2, append(msgAndArgs, a.o)...) { return } @@ -1444,7 +1449,7 @@ func (a *Assertions) LessOrEqualf(e1 any, e2 any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.LessOrEqual(a.T, e1, e2, forwardArgs(msg, args)...) { + if assertions.LessOrEqual(a.T, e1, e2, forwardArgs(msg, args, a.o)...) { return } @@ -1458,7 +1463,7 @@ func (a *Assertions) Negative(e any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Negative(a.T, e, msgAndArgs...) { + if assertions.Negative(a.T, e, append(msgAndArgs, a.o)...) { return } @@ -1472,7 +1477,7 @@ func (a *Assertions) Negativef(e any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Negative(a.T, e, forwardArgs(msg, args)...) { + if assertions.Negative(a.T, e, forwardArgs(msg, args, a.o)...) { return } @@ -1486,7 +1491,7 @@ func (a *Assertions) Nil(object any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Nil(a.T, object, msgAndArgs...) { + if assertions.Nil(a.T, object, append(msgAndArgs, a.o)...) { return } @@ -1500,7 +1505,7 @@ func (a *Assertions) Nilf(object any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Nil(a.T, object, forwardArgs(msg, args)...) { + if assertions.Nil(a.T, object, forwardArgs(msg, args, a.o)...) { return } @@ -1514,7 +1519,7 @@ func (a *Assertions) NoError(err error, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NoError(a.T, err, msgAndArgs...) { + if assertions.NoError(a.T, err, append(msgAndArgs, a.o)...) { return } @@ -1528,7 +1533,7 @@ func (a *Assertions) NoErrorf(err error, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NoError(a.T, err, forwardArgs(msg, args)...) { + if assertions.NoError(a.T, err, forwardArgs(msg, args, a.o)...) { return } @@ -1542,7 +1547,7 @@ func (a *Assertions) NoFileDescriptorLeak(tested func(), msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NoFileDescriptorLeak(a.T, tested, msgAndArgs...) { + if assertions.NoFileDescriptorLeak(a.T, tested, append(msgAndArgs, a.o)...) { return } @@ -1556,7 +1561,7 @@ func (a *Assertions) NoFileDescriptorLeakf(tested func(), msg string, args ...an if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NoFileDescriptorLeak(a.T, tested, forwardArgs(msg, args)...) { + if assertions.NoFileDescriptorLeak(a.T, tested, forwardArgs(msg, args, a.o)...) { return } @@ -1570,7 +1575,7 @@ func (a *Assertions) NoGoRoutineLeak(tested func(), msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NoGoRoutineLeak(a.T, tested, msgAndArgs...) { + if assertions.NoGoRoutineLeak(a.T, tested, append(msgAndArgs, a.o)...) { return } @@ -1584,7 +1589,7 @@ func (a *Assertions) NoGoRoutineLeakf(tested func(), msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NoGoRoutineLeak(a.T, tested, forwardArgs(msg, args)...) { + if assertions.NoGoRoutineLeak(a.T, tested, forwardArgs(msg, args, a.o)...) { return } @@ -1598,7 +1603,7 @@ func (a *Assertions) NotBlocked(ch any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotBlocked(a.T, ch, msgAndArgs...) { + if assertions.NotBlocked(a.T, ch, append(msgAndArgs, a.o)...) { return } @@ -1612,7 +1617,7 @@ func (a *Assertions) NotBlockedf(ch any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotBlocked(a.T, ch, forwardArgs(msg, args)...) { + if assertions.NotBlocked(a.T, ch, forwardArgs(msg, args, a.o)...) { return } @@ -1626,7 +1631,7 @@ func (a *Assertions) NotContains(s any, contains any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotContains(a.T, s, contains, msgAndArgs...) { + if assertions.NotContains(a.T, s, contains, append(msgAndArgs, a.o)...) { return } @@ -1640,7 +1645,7 @@ func (a *Assertions) NotContainsf(s any, contains any, msg string, args ...any) if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotContains(a.T, s, contains, forwardArgs(msg, args)...) { + if assertions.NotContains(a.T, s, contains, forwardArgs(msg, args, a.o)...) { return } @@ -1654,7 +1659,7 @@ func (a *Assertions) NotElementsMatch(listA any, listB any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotElementsMatch(a.T, listA, listB, msgAndArgs...) { + if assertions.NotElementsMatch(a.T, listA, listB, append(msgAndArgs, a.o)...) { return } @@ -1668,7 +1673,7 @@ func (a *Assertions) NotElementsMatchf(listA any, listB any, msg string, args .. if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotElementsMatch(a.T, listA, listB, forwardArgs(msg, args)...) { + if assertions.NotElementsMatch(a.T, listA, listB, forwardArgs(msg, args, a.o)...) { return } @@ -1682,7 +1687,7 @@ func (a *Assertions) NotEmpty(object any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotEmpty(a.T, object, msgAndArgs...) { + if assertions.NotEmpty(a.T, object, append(msgAndArgs, a.o)...) { return } @@ -1696,7 +1701,7 @@ func (a *Assertions) NotEmptyf(object any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotEmpty(a.T, object, forwardArgs(msg, args)...) { + if assertions.NotEmpty(a.T, object, forwardArgs(msg, args, a.o)...) { return } @@ -1710,7 +1715,7 @@ func (a *Assertions) NotEqual(expected any, actual any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotEqual(a.T, expected, actual, msgAndArgs...) { + if assertions.NotEqual(a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -1724,7 +1729,7 @@ func (a *Assertions) NotEqualf(expected any, actual any, msg string, args ...any if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotEqual(a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.NotEqual(a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -1738,7 +1743,7 @@ func (a *Assertions) NotEqualValues(expected any, actual any, msgAndArgs ...any) if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotEqualValues(a.T, expected, actual, msgAndArgs...) { + if assertions.NotEqualValues(a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -1752,7 +1757,7 @@ func (a *Assertions) NotEqualValuesf(expected any, actual any, msg string, args if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotEqualValues(a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.NotEqualValues(a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -1766,7 +1771,7 @@ func (a *Assertions) NotErrorAs(err error, target any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotErrorAs(a.T, err, target, msgAndArgs...) { + if assertions.NotErrorAs(a.T, err, target, append(msgAndArgs, a.o)...) { return } @@ -1780,7 +1785,7 @@ func (a *Assertions) NotErrorAsf(err error, target any, msg string, args ...any) if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotErrorAs(a.T, err, target, forwardArgs(msg, args)...) { + if assertions.NotErrorAs(a.T, err, target, forwardArgs(msg, args, a.o)...) { return } @@ -1794,7 +1799,7 @@ func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotErrorIs(a.T, err, target, msgAndArgs...) { + if assertions.NotErrorIs(a.T, err, target, append(msgAndArgs, a.o)...) { return } @@ -1808,7 +1813,7 @@ func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...an if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotErrorIs(a.T, err, target, forwardArgs(msg, args)...) { + if assertions.NotErrorIs(a.T, err, target, forwardArgs(msg, args, a.o)...) { return } @@ -1822,7 +1827,7 @@ func (a *Assertions) NotImplements(interfaceObject any, object any, msgAndArgs . if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotImplements(a.T, interfaceObject, object, msgAndArgs...) { + if assertions.NotImplements(a.T, interfaceObject, object, append(msgAndArgs, a.o)...) { return } @@ -1836,7 +1841,7 @@ func (a *Assertions) NotImplementsf(interfaceObject any, object any, msg string, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotImplements(a.T, interfaceObject, object, forwardArgs(msg, args)...) { + if assertions.NotImplements(a.T, interfaceObject, object, forwardArgs(msg, args, a.o)...) { return } @@ -1850,7 +1855,7 @@ func (a *Assertions) NotKind(expectedKind reflect.Kind, object any, msgAndArgs . if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotKind(a.T, expectedKind, object, msgAndArgs...) { + if assertions.NotKind(a.T, expectedKind, object, append(msgAndArgs, a.o)...) { return } @@ -1864,7 +1869,7 @@ func (a *Assertions) NotKindf(expectedKind reflect.Kind, object any, msg string, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotKind(a.T, expectedKind, object, forwardArgs(msg, args)...) { + if assertions.NotKind(a.T, expectedKind, object, forwardArgs(msg, args, a.o)...) { return } @@ -1878,7 +1883,7 @@ func (a *Assertions) NotNil(object any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotNil(a.T, object, msgAndArgs...) { + if assertions.NotNil(a.T, object, append(msgAndArgs, a.o)...) { return } @@ -1892,7 +1897,7 @@ func (a *Assertions) NotNilf(object any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotNil(a.T, object, forwardArgs(msg, args)...) { + if assertions.NotNil(a.T, object, forwardArgs(msg, args, a.o)...) { return } @@ -1906,7 +1911,7 @@ func (a *Assertions) NotPanics(f func(), msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotPanics(a.T, f, msgAndArgs...) { + if assertions.NotPanics(a.T, f, append(msgAndArgs, a.o)...) { return } @@ -1920,7 +1925,7 @@ func (a *Assertions) NotPanicsf(f func(), msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotPanics(a.T, f, forwardArgs(msg, args)...) { + if assertions.NotPanics(a.T, f, forwardArgs(msg, args, a.o)...) { return } @@ -1934,7 +1939,7 @@ func (a *Assertions) NotRegexp(rx any, actual any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotRegexp(a.T, rx, actual, msgAndArgs...) { + if assertions.NotRegexp(a.T, rx, actual, append(msgAndArgs, a.o)...) { return } @@ -1948,7 +1953,7 @@ func (a *Assertions) NotRegexpf(rx any, actual any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotRegexp(a.T, rx, actual, forwardArgs(msg, args)...) { + if assertions.NotRegexp(a.T, rx, actual, forwardArgs(msg, args, a.o)...) { return } @@ -1962,7 +1967,7 @@ func (a *Assertions) NotSame(expected any, actual any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotSame(a.T, expected, actual, msgAndArgs...) { + if assertions.NotSame(a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -1976,7 +1981,7 @@ func (a *Assertions) NotSamef(expected any, actual any, msg string, args ...any) if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotSame(a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.NotSame(a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -1990,7 +1995,7 @@ func (a *Assertions) NotSubset(list any, subset any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotSubset(a.T, list, subset, msgAndArgs...) { + if assertions.NotSubset(a.T, list, subset, append(msgAndArgs, a.o)...) { return } @@ -2004,7 +2009,7 @@ func (a *Assertions) NotSubsetf(list any, subset any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotSubset(a.T, list, subset, forwardArgs(msg, args)...) { + if assertions.NotSubset(a.T, list, subset, forwardArgs(msg, args, a.o)...) { return } @@ -2018,7 +2023,7 @@ func (a *Assertions) NotZero(i any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotZero(a.T, i, msgAndArgs...) { + if assertions.NotZero(a.T, i, append(msgAndArgs, a.o)...) { return } @@ -2032,7 +2037,7 @@ func (a *Assertions) NotZerof(i any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotZero(a.T, i, forwardArgs(msg, args)...) { + if assertions.NotZero(a.T, i, forwardArgs(msg, args, a.o)...) { return } @@ -2046,7 +2051,7 @@ func (a *Assertions) Panics(f func(), msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Panics(a.T, f, msgAndArgs...) { + if assertions.Panics(a.T, f, append(msgAndArgs, a.o)...) { return } @@ -2060,7 +2065,7 @@ func (a *Assertions) Panicsf(f func(), msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Panics(a.T, f, forwardArgs(msg, args)...) { + if assertions.Panics(a.T, f, forwardArgs(msg, args, a.o)...) { return } @@ -2074,7 +2079,7 @@ func (a *Assertions) PanicsWithError(errString string, f func(), msgAndArgs ...a if h, ok := a.T.(H); ok { h.Helper() } - if assertions.PanicsWithError(a.T, errString, f, msgAndArgs...) { + if assertions.PanicsWithError(a.T, errString, f, append(msgAndArgs, a.o)...) { return } @@ -2088,7 +2093,7 @@ func (a *Assertions) PanicsWithErrorf(errString string, f func(), msg string, ar if h, ok := a.T.(H); ok { h.Helper() } - if assertions.PanicsWithError(a.T, errString, f, forwardArgs(msg, args)...) { + if assertions.PanicsWithError(a.T, errString, f, forwardArgs(msg, args, a.o)...) { return } @@ -2102,7 +2107,7 @@ func (a *Assertions) PanicsWithValue(expected any, f func(), msgAndArgs ...any) if h, ok := a.T.(H); ok { h.Helper() } - if assertions.PanicsWithValue(a.T, expected, f, msgAndArgs...) { + if assertions.PanicsWithValue(a.T, expected, f, append(msgAndArgs, a.o)...) { return } @@ -2116,7 +2121,7 @@ func (a *Assertions) PanicsWithValuef(expected any, f func(), msg string, args . if h, ok := a.T.(H); ok { h.Helper() } - if assertions.PanicsWithValue(a.T, expected, f, forwardArgs(msg, args)...) { + if assertions.PanicsWithValue(a.T, expected, f, forwardArgs(msg, args, a.o)...) { return } @@ -2130,7 +2135,7 @@ func (a *Assertions) Positive(e any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Positive(a.T, e, msgAndArgs...) { + if assertions.Positive(a.T, e, append(msgAndArgs, a.o)...) { return } @@ -2144,7 +2149,7 @@ func (a *Assertions) Positivef(e any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Positive(a.T, e, forwardArgs(msg, args)...) { + if assertions.Positive(a.T, e, forwardArgs(msg, args, a.o)...) { return } @@ -2158,7 +2163,7 @@ func (a *Assertions) Regexp(rx any, actual any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Regexp(a.T, rx, actual, msgAndArgs...) { + if assertions.Regexp(a.T, rx, actual, append(msgAndArgs, a.o)...) { return } @@ -2172,7 +2177,7 @@ func (a *Assertions) Regexpf(rx any, actual any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Regexp(a.T, rx, actual, forwardArgs(msg, args)...) { + if assertions.Regexp(a.T, rx, actual, forwardArgs(msg, args, a.o)...) { return } @@ -2186,7 +2191,7 @@ func (a *Assertions) Same(expected any, actual any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Same(a.T, expected, actual, msgAndArgs...) { + if assertions.Same(a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -2200,7 +2205,7 @@ func (a *Assertions) Samef(expected any, actual any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Same(a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.Same(a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -2214,7 +2219,7 @@ func (a *Assertions) Subset(list any, subset any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Subset(a.T, list, subset, msgAndArgs...) { + if assertions.Subset(a.T, list, subset, append(msgAndArgs, a.o)...) { return } @@ -2228,7 +2233,7 @@ func (a *Assertions) Subsetf(list any, subset any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Subset(a.T, list, subset, forwardArgs(msg, args)...) { + if assertions.Subset(a.T, list, subset, forwardArgs(msg, args, a.o)...) { return } @@ -2242,7 +2247,7 @@ func (a *Assertions) True(value bool, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.True(a.T, value, msgAndArgs...) { + if assertions.True(a.T, value, append(msgAndArgs, a.o)...) { return } @@ -2256,7 +2261,7 @@ func (a *Assertions) Truef(value bool, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.True(a.T, value, forwardArgs(msg, args)...) { + if assertions.True(a.T, value, forwardArgs(msg, args, a.o)...) { return } @@ -2270,7 +2275,7 @@ func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta if h, ok := a.T.(H); ok { h.Helper() } - if assertions.WithinDuration(a.T, expected, actual, delta, msgAndArgs...) { + if assertions.WithinDuration(a.T, expected, actual, delta, append(msgAndArgs, a.o)...) { return } @@ -2284,7 +2289,7 @@ func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta if h, ok := a.T.(H); ok { h.Helper() } - if assertions.WithinDuration(a.T, expected, actual, delta, forwardArgs(msg, args)...) { + if assertions.WithinDuration(a.T, expected, actual, delta, forwardArgs(msg, args, a.o)...) { return } @@ -2298,7 +2303,7 @@ func (a *Assertions) WithinRange(actual time.Time, start time.Time, end time.Tim if h, ok := a.T.(H); ok { h.Helper() } - if assertions.WithinRange(a.T, actual, start, end, msgAndArgs...) { + if assertions.WithinRange(a.T, actual, start, end, append(msgAndArgs, a.o)...) { return } @@ -2312,7 +2317,7 @@ func (a *Assertions) WithinRangef(actual time.Time, start time.Time, end time.Ti if h, ok := a.T.(H); ok { h.Helper() } - if assertions.WithinRange(a.T, actual, start, end, forwardArgs(msg, args)...) { + if assertions.WithinRange(a.T, actual, start, end, forwardArgs(msg, args, a.o)...) { return } @@ -2326,7 +2331,7 @@ func (a *Assertions) YAMLEq(expected string, actual string, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.YAMLEq(a.T, expected, actual, msgAndArgs...) { + if assertions.YAMLEq(a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -2340,7 +2345,7 @@ func (a *Assertions) YAMLEqf(expected string, actual string, msg string, args .. if h, ok := a.T.(H); ok { h.Helper() } - if assertions.YAMLEq(a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.YAMLEq(a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -2354,7 +2359,7 @@ func (a *Assertions) YAMLEqBytes(expected []byte, actual []byte, msgAndArgs ...a if h, ok := a.T.(H); ok { h.Helper() } - if assertions.YAMLEqBytes(a.T, expected, actual, msgAndArgs...) { + if assertions.YAMLEqBytes(a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -2368,7 +2373,7 @@ func (a *Assertions) YAMLEqBytesf(expected []byte, actual []byte, msg string, ar if h, ok := a.T.(H); ok { h.Helper() } - if assertions.YAMLEqBytes(a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.YAMLEqBytes(a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -2382,7 +2387,7 @@ func (a *Assertions) Zero(i any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Zero(a.T, i, msgAndArgs...) { + if assertions.Zero(a.T, i, append(msgAndArgs, a.o)...) { return } @@ -2396,7 +2401,7 @@ func (a *Assertions) Zerof(i any, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Zero(a.T, i, forwardArgs(msg, args)...) { + if assertions.Zero(a.T, i, forwardArgs(msg, args, a.o)...) { return } diff --git a/require/require_forward_go127.go b/require/require_forward_go127.go index bd22556b5..eab1c1e06 100644 --- a/require/require_forward_go127.go +++ b/require/require_forward_go127.go @@ -21,7 +21,7 @@ func (a *Assertions) BlockedT[E any, CHAN ~chan E](ch CHAN, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.BlockedT[E, CHAN](a.T, ch, msgAndArgs...) { + if assertions.BlockedT[E, CHAN](a.T, ch, append(msgAndArgs, a.o)...) { return } @@ -35,7 +35,7 @@ func (a *Assertions) BlockedTf[E any, CHAN ~chan E](ch CHAN, msg string, args .. if h, ok := a.T.(H); ok { h.Helper() } - if assertions.BlockedT[E, CHAN](a.T, ch, forwardArgs(msg, args)...) { + if assertions.BlockedT[E, CHAN](a.T, ch, forwardArgs(msg, args, a.o)...) { return } @@ -49,7 +49,7 @@ func (a *Assertions) Consistently[C Conditioner](condition C, timeout time.Durat if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Consistently[C](a.T, condition, timeout, tick, msgAndArgs...) { + if assertions.Consistently[C](a.T, condition, timeout, tick, append(msgAndArgs, a.o)...) { return } @@ -63,7 +63,7 @@ func (a *Assertions) Consistentlyf[C Conditioner](condition C, timeout time.Dura if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Consistently[C](a.T, condition, timeout, tick, forwardArgs(msg, args)...) { + if assertions.Consistently[C](a.T, condition, timeout, tick, forwardArgs(msg, args, a.o)...) { return } @@ -77,7 +77,7 @@ func (a *Assertions) ElementsMatchT[E comparable](listA []E, listB []E, msgAndAr if h, ok := a.T.(H); ok { h.Helper() } - if assertions.ElementsMatchT[E](a.T, listA, listB, msgAndArgs...) { + if assertions.ElementsMatchT[E](a.T, listA, listB, append(msgAndArgs, a.o)...) { return } @@ -91,7 +91,7 @@ func (a *Assertions) ElementsMatchTf[E comparable](listA []E, listB []E, msg str if h, ok := a.T.(H); ok { h.Helper() } - if assertions.ElementsMatchT[E](a.T, listA, listB, forwardArgs(msg, args)...) { + if assertions.ElementsMatchT[E](a.T, listA, listB, forwardArgs(msg, args, a.o)...) { return } @@ -105,7 +105,7 @@ func (a *Assertions) EqualT[V comparable](expected V, actual V, msgAndArgs ...an if h, ok := a.T.(H); ok { h.Helper() } - if assertions.EqualT[V](a.T, expected, actual, msgAndArgs...) { + if assertions.EqualT[V](a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -119,7 +119,7 @@ func (a *Assertions) EqualTf[V comparable](expected V, actual V, msg string, arg if h, ok := a.T.(H); ok { h.Helper() } - if assertions.EqualT[V](a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.EqualT[V](a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -133,7 +133,7 @@ func (a *Assertions) ErrorAsType[E error](err error, target *E, msgAndArgs ...an if h, ok := a.T.(H); ok { h.Helper() } - if assertions.ErrorAsType[E](a.T, err, target, msgAndArgs...) { + if assertions.ErrorAsType[E](a.T, err, target, append(msgAndArgs, a.o)...) { return } @@ -147,7 +147,7 @@ func (a *Assertions) ErrorAsTypef[E error](err error, target *E, msg string, arg if h, ok := a.T.(H); ok { h.Helper() } - if assertions.ErrorAsType[E](a.T, err, target, forwardArgs(msg, args)...) { + if assertions.ErrorAsType[E](a.T, err, target, forwardArgs(msg, args, a.o)...) { return } @@ -161,7 +161,7 @@ func (a *Assertions) Eventually[C Conditioner](condition C, timeout time.Duratio if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Eventually[C](a.T, condition, timeout, tick, msgAndArgs...) { + if assertions.Eventually[C](a.T, condition, timeout, tick, append(msgAndArgs, a.o)...) { return } @@ -175,7 +175,7 @@ func (a *Assertions) Eventuallyf[C Conditioner](condition C, timeout time.Durati if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Eventually[C](a.T, condition, timeout, tick, forwardArgs(msg, args)...) { + if assertions.Eventually[C](a.T, condition, timeout, tick, forwardArgs(msg, args, a.o)...) { return } @@ -189,7 +189,7 @@ func (a *Assertions) EventuallyWith[C CollectibleConditioner](condition C, timeo if h, ok := a.T.(H); ok { h.Helper() } - if assertions.EventuallyWith[C](a.T, condition, timeout, tick, msgAndArgs...) { + if assertions.EventuallyWith[C](a.T, condition, timeout, tick, append(msgAndArgs, a.o)...) { return } @@ -203,7 +203,7 @@ func (a *Assertions) EventuallyWithf[C CollectibleConditioner](condition C, time if h, ok := a.T.(H); ok { h.Helper() } - if assertions.EventuallyWith[C](a.T, condition, timeout, tick, forwardArgs(msg, args)...) { + if assertions.EventuallyWith[C](a.T, condition, timeout, tick, forwardArgs(msg, args, a.o)...) { return } @@ -217,7 +217,7 @@ func (a *Assertions) FalseT[B Boolean](value B, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.FalseT[B](a.T, value, msgAndArgs...) { + if assertions.FalseT[B](a.T, value, append(msgAndArgs, a.o)...) { return } @@ -231,7 +231,7 @@ func (a *Assertions) FalseTf[B Boolean](value B, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.FalseT[B](a.T, value, forwardArgs(msg, args)...) { + if assertions.FalseT[B](a.T, value, forwardArgs(msg, args, a.o)...) { return } @@ -245,7 +245,7 @@ func (a *Assertions) GreaterOrEqualT[Orderable Ordered](e1 Orderable, e2 Orderab if h, ok := a.T.(H); ok { h.Helper() } - if assertions.GreaterOrEqualT[Orderable](a.T, e1, e2, msgAndArgs...) { + if assertions.GreaterOrEqualT[Orderable](a.T, e1, e2, append(msgAndArgs, a.o)...) { return } @@ -259,7 +259,7 @@ func (a *Assertions) GreaterOrEqualTf[Orderable Ordered](e1 Orderable, e2 Ordera if h, ok := a.T.(H); ok { h.Helper() } - if assertions.GreaterOrEqualT[Orderable](a.T, e1, e2, forwardArgs(msg, args)...) { + if assertions.GreaterOrEqualT[Orderable](a.T, e1, e2, forwardArgs(msg, args, a.o)...) { return } @@ -273,7 +273,7 @@ func (a *Assertions) GreaterT[Orderable Ordered](e1 Orderable, e2 Orderable, msg if h, ok := a.T.(H); ok { h.Helper() } - if assertions.GreaterT[Orderable](a.T, e1, e2, msgAndArgs...) { + if assertions.GreaterT[Orderable](a.T, e1, e2, append(msgAndArgs, a.o)...) { return } @@ -287,7 +287,7 @@ func (a *Assertions) GreaterTf[Orderable Ordered](e1 Orderable, e2 Orderable, ms if h, ok := a.T.(H); ok { h.Helper() } - if assertions.GreaterT[Orderable](a.T, e1, e2, forwardArgs(msg, args)...) { + if assertions.GreaterT[Orderable](a.T, e1, e2, forwardArgs(msg, args, a.o)...) { return } @@ -301,7 +301,7 @@ func (a *Assertions) InDeltaT[Number Measurable](expected Number, actual Number, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InDeltaT[Number](a.T, expected, actual, delta, msgAndArgs...) { + if assertions.InDeltaT[Number](a.T, expected, actual, delta, append(msgAndArgs, a.o)...) { return } @@ -315,7 +315,7 @@ func (a *Assertions) InDeltaTf[Number Measurable](expected Number, actual Number if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InDeltaT[Number](a.T, expected, actual, delta, forwardArgs(msg, args)...) { + if assertions.InDeltaT[Number](a.T, expected, actual, delta, forwardArgs(msg, args, a.o)...) { return } @@ -329,7 +329,7 @@ func (a *Assertions) InEpsilonSymmetricT[Number Measurable](x Number, y Number, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InEpsilonSymmetricT[Number](a.T, x, y, epsilon, msgAndArgs...) { + if assertions.InEpsilonSymmetricT[Number](a.T, x, y, epsilon, append(msgAndArgs, a.o)...) { return } @@ -343,7 +343,7 @@ func (a *Assertions) InEpsilonSymmetricTf[Number Measurable](x Number, y Number, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InEpsilonSymmetricT[Number](a.T, x, y, epsilon, forwardArgs(msg, args)...) { + if assertions.InEpsilonSymmetricT[Number](a.T, x, y, epsilon, forwardArgs(msg, args, a.o)...) { return } @@ -357,7 +357,7 @@ func (a *Assertions) InEpsilonT[Number Measurable](expected Number, actual Numbe if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InEpsilonT[Number](a.T, expected, actual, epsilon, msgAndArgs...) { + if assertions.InEpsilonT[Number](a.T, expected, actual, epsilon, append(msgAndArgs, a.o)...) { return } @@ -371,7 +371,7 @@ func (a *Assertions) InEpsilonTf[Number Measurable](expected Number, actual Numb if h, ok := a.T.(H); ok { h.Helper() } - if assertions.InEpsilonT[Number](a.T, expected, actual, epsilon, forwardArgs(msg, args)...) { + if assertions.InEpsilonT[Number](a.T, expected, actual, epsilon, forwardArgs(msg, args, a.o)...) { return } @@ -385,7 +385,7 @@ func (a *Assertions) IsDecreasingT[OrderedSlice ~[]E, E Ordered](collection Orde if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsDecreasingT[OrderedSlice, E](a.T, collection, msgAndArgs...) { + if assertions.IsDecreasingT[OrderedSlice, E](a.T, collection, append(msgAndArgs, a.o)...) { return } @@ -399,7 +399,7 @@ func (a *Assertions) IsDecreasingTf[OrderedSlice ~[]E, E Ordered](collection Ord if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsDecreasingT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args)...) { + if assertions.IsDecreasingT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args, a.o)...) { return } @@ -413,7 +413,7 @@ func (a *Assertions) IsIncreasingT[OrderedSlice ~[]E, E Ordered](collection Orde if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsIncreasingT[OrderedSlice, E](a.T, collection, msgAndArgs...) { + if assertions.IsIncreasingT[OrderedSlice, E](a.T, collection, append(msgAndArgs, a.o)...) { return } @@ -427,7 +427,7 @@ func (a *Assertions) IsIncreasingTf[OrderedSlice ~[]E, E Ordered](collection Ord if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsIncreasingT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args)...) { + if assertions.IsIncreasingT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args, a.o)...) { return } @@ -441,7 +441,7 @@ func (a *Assertions) IsNonDecreasingT[OrderedSlice ~[]E, E Ordered](collection O if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsNonDecreasingT[OrderedSlice, E](a.T, collection, msgAndArgs...) { + if assertions.IsNonDecreasingT[OrderedSlice, E](a.T, collection, append(msgAndArgs, a.o)...) { return } @@ -455,7 +455,7 @@ func (a *Assertions) IsNonDecreasingTf[OrderedSlice ~[]E, E Ordered](collection if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsNonDecreasingT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args)...) { + if assertions.IsNonDecreasingT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args, a.o)...) { return } @@ -469,7 +469,7 @@ func (a *Assertions) IsNonIncreasingT[OrderedSlice ~[]E, E Ordered](collection O if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsNonIncreasingT[OrderedSlice, E](a.T, collection, msgAndArgs...) { + if assertions.IsNonIncreasingT[OrderedSlice, E](a.T, collection, append(msgAndArgs, a.o)...) { return } @@ -483,7 +483,7 @@ func (a *Assertions) IsNonIncreasingTf[OrderedSlice ~[]E, E Ordered](collection if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsNonIncreasingT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args)...) { + if assertions.IsNonIncreasingT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args, a.o)...) { return } @@ -497,7 +497,7 @@ func (a *Assertions) IsNotOfTypeT[EType any](object any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsNotOfTypeT[EType](a.T, object, msgAndArgs...) { + if assertions.IsNotOfTypeT[EType](a.T, object, append(msgAndArgs, a.o)...) { return } @@ -511,7 +511,7 @@ func (a *Assertions) IsNotOfTypeTf[EType any](object any, msg string, args ...an if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsNotOfTypeT[EType](a.T, object, forwardArgs(msg, args)...) { + if assertions.IsNotOfTypeT[EType](a.T, object, forwardArgs(msg, args, a.o)...) { return } @@ -525,7 +525,7 @@ func (a *Assertions) IsOfTypeT[EType any](object any, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsOfTypeT[EType](a.T, object, msgAndArgs...) { + if assertions.IsOfTypeT[EType](a.T, object, append(msgAndArgs, a.o)...) { return } @@ -539,7 +539,7 @@ func (a *Assertions) IsOfTypeTf[EType any](object any, msg string, args ...any) if h, ok := a.T.(H); ok { h.Helper() } - if assertions.IsOfTypeT[EType](a.T, object, forwardArgs(msg, args)...) { + if assertions.IsOfTypeT[EType](a.T, object, forwardArgs(msg, args, a.o)...) { return } @@ -553,7 +553,7 @@ func (a *Assertions) JSONEqT[EDoc, ADoc RText](expected EDoc, actual ADoc, msgAn if h, ok := a.T.(H); ok { h.Helper() } - if assertions.JSONEqT[EDoc, ADoc](a.T, expected, actual, msgAndArgs...) { + if assertions.JSONEqT[EDoc, ADoc](a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -567,7 +567,7 @@ func (a *Assertions) JSONEqTf[EDoc, ADoc RText](expected EDoc, actual ADoc, msg if h, ok := a.T.(H); ok { h.Helper() } - if assertions.JSONEqT[EDoc, ADoc](a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.JSONEqT[EDoc, ADoc](a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -581,7 +581,7 @@ func (a *Assertions) JSONMarshalAsT[EDoc RText](expected EDoc, object any, msgAn if h, ok := a.T.(H); ok { h.Helper() } - if assertions.JSONMarshalAsT[EDoc](a.T, expected, object, msgAndArgs...) { + if assertions.JSONMarshalAsT[EDoc](a.T, expected, object, append(msgAndArgs, a.o)...) { return } @@ -595,7 +595,7 @@ func (a *Assertions) JSONMarshalAsTf[EDoc RText](expected EDoc, object any, msg if h, ok := a.T.(H); ok { h.Helper() } - if assertions.JSONMarshalAsT[EDoc](a.T, expected, object, forwardArgs(msg, args)...) { + if assertions.JSONMarshalAsT[EDoc](a.T, expected, object, forwardArgs(msg, args, a.o)...) { return } @@ -609,7 +609,7 @@ func (a *Assertions) JSONUnmarshalAsT[Object any, ADoc RText](expected Object, j if h, ok := a.T.(H); ok { h.Helper() } - if assertions.JSONUnmarshalAsT[Object, ADoc](a.T, expected, jazon, msgAndArgs...) { + if assertions.JSONUnmarshalAsT[Object, ADoc](a.T, expected, jazon, append(msgAndArgs, a.o)...) { return } @@ -623,7 +623,7 @@ func (a *Assertions) JSONUnmarshalAsTf[Object any, ADoc RText](expected Object, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.JSONUnmarshalAsT[Object, ADoc](a.T, expected, jazon, forwardArgs(msg, args)...) { + if assertions.JSONUnmarshalAsT[Object, ADoc](a.T, expected, jazon, forwardArgs(msg, args, a.o)...) { return } @@ -637,7 +637,7 @@ func (a *Assertions) LessOrEqualT[Orderable Ordered](e1 Orderable, e2 Orderable, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.LessOrEqualT[Orderable](a.T, e1, e2, msgAndArgs...) { + if assertions.LessOrEqualT[Orderable](a.T, e1, e2, append(msgAndArgs, a.o)...) { return } @@ -651,7 +651,7 @@ func (a *Assertions) LessOrEqualTf[Orderable Ordered](e1 Orderable, e2 Orderable if h, ok := a.T.(H); ok { h.Helper() } - if assertions.LessOrEqualT[Orderable](a.T, e1, e2, forwardArgs(msg, args)...) { + if assertions.LessOrEqualT[Orderable](a.T, e1, e2, forwardArgs(msg, args, a.o)...) { return } @@ -665,7 +665,7 @@ func (a *Assertions) LessT[Orderable Ordered](e1 Orderable, e2 Orderable, msgAnd if h, ok := a.T.(H); ok { h.Helper() } - if assertions.LessT[Orderable](a.T, e1, e2, msgAndArgs...) { + if assertions.LessT[Orderable](a.T, e1, e2, append(msgAndArgs, a.o)...) { return } @@ -679,7 +679,7 @@ func (a *Assertions) LessTf[Orderable Ordered](e1 Orderable, e2 Orderable, msg s if h, ok := a.T.(H); ok { h.Helper() } - if assertions.LessT[Orderable](a.T, e1, e2, forwardArgs(msg, args)...) { + if assertions.LessT[Orderable](a.T, e1, e2, forwardArgs(msg, args, a.o)...) { return } @@ -693,7 +693,7 @@ func (a *Assertions) MapContainsT[Map ~map[K]V, K comparable, V any](m Map, key if h, ok := a.T.(H); ok { h.Helper() } - if assertions.MapContainsT[Map, K, V](a.T, m, key, msgAndArgs...) { + if assertions.MapContainsT[Map, K, V](a.T, m, key, append(msgAndArgs, a.o)...) { return } @@ -707,7 +707,7 @@ func (a *Assertions) MapContainsTf[Map ~map[K]V, K comparable, V any](m Map, key if h, ok := a.T.(H); ok { h.Helper() } - if assertions.MapContainsT[Map, K, V](a.T, m, key, forwardArgs(msg, args)...) { + if assertions.MapContainsT[Map, K, V](a.T, m, key, forwardArgs(msg, args, a.o)...) { return } @@ -721,7 +721,7 @@ func (a *Assertions) MapEqualT[K, V comparable](listA map[K]V, listB map[K]V, ms if h, ok := a.T.(H); ok { h.Helper() } - if assertions.MapEqualT[K, V](a.T, listA, listB, msgAndArgs...) { + if assertions.MapEqualT[K, V](a.T, listA, listB, append(msgAndArgs, a.o)...) { return } @@ -735,7 +735,7 @@ func (a *Assertions) MapEqualTf[K, V comparable](listA map[K]V, listB map[K]V, m if h, ok := a.T.(H); ok { h.Helper() } - if assertions.MapEqualT[K, V](a.T, listA, listB, forwardArgs(msg, args)...) { + if assertions.MapEqualT[K, V](a.T, listA, listB, forwardArgs(msg, args, a.o)...) { return } @@ -749,7 +749,7 @@ func (a *Assertions) MapNotContainsT[Map ~map[K]V, K comparable, V any](m Map, k if h, ok := a.T.(H); ok { h.Helper() } - if assertions.MapNotContainsT[Map, K, V](a.T, m, key, msgAndArgs...) { + if assertions.MapNotContainsT[Map, K, V](a.T, m, key, append(msgAndArgs, a.o)...) { return } @@ -763,7 +763,7 @@ func (a *Assertions) MapNotContainsTf[Map ~map[K]V, K comparable, V any](m Map, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.MapNotContainsT[Map, K, V](a.T, m, key, forwardArgs(msg, args)...) { + if assertions.MapNotContainsT[Map, K, V](a.T, m, key, forwardArgs(msg, args, a.o)...) { return } @@ -777,7 +777,7 @@ func (a *Assertions) MapNotEqualT[K, V comparable](listA map[K]V, listB map[K]V, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.MapNotEqualT[K, V](a.T, listA, listB, msgAndArgs...) { + if assertions.MapNotEqualT[K, V](a.T, listA, listB, append(msgAndArgs, a.o)...) { return } @@ -791,7 +791,7 @@ func (a *Assertions) MapNotEqualTf[K, V comparable](listA map[K]V, listB map[K]V if h, ok := a.T.(H); ok { h.Helper() } - if assertions.MapNotEqualT[K, V](a.T, listA, listB, forwardArgs(msg, args)...) { + if assertions.MapNotEqualT[K, V](a.T, listA, listB, forwardArgs(msg, args, a.o)...) { return } @@ -805,7 +805,7 @@ func (a *Assertions) NegativeT[SignedNumber SignedNumeric](e SignedNumber, msgAn if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NegativeT[SignedNumber](a.T, e, msgAndArgs...) { + if assertions.NegativeT[SignedNumber](a.T, e, append(msgAndArgs, a.o)...) { return } @@ -819,7 +819,7 @@ func (a *Assertions) NegativeTf[SignedNumber SignedNumeric](e SignedNumber, msg if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NegativeT[SignedNumber](a.T, e, forwardArgs(msg, args)...) { + if assertions.NegativeT[SignedNumber](a.T, e, forwardArgs(msg, args, a.o)...) { return } @@ -833,7 +833,7 @@ func (a *Assertions) Never[C NeverConditioner](condition C, timeout time.Duratio if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Never[C](a.T, condition, timeout, tick, msgAndArgs...) { + if assertions.Never[C](a.T, condition, timeout, tick, append(msgAndArgs, a.o)...) { return } @@ -847,7 +847,7 @@ func (a *Assertions) Neverf[C NeverConditioner](condition C, timeout time.Durati if h, ok := a.T.(H); ok { h.Helper() } - if assertions.Never[C](a.T, condition, timeout, tick, forwardArgs(msg, args)...) { + if assertions.Never[C](a.T, condition, timeout, tick, forwardArgs(msg, args, a.o)...) { return } @@ -861,7 +861,7 @@ func (a *Assertions) NotBlockedT[E any, CHAN ~chan E](ch CHAN, msgAndArgs ...any if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotBlockedT[E, CHAN](a.T, ch, msgAndArgs...) { + if assertions.NotBlockedT[E, CHAN](a.T, ch, append(msgAndArgs, a.o)...) { return } @@ -875,7 +875,7 @@ func (a *Assertions) NotBlockedTf[E any, CHAN ~chan E](ch CHAN, msg string, args if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotBlockedT[E, CHAN](a.T, ch, forwardArgs(msg, args)...) { + if assertions.NotBlockedT[E, CHAN](a.T, ch, forwardArgs(msg, args, a.o)...) { return } @@ -889,7 +889,7 @@ func (a *Assertions) NotElementsMatchT[E comparable](listA []E, listB []E, msgAn if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotElementsMatchT[E](a.T, listA, listB, msgAndArgs...) { + if assertions.NotElementsMatchT[E](a.T, listA, listB, append(msgAndArgs, a.o)...) { return } @@ -903,7 +903,7 @@ func (a *Assertions) NotElementsMatchTf[E comparable](listA []E, listB []E, msg if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotElementsMatchT[E](a.T, listA, listB, forwardArgs(msg, args)...) { + if assertions.NotElementsMatchT[E](a.T, listA, listB, forwardArgs(msg, args, a.o)...) { return } @@ -917,7 +917,7 @@ func (a *Assertions) NotEqualT[V comparable](expected V, actual V, msgAndArgs .. if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotEqualT[V](a.T, expected, actual, msgAndArgs...) { + if assertions.NotEqualT[V](a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -931,7 +931,7 @@ func (a *Assertions) NotEqualTf[V comparable](expected V, actual V, msg string, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotEqualT[V](a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.NotEqualT[V](a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -945,7 +945,7 @@ func (a *Assertions) NotErrorAsType[E error](err error, target *E, msgAndArgs .. if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotErrorAsType[E](a.T, err, target, msgAndArgs...) { + if assertions.NotErrorAsType[E](a.T, err, target, append(msgAndArgs, a.o)...) { return } @@ -959,7 +959,7 @@ func (a *Assertions) NotErrorAsTypef[E error](err error, target *E, msg string, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotErrorAsType[E](a.T, err, target, forwardArgs(msg, args)...) { + if assertions.NotErrorAsType[E](a.T, err, target, forwardArgs(msg, args, a.o)...) { return } @@ -973,7 +973,7 @@ func (a *Assertions) NotRegexpT[Rex RegExp, ADoc Text](rx Rex, actual ADoc, msgA if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotRegexpT[Rex, ADoc](a.T, rx, actual, msgAndArgs...) { + if assertions.NotRegexpT[Rex, ADoc](a.T, rx, actual, append(msgAndArgs, a.o)...) { return } @@ -987,7 +987,7 @@ func (a *Assertions) NotRegexpTf[Rex RegExp, ADoc Text](rx Rex, actual ADoc, msg if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotRegexpT[Rex, ADoc](a.T, rx, actual, forwardArgs(msg, args)...) { + if assertions.NotRegexpT[Rex, ADoc](a.T, rx, actual, forwardArgs(msg, args, a.o)...) { return } @@ -1001,7 +1001,7 @@ func (a *Assertions) NotSameT[P any](expected *P, actual *P, msgAndArgs ...any) if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotSameT[P](a.T, expected, actual, msgAndArgs...) { + if assertions.NotSameT[P](a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -1015,7 +1015,7 @@ func (a *Assertions) NotSameTf[P any](expected *P, actual *P, msg string, args . if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotSameT[P](a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.NotSameT[P](a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -1029,7 +1029,7 @@ func (a *Assertions) NotSortedT[OrderedSlice ~[]E, E Ordered](collection Ordered if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotSortedT[OrderedSlice, E](a.T, collection, msgAndArgs...) { + if assertions.NotSortedT[OrderedSlice, E](a.T, collection, append(msgAndArgs, a.o)...) { return } @@ -1043,7 +1043,7 @@ func (a *Assertions) NotSortedTf[OrderedSlice ~[]E, E Ordered](collection Ordere if h, ok := a.T.(H); ok { h.Helper() } - if assertions.NotSortedT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args)...) { + if assertions.NotSortedT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args, a.o)...) { return } @@ -1057,7 +1057,7 @@ func (a *Assertions) PositiveT[SignedNumber SignedNumeric](e SignedNumber, msgAn if h, ok := a.T.(H); ok { h.Helper() } - if assertions.PositiveT[SignedNumber](a.T, e, msgAndArgs...) { + if assertions.PositiveT[SignedNumber](a.T, e, append(msgAndArgs, a.o)...) { return } @@ -1071,7 +1071,7 @@ func (a *Assertions) PositiveTf[SignedNumber SignedNumeric](e SignedNumber, msg if h, ok := a.T.(H); ok { h.Helper() } - if assertions.PositiveT[SignedNumber](a.T, e, forwardArgs(msg, args)...) { + if assertions.PositiveT[SignedNumber](a.T, e, forwardArgs(msg, args, a.o)...) { return } @@ -1085,7 +1085,7 @@ func (a *Assertions) RegexpT[Rex RegExp, ADoc Text](rx Rex, actual ADoc, msgAndA if h, ok := a.T.(H); ok { h.Helper() } - if assertions.RegexpT[Rex, ADoc](a.T, rx, actual, msgAndArgs...) { + if assertions.RegexpT[Rex, ADoc](a.T, rx, actual, append(msgAndArgs, a.o)...) { return } @@ -1099,7 +1099,7 @@ func (a *Assertions) RegexpTf[Rex RegExp, ADoc Text](rx Rex, actual ADoc, msg st if h, ok := a.T.(H); ok { h.Helper() } - if assertions.RegexpT[Rex, ADoc](a.T, rx, actual, forwardArgs(msg, args)...) { + if assertions.RegexpT[Rex, ADoc](a.T, rx, actual, forwardArgs(msg, args, a.o)...) { return } @@ -1113,7 +1113,7 @@ func (a *Assertions) SameT[P any](expected *P, actual *P, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SameT[P](a.T, expected, actual, msgAndArgs...) { + if assertions.SameT[P](a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -1127,7 +1127,7 @@ func (a *Assertions) SameTf[P any](expected *P, actual *P, msg string, args ...a if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SameT[P](a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.SameT[P](a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -1141,7 +1141,7 @@ func (a *Assertions) SeqContainsT[E comparable](iter iter.Seq[E], element E, msg if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SeqContainsT[E](a.T, iter, element, msgAndArgs...) { + if assertions.SeqContainsT[E](a.T, iter, element, append(msgAndArgs, a.o)...) { return } @@ -1155,7 +1155,7 @@ func (a *Assertions) SeqContainsTf[E comparable](iter iter.Seq[E], element E, ms if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SeqContainsT[E](a.T, iter, element, forwardArgs(msg, args)...) { + if assertions.SeqContainsT[E](a.T, iter, element, forwardArgs(msg, args, a.o)...) { return } @@ -1169,7 +1169,7 @@ func (a *Assertions) SeqNotContainsT[E comparable](iter iter.Seq[E], element E, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SeqNotContainsT[E](a.T, iter, element, msgAndArgs...) { + if assertions.SeqNotContainsT[E](a.T, iter, element, append(msgAndArgs, a.o)...) { return } @@ -1183,7 +1183,7 @@ func (a *Assertions) SeqNotContainsTf[E comparable](iter iter.Seq[E], element E, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SeqNotContainsT[E](a.T, iter, element, forwardArgs(msg, args)...) { + if assertions.SeqNotContainsT[E](a.T, iter, element, forwardArgs(msg, args, a.o)...) { return } @@ -1197,7 +1197,7 @@ func (a *Assertions) SliceContainsT[Slice ~[]E, E comparable](s Slice, element E if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SliceContainsT[Slice, E](a.T, s, element, msgAndArgs...) { + if assertions.SliceContainsT[Slice, E](a.T, s, element, append(msgAndArgs, a.o)...) { return } @@ -1211,7 +1211,7 @@ func (a *Assertions) SliceContainsTf[Slice ~[]E, E comparable](s Slice, element if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SliceContainsT[Slice, E](a.T, s, element, forwardArgs(msg, args)...) { + if assertions.SliceContainsT[Slice, E](a.T, s, element, forwardArgs(msg, args, a.o)...) { return } @@ -1225,7 +1225,7 @@ func (a *Assertions) SliceEqualT[E comparable](listA []E, listB []E, msgAndArgs if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SliceEqualT[E](a.T, listA, listB, msgAndArgs...) { + if assertions.SliceEqualT[E](a.T, listA, listB, append(msgAndArgs, a.o)...) { return } @@ -1239,7 +1239,7 @@ func (a *Assertions) SliceEqualTf[E comparable](listA []E, listB []E, msg string if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SliceEqualT[E](a.T, listA, listB, forwardArgs(msg, args)...) { + if assertions.SliceEqualT[E](a.T, listA, listB, forwardArgs(msg, args, a.o)...) { return } @@ -1253,7 +1253,7 @@ func (a *Assertions) SliceNotContainsT[Slice ~[]E, E comparable](s Slice, elemen if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SliceNotContainsT[Slice, E](a.T, s, element, msgAndArgs...) { + if assertions.SliceNotContainsT[Slice, E](a.T, s, element, append(msgAndArgs, a.o)...) { return } @@ -1267,7 +1267,7 @@ func (a *Assertions) SliceNotContainsTf[Slice ~[]E, E comparable](s Slice, eleme if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SliceNotContainsT[Slice, E](a.T, s, element, forwardArgs(msg, args)...) { + if assertions.SliceNotContainsT[Slice, E](a.T, s, element, forwardArgs(msg, args, a.o)...) { return } @@ -1281,7 +1281,7 @@ func (a *Assertions) SliceNotEqualT[E comparable](listA []E, listB []E, msgAndAr if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SliceNotEqualT[E](a.T, listA, listB, msgAndArgs...) { + if assertions.SliceNotEqualT[E](a.T, listA, listB, append(msgAndArgs, a.o)...) { return } @@ -1295,7 +1295,7 @@ func (a *Assertions) SliceNotEqualTf[E comparable](listA []E, listB []E, msg str if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SliceNotEqualT[E](a.T, listA, listB, forwardArgs(msg, args)...) { + if assertions.SliceNotEqualT[E](a.T, listA, listB, forwardArgs(msg, args, a.o)...) { return } @@ -1309,7 +1309,7 @@ func (a *Assertions) SliceNotSubsetT[Slice ~[]E, E comparable](list Slice, subse if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SliceNotSubsetT[Slice, E](a.T, list, subset, msgAndArgs...) { + if assertions.SliceNotSubsetT[Slice, E](a.T, list, subset, append(msgAndArgs, a.o)...) { return } @@ -1323,7 +1323,7 @@ func (a *Assertions) SliceNotSubsetTf[Slice ~[]E, E comparable](list Slice, subs if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SliceNotSubsetT[Slice, E](a.T, list, subset, forwardArgs(msg, args)...) { + if assertions.SliceNotSubsetT[Slice, E](a.T, list, subset, forwardArgs(msg, args, a.o)...) { return } @@ -1337,7 +1337,7 @@ func (a *Assertions) SliceSubsetT[Slice ~[]E, E comparable](list Slice, subset S if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SliceSubsetT[Slice, E](a.T, list, subset, msgAndArgs...) { + if assertions.SliceSubsetT[Slice, E](a.T, list, subset, append(msgAndArgs, a.o)...) { return } @@ -1351,7 +1351,7 @@ func (a *Assertions) SliceSubsetTf[Slice ~[]E, E comparable](list Slice, subset if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SliceSubsetT[Slice, E](a.T, list, subset, forwardArgs(msg, args)...) { + if assertions.SliceSubsetT[Slice, E](a.T, list, subset, forwardArgs(msg, args, a.o)...) { return } @@ -1365,7 +1365,7 @@ func (a *Assertions) SortedT[OrderedSlice ~[]E, E Ordered](collection OrderedSli if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SortedT[OrderedSlice, E](a.T, collection, msgAndArgs...) { + if assertions.SortedT[OrderedSlice, E](a.T, collection, append(msgAndArgs, a.o)...) { return } @@ -1379,7 +1379,7 @@ func (a *Assertions) SortedTf[OrderedSlice ~[]E, E Ordered](collection OrderedSl if h, ok := a.T.(H); ok { h.Helper() } - if assertions.SortedT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args)...) { + if assertions.SortedT[OrderedSlice, E](a.T, collection, forwardArgs(msg, args, a.o)...) { return } @@ -1393,7 +1393,7 @@ func (a *Assertions) StringContainsT[ADoc, EDoc Text](str ADoc, substring EDoc, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.StringContainsT[ADoc, EDoc](a.T, str, substring, msgAndArgs...) { + if assertions.StringContainsT[ADoc, EDoc](a.T, str, substring, append(msgAndArgs, a.o)...) { return } @@ -1407,7 +1407,7 @@ func (a *Assertions) StringContainsTf[ADoc, EDoc Text](str ADoc, substring EDoc, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.StringContainsT[ADoc, EDoc](a.T, str, substring, forwardArgs(msg, args)...) { + if assertions.StringContainsT[ADoc, EDoc](a.T, str, substring, forwardArgs(msg, args, a.o)...) { return } @@ -1421,7 +1421,7 @@ func (a *Assertions) StringNotContainsT[ADoc, EDoc Text](str ADoc, substring EDo if h, ok := a.T.(H); ok { h.Helper() } - if assertions.StringNotContainsT[ADoc, EDoc](a.T, str, substring, msgAndArgs...) { + if assertions.StringNotContainsT[ADoc, EDoc](a.T, str, substring, append(msgAndArgs, a.o)...) { return } @@ -1435,7 +1435,7 @@ func (a *Assertions) StringNotContainsTf[ADoc, EDoc Text](str ADoc, substring ED if h, ok := a.T.(H); ok { h.Helper() } - if assertions.StringNotContainsT[ADoc, EDoc](a.T, str, substring, forwardArgs(msg, args)...) { + if assertions.StringNotContainsT[ADoc, EDoc](a.T, str, substring, forwardArgs(msg, args, a.o)...) { return } @@ -1449,7 +1449,7 @@ func (a *Assertions) TrueT[B Boolean](value B, msgAndArgs ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.TrueT[B](a.T, value, msgAndArgs...) { + if assertions.TrueT[B](a.T, value, append(msgAndArgs, a.o)...) { return } @@ -1463,7 +1463,7 @@ func (a *Assertions) TrueTf[B Boolean](value B, msg string, args ...any) { if h, ok := a.T.(H); ok { h.Helper() } - if assertions.TrueT[B](a.T, value, forwardArgs(msg, args)...) { + if assertions.TrueT[B](a.T, value, forwardArgs(msg, args, a.o)...) { return } @@ -1477,7 +1477,7 @@ func (a *Assertions) YAMLEqT[EDoc, ADoc RText](expected EDoc, actual ADoc, msgAn if h, ok := a.T.(H); ok { h.Helper() } - if assertions.YAMLEqT[EDoc, ADoc](a.T, expected, actual, msgAndArgs...) { + if assertions.YAMLEqT[EDoc, ADoc](a.T, expected, actual, append(msgAndArgs, a.o)...) { return } @@ -1491,7 +1491,7 @@ func (a *Assertions) YAMLEqTf[EDoc, ADoc RText](expected EDoc, actual ADoc, msg if h, ok := a.T.(H); ok { h.Helper() } - if assertions.YAMLEqT[EDoc, ADoc](a.T, expected, actual, forwardArgs(msg, args)...) { + if assertions.YAMLEqT[EDoc, ADoc](a.T, expected, actual, forwardArgs(msg, args, a.o)...) { return } @@ -1505,7 +1505,7 @@ func (a *Assertions) YAMLMarshalAsT[EDoc RText](expected EDoc, object any, msgAn if h, ok := a.T.(H); ok { h.Helper() } - if assertions.YAMLMarshalAsT[EDoc](a.T, expected, object, msgAndArgs...) { + if assertions.YAMLMarshalAsT[EDoc](a.T, expected, object, append(msgAndArgs, a.o)...) { return } @@ -1519,7 +1519,7 @@ func (a *Assertions) YAMLMarshalAsTf[EDoc RText](expected EDoc, object any, msg if h, ok := a.T.(H); ok { h.Helper() } - if assertions.YAMLMarshalAsT[EDoc](a.T, expected, object, forwardArgs(msg, args)...) { + if assertions.YAMLMarshalAsT[EDoc](a.T, expected, object, forwardArgs(msg, args, a.o)...) { return } @@ -1533,7 +1533,7 @@ func (a *Assertions) YAMLUnmarshalAsT[Object any, ADoc RText](expected Object, y if h, ok := a.T.(H); ok { h.Helper() } - if assertions.YAMLUnmarshalAsT[Object, ADoc](a.T, expected, yamlDoc, msgAndArgs...) { + if assertions.YAMLUnmarshalAsT[Object, ADoc](a.T, expected, yamlDoc, append(msgAndArgs, a.o)...) { return } @@ -1547,7 +1547,7 @@ func (a *Assertions) YAMLUnmarshalAsTf[Object any, ADoc RText](expected Object, if h, ok := a.T.(H); ok { h.Helper() } - if assertions.YAMLUnmarshalAsT[Object, ADoc](a.T, expected, yamlDoc, forwardArgs(msg, args)...) { + if assertions.YAMLUnmarshalAsT[Object, ADoc](a.T, expected, yamlDoc, forwardArgs(msg, args, a.o)...) { return } diff --git a/require/require_helpers.go b/require/require_helpers.go index e5a12478e..dcae5527e 100644 --- a/require/require_helpers.go +++ b/require/require_helpers.go @@ -37,3 +37,10 @@ func ObjectsAreEqual(expected any, actual any) bool { func ObjectsAreEqualValues(expected any, actual any) bool { return assertions.ObjectsAreEqualValues(expected, actual) } + +// WithHunkSize modifies the size of the hunk context in diff. +// +// The default is 1. +func WithHunkSize(n int) Option { + return assertions.WithHunkSize(n) +} diff --git a/require/require_helpers_test.go b/require/require_helpers_test.go index 844cff43d..22c9ed4df 100644 --- a/require/require_helpers_test.go +++ b/require/require_helpers_test.go @@ -9,18 +9,22 @@ import ( "testing" ) -func TestCallerInfof(t *testing.T) { +func TestCallerInfo(t *testing.T) { t.Skip() // this function doesn't have tests yet } -func TestHTTPBodyf(t *testing.T) { +func TestHTTPBody(t *testing.T) { t.Skip() // this function doesn't have tests yet } -func TestObjectsAreEqualf(t *testing.T) { +func TestObjectsAreEqual(t *testing.T) { t.Skip() // this function doesn't have tests yet } -func TestObjectsAreEqualValuesf(t *testing.T) { +func TestObjectsAreEqualValues(t *testing.T) { + t.Skip() // this function doesn't have tests yet +} + +func TestWithHunkSize(t *testing.T) { t.Skip() // this function doesn't have tests yet } diff --git a/require/require_options_test.go b/require/require_options_test.go new file mode 100644 index 000000000..05a559d02 --- /dev/null +++ b/require/require_options_test.go @@ -0,0 +1,145 @@ +// SPDX-FileCopyrightText: Copyright 2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + +package require + +import ( + "fmt" + "strings" + "testing" +) + +// capturingT is a [T] that keeps the last failure message and absorbs FailNow. +type capturingT struct { + message string + failed bool +} + +func (capturingT) Helper() {} + +func (m *capturingT) Errorf(format string, args ...any) { + m.message = fmt.Sprintf(format, args...) +} + +func (m *capturingT) FailNow() { + m.failed = true +} + +// TestNewWithHunkSize demonstrates how [WithHunkSize] widens the diff reported by [Assertions.Equal]. +// +// The two values differ on their last element only, so the diff holds a single hunk and the +// option decides how many unchanged lines precede the change. +func TestNewWithHunkSize(t *testing.T) { + t.Parallel() + + expected := []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"} + actual := []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "z"} + + for _, toPin := range []struct { + name string + options []Option + wantContext int // unchanged lines of the diff + wantFirst string // first unchanged line of the hunk + }{ + {name: "default", options: nil, wantContext: 2, wantFirst: `(string) (len=1) "i",`}, + {name: "hunk size 1", options: []Option{WithHunkSize(1)}, wantContext: 2, wantFirst: `(string) (len=1) "i",`}, + {name: "hunk size 3", options: []Option{WithHunkSize(3)}, wantContext: 4, wantFirst: `(string) (len=1) "g",`}, + {name: "hunk size 5", options: []Option{WithHunkSize(5)}, wantContext: 6, wantFirst: `(string) (len=1) "e",`}, + {name: "hunk size 100", options: []Option{WithHunkSize(100)}, wantContext: 11, wantFirst: `([]string) (len=10) {`}, + } { + t.Run(toPin.name, func(t *testing.T) { + t.Parallel() + + mock := new(capturingT) + a := New(mock, toPin.options...) + + a.Equal(expected, actual) + + if !mock.failed { + t.Fatal("Equal should call FailNow() on different values") + } + + if got := countDiffContextLines(mock.message); got != toPin.wantContext { + t.Errorf("expected %d unchanged lines in the diff, got %d in:\n%s", + toPin.wantContext, got, mock.message) + } + + if got := firstDiffContextLine(mock.message); got != toPin.wantFirst { + t.Errorf("expected the hunk to start at %q, got %q in:\n%s", + toPin.wantFirst, got, mock.message) + } + + if strings.Contains(mock.message, "hunkSize") || strings.Contains(mock.message, "Messages:") { + t.Errorf("expected the option not to leak into the message, got:\n%s", mock.message) + } + }) + } + + t.Run("the format variant should keep its message", func(t *testing.T) { + t.Parallel() + + mock := new(capturingT) + a := New(mock, WithHunkSize(5)) + + a.Equalf(expected, actual, "values differ at index %d", 9) + + if !mock.failed { + t.Fatal("Equalf should call FailNow() on different values") + } + + if !strings.Contains(mock.message, "values differ at index 9") { + t.Errorf("expected the formatted message to be reported, got:\n%s", mock.message) + } + + if got := countDiffContextLines(mock.message); got != 6 { + t.Errorf("expected 6 unchanged lines in the diff, got %d in:\n%s", got, mock.message) + } + }) +} + +// diffLines returns the lines of the "Diff:" section of a failure message, stripped from +// the "\t\t" indentation that labeledOutput adds to continuation lines. +func diffLines(message string) []string { + _, unified, found := strings.Cut(message, "Diff:\n") + if !found { + return nil + } + + var lines []string + + for line := range strings.SplitSeq(unified, "\n") { + parts := strings.SplitN(line, "\t", 3) + if len(parts) < 3 { + continue + } + + lines = append(lines, parts[2]) + } + + return lines +} + +// countDiffContextLines counts the unchanged lines of the diff, i.e. those prefixed with a space. +func countDiffContextLines(message string) int { + var count int + + for _, line := range diffLines(message) { + if strings.HasPrefix(line, " ") && strings.TrimSpace(line) != "" { + count++ + } + } + + return count +} + +// firstDiffContextLine returns the first unchanged line of the diff, which tells how far +// back the hunk reaches. +func firstDiffContextLine(message string) string { + for _, line := range diffLines(message) { + if strings.HasPrefix(line, " ") && strings.TrimSpace(line) != "" { + return strings.TrimSpace(line) + } + } + + return "" +} diff --git a/require/require_types.go b/require/require_types.go index d8ca03865..2aacb1141 100644 --- a/require/require_types.go +++ b/require/require_types.go @@ -75,6 +75,14 @@ type ( // The [WithSynctest] wrapper opts a call into fake-time polling. NeverConditioner = assertions.NeverConditioner + // Option to modify the behavior of an assertion. + // + // Options are specified when building an assertion type with [New]. + // + // At this moment, the only supported option is to modify the context-width ("hunk") of the diff + // reported on the family of Equal assertions. + Option = assertions.Option + // Ordered is a standard ordered type (i.e. types that support "<": [cmp.Ordered]) plus []byte and [time.Time]. // // This is used by [GreaterT], [GreaterOrEqualT], [LessT], [LessOrEqualT], [IsIncreasingT], [IsDecreasingT]. From 6322994c8845006974684128e9317164ec62bf60 Mon Sep 17 00:00:00 2001 From: Frederic BIDON Date: Mon, 7 Sep 2026 16:30:04 +0200 Subject: [PATCH 2/3] doc(assertions): show how WithHunkSize widens the diff WithHunkSize said only "modifies the size of the hunk context in diff". It now names the five assertions that render a diff (Equal, EqualT, EqualValues, EqualExportedValues, Exactly), states the default of 1, the clamp below 1, the whole-value case above the rendered length, and shows the call. USAGE.md gains a "Widening the Diff Context" section under Customization, comparing the real output of the same struct at hunk size 1 and 4, and a warning that options ride on the Assertions object: assert.Equal at package level always uses a hunk size of 1. The Forward Methods section links to it. CHANGES.md records the option under Major Additions. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_015qDqrLvtn2K5uA6RpSoHvR Signed-off-by: Frederic BIDON --- assert/assert_helpers.go | 12 +++++- docs/doc-site/api/common.md | 14 +++++-- docs/doc-site/api/metrics.md | 10 ++--- docs/doc-site/usage/CHANGES.md | 2 + docs/doc-site/usage/USAGE.md | 67 ++++++++++++++++++++++++++++++++++ internal/assertions/options.go | 12 +++++- require/require_helpers.go | 12 +++++- 7 files changed, 115 insertions(+), 14 deletions(-) diff --git a/assert/assert_helpers.go b/assert/assert_helpers.go index ce4243047..3dcdfd982 100644 --- a/assert/assert_helpers.go +++ b/assert/assert_helpers.go @@ -38,9 +38,17 @@ func ObjectsAreEqualValues(expected any, actual any) bool { return assertions.ObjectsAreEqualValues(expected, actual) } -// WithHunkSize modifies the size of the hunk context in diff. +// WithHunkSize sets how many unchanged lines the diff shows around each change. // -// The default is 1. +// The diff appears in the failure message of [Equal], [EqualT], [EqualValues], +// [EqualExportedValues] and [Exactly], whenever both values are a struct, map, slice, array +// or string. The default is 1. A value below 1 is clamped to 1, and a value larger than the +// rendered value prints it whole. +// +// Pass it to [New], which is the only place options are read: +// +// a := assert.New(t, assert.WithHunkSize(4)) +// a.Equal(expected, actual) func WithHunkSize(n int) Option { return assertions.WithHunkSize(n) } diff --git a/docs/doc-site/api/common.md b/docs/doc-site/api/common.md index ff7fe940e..bfd394137 100644 --- a/docs/doc-site/api/common.md +++ b/docs/doc-site/api/common.md @@ -118,9 +118,17 @@ values are equal. {{< /tabs >}} ### WithHunkSize{#withhunksize} -WithHunkSize modifies the size of the hunk context in diff. +WithHunkSize sets how many unchanged lines the diff shows around each change. -The default is 1. +The diff appears in the failure message of [Equal](https://pkg.go.dev/github.com/go-openapi/testify/v2/assert#Equal), [EqualT](https://pkg.go.dev/github.com/go-openapi/testify/v2/assert#EqualT), [EqualValues](https://pkg.go.dev/github.com/go-openapi/testify/v2/assert#EqualValues), +[EqualExportedValues](https://pkg.go.dev/github.com/go-openapi/testify/v2/assert#EqualExportedValues) and [Exactly](https://pkg.go.dev/github.com/go-openapi/testify/v2/assert#Exactly), whenever both values are a struct, map, slice, array +or string. The default is 1. A value below 1 is clamped to 1, and a value larger than the +rendered value prints it whole. + +Pass it to [New](https://pkg.go.dev/github.com/go-openapi/testify/v2/assert#New), which is the only place options are read: + + a := assert.New(t, assert.WithHunkSize(4)) + a.Equal(expected, actual) {{< tabs >}} @@ -141,7 +149,7 @@ The default is 1. |--|--| | [`assertions.WithHunkSize(n int) Option`](https://pkg.go.dev/github.com/go-openapi/testify/v2/internal/assertions#WithHunkSize) | internal implementation | -**Source:** [github.com/go-openapi/testify/v2/internal/assertions#WithHunkSize](https://github.com/go-openapi/testify/blob/master/internal/assertions/options.go#L35) +**Source:** [github.com/go-openapi/testify/v2/internal/assertions#WithHunkSize](https://github.com/go-openapi/testify/blob/master/internal/assertions/options.go#L45) {{% /tab %}} {{< /tabs >}} diff --git a/docs/doc-site/api/metrics.md b/docs/doc-site/api/metrics.md index 41806828e..901efcb63 100644 --- a/docs/doc-site/api/metrics.md +++ b/docs/doc-site/api/metrics.md @@ -19,15 +19,15 @@ on methods; on go1.26 those two variants per generic assertion are excluded by t | Kind | Count | Note | | ------------------------- | ----------------- | ---- | -| All core functions | 145 | Maintained core | -| All core assertions | 140 | Usage with `*testing.T` | -| Generic assertions | 55 | Type-safe assertions ("T" suffix) (per package)| -| Helpers (not assertions) | 5 | General-purpose utilities, not assertions (per package)| +| All core functions | 145 | Maintained core (internal) | +| All core assertions | 140 | Usage with `*testing.T` (per package) | +| Generic assertions | 55 | Type-safe assertions ("T" suffix) (per package) | +| Helpers (not assertions) | 5 | General-purpose utilities, not assertions (per package) | | Others | 0 | | | assert/require variants | 560 | Generated variants | | Total assertions variants | 1120 | Available assertions API | | Constructors | 2 | Builders of Assertion values | -| Total API surface | 1132 | All variants, constructors and helpers | +| Total API surface | 1132 | All variants, constructors and helpers over all packages | ## Quick index diff --git a/docs/doc-site/usage/CHANGES.md b/docs/doc-site/usage/CHANGES.md index d33a3f3cf..e6d6e4eb5 100644 --- a/docs/doc-site/usage/CHANGES.md +++ b/docs/doc-site/usage/CHANGES.md @@ -47,8 +47,10 @@ See also a quick [migration guide](./MIGRATION.md). | **Optional YAML support** | Design goal | YAML assertions are now enabled via opt-in `enable/yaml` module | | **Colorized output** | [#1467], [#1480], [#1232], [#994] | Optional colorization via `enable/color` module with themes | | **Enhanced diff output** | [#1829] | Improved time.Time rendering, deterministic map ordering | +| **Tunable diff context** | [#1878] | `assert.New(t, assert.WithHunkSize(n))` widens the unchanged context shown around each change | [#1829]: https://github.com/stretchr/testify/issues/1829 +[#1878]: https://github.com/stretchr/testify/pull/1878 #### Maintainability diff --git a/docs/doc-site/usage/USAGE.md b/docs/doc-site/usage/USAGE.md index 50f32f970..7866acf67 100644 --- a/docs/doc-site/usage/USAGE.md +++ b/docs/doc-site/usage/USAGE.md @@ -354,6 +354,9 @@ func TestUser(t *testing.T) { {{% /tab %}} {{< /tabs >}} +`New` also accepts options that tune how failures are reported. See +[Widening the Diff Context](#widening-the-diff-context) for `WithHunkSize`. + ## Common Usage Patterns {{% tabs %}} @@ -512,6 +515,70 @@ func TestTypeSafety(t *testing.T) { ## Customization +### Widening the Diff Context + +When `Equal` fails on a struct, map or slice, testify renders a unified diff of the two values. By default the diff +shows **1 line** of unchanged context around each change, which keeps the failure short but can hide the fields that +tell you which record you are looking at. + +Pass `WithHunkSize` to `assert.New` or `require.New` to show more context: + +```go +func TestUser(t *testing.T) { + a := assert.New(t, assert.WithHunkSize(4)) + + a.Equal(expected, actual) +} +``` + +{{< tabs >}} +{{% tab title="Default (1 line)" %}} +```text + Error: Not equal: + expected: assert.User{ID:1, Name:"Alice", Email:"alice@example.com", Role:"admin", Active:true, Country:"FR", City:"Paris", Zip:"75001"} + actual : assert.User{ID:1, Name:"Alice", Email:"alice@example.com", Role:"admin", Active:true, Country:"FR", City:"Paris", Zip:"75002"} + + Diff: + --- Expected + +++ Actual + @@ -8,3 +8,3 @@ + City: (string) (len=5) "Paris", + - Zip: (string) (len=5) "75001" + + Zip: (string) (len=5) "75002" + } +``` +{{% /tab %}} + +{{% tab title="WithHunkSize(4)" %}} +```text + Error: Not equal: + expected: assert.User{ID:1, Name:"Alice", Email:"alice@example.com", Role:"admin", Active:true, Country:"FR", City:"Paris", Zip:"75001"} + actual : assert.User{ID:1, Name:"Alice", Email:"alice@example.com", Role:"admin", Active:true, Country:"FR", City:"Paris", Zip:"75002"} + + Diff: + --- Expected + +++ Actual + @@ -5,7 +5,7 @@ + Role: (string) (len=5) "admin", + Active: (bool) true, + Country: (string) (len=2) "FR", + City: (string) (len=5) "Paris", + - Zip: (string) (len=5) "75001" + + Zip: (string) (len=5) "75002" + } +``` +{{% /tab %}} +{{< /tabs >}} + +The hunk size counts unchanged lines on each side of a change. A value larger than the rendered value prints it whole, +which is handy for small structs. Values below 1 are clamped to 1. + +{{% notice style="warning" title="Forward Methods Only" icon="triangle-exclamation" %}} +Options are carried by the `Assertions` object returned by `New`, so `WithHunkSize` has no effect on the package-level +functions: `assert.Equal(t, expected, actual)` always uses a hunk size of 1. Build an assertion object when you want a +wider diff. +{{% /notice %}} + ### Using a Custom YAML Unmarshaler By default, testify uses `gopkg.in/yaml.v3` for YAML assertions (e.g. `YAMLEq`) when you import the standard diff --git a/internal/assertions/options.go b/internal/assertions/options.go index 88e872d58..df0dab0b1 100644 --- a/internal/assertions/options.go +++ b/internal/assertions/options.go @@ -31,9 +31,17 @@ func BuildOptions(opts []Option) any { return o } -// WithHunkSize modifies the size of the hunk context in diff. +// WithHunkSize sets how many unchanged lines the diff shows around each change. // -// The default is 1. +// The diff appears in the failure message of [Equal], [EqualT], [EqualValues], +// [EqualExportedValues] and [Exactly], whenever both values are a struct, map, slice, array +// or string. The default is 1. A value below 1 is clamped to 1, and a value larger than the +// rendered value prints it whole. +// +// Pass it to [New], which is the only place options are read: +// +// a := assert.New(t, assert.WithHunkSize(4)) +// a.Equal(expected, actual) func WithHunkSize(n int) Option { return func(o options) options { o.hunkSize = n diff --git a/require/require_helpers.go b/require/require_helpers.go index dcae5527e..7a42e4091 100644 --- a/require/require_helpers.go +++ b/require/require_helpers.go @@ -38,9 +38,17 @@ func ObjectsAreEqualValues(expected any, actual any) bool { return assertions.ObjectsAreEqualValues(expected, actual) } -// WithHunkSize modifies the size of the hunk context in diff. +// WithHunkSize sets how many unchanged lines the diff shows around each change. // -// The default is 1. +// The diff appears in the failure message of [Equal], [EqualT], [EqualValues], +// [EqualExportedValues] and [Exactly], whenever both values are a struct, map, slice, array +// or string. The default is 1. A value below 1 is clamped to 1, and a value larger than the +// rendered value prints it whole. +// +// Pass it to [New], which is the only place options are read: +// +// a := assert.New(t, assert.WithHunkSize(4)) +// a.Equal(expected, actual) func WithHunkSize(n int) Option { return assertions.WithHunkSize(n) } From 369de6571b85970670f1eeb2f3ded7cb1280f2de Mon Sep 17 00:00:00 2001 From: Frederic BIDON Date: Mon, 7 Sep 2026 16:30:09 +0200 Subject: [PATCH 3/3] doc: update upstream tracking for the hunk-size option Moves stretchr/testify#1878 from Monitoring to Adapted, restricted to the forward methods, and starts monitoring stretchr/testify#1945 (a Must helper returning a value when there is no error). Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_015qDqrLvtn2K5uA6RpSoHvR Signed-off-by: Frederic BIDON --- docs/doc-site/usage/TRACKING.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/doc-site/usage/TRACKING.md b/docs/doc-site/usage/TRACKING.md index 7041b3f66..ea2a2c28e 100644 --- a/docs/doc-site/usage/TRACKING.md +++ b/docs/doc-site/usage/TRACKING.md @@ -96,6 +96,7 @@ This table catalogs all upstream PRs and issues from [github.com/stretchr/testif | [#1899], [#1931] | PR | Pass the custom message through `InEpsilonSlice` | ✅ Adapted - the index context no longer replaces the caller's message; both are joined. | | [#1908] | PR | `Contains` is not rune-safe on Unicode strings | ✅ Adapted - `Contains(t, "héllo", 'é')` compared against the literal `""`. Dispatch is now on the element kind (string, rune, byte, defined string type). The invalid-UTF-8 half of the upstream report is deliberately left as byte semantics. | | [#1940], [#1942] | Issue/PR | `ErrorNotContains` assertion | ✅ Adapted - implemented as `ErrorNotContains` in the error domain, the opposite of `ErrorContains`: a nil error fails, and so does an error whose message contains the substring. | +| [#1878] | Issue | diff hunk size | ✅ Implemented (forward only) - parameterized hunk size is an API challenge | [#994]: https://github.com/stretchr/testify/pull/994 [#1232]: https://github.com/stretchr/testify/pull/1232 @@ -117,6 +118,7 @@ This table catalogs all upstream PRs and issues from [github.com/stretchr/testif [#1915]: https://github.com/stretchr/testify/issues/1915 [#1874]: https://github.com/stretchr/testify/pull/1874 [#1875]: https://github.com/stretchr/testify/pull/1875 +[#1878]: https://github.com/stretchr/testify/pull/1878 [#1898]: https://github.com/stretchr/testify/pull/1898 [#1899]: https://github.com/stretchr/testify/pull/1899 [#1908]: https://github.com/stretchr/testify/pull/1908 @@ -142,7 +144,9 @@ This table catalogs all upstream PRs and issues from [github.com/stretchr/testif | Reference | Type | Summary | Status | |-----------|------|---------|--------| | [#1576] | Issue/PR | `EqualValues` assertion | 🔍 Monitoring [#1863]- Wrong equality when comparing float32 and float64| -| [#1878] | Issue | diff hunk size | 🔍 Monitoring - parameterized hunk size is an API challenge | +| [#1945] | PR | `Must` helper | 🔍 Monitoring [#1945]- Syntactic sugar to hand a value directly when no error | + +[#1945]: https://github.com/stretchr/testify/pull/1945 ### Informational (Not Implemented) @@ -165,15 +169,14 @@ This table catalogs all upstream PRs and issues from [github.com/stretchr/testif [#1861]: https://github.com/stretchr/testify/pull/1861 [#1862]: https://github.com/stretchr/testify/pull/1862 [#1863]: https://github.com/stretchr/testify/pull/1863 -[#1878]: https://github.com/stretchr/testify/pull/1878 ### Summary Statistics | Category | Count | |----------|-------| -| **Implemented/Merged** | 34 | +| **Implemented/Merged** | 35 | | **Superseded** | 6 | -| **Monitoring** | 2 | +| **Monitoring** | 1 | | **Informational** | 5 | | **Total Processed** | 47 |