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