package waiterr_test import ( "errors" "testing" "github.com/nalgeon/be" "codeberg.org/danjones000/waiterr" ) func TestGo(t *testing.T) { we := new(waiterr.WaitErr) err := errors.New("uh-oh") var run bool we.Go(func() error { run = true return err }) be.Err(t, we.Wait(), err) be.True(t, run) } func TestWait(t *testing.T) { we := new(waiterr.WaitErr) er1 := errors.New("uh-oh") er2 := errors.New("oops") we.Go(func() error { return er1 }) we.Go(func() error { return nil }) we.Go(func() error { return er2 }) err := we.Wait() be.Err(t, err, er1, er2) if ers, ok := err.(interface{ Unwrap() []error }); ok { all := ers.Unwrap() be.Equal(t, len(all), 2) be.True(t, all[0] == er1 || all[0] == er2) be.True(t, all[1] == er2 || all[1] == er1) } else { t.Fatal("Returned error should have Unwrap method") } } func TestWaitForError(t *testing.T) { we := new(waiterr.WaitErr) er1 := errors.New("uh-oh") er2 := errors.New("oops") we.Go(func() error { return nil }) we.Go(func() error { return er1 }) we.Go(func() error { return er2 }) err := we.WaitForError() // Due to how goroutines run, it is possible that either of those return first. This is an acceptable limitation be.True(t, err == er1 || err == er2) } func TestWaitForErrorNoErr(t *testing.T) { we := new(waiterr.WaitErr) we.Go(func() error { return nil }) we.Go(func() error { return nil }) we.Go(func() error { return nil }) err := we.WaitForError() be.Err(t, err, nil) }