|  | package gbytes_test | 
|  |  | 
|  | import ( | 
|  | . "github.com/onsi/gomega/gbytes" | 
|  | "time" | 
|  |  | 
|  | . "github.com/onsi/ginkgo" | 
|  | . "github.com/onsi/gomega" | 
|  | ) | 
|  |  | 
|  | type speaker struct { | 
|  | buffer *Buffer | 
|  | } | 
|  |  | 
|  | func (s *speaker) Buffer() *Buffer { | 
|  | return s.buffer | 
|  | } | 
|  |  | 
|  | var _ = Describe("SayMatcher", func() { | 
|  | var buffer *Buffer | 
|  |  | 
|  | BeforeEach(func() { | 
|  | buffer = NewBuffer() | 
|  | buffer.Write([]byte("abc")) | 
|  | }) | 
|  |  | 
|  | Context("when actual is not a gexec Buffer, or a BufferProvider", func() { | 
|  | It("should error", func() { | 
|  | failures := InterceptGomegaFailures(func() { | 
|  | Ω("foo").Should(Say("foo")) | 
|  | }) | 
|  | Ω(failures[0]).Should(ContainSubstring("*gbytes.Buffer")) | 
|  | }) | 
|  | }) | 
|  |  | 
|  | Context("when a match is found", func() { | 
|  | It("should succeed", func() { | 
|  | Ω(buffer).Should(Say("abc")) | 
|  | }) | 
|  |  | 
|  | It("should support printf-like formatting", func() { | 
|  | Ω(buffer).Should(Say("a%sc", "b")) | 
|  | }) | 
|  |  | 
|  | It("should use a regular expression", func() { | 
|  | Ω(buffer).Should(Say("a.c")) | 
|  | }) | 
|  |  | 
|  | It("should fastforward the buffer", func() { | 
|  | buffer.Write([]byte("def")) | 
|  | Ω(buffer).Should(Say("abcd")) | 
|  | Ω(buffer).Should(Say("ef")) | 
|  | Ω(buffer).ShouldNot(Say("[a-z]")) | 
|  | }) | 
|  | }) | 
|  |  | 
|  | Context("when no match is found", func() { | 
|  | It("should not error", func() { | 
|  | Ω(buffer).ShouldNot(Say("def")) | 
|  | }) | 
|  |  | 
|  | Context("when the buffer is closed", func() { | 
|  | BeforeEach(func() { | 
|  | buffer.Close() | 
|  | }) | 
|  |  | 
|  | It("should abort an eventually", func() { | 
|  | t := time.Now() | 
|  | failures := InterceptGomegaFailures(func() { | 
|  | Eventually(buffer).Should(Say("def")) | 
|  | }) | 
|  | Eventually(buffer).ShouldNot(Say("def")) | 
|  | Ω(time.Since(t)).Should(BeNumerically("<", 500*time.Millisecond)) | 
|  | Ω(failures).Should(HaveLen(1)) | 
|  |  | 
|  | t = time.Now() | 
|  | Eventually(buffer).Should(Say("abc")) | 
|  | Ω(time.Since(t)).Should(BeNumerically("<", 500*time.Millisecond)) | 
|  | }) | 
|  |  | 
|  | It("should abort a consistently", func() { | 
|  | t := time.Now() | 
|  | Consistently(buffer, 2.0).ShouldNot(Say("def")) | 
|  | Ω(time.Since(t)).Should(BeNumerically("<", 500*time.Millisecond)) | 
|  | }) | 
|  |  | 
|  | It("should not error with a synchronous matcher", func() { | 
|  | Ω(buffer).ShouldNot(Say("def")) | 
|  | Ω(buffer).Should(Say("abc")) | 
|  | }) | 
|  | }) | 
|  | }) | 
|  |  | 
|  | Context("when a positive match fails", func() { | 
|  | It("should report where it got stuck", func() { | 
|  | Ω(buffer).Should(Say("abc")) | 
|  | buffer.Write([]byte("def")) | 
|  | failures := InterceptGomegaFailures(func() { | 
|  | Ω(buffer).Should(Say("abc")) | 
|  | }) | 
|  | Ω(failures[0]).Should(ContainSubstring("Got stuck at:")) | 
|  | Ω(failures[0]).Should(ContainSubstring("def")) | 
|  | }) | 
|  | }) | 
|  |  | 
|  | Context("when a negative match fails", func() { | 
|  | It("should report where it got stuck", func() { | 
|  | failures := InterceptGomegaFailures(func() { | 
|  | Ω(buffer).ShouldNot(Say("abc")) | 
|  | }) | 
|  | Ω(failures[0]).Should(ContainSubstring("Saw:")) | 
|  | Ω(failures[0]).Should(ContainSubstring("Which matches the unexpected:")) | 
|  | Ω(failures[0]).Should(ContainSubstring("abc")) | 
|  | }) | 
|  | }) | 
|  |  | 
|  | Context("when a match is not found", func() { | 
|  | It("should not fastforward the buffer", func() { | 
|  | Ω(buffer).ShouldNot(Say("def")) | 
|  | Ω(buffer).Should(Say("abc")) | 
|  | }) | 
|  | }) | 
|  |  | 
|  | Context("a nice real-life example", func() { | 
|  | It("should behave well", func() { | 
|  | Ω(buffer).Should(Say("abc")) | 
|  | go func() { | 
|  | time.Sleep(10 * time.Millisecond) | 
|  | buffer.Write([]byte("def")) | 
|  | }() | 
|  | Ω(buffer).ShouldNot(Say("def")) | 
|  | Eventually(buffer).Should(Say("def")) | 
|  | }) | 
|  | }) | 
|  |  | 
|  | Context("when actual is a BufferProvider", func() { | 
|  | It("should use actual's buffer", func() { | 
|  | s := &speaker{ | 
|  | buffer: NewBuffer(), | 
|  | } | 
|  |  | 
|  | Ω(s).ShouldNot(Say("abc")) | 
|  |  | 
|  | s.Buffer().Write([]byte("abc")) | 
|  | Ω(s).Should(Say("abc")) | 
|  | }) | 
|  |  | 
|  | It("should abort an eventually", func() { | 
|  | s := &speaker{ | 
|  | buffer: NewBuffer(), | 
|  | } | 
|  |  | 
|  | s.buffer.Close() | 
|  |  | 
|  | t := time.Now() | 
|  | failures := InterceptGomegaFailures(func() { | 
|  | Eventually(s).Should(Say("def")) | 
|  | }) | 
|  | Ω(failures).Should(HaveLen(1)) | 
|  | Ω(time.Since(t)).Should(BeNumerically("<", 500*time.Millisecond)) | 
|  | }) | 
|  | }) | 
|  | }) |