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..3dcdfd982 100644 --- a/assert/assert_helpers.go +++ b/assert/assert_helpers.go @@ -37,3 +37,18 @@ func ObjectsAreEqual(expected any, actual any) bool { func ObjectsAreEqualValues(expected any, actual any) bool { return assertions.ObjectsAreEqualValues(expected, actual) } + +// WithHunkSize sets how many unchanged lines the diff shows around each change. +// +// 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/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..bfd394137 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,42 @@ values are equal. {{% /tab %}} {{< /tabs >}} +### WithHunkSize{#withhunksize} +WithHunkSize sets how many unchanged lines the diff shows around each change. + +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 >}} + +{{% 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#L45) +{{% /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..901efcb63 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 assertions | 140 | Usage with `*testing.T` | -| Generic assertions | 55 | Type-safe assertions ("T" suffix) | -| Helpers (not assertions) | 4 | General-purpose utilities, not assertions | +| 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 | -| Total API surface | 1130 | | +| Constructors | 2 | Builders of Assertion values | +| Total API surface | 1132 | All variants, constructors and helpers over all packages | ## 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/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/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 | 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/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..df0dab0b1 --- /dev/null +++ b/internal/assertions/options.go @@ -0,0 +1,83 @@ +// 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 sets how many unchanged lines the diff shows around each change. +// +// 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 + + 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..7a42e4091 100644 --- a/require/require_helpers.go +++ b/require/require_helpers.go @@ -37,3 +37,18 @@ func ObjectsAreEqual(expected any, actual any) bool { func ObjectsAreEqualValues(expected any, actual any) bool { return assertions.ObjectsAreEqualValues(expected, actual) } + +// WithHunkSize sets how many unchanged lines the diff shows around each change. +// +// 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/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].