diff options
-rw-r--r-- | src/gobang.go | 19 | ||||
-rw-r--r-- | tests/gobang.go | 29 |
2 files changed, 48 insertions, 0 deletions
diff --git a/src/gobang.go b/src/gobang.go index dd638f2..a35a57e 100644 --- a/src/gobang.go +++ b/src/gobang.go @@ -71,6 +71,25 @@ func ValidateSQLTablePrefix(prefix string) error { return nil } +func WrapErrors(errs ...error) error { + slices.Reverse(errs) + var out error + for _, err := range errs { + if err != nil { + if out == nil { + out = err + } else { + out = fmt.Errorf( + "error %w on top of %w", + err, + out, + ) + } + } + } + return out +} + func SomeError(errs ...error) error { for _, err := range errs { if err != nil { diff --git a/tests/gobang.go b/tests/gobang.go index be33eb4..9d42ca9 100644 --- a/tests/gobang.go +++ b/tests/gobang.go @@ -3,6 +3,7 @@ package gobang import ( "encoding/json" "errors" + "fmt" "log/slog" "os" "strings" @@ -48,6 +49,32 @@ func test_ValidateSQLTablePrefix() { }) } +func test_WrapErrors() { + TestStart("WrapErrors()") + + Testing("nil for empty args", func() { + TAssertEqual(WrapErrors(), nil) + }) + + Testing("nil when all args are nil", func() { + TAssertEqual(WrapErrors(nil, nil, nil), nil) + }) + + Testing("if only 1 is an error, return it", func() { + err := errors.New("my error") + TAssertEqual(WrapErrors(nil, nil, err), err) + }) + + Testing("otherwise wrap them, from right to left", func() { + err1 := errors.New("error 1") + err2 := errors.New("error 2") + expected1 := fmt.Errorf("error %w on top of %w", err1, err2) + expected2 := fmt.Errorf("error %w on top of %w", err2, err1) + TAssertEqual(WrapErrors(nil, err1, nil, err2), expected1) + TAssertEqual(WrapErrors(err2, nil, nil, err1), expected2) + }) +} + func test_SomeError() { TestStart("SomeError()") @@ -763,8 +790,10 @@ func test_setHostname() { } + func MainTest() { test_ValidateSQLTablePrefix() + test_WrapErrors() test_SomeError() test_SomeFnError() test_Random() |