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