| package gbytes_test | 
 |  | 
 | import ( | 
 | 	"io" | 
 | 	"time" | 
 |  | 
 | 	. "github.com/onsi/gomega/gbytes" | 
 |  | 
 | 	. "github.com/onsi/ginkgo" | 
 | 	. "github.com/onsi/gomega" | 
 | ) | 
 |  | 
 | var _ = Describe("Buffer", func() { | 
 | 	var buffer *Buffer | 
 |  | 
 | 	BeforeEach(func() { | 
 | 		buffer = NewBuffer() | 
 | 	}) | 
 |  | 
 | 	Describe("dumping the entire contents of the buffer", func() { | 
 | 		It("should return everything that's been written", func() { | 
 | 			buffer.Write([]byte("abc")) | 
 | 			buffer.Write([]byte("def")) | 
 | 			Ω(buffer.Contents()).Should(Equal([]byte("abcdef"))) | 
 |  | 
 | 			Ω(buffer).Should(Say("bcd")) | 
 | 			Ω(buffer.Contents()).Should(Equal([]byte("abcdef"))) | 
 | 		}) | 
 | 	}) | 
 |  | 
 | 	Describe("creating a buffer with bytes", func() { | 
 | 		It("should create the buffer with the cursor set to the beginning", func() { | 
 | 			buffer := BufferWithBytes([]byte("abcdef")) | 
 | 			Ω(buffer.Contents()).Should(Equal([]byte("abcdef"))) | 
 | 			Ω(buffer).Should(Say("abc")) | 
 | 			Ω(buffer).ShouldNot(Say("abc")) | 
 | 			Ω(buffer).Should(Say("def")) | 
 | 		}) | 
 | 	}) | 
 |  | 
 | 	Describe("reading from a buffer", func() { | 
 | 		It("should read the current contents of the buffer", func() { | 
 | 			buffer := BufferWithBytes([]byte("abcde")) | 
 |  | 
 | 			dest := make([]byte, 3) | 
 | 			n, err := buffer.Read(dest) | 
 | 			Ω(err).ShouldNot(HaveOccurred()) | 
 | 			Ω(n).Should(Equal(3)) | 
 | 			Ω(string(dest)).Should(Equal("abc")) | 
 |  | 
 | 			dest = make([]byte, 3) | 
 | 			n, err = buffer.Read(dest) | 
 | 			Ω(err).ShouldNot(HaveOccurred()) | 
 | 			Ω(n).Should(Equal(2)) | 
 | 			Ω(string(dest[:n])).Should(Equal("de")) | 
 |  | 
 | 			n, err = buffer.Read(dest) | 
 | 			Ω(err).Should(Equal(io.EOF)) | 
 | 			Ω(n).Should(Equal(0)) | 
 | 		}) | 
 |  | 
 | 		Context("after the buffer has been closed", func() { | 
 | 			It("returns an error", func() { | 
 | 				buffer := BufferWithBytes([]byte("abcde")) | 
 |  | 
 | 				buffer.Close() | 
 |  | 
 | 				dest := make([]byte, 3) | 
 | 				n, err := buffer.Read(dest) | 
 | 				Ω(err).Should(HaveOccurred()) | 
 | 				Ω(n).Should(Equal(0)) | 
 | 			}) | 
 | 		}) | 
 | 	}) | 
 |  | 
 | 	Describe("detecting regular expressions", func() { | 
 | 		It("should fire the appropriate channel when the passed in pattern matches, then close it", func(done Done) { | 
 | 			go func() { | 
 | 				time.Sleep(10 * time.Millisecond) | 
 | 				buffer.Write([]byte("abcde")) | 
 | 			}() | 
 |  | 
 | 			A := buffer.Detect("%s", "a.c") | 
 | 			B := buffer.Detect("def") | 
 |  | 
 | 			var gotIt bool | 
 | 			select { | 
 | 			case gotIt = <-A: | 
 | 			case <-B: | 
 | 				Fail("should not have gotten here") | 
 | 			} | 
 |  | 
 | 			Ω(gotIt).Should(BeTrue()) | 
 | 			Eventually(A).Should(BeClosed()) | 
 |  | 
 | 			buffer.Write([]byte("f")) | 
 | 			Eventually(B).Should(Receive()) | 
 | 			Eventually(B).Should(BeClosed()) | 
 |  | 
 | 			close(done) | 
 | 		}) | 
 |  | 
 | 		It("should fast-forward the buffer upon detection", func(done Done) { | 
 | 			buffer.Write([]byte("abcde")) | 
 | 			<-buffer.Detect("abc") | 
 | 			Ω(buffer).ShouldNot(Say("abc")) | 
 | 			Ω(buffer).Should(Say("de")) | 
 | 			close(done) | 
 | 		}) | 
 |  | 
 | 		It("should only fast-forward the buffer when the channel is read, and only if doing so would not rewind it", func(done Done) { | 
 | 			buffer.Write([]byte("abcde")) | 
 | 			A := buffer.Detect("abc") | 
 | 			time.Sleep(20 * time.Millisecond) //give the goroutine a chance to detect and write to the channel | 
 | 			Ω(buffer).Should(Say("abcd")) | 
 | 			<-A | 
 | 			Ω(buffer).ShouldNot(Say("d")) | 
 | 			Ω(buffer).Should(Say("e")) | 
 | 			Eventually(A).Should(BeClosed()) | 
 | 			close(done) | 
 | 		}) | 
 |  | 
 | 		It("should be possible to cancel a detection", func(done Done) { | 
 | 			A := buffer.Detect("abc") | 
 | 			B := buffer.Detect("def") | 
 | 			buffer.CancelDetects() | 
 | 			buffer.Write([]byte("abcdef")) | 
 | 			Eventually(A).Should(BeClosed()) | 
 | 			Eventually(B).Should(BeClosed()) | 
 |  | 
 | 			Ω(buffer).Should(Say("bcde")) | 
 | 			<-buffer.Detect("f") | 
 | 			close(done) | 
 | 		}) | 
 | 	}) | 
 |  | 
 | 	Describe("closing the buffer", func() { | 
 | 		It("should error when further write attempts are made", func() { | 
 | 			_, err := buffer.Write([]byte("abc")) | 
 | 			Ω(err).ShouldNot(HaveOccurred()) | 
 |  | 
 | 			buffer.Close() | 
 |  | 
 | 			_, err = buffer.Write([]byte("def")) | 
 | 			Ω(err).Should(HaveOccurred()) | 
 |  | 
 | 			Ω(buffer.Contents()).Should(Equal([]byte("abc"))) | 
 | 		}) | 
 |  | 
 | 		It("should be closed", func() { | 
 | 			Ω(buffer.Closed()).Should(BeFalse()) | 
 |  | 
 | 			buffer.Close() | 
 |  | 
 | 			Ω(buffer.Closed()).Should(BeTrue()) | 
 | 		}) | 
 | 	}) | 
 | }) |