| package cleanups | |
| import ( | |
| "context" | |
| "errors" | |
| "fmt" | |
| "testing" | |
| "gotest.tools/v3/assert" | |
| is "gotest.tools/v3/assert/cmp" | |
| ) | |
| func TestCall(t *testing.T) { | |
| c := Composite{} | |
| err1 := errors.New("error1") | |
| err2 := errors.New("error2") | |
| errX := errors.New("errorX") | |
| errY := errors.New("errorY") | |
| errZ := errors.New("errorZ") | |
| errYZ := errors.Join(errY, errZ) | |
| c.Add(func(ctx context.Context) error { | |
| return err1 | |
| }) | |
| c.Add(func(ctx context.Context) error { | |
| return nil | |
| }) | |
| c.Add(func(ctx context.Context) error { | |
| return fmt.Errorf("something happened: %w", err2) | |
| }) | |
| c.Add(func(ctx context.Context) error { | |
| return errors.Join(errX, fmt.Errorf("joined: %w", errYZ)) | |
| }) | |
| err := c.Call(context.Background()) | |
| errs := err.(interface{ Unwrap() []error }).Unwrap() | |
| assert.Check(t, is.ErrorContains(err, err1.Error())) | |
| assert.Check(t, is.ErrorContains(err, err2.Error())) | |
| assert.Check(t, is.ErrorContains(err, errX.Error())) | |
| assert.Check(t, is.ErrorContains(err, errY.Error())) | |
| assert.Check(t, is.ErrorContains(err, errZ.Error())) | |
| assert.Check(t, is.ErrorContains(err, "something happened: "+err2.Error())) | |
| t.Log(err) | |
| assert.Assert(t, is.Len(errs, 3)) | |
| // Cleanups executed in reverse order. | |
| assert.Check(t, is.ErrorIs(errs[2], err1)) | |
| assert.Check(t, is.ErrorIs(errs[1], err2)) | |
| assert.Check(t, is.ErrorIs(errs[0], errX)) | |
| assert.Check(t, is.ErrorIs(errs[0], errYZ)) | |
| } |