package usync import "time" import "errors" import "testing" func TestGate(test *testing.T) { gate := NewGate[int]() go func() { for number := range 21 { test.Log("send", number) gate.Send(number) } test.Log("send done") }() for correct := range 21 { got := <- gate.Receive() test.Log("RECV", correct, got) if correct != got { test.Fatal("RECV not equal") } } test.Log("RECV done") } func TestGateCloseEarly(test *testing.T) { gate := NewGate[int]() sendDone := make(chan struct { }) go func() { for number := range 21 { test.Log("send", number) gate.Send(number) } test.Log("send done") close(sendDone) }() for correct := range 15 { got := <- gate.Receive() test.Log("RECV", correct, got) if correct != got { test.Fatal("RECV not equal") } } test.Log("RECV done, closing gate... DOOR STUCK!! PLS I BEG OF YOU!!") gate.Close() test.Log("RECV closed gate yay :)))") timeout := time.NewTimer(time.Second * 4) select { case <- sendDone: case <- timeout.C: test.Fatal("timed out waiting for sender goroutine to stop") } } func TestGateCloseIdempotent(test *testing.T) { gate := NewGate[int]() err := gate.Close() if err != nil { test.Fatal(err) } err = gate.Close() if !errors.Is(err, ErrAlreadyClosed) { test.Fatal("wrong error: ", err) } }