// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package errors_test import ( "errors" "reflect" "testing" ) func TestJoinReturnsNil(t *testing.T) { if err := errors.Join(); err != nil { t.Errorf("errors.Join() = %v, want nil", err) } if err := errors.Join(nil); err != nil { t.Errorf("errors.Join(nil) = %v, want nil", err) } if err := errors.Join(nil, nil); err != nil { t.Errorf("errors.Join(nil, nil) = %v, want nil", err) } } func TestJoin(t *testing.T) { err1 := errors.New("err1") err2 := errors.New("err2") for _, test := range []struct { errs []error want []error }{{ errs: []error{err1}, want: []error{err1}, }, { errs: []error{err1, err2}, want: []error{err1, err2}, }, { errs: []error{err1, nil, err2}, want: []error{err1, err2}, }} { got := errors.Join(test.errs...).(interface{ Unwrap() []error }).Unwrap() if !reflect.DeepEqual(got, test.want) { t.Errorf("Join(%v) = %v; want %v", test.errs, got, test.want) } if len(got) != cap(got) { t.Errorf("Join(%v) returns errors with len=%v, cap=%v; want len==cap", test.errs, len(got), cap(got)) } } } func TestJoinErrorMethod(t *testing.T) { err1 := errors.New("err1") err2 := errors.New("err2") for _, test := range []struct { errs []error want string }{{ errs: []error{err1}, want: "err1", }, { errs: []error{err1, err2}, want: "err1\nerr2", }, { errs: []error{err1, nil, err2}, want: "err1\nerr2", }} { got := errors.Join(test.errs...).Error() if got != test.want { t.Errorf("Join(%v).Error() = %q; want %q", test.errs, got, test.want) } } } func BenchmarkJoin(b *testing.B) { for _, bb := range []struct { name string errs []error }{ { name: "no error", }, { name: "single non-nil error", errs: []error{errors.New("err")}, }, { name: "multiple errors", errs: []error{errors.New("err"), errors.New("newerr"), errors.New("newerr2")}, }, { name: "unwrappable single error", errs: []error{errors.Join(errors.New("err"))}, }, { name: "nil first error", errs: []error{nil, errors.New("newerr")}, }, } { b.Run(bb.name, func(b *testing.B) { b.ReportAllocs() for i := 0; i < b.N; i++ { _ = errors.Join(bb.errs...) } }) } }