1package matchers_test
2
3import (
4	. "github.com/onsi/ginkgo"
5	. "github.com/onsi/gomega"
6	. "github.com/onsi/gomega/matchers"
7)
8
9var _ = Describe("Panic", func() {
10	When("passed something that's not a function that takes zero arguments and returns nothing", func() {
11		It("should error", func() {
12			success, err := (&PanicMatcher{}).Match("foo")
13			Expect(success).To(BeFalse())
14			Expect(err).To(HaveOccurred())
15
16			success, err = (&PanicMatcher{}).Match(nil)
17			Expect(success).To(BeFalse())
18			Expect(err).To(HaveOccurred())
19
20			success, err = (&PanicMatcher{}).Match(func(foo string) {})
21			Expect(success).To(BeFalse())
22			Expect(err).To(HaveOccurred())
23
24			success, err = (&PanicMatcher{}).Match(func() string { return "bar" })
25			Expect(success).To(BeFalse())
26			Expect(err).To(HaveOccurred())
27		})
28	})
29
30	When("passed a function of the correct type", func() {
31		It("should call the function and pass if the function panics", func() {
32			Expect(func() { panic("ack!") }).To(Panic())
33			Expect(func() {}).NotTo(Panic())
34		})
35	})
36
37	When("assertion fails", func() {
38		It("prints the object passed to panic() when negative", func() {
39			failuresMessages := InterceptGomegaFailures(func() {
40				Expect(func() { panic("ack!") }).NotTo(Panic())
41			})
42			Expect(failuresMessages).To(ConsistOf(ContainSubstring("not to panic, but panicked with\n    <string>: ack!")))
43		})
44
45		It("prints simple message when positive", func() {
46			failuresMessages := InterceptGomegaFailures(func() {
47				Expect(func() {}).To(Panic())
48			})
49			Expect(failuresMessages).To(ConsistOf(MatchRegexp("Expected\n\\s+<func\\(\\)>: .+\nto panic")))
50		})
51	})
52})
53
54var _ = Describe("PanicWith", func() {
55	When("a specific panic value is expected", func() {
56		matcher := PanicWith("ack!")
57
58		When("no panic occurs", func() {
59			actual := func() {}
60
61			It("prints a message that includes the expected value", func() {
62				failuresMessages := InterceptGomegaFailures(func() {
63					Expect(actual).To(matcher)
64				})
65				Expect(failuresMessages).To(ConsistOf(
66					MatchRegexp("Expected\n\\s+<func\\(\\)>: .+\nto panic with\\s+<string>: ack!"),
67				))
68			})
69
70			It("passes when negated", func() {
71				Expect(actual).NotTo(matcher)
72			})
73		})
74
75		When("the panic value matches", func() {
76			actual := func() { panic("ack!") }
77
78			It("passes", func() {
79				Expect(actual).To(matcher)
80			})
81
82			It("prints a message that includes the (un)expected value when negated", func() {
83				failuresMessages := InterceptGomegaFailures(func() {
84					Expect(actual).NotTo(matcher)
85				})
86				Expect(failuresMessages).To(ConsistOf(
87					MatchRegexp("Expected\n\\s+<func\\(\\)>: .+\nnot to panic with\\s+<string>: ack!"),
88				))
89			})
90		})
91
92		When("the panic value does not match", func() {
93			actual := func() { panic("unexpected!") }
94
95			It("prints a message that includes both the actual and expected values", func() {
96				failuresMessages := InterceptGomegaFailures(func() {
97					Expect(actual).To(matcher)
98				})
99				Expect(failuresMessages).To(ConsistOf(
100					MatchRegexp("Expected\n\\s+<func\\(\\)>: .+\nto panic with\\s+<string>: ack!\nbut panicked with\n\\s+<string>: unexpected!"),
101				))
102			})
103
104			It("passes when negated", func() {
105				Expect(actual).NotTo(matcher)
106			})
107		})
108	})
109
110	When("the expected value is actually a matcher", func() {
111		matcher := PanicWith(MatchRegexp("ack"))
112
113		When("no panic occurs", func() {
114			actual := func() {}
115
116			It("prints a message that includes the expected value", func() {
117				failuresMessages := InterceptGomegaFailures(func() {
118					Expect(actual).To(matcher)
119				})
120				Expect(failuresMessages).To(ConsistOf(
121					MatchRegexp("Expected\n\\s+<func\\(\\)>: .+\nto panic with a value matching\n.+MatchRegexpMatcher.+ack"),
122				))
123			})
124
125			It("passes when negated", func() {
126				Expect(actual).NotTo(matcher)
127			})
128		})
129
130		When("the panic value matches", func() {
131			actual := func() { panic("ack!") }
132
133			It("passes", func() {
134				Expect(actual).To(matcher)
135			})
136
137			It("prints a message that includes the (un)expected value when negated", func() {
138				failuresMessages := InterceptGomegaFailures(func() {
139					Expect(actual).NotTo(matcher)
140				})
141				Expect(failuresMessages).To(ConsistOf(
142					MatchRegexp("Expected\n\\s+<func\\(\\)>: .+\nnot to panic with a value matching\n.+MatchRegexpMatcher.+ack"),
143				))
144			})
145		})
146
147		When("the panic value does not match", func() {
148			actual := func() { panic("unexpected!") }
149
150			It("prints a message that includes both the actual and expected values", func() {
151				failuresMessages := InterceptGomegaFailures(func() {
152					Expect(actual).To(matcher)
153				})
154				Expect(failuresMessages).To(ConsistOf(
155					MatchRegexp("Expected\n\\s+<func\\(\\)>: .+\nto panic with a value matching\n.+MatchRegexpMatcher.+ack.+\nbut panicked with\n\\s+<string>: unexpected!"),
156				))
157			})
158
159			It("passes when negated", func() {
160				Expect(actual).NotTo(matcher)
161			})
162		})
163	})
164})
165