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