diff options
Diffstat (limited to '')
-rw-r--r-- | dependencies/pkg/mod/go.uber.org/multierr@v1.6.0/go113_test.go | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/dependencies/pkg/mod/go.uber.org/multierr@v1.6.0/go113_test.go b/dependencies/pkg/mod/go.uber.org/multierr@v1.6.0/go113_test.go new file mode 100644 index 0000000..4fbd0bb --- /dev/null +++ b/dependencies/pkg/mod/go.uber.org/multierr@v1.6.0/go113_test.go @@ -0,0 +1,144 @@ +// Copyright (c) 2019 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +// +build go1.13 + +package multierr_test + +import ( + "errors" + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/multierr" +) + +type errGreatSadness struct{ id int } + +func (errGreatSadness) Error() string { + return "great sadness" +} + +type errUnprecedentedFailure struct{ id int } + +func (errUnprecedentedFailure) Error() string { + return "unprecedented failure" +} + +func (e errUnprecedentedFailure) Unwrap() error { + return errRootCause{e.id} +} + +type errRootCause struct{ i int } + +func (errRootCause) Error() string { + return "root cause" +} + +func TestErrorsWrapping(t *testing.T) { + err := multierr.Append( + errGreatSadness{42}, + errUnprecedentedFailure{43}, + ) + + t.Run("left", func(t *testing.T) { + t.Run("As", func(t *testing.T) { + var got errGreatSadness + require.True(t, errors.As(err, &got)) + assert.Equal(t, 42, got.id) + }) + + t.Run("Is", func(t *testing.T) { + assert.False(t, errors.Is(err, errGreatSadness{41})) + assert.True(t, errors.Is(err, errGreatSadness{42})) + }) + }) + + t.Run("right", func(t *testing.T) { + t.Run("As", func(t *testing.T) { + var got errUnprecedentedFailure + require.True(t, errors.As(err, &got)) + assert.Equal(t, 43, got.id) + }) + + t.Run("Is", func(t *testing.T) { + assert.False(t, errors.Is(err, errUnprecedentedFailure{42})) + assert.True(t, errors.Is(err, errUnprecedentedFailure{43})) + }) + }) + + t.Run("top-level", func(t *testing.T) { + t.Run("As", func(t *testing.T) { + var got interface{ Errors() []error } + require.True(t, errors.As(err, &got)) + assert.Len(t, got.Errors(), 2) + }) + + t.Run("Is", func(t *testing.T) { + assert.True(t, errors.Is(err, err)) + }) + }) + + t.Run("root cause", func(t *testing.T) { + t.Run("As", func(t *testing.T) { + var got errRootCause + require.True(t, errors.As(err, &got)) + assert.Equal(t, 43, got.i) + }) + + t.Run("Is", func(t *testing.T) { + assert.False(t, errors.Is(err, errRootCause{42})) + assert.True(t, errors.Is(err, errRootCause{43})) + }) + }) + + t.Run("mismatch", func(t *testing.T) { + t.Run("As", func(t *testing.T) { + var got *os.PathError + assert.False(t, errors.As(err, &got)) + }) + + t.Run("Is", func(t *testing.T) { + assert.False(t, errors.Is(err, errors.New("great sadness"))) + }) + }) +} + +func TestErrorsWrappingSameType(t *testing.T) { + err := multierr.Combine( + errGreatSadness{1}, + errGreatSadness{2}, + errGreatSadness{3}, + ) + + t.Run("As returns first", func(t *testing.T) { + var got errGreatSadness + require.True(t, errors.As(err, &got)) + assert.Equal(t, 1, got.id) + }) + + t.Run("Is matches all", func(t *testing.T) { + assert.True(t, errors.Is(err, errGreatSadness{1})) + assert.True(t, errors.Is(err, errGreatSadness{2})) + assert.True(t, errors.Is(err, errGreatSadness{3})) + }) +} |