1// Copyright 2022 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package errors_test
6
7import (
8	"errors"
9	"reflect"
10	"testing"
11)
12
13func TestJoinReturnsNil(t *testing.T) {
14	if err := errors.Join(); err != nil {
15		t.Errorf("errors.Join() = %v, want nil", err)
16	}
17	if err := errors.Join(nil); err != nil {
18		t.Errorf("errors.Join(nil) = %v, want nil", err)
19	}
20	if err := errors.Join(nil, nil); err != nil {
21		t.Errorf("errors.Join(nil, nil) = %v, want nil", err)
22	}
23}
24
25func TestJoin(t *testing.T) {
26	err1 := errors.New("err1")
27	err2 := errors.New("err2")
28	for _, test := range []struct {
29		errs []error
30		want []error
31	}{{
32		errs: []error{err1},
33		want: []error{err1},
34	}, {
35		errs: []error{err1, err2},
36		want: []error{err1, err2},
37	}, {
38		errs: []error{err1, nil, err2},
39		want: []error{err1, err2},
40	}} {
41		got := errors.Join(test.errs...).(interface{ Unwrap() []error }).Unwrap()
42		if !reflect.DeepEqual(got, test.want) {
43			t.Errorf("Join(%v) = %v; want %v", test.errs, got, test.want)
44		}
45		if len(got) != cap(got) {
46			t.Errorf("Join(%v) returns errors with len=%v, cap=%v; want len==cap", test.errs, len(got), cap(got))
47		}
48	}
49}
50
51func TestJoinErrorMethod(t *testing.T) {
52	err1 := errors.New("err1")
53	err2 := errors.New("err2")
54	for _, test := range []struct {
55		errs []error
56		want string
57	}{{
58		errs: []error{err1},
59		want: "err1",
60	}, {
61		errs: []error{err1, err2},
62		want: "err1\nerr2",
63	}, {
64		errs: []error{err1, nil, err2},
65		want: "err1\nerr2",
66	}} {
67		got := errors.Join(test.errs...).Error()
68		if got != test.want {
69			t.Errorf("Join(%v).Error() = %q; want %q", test.errs, got, test.want)
70		}
71	}
72}
73