package gbytes_test

import (
	"time"
	. "github.com/onsi/gomega/gbytes"

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