| 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)) |
| }) |
| }) |
| }) |