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