package assertion_test

import (
	"errors"

	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
	. "github.com/onsi/gomega/internal/assertion"
	"github.com/onsi/gomega/internal/fakematcher"
)

var _ = Describe("Assertion", func() {
	var (
		a                 *Assertion
		failureMessage    string
		failureCallerSkip int
		matcher           *fakematcher.FakeMatcher
	)

	input := "The thing I'm testing"

	var fakeFailHandler = func(message string, callerSkip ...int) {
		failureMessage = message
		if len(callerSkip) == 1 {
			failureCallerSkip = callerSkip[0]
		}
	}

	BeforeEach(func() {
		matcher = &fakematcher.FakeMatcher{}
		failureMessage = ""
		failureCallerSkip = 0
		a = New(input, fakeFailHandler, 1)
	})

	Context("when called", func() {
		It("should pass the provided input value to the matcher", func() {
			a.Should(matcher)

			Ω(matcher.ReceivedActual).Should(Equal(input))
			matcher.ReceivedActual = ""

			a.ShouldNot(matcher)

			Ω(matcher.ReceivedActual).Should(Equal(input))
			matcher.ReceivedActual = ""

			a.To(matcher)

			Ω(matcher.ReceivedActual).Should(Equal(input))
			matcher.ReceivedActual = ""

			a.ToNot(matcher)

			Ω(matcher.ReceivedActual).Should(Equal(input))
			matcher.ReceivedActual = ""

			a.NotTo(matcher)

			Ω(matcher.ReceivedActual).Should(Equal(input))
		})
	})

	Context("when the matcher succeeds", func() {
		BeforeEach(func() {
			matcher.MatchesToReturn = true
			matcher.ErrToReturn = nil
		})

		Context("and a positive assertion is being made", func() {
			It("should not call the failure callback", func() {
				a.Should(matcher)
				Ω(failureMessage).Should(Equal(""))
			})

			It("should be true", func() {
				Ω(a.Should(matcher)).Should(BeTrue())
			})
		})

		Context("and a negative assertion is being made", func() {
			It("should call the failure callback", func() {
				a.ShouldNot(matcher)
				Ω(failureMessage).Should(Equal("negative: The thing I'm testing"))
				Ω(failureCallerSkip).Should(Equal(3))
			})

			It("should be false", func() {
				Ω(a.ShouldNot(matcher)).Should(BeFalse())
			})
		})
	})

	Context("when the matcher fails", func() {
		BeforeEach(func() {
			matcher.MatchesToReturn = false
			matcher.ErrToReturn = nil
		})

		Context("and a positive assertion is being made", func() {
			It("should call the failure callback", func() {
				a.Should(matcher)
				Ω(failureMessage).Should(Equal("positive: The thing I'm testing"))
				Ω(failureCallerSkip).Should(Equal(3))
			})

			It("should be false", func() {
				Ω(a.Should(matcher)).Should(BeFalse())
			})
		})

		Context("and a negative assertion is being made", func() {
			It("should not call the failure callback", func() {
				a.ShouldNot(matcher)
				Ω(failureMessage).Should(Equal(""))
			})

			It("should be true", func() {
				Ω(a.ShouldNot(matcher)).Should(BeTrue())
			})
		})
	})

	Context("When reporting a failure", func() {
		BeforeEach(func() {
			matcher.MatchesToReturn = false
			matcher.ErrToReturn = nil
		})

		Context("and there is an optional description", func() {
			It("should append the description to the failure message", func() {
				a.Should(matcher, "A description")
				Ω(failureMessage).Should(Equal("A description\npositive: The thing I'm testing"))
				Ω(failureCallerSkip).Should(Equal(3))
			})
		})

		Context("and there are multiple arguments to the optional description", func() {
			It("should append the formatted description to the failure message", func() {
				a.Should(matcher, "A description of [%d]", 3)
				Ω(failureMessage).Should(Equal("A description of [3]\npositive: The thing I'm testing"))
				Ω(failureCallerSkip).Should(Equal(3))
			})
		})
	})

	Context("When the matcher returns an error", func() {
		BeforeEach(func() {
			matcher.ErrToReturn = errors.New("Kaboom!")
		})

		Context("and a positive assertion is being made", func() {
			It("should call the failure callback", func() {
				matcher.MatchesToReturn = true
				a.Should(matcher)
				Ω(failureMessage).Should(Equal("Kaboom!"))
				Ω(failureCallerSkip).Should(Equal(3))
			})
		})

		Context("and a negative assertion is being made", func() {
			It("should call the failure callback", func() {
				matcher.MatchesToReturn = false
				a.ShouldNot(matcher)
				Ω(failureMessage).Should(Equal("Kaboom!"))
				Ω(failureCallerSkip).Should(Equal(3))
			})
		})

		It("should always be false", func() {
			Ω(a.Should(matcher)).Should(BeFalse())
			Ω(a.ShouldNot(matcher)).Should(BeFalse())
		})
	})

	Context("when there are extra parameters", func() {
		It("(a simple example)", func() {
			Ω(func() (string, int, error) {
				return "foo", 0, nil
			}()).Should(Equal("foo"))
		})

		Context("when the parameters are all nil or zero", func() {
			It("should invoke the matcher", func() {
				matcher.MatchesToReturn = true
				matcher.ErrToReturn = nil

				var typedNil []string
				a = New(input, fakeFailHandler, 1, 0, nil, typedNil)

				result := a.Should(matcher)
				Ω(result).Should(BeTrue())
				Ω(matcher.ReceivedActual).Should(Equal(input))

				Ω(failureMessage).Should(BeZero())
			})
		})

		Context("when any of the parameters are not nil or zero", func() {
			It("should call the failure callback", func() {
				matcher.MatchesToReturn = false
				matcher.ErrToReturn = nil

				a = New(input, fakeFailHandler, 1, errors.New("foo"))
				result := a.Should(matcher)
				Ω(result).Should(BeFalse())
				Ω(matcher.ReceivedActual).Should(BeZero(), "The matcher doesn't even get called")
				Ω(failureMessage).Should(ContainSubstring("foo"))
				failureMessage = ""

				a = New(input, fakeFailHandler, 1, nil, 1)
				result = a.ShouldNot(matcher)
				Ω(result).Should(BeFalse())
				Ω(failureMessage).Should(ContainSubstring("1"))
				failureMessage = ""

				a = New(input, fakeFailHandler, 1, nil, 0, []string{"foo"})
				result = a.To(matcher)
				Ω(result).Should(BeFalse())
				Ω(failureMessage).Should(ContainSubstring("foo"))
				failureMessage = ""

				a = New(input, fakeFailHandler, 1, nil, 0, []string{"foo"})
				result = a.ToNot(matcher)
				Ω(result).Should(BeFalse())
				Ω(failureMessage).Should(ContainSubstring("foo"))
				failureMessage = ""

				a = New(input, fakeFailHandler, 1, nil, 0, []string{"foo"})
				result = a.NotTo(matcher)
				Ω(result).Should(BeFalse())
				Ω(failureMessage).Should(ContainSubstring("foo"))
				Ω(failureCallerSkip).Should(Equal(3))
			})
		})
	})

	Context("Making an assertion without a registered fail handler", func() {
		It("should panic", func() {
			defer func() {
				e := recover()
				RegisterFailHandler(Fail)
				if e == nil {
					Fail("expected a panic to have occurred")
				}
			}()

			RegisterFailHandler(nil)
			Ω(true).Should(BeTrue())
		})
	})
})
