From 2243d79456b595f7fdf164db110ab26aaeb74885 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 13:53:20 +0000 Subject: [PATCH 1/7] Initial plan From 8b0e18de2da93bc084eb0f9d9415f237305bc814 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 13:58:06 +0000 Subject: [PATCH 2/7] Add comprehensive tests for errorset.go to achieve 88% coverage Co-authored-by: SuperSandro2000 <7258858+SuperSandro2000@users.noreply.github.com> --- errext/errorset_test.go | 241 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 errext/errorset_test.go diff --git a/errext/errorset_test.go b/errext/errorset_test.go new file mode 100644 index 0000000..c3fa264 --- /dev/null +++ b/errext/errorset_test.go @@ -0,0 +1,241 @@ +// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company +// SPDX-License-Identifier: Apache-2.0 + +package errext + +import ( + "errors" + "fmt" + "testing" + + "github.com/sapcc/go-bits/assert" +) + +func TestErrorSetAdd(t *testing.T) { + var errs ErrorSet + + // Add nil error - should not be added + errs.Add(nil) + assert.Equal(t, len(errs), 0) + + // Add non-nil error + err1 := errors.New("error 1") + errs.Add(err1) + assert.Equal(t, len(errs), 1) + assert.Equal(t, errs[0].Error(), "error 1") + + // Add another non-nil error + err2 := errors.New("error 2") + errs.Add(err2) + assert.Equal(t, len(errs), 2) + assert.Equal(t, errs[1].Error(), "error 2") + + // Add nil error again - should not be added + errs.Add(nil) + assert.Equal(t, len(errs), 2) +} + +func TestErrorSetAddf(t *testing.T) { + var errs ErrorSet + + // Add formatted error + errs.Addf("error with number: %d", 42) + assert.Equal(t, len(errs), 1) + assert.Equal(t, errs[0].Error(), "error with number: 42") + + // Add another formatted error + errs.Addf("error with string: %s", "test") + assert.Equal(t, len(errs), 2) + assert.Equal(t, errs[1].Error(), "error with string: test") + + // Add formatted error without parameters + errs.Addf("simple error") + assert.Equal(t, len(errs), 3) + assert.Equal(t, errs[2].Error(), "simple error") +} + +func TestErrorSetAppend(t *testing.T) { + var errs1 ErrorSet + errs1.Add(errors.New("error 1")) + errs1.Add(errors.New("error 2")) + + var errs2 ErrorSet + errs2.Add(errors.New("error 3")) + errs2.Add(errors.New("error 4")) + + // Append errs2 to errs1 + errs1.Append(errs2) + assert.Equal(t, len(errs1), 4) + assert.Equal(t, errs1[0].Error(), "error 1") + assert.Equal(t, errs1[1].Error(), "error 2") + assert.Equal(t, errs1[2].Error(), "error 3") + assert.Equal(t, errs1[3].Error(), "error 4") + + // Append empty ErrorSet + var errs3 ErrorSet + errs1.Append(errs3) + assert.Equal(t, len(errs1), 4) +} + +func TestErrorSetIsEmpty(t *testing.T) { + var errs ErrorSet + + // Empty ErrorSet + assert.Equal(t, errs.IsEmpty(), true) + + // Add an error + errs.Add(errors.New("error")) + assert.Equal(t, errs.IsEmpty(), false) + + // Create new ErrorSet with errors + errs2 := ErrorSet{errors.New("error 1"), errors.New("error 2")} + assert.Equal(t, errs2.IsEmpty(), false) +} + +func TestErrorSetJoin(t *testing.T) { + var errs ErrorSet + + // Empty ErrorSet + result := errs.Join(", ") + assert.Equal(t, result, "") + + // Single error + errs.Add(errors.New("error 1")) + result = errs.Join(", ") + assert.Equal(t, result, "error 1") + + // Multiple errors with comma separator + errs.Add(errors.New("error 2")) + errs.Add(errors.New("error 3")) + result = errs.Join(", ") + assert.Equal(t, result, "error 1, error 2, error 3") + + // Multiple errors with different separator + result = errs.Join(" | ") + assert.Equal(t, result, "error 1 | error 2 | error 3") + + // Multiple errors with newline separator + result = errs.Join("\n") + assert.Equal(t, result, "error 1\nerror 2\nerror 3") +} + +func TestErrorSetJoinedError(t *testing.T) { + var errs ErrorSet + + // Empty ErrorSet + joined := errs.JoinedError(", ") + assert.Equal(t, joined.Error(), "") + + // Single error + errs.Add(errors.New("error 1")) + joined = errs.JoinedError(", ") + assert.Equal(t, joined.Error(), "error 1") + + // Multiple errors + errs.Add(errors.New("error 2")) + errs.Add(errors.New("error 3")) + joined = errs.JoinedError("; ") + assert.Equal(t, joined.Error(), "error 1; error 2; error 3") +} + +func TestJoinedErrorError(t *testing.T) { + // Test the Error() method of joinedError directly + je := joinedError{ + errs: []error{errors.New("error 1"), errors.New("error 2")}, + separator: " - ", + } + assert.Equal(t, je.Error(), "error 1 - error 2") + + // Empty error list + je2 := joinedError{ + errs: []error{}, + separator: ", ", + } + assert.Equal(t, je2.Error(), "") +} + +func TestJoinedErrorUnwrap(t *testing.T) { + err1 := errors.New("error 1") + err2 := errors.New("error 2") + err3 := errors.New("error 3") + + var errs ErrorSet + errs.Add(err1) + errs.Add(err2) + errs.Add(err3) + + joined := errs.JoinedError(", ") + + // Unwrap should return the original errors + unwrapped := joined.(interface{ Unwrap() []error }).Unwrap() + assert.Equal(t, len(unwrapped), 3) + assert.Equal(t, unwrapped[0], err1) + assert.Equal(t, unwrapped[1], err2) + assert.Equal(t, unwrapped[2], err3) + + // Test with errors.Is and errors.As + assert.Equal(t, errors.Is(joined, err1), true) + assert.Equal(t, errors.Is(joined, err2), true) + assert.Equal(t, errors.Is(joined, err3), true) + assert.Equal(t, errors.Is(joined, errors.New("different error")), false) +} + +func TestErrorSetLogFatalIfError(t *testing.T) { + // Test with empty ErrorSet - should not exit + var emptyErrs ErrorSet + // We can't directly test os.Exit, but we can verify the function doesn't panic + // on empty ErrorSet. In a real scenario, this would not call os.Exit. + // Note: We cannot fully test LogFatalIfError as it calls os.Exit(1) + // For an empty ErrorSet, it should complete without exiting + testLogFatalWithEmptyErrorSet(emptyErrs) +} + +func testLogFatalWithEmptyErrorSet(errs ErrorSet) { + // This function is a helper to test that LogFatalIfError doesn't panic + // on empty ErrorSet. We cannot test the actual exit behavior. + defer func() { + if r := recover(); r != nil { + panic(fmt.Sprintf("LogFatalIfError panicked: %v", r)) + } + }() + + // For empty ErrorSet, this should complete without issues + if errs.IsEmpty() { + // We skip calling LogFatalIfError on non-empty sets as it would exit + errs.LogFatalIfError() + } +} + +func TestErrorSetIntegration(t *testing.T) { + // Integration test combining multiple methods + var errs ErrorSet + + // Start empty + assert.Equal(t, errs.IsEmpty(), true) + + // Add some errors using different methods + errs.Add(errors.New("error 1")) + errs.Addf("error %d", 2) + + assert.Equal(t, errs.IsEmpty(), false) + assert.Equal(t, len(errs), 2) + + // Create another ErrorSet and append + var moreErrs ErrorSet + moreErrs.Add(errors.New("error 3")) + moreErrs.Addf("error %d", 4) + + errs.Append(moreErrs) + assert.Equal(t, len(errs), 4) + + // Test Join + result := errs.Join(" | ") + assert.Equal(t, result, "error 1 | error 2 | error 3 | error 4") + + // Test JoinedError and Unwrap + joined := errs.JoinedError("; ") + assert.Equal(t, joined.Error(), "error 1; error 2; error 3; error 4") + + unwrapped := joined.(interface{ Unwrap() []error }).Unwrap() + assert.Equal(t, len(unwrapped), 4) +} From 9298b5afed070d166e326ad3dbb931693a415d86 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 14:01:05 +0000 Subject: [PATCH 3/7] Fix formatting in errorset_test.go (remove trailing whitespace) Co-authored-by: SuperSandro2000 <7258858+SuperSandro2000@users.noreply.github.com> --- errext/errorset_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/errext/errorset_test.go b/errext/errorset_test.go index c3fa264..f480976 100644 --- a/errext/errorset_test.go +++ b/errext/errorset_test.go @@ -198,7 +198,7 @@ func testLogFatalWithEmptyErrorSet(errs ErrorSet) { panic(fmt.Sprintf("LogFatalIfError panicked: %v", r)) } }() - + // For empty ErrorSet, this should complete without issues if errs.IsEmpty() { // We skip calling LogFatalIfError on non-empty sets as it would exit @@ -216,7 +216,7 @@ func TestErrorSetIntegration(t *testing.T) { // Add some errors using different methods errs.Add(errors.New("error 1")) errs.Addf("error %d", 2) - + assert.Equal(t, errs.IsEmpty(), false) assert.Equal(t, len(errs), 2) @@ -224,7 +224,7 @@ func TestErrorSetIntegration(t *testing.T) { var moreErrs ErrorSet moreErrs.Add(errors.New("error 3")) moreErrs.Addf("error %d", 4) - + errs.Append(moreErrs) assert.Equal(t, len(errs), 4) @@ -235,7 +235,7 @@ func TestErrorSetIntegration(t *testing.T) { // Test JoinedError and Unwrap joined := errs.JoinedError("; ") assert.Equal(t, joined.Error(), "error 1; error 2; error 3; error 4") - + unwrapped := joined.(interface{ Unwrap() []error }).Unwrap() assert.Equal(t, len(unwrapped), 4) } From 9764f1c638275749b8af261383417352c3a466ed Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 14:05:31 +0000 Subject: [PATCH 4/7] Fix assert.Equal parameter order (actual, expected) Co-authored-by: SuperSandro2000 <7258858+SuperSandro2000@users.noreply.github.com> --- errext/errorset_test.go | 92 ++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/errext/errorset_test.go b/errext/errorset_test.go index f480976..febd22f 100644 --- a/errext/errorset_test.go +++ b/errext/errorset_test.go @@ -16,23 +16,23 @@ func TestErrorSetAdd(t *testing.T) { // Add nil error - should not be added errs.Add(nil) - assert.Equal(t, len(errs), 0) + assert.Equal(t, 0, len(errs)) // Add non-nil error err1 := errors.New("error 1") errs.Add(err1) - assert.Equal(t, len(errs), 1) - assert.Equal(t, errs[0].Error(), "error 1") + assert.Equal(t, 1, len(errs)) + assert.Equal(t, "error 1", errs[0].Error()) // Add another non-nil error err2 := errors.New("error 2") errs.Add(err2) - assert.Equal(t, len(errs), 2) - assert.Equal(t, errs[1].Error(), "error 2") + assert.Equal(t, 2, len(errs)) + assert.Equal(t, "error 2", errs[1].Error()) // Add nil error again - should not be added errs.Add(nil) - assert.Equal(t, len(errs), 2) + assert.Equal(t, 2, len(errs)) } func TestErrorSetAddf(t *testing.T) { @@ -40,18 +40,18 @@ func TestErrorSetAddf(t *testing.T) { // Add formatted error errs.Addf("error with number: %d", 42) - assert.Equal(t, len(errs), 1) - assert.Equal(t, errs[0].Error(), "error with number: 42") + assert.Equal(t, 1, len(errs)) + assert.Equal(t, "error with number: 42", errs[0].Error()) // Add another formatted error errs.Addf("error with string: %s", "test") - assert.Equal(t, len(errs), 2) - assert.Equal(t, errs[1].Error(), "error with string: test") + assert.Equal(t, 2, len(errs)) + assert.Equal(t, "error with string: test", errs[1].Error()) // Add formatted error without parameters errs.Addf("simple error") - assert.Equal(t, len(errs), 3) - assert.Equal(t, errs[2].Error(), "simple error") + assert.Equal(t, 3, len(errs)) + assert.Equal(t, "simple error", errs[2].Error()) } func TestErrorSetAppend(t *testing.T) { @@ -65,31 +65,31 @@ func TestErrorSetAppend(t *testing.T) { // Append errs2 to errs1 errs1.Append(errs2) - assert.Equal(t, len(errs1), 4) - assert.Equal(t, errs1[0].Error(), "error 1") - assert.Equal(t, errs1[1].Error(), "error 2") - assert.Equal(t, errs1[2].Error(), "error 3") - assert.Equal(t, errs1[3].Error(), "error 4") + assert.Equal(t, 4, len(errs1)) + assert.Equal(t, "error 1", errs1[0].Error()) + assert.Equal(t, "error 2", errs1[1].Error()) + assert.Equal(t, "error 3", errs1[2].Error()) + assert.Equal(t, "error 4", errs1[3].Error()) // Append empty ErrorSet var errs3 ErrorSet errs1.Append(errs3) - assert.Equal(t, len(errs1), 4) + assert.Equal(t, 4, len(errs1)) } func TestErrorSetIsEmpty(t *testing.T) { var errs ErrorSet // Empty ErrorSet - assert.Equal(t, errs.IsEmpty(), true) + assert.Equal(t, true, errs.IsEmpty()) // Add an error errs.Add(errors.New("error")) - assert.Equal(t, errs.IsEmpty(), false) + assert.Equal(t, false, errs.IsEmpty()) // Create new ErrorSet with errors errs2 := ErrorSet{errors.New("error 1"), errors.New("error 2")} - assert.Equal(t, errs2.IsEmpty(), false) + assert.Equal(t, false, errs2.IsEmpty()) } func TestErrorSetJoin(t *testing.T) { @@ -97,26 +97,26 @@ func TestErrorSetJoin(t *testing.T) { // Empty ErrorSet result := errs.Join(", ") - assert.Equal(t, result, "") + assert.Equal(t, "", result) // Single error errs.Add(errors.New("error 1")) result = errs.Join(", ") - assert.Equal(t, result, "error 1") + assert.Equal(t, "error 1", result) // Multiple errors with comma separator errs.Add(errors.New("error 2")) errs.Add(errors.New("error 3")) result = errs.Join(", ") - assert.Equal(t, result, "error 1, error 2, error 3") + assert.Equal(t, "error 1, error 2, error 3", result) // Multiple errors with different separator result = errs.Join(" | ") - assert.Equal(t, result, "error 1 | error 2 | error 3") + assert.Equal(t, "error 1 | error 2 | error 3", result) // Multiple errors with newline separator result = errs.Join("\n") - assert.Equal(t, result, "error 1\nerror 2\nerror 3") + assert.Equal(t, "error 1\nerror 2\nerror 3", result) } func TestErrorSetJoinedError(t *testing.T) { @@ -124,18 +124,18 @@ func TestErrorSetJoinedError(t *testing.T) { // Empty ErrorSet joined := errs.JoinedError(", ") - assert.Equal(t, joined.Error(), "") + assert.Equal(t, "", joined.Error()) // Single error errs.Add(errors.New("error 1")) joined = errs.JoinedError(", ") - assert.Equal(t, joined.Error(), "error 1") + assert.Equal(t, "error 1", joined.Error()) // Multiple errors errs.Add(errors.New("error 2")) errs.Add(errors.New("error 3")) joined = errs.JoinedError("; ") - assert.Equal(t, joined.Error(), "error 1; error 2; error 3") + assert.Equal(t, "error 1; error 2; error 3", joined.Error()) } func TestJoinedErrorError(t *testing.T) { @@ -144,14 +144,14 @@ func TestJoinedErrorError(t *testing.T) { errs: []error{errors.New("error 1"), errors.New("error 2")}, separator: " - ", } - assert.Equal(t, je.Error(), "error 1 - error 2") + assert.Equal(t, "error 1 - error 2", je.Error()) // Empty error list je2 := joinedError{ errs: []error{}, separator: ", ", } - assert.Equal(t, je2.Error(), "") + assert.Equal(t, "", je2.Error()) } func TestJoinedErrorUnwrap(t *testing.T) { @@ -168,16 +168,16 @@ func TestJoinedErrorUnwrap(t *testing.T) { // Unwrap should return the original errors unwrapped := joined.(interface{ Unwrap() []error }).Unwrap() - assert.Equal(t, len(unwrapped), 3) - assert.Equal(t, unwrapped[0], err1) - assert.Equal(t, unwrapped[1], err2) - assert.Equal(t, unwrapped[2], err3) + assert.Equal(t, 3, len(unwrapped)) + assert.Equal(t, err1, unwrapped[0]) + assert.Equal(t, err2, unwrapped[1]) + assert.Equal(t, err3, unwrapped[2]) // Test with errors.Is and errors.As - assert.Equal(t, errors.Is(joined, err1), true) - assert.Equal(t, errors.Is(joined, err2), true) - assert.Equal(t, errors.Is(joined, err3), true) - assert.Equal(t, errors.Is(joined, errors.New("different error")), false) + assert.Equal(t, true, errors.Is(joined, err1)) + assert.Equal(t, true, errors.Is(joined, err2)) + assert.Equal(t, true, errors.Is(joined, err3)) + assert.Equal(t, false, errors.Is(joined, errors.New("different error"))) } func TestErrorSetLogFatalIfError(t *testing.T) { @@ -211,14 +211,14 @@ func TestErrorSetIntegration(t *testing.T) { var errs ErrorSet // Start empty - assert.Equal(t, errs.IsEmpty(), true) + assert.Equal(t, true, errs.IsEmpty()) // Add some errors using different methods errs.Add(errors.New("error 1")) errs.Addf("error %d", 2) - assert.Equal(t, errs.IsEmpty(), false) - assert.Equal(t, len(errs), 2) + assert.Equal(t, false, errs.IsEmpty()) + assert.Equal(t, 2, len(errs)) // Create another ErrorSet and append var moreErrs ErrorSet @@ -226,16 +226,16 @@ func TestErrorSetIntegration(t *testing.T) { moreErrs.Addf("error %d", 4) errs.Append(moreErrs) - assert.Equal(t, len(errs), 4) + assert.Equal(t, 4, len(errs)) // Test Join result := errs.Join(" | ") - assert.Equal(t, result, "error 1 | error 2 | error 3 | error 4") + assert.Equal(t, "error 1 | error 2 | error 3 | error 4", result) // Test JoinedError and Unwrap joined := errs.JoinedError("; ") - assert.Equal(t, joined.Error(), "error 1; error 2; error 3; error 4") + assert.Equal(t, "error 1; error 2; error 3; error 4", joined.Error()) unwrapped := joined.(interface{ Unwrap() []error }).Unwrap() - assert.Equal(t, len(unwrapped), 4) + assert.Equal(t, 4, len(unwrapped)) } From 20957575bb1b6f5b8e4f353720c1c0e46f720c86 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 15:00:04 +0000 Subject: [PATCH 5/7] Correct assert.Equal parameter order per review feedback Co-authored-by: SuperSandro2000 <7258858+SuperSandro2000@users.noreply.github.com> --- errext/errorset_test.go | 92 ++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/errext/errorset_test.go b/errext/errorset_test.go index febd22f..f480976 100644 --- a/errext/errorset_test.go +++ b/errext/errorset_test.go @@ -16,23 +16,23 @@ func TestErrorSetAdd(t *testing.T) { // Add nil error - should not be added errs.Add(nil) - assert.Equal(t, 0, len(errs)) + assert.Equal(t, len(errs), 0) // Add non-nil error err1 := errors.New("error 1") errs.Add(err1) - assert.Equal(t, 1, len(errs)) - assert.Equal(t, "error 1", errs[0].Error()) + assert.Equal(t, len(errs), 1) + assert.Equal(t, errs[0].Error(), "error 1") // Add another non-nil error err2 := errors.New("error 2") errs.Add(err2) - assert.Equal(t, 2, len(errs)) - assert.Equal(t, "error 2", errs[1].Error()) + assert.Equal(t, len(errs), 2) + assert.Equal(t, errs[1].Error(), "error 2") // Add nil error again - should not be added errs.Add(nil) - assert.Equal(t, 2, len(errs)) + assert.Equal(t, len(errs), 2) } func TestErrorSetAddf(t *testing.T) { @@ -40,18 +40,18 @@ func TestErrorSetAddf(t *testing.T) { // Add formatted error errs.Addf("error with number: %d", 42) - assert.Equal(t, 1, len(errs)) - assert.Equal(t, "error with number: 42", errs[0].Error()) + assert.Equal(t, len(errs), 1) + assert.Equal(t, errs[0].Error(), "error with number: 42") // Add another formatted error errs.Addf("error with string: %s", "test") - assert.Equal(t, 2, len(errs)) - assert.Equal(t, "error with string: test", errs[1].Error()) + assert.Equal(t, len(errs), 2) + assert.Equal(t, errs[1].Error(), "error with string: test") // Add formatted error without parameters errs.Addf("simple error") - assert.Equal(t, 3, len(errs)) - assert.Equal(t, "simple error", errs[2].Error()) + assert.Equal(t, len(errs), 3) + assert.Equal(t, errs[2].Error(), "simple error") } func TestErrorSetAppend(t *testing.T) { @@ -65,31 +65,31 @@ func TestErrorSetAppend(t *testing.T) { // Append errs2 to errs1 errs1.Append(errs2) - assert.Equal(t, 4, len(errs1)) - assert.Equal(t, "error 1", errs1[0].Error()) - assert.Equal(t, "error 2", errs1[1].Error()) - assert.Equal(t, "error 3", errs1[2].Error()) - assert.Equal(t, "error 4", errs1[3].Error()) + assert.Equal(t, len(errs1), 4) + assert.Equal(t, errs1[0].Error(), "error 1") + assert.Equal(t, errs1[1].Error(), "error 2") + assert.Equal(t, errs1[2].Error(), "error 3") + assert.Equal(t, errs1[3].Error(), "error 4") // Append empty ErrorSet var errs3 ErrorSet errs1.Append(errs3) - assert.Equal(t, 4, len(errs1)) + assert.Equal(t, len(errs1), 4) } func TestErrorSetIsEmpty(t *testing.T) { var errs ErrorSet // Empty ErrorSet - assert.Equal(t, true, errs.IsEmpty()) + assert.Equal(t, errs.IsEmpty(), true) // Add an error errs.Add(errors.New("error")) - assert.Equal(t, false, errs.IsEmpty()) + assert.Equal(t, errs.IsEmpty(), false) // Create new ErrorSet with errors errs2 := ErrorSet{errors.New("error 1"), errors.New("error 2")} - assert.Equal(t, false, errs2.IsEmpty()) + assert.Equal(t, errs2.IsEmpty(), false) } func TestErrorSetJoin(t *testing.T) { @@ -97,26 +97,26 @@ func TestErrorSetJoin(t *testing.T) { // Empty ErrorSet result := errs.Join(", ") - assert.Equal(t, "", result) + assert.Equal(t, result, "") // Single error errs.Add(errors.New("error 1")) result = errs.Join(", ") - assert.Equal(t, "error 1", result) + assert.Equal(t, result, "error 1") // Multiple errors with comma separator errs.Add(errors.New("error 2")) errs.Add(errors.New("error 3")) result = errs.Join(", ") - assert.Equal(t, "error 1, error 2, error 3", result) + assert.Equal(t, result, "error 1, error 2, error 3") // Multiple errors with different separator result = errs.Join(" | ") - assert.Equal(t, "error 1 | error 2 | error 3", result) + assert.Equal(t, result, "error 1 | error 2 | error 3") // Multiple errors with newline separator result = errs.Join("\n") - assert.Equal(t, "error 1\nerror 2\nerror 3", result) + assert.Equal(t, result, "error 1\nerror 2\nerror 3") } func TestErrorSetJoinedError(t *testing.T) { @@ -124,18 +124,18 @@ func TestErrorSetJoinedError(t *testing.T) { // Empty ErrorSet joined := errs.JoinedError(", ") - assert.Equal(t, "", joined.Error()) + assert.Equal(t, joined.Error(), "") // Single error errs.Add(errors.New("error 1")) joined = errs.JoinedError(", ") - assert.Equal(t, "error 1", joined.Error()) + assert.Equal(t, joined.Error(), "error 1") // Multiple errors errs.Add(errors.New("error 2")) errs.Add(errors.New("error 3")) joined = errs.JoinedError("; ") - assert.Equal(t, "error 1; error 2; error 3", joined.Error()) + assert.Equal(t, joined.Error(), "error 1; error 2; error 3") } func TestJoinedErrorError(t *testing.T) { @@ -144,14 +144,14 @@ func TestJoinedErrorError(t *testing.T) { errs: []error{errors.New("error 1"), errors.New("error 2")}, separator: " - ", } - assert.Equal(t, "error 1 - error 2", je.Error()) + assert.Equal(t, je.Error(), "error 1 - error 2") // Empty error list je2 := joinedError{ errs: []error{}, separator: ", ", } - assert.Equal(t, "", je2.Error()) + assert.Equal(t, je2.Error(), "") } func TestJoinedErrorUnwrap(t *testing.T) { @@ -168,16 +168,16 @@ func TestJoinedErrorUnwrap(t *testing.T) { // Unwrap should return the original errors unwrapped := joined.(interface{ Unwrap() []error }).Unwrap() - assert.Equal(t, 3, len(unwrapped)) - assert.Equal(t, err1, unwrapped[0]) - assert.Equal(t, err2, unwrapped[1]) - assert.Equal(t, err3, unwrapped[2]) + assert.Equal(t, len(unwrapped), 3) + assert.Equal(t, unwrapped[0], err1) + assert.Equal(t, unwrapped[1], err2) + assert.Equal(t, unwrapped[2], err3) // Test with errors.Is and errors.As - assert.Equal(t, true, errors.Is(joined, err1)) - assert.Equal(t, true, errors.Is(joined, err2)) - assert.Equal(t, true, errors.Is(joined, err3)) - assert.Equal(t, false, errors.Is(joined, errors.New("different error"))) + assert.Equal(t, errors.Is(joined, err1), true) + assert.Equal(t, errors.Is(joined, err2), true) + assert.Equal(t, errors.Is(joined, err3), true) + assert.Equal(t, errors.Is(joined, errors.New("different error")), false) } func TestErrorSetLogFatalIfError(t *testing.T) { @@ -211,14 +211,14 @@ func TestErrorSetIntegration(t *testing.T) { var errs ErrorSet // Start empty - assert.Equal(t, true, errs.IsEmpty()) + assert.Equal(t, errs.IsEmpty(), true) // Add some errors using different methods errs.Add(errors.New("error 1")) errs.Addf("error %d", 2) - assert.Equal(t, false, errs.IsEmpty()) - assert.Equal(t, 2, len(errs)) + assert.Equal(t, errs.IsEmpty(), false) + assert.Equal(t, len(errs), 2) // Create another ErrorSet and append var moreErrs ErrorSet @@ -226,16 +226,16 @@ func TestErrorSetIntegration(t *testing.T) { moreErrs.Addf("error %d", 4) errs.Append(moreErrs) - assert.Equal(t, 4, len(errs)) + assert.Equal(t, len(errs), 4) // Test Join result := errs.Join(" | ") - assert.Equal(t, "error 1 | error 2 | error 3 | error 4", result) + assert.Equal(t, result, "error 1 | error 2 | error 3 | error 4") // Test JoinedError and Unwrap joined := errs.JoinedError("; ") - assert.Equal(t, "error 1; error 2; error 3; error 4", joined.Error()) + assert.Equal(t, joined.Error(), "error 1; error 2; error 3; error 4") unwrapped := joined.(interface{ Unwrap() []error }).Unwrap() - assert.Equal(t, 4, len(unwrapped)) + assert.Equal(t, len(unwrapped), 4) } From e68de7d003a9c6d761075125355522f08c4f112a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 7 Nov 2025 15:37:47 +0000 Subject: [PATCH 6/7] Remove direct Unwrap() testing, rely on errors.Is() instead Co-authored-by: SuperSandro2000 <7258858+SuperSandro2000@users.noreply.github.com> --- errext/errorset_test.go | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/errext/errorset_test.go b/errext/errorset_test.go index f480976..abf75c3 100644 --- a/errext/errorset_test.go +++ b/errext/errorset_test.go @@ -166,14 +166,7 @@ func TestJoinedErrorUnwrap(t *testing.T) { joined := errs.JoinedError(", ") - // Unwrap should return the original errors - unwrapped := joined.(interface{ Unwrap() []error }).Unwrap() - assert.Equal(t, len(unwrapped), 3) - assert.Equal(t, unwrapped[0], err1) - assert.Equal(t, unwrapped[1], err2) - assert.Equal(t, unwrapped[2], err3) - - // Test with errors.Is and errors.As + // Test that errors.Is correctly identifies wrapped errors assert.Equal(t, errors.Is(joined, err1), true) assert.Equal(t, errors.Is(joined, err2), true) assert.Equal(t, errors.Is(joined, err3), true) @@ -232,10 +225,7 @@ func TestErrorSetIntegration(t *testing.T) { result := errs.Join(" | ") assert.Equal(t, result, "error 1 | error 2 | error 3 | error 4") - // Test JoinedError and Unwrap + // Test JoinedError joined := errs.JoinedError("; ") assert.Equal(t, joined.Error(), "error 1; error 2; error 3; error 4") - - unwrapped := joined.(interface{ Unwrap() []error }).Unwrap() - assert.Equal(t, len(unwrapped), 4) } From 3eca88b3d8754073fa2fd4c4afdc945a3ab520e6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 14 Nov 2025 16:15:19 +0000 Subject: [PATCH 7/7] Rename test helper function for clarity Co-authored-by: SuperSandro2000 <7258858+SuperSandro2000@users.noreply.github.com> --- errext/errorset_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/errext/errorset_test.go b/errext/errorset_test.go index abf75c3..868d272 100644 --- a/errext/errorset_test.go +++ b/errext/errorset_test.go @@ -180,10 +180,10 @@ func TestErrorSetLogFatalIfError(t *testing.T) { // on empty ErrorSet. In a real scenario, this would not call os.Exit. // Note: We cannot fully test LogFatalIfError as it calls os.Exit(1) // For an empty ErrorSet, it should complete without exiting - testLogFatalWithEmptyErrorSet(emptyErrs) + helperLogFatalIfErrorWithEmptySet(emptyErrs) } -func testLogFatalWithEmptyErrorSet(errs ErrorSet) { +func helperLogFatalIfErrorWithEmptySet(errs ErrorSet) { // This function is a helper to test that LogFatalIfError doesn't panic // on empty ErrorSet. We cannot test the actual exit behavior. defer func() {