package matchers_test import ( . "github.com/onsi/gomega/matchers" "time" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) var _ = Describe("BeSent", func() { Context("when passed a channel and a matching type", func() { Context("when the channel is ready to receive", func() { It("should succeed and send the value down the channel", func() { c := make(chan string) d := make(chan string) go func() { val := <-c d <- val }() time.Sleep(10 * time.Millisecond) Ω(c).Should(BeSent("foo")) Eventually(d).Should(Receive(Equal("foo"))) }) It("should succeed (with a buffered channel)", func() { c := make(chan string, 1) Ω(c).Should(BeSent("foo")) Ω(<-c).Should(Equal("foo")) }) }) Context("when the channel is not ready to receive", func() { It("should fail and not send down the channel", func() { c := make(chan string) Ω(c).ShouldNot(BeSent("foo")) Consistently(c).ShouldNot(Receive()) }) }) Context("when the channel is eventually ready to receive", func() { It("should succeed", func() { c := make(chan string) d := make(chan string) go func() { time.Sleep(30 * time.Millisecond) val := <-c d <- val }() Eventually(c).Should(BeSent("foo")) Eventually(d).Should(Receive(Equal("foo"))) }) }) Context("when the channel is closed", func() { It("should error", func() { c := make(chan string) close(c) success, err := (&BeSentMatcher{Arg: "foo"}).Match(c) Ω(success).Should(BeFalse()) Ω(err).Should(HaveOccurred()) }) It("should short-circuit Eventually", func() { c := make(chan string) close(c) t := time.Now() failures := InterceptGomegaFailures(func() { Eventually(c, 10.0).Should(BeSent("foo")) }) Ω(failures).Should(HaveLen(1)) Ω(time.Since(t)).Should(BeNumerically("<", time.Second)) }) }) }) Context("when passed a channel and a non-matching type", func() { It("should error", func() { success, err := (&BeSentMatcher{Arg: "foo"}).Match(make(chan int, 1)) Ω(success).Should(BeFalse()) Ω(err).Should(HaveOccurred()) }) }) Context("when passed a receive-only channel", func() { It("should error", func() { var c <-chan string c = make(chan string, 1) success, err := (&BeSentMatcher{Arg: "foo"}).Match(c) Ω(success).Should(BeFalse()) Ω(err).Should(HaveOccurred()) }) }) Context("when passed a nonchannel", func() { It("should error", func() { success, err := (&BeSentMatcher{Arg: "foo"}).Match("bar") Ω(success).Should(BeFalse()) Ω(err).Should(HaveOccurred()) }) }) })