podman
701 строка · 28.2 Кб
1package gomega
2
3import (
4"fmt"
5"time"
6
7"github.com/google/go-cmp/cmp"
8"github.com/onsi/gomega/matchers"
9"github.com/onsi/gomega/types"
10)
11
12// Equal uses reflect.DeepEqual to compare actual with expected. Equal is strict about
13// types when performing comparisons.
14// It is an error for both actual and expected to be nil. Use BeNil() instead.
15func Equal(expected interface{}) types.GomegaMatcher {
16return &matchers.EqualMatcher{
17Expected: expected,
18}
19}
20
21// BeEquivalentTo is more lax than Equal, allowing equality between different types.
22// This is done by converting actual to have the type of expected before
23// attempting equality with reflect.DeepEqual.
24// It is an error for actual and expected to be nil. Use BeNil() instead.
25func BeEquivalentTo(expected interface{}) types.GomegaMatcher {
26return &matchers.BeEquivalentToMatcher{
27Expected: expected,
28}
29}
30
31// BeComparableTo uses gocmp.Equal from github.com/google/go-cmp (instead of reflect.DeepEqual) to perform a deep comparison.
32// You can pass cmp.Option as options.
33// It is an error for actual and expected to be nil. Use BeNil() instead.
34func BeComparableTo(expected interface{}, opts ...cmp.Option) types.GomegaMatcher {
35return &matchers.BeComparableToMatcher{
36Expected: expected,
37Options: opts,
38}
39}
40
41// BeIdenticalTo uses the == operator to compare actual with expected.
42// BeIdenticalTo is strict about types when performing comparisons.
43// It is an error for both actual and expected to be nil. Use BeNil() instead.
44func BeIdenticalTo(expected interface{}) types.GomegaMatcher {
45return &matchers.BeIdenticalToMatcher{
46Expected: expected,
47}
48}
49
50// BeNil succeeds if actual is nil
51func BeNil() types.GomegaMatcher {
52return &matchers.BeNilMatcher{}
53}
54
55// BeTrue succeeds if actual is true
56//
57// In general, it's better to use `BeTrueBecause(reason)` to provide a more useful error message if a true check fails.
58func BeTrue() types.GomegaMatcher {
59return &matchers.BeTrueMatcher{}
60}
61
62// BeFalse succeeds if actual is false
63//
64// In general, it's better to use `BeFalseBecause(reason)` to provide a more useful error message if a false check fails.
65func BeFalse() types.GomegaMatcher {
66return &matchers.BeFalseMatcher{}
67}
68
69// BeTrueBecause succeeds if actual is true and displays the provided reason if it is false
70// fmt.Sprintf is used to render the reason
71func BeTrueBecause(format string, args ...any) types.GomegaMatcher {
72return &matchers.BeTrueMatcher{Reason: fmt.Sprintf(format, args...)}
73}
74
75// BeFalseBecause succeeds if actual is false and displays the provided reason if it is true.
76// fmt.Sprintf is used to render the reason
77func BeFalseBecause(format string, args ...any) types.GomegaMatcher {
78return &matchers.BeFalseMatcher{Reason: fmt.Sprintf(format, args...)}
79}
80
81// HaveOccurred succeeds if actual is a non-nil error
82// The typical Go error checking pattern looks like:
83//
84// err := SomethingThatMightFail()
85// Expect(err).ShouldNot(HaveOccurred())
86func HaveOccurred() types.GomegaMatcher {
87return &matchers.HaveOccurredMatcher{}
88}
89
90// Succeed passes if actual is a nil error
91// Succeed is intended to be used with functions that return a single error value. Instead of
92//
93// err := SomethingThatMightFail()
94// Expect(err).ShouldNot(HaveOccurred())
95//
96// You can write:
97//
98// Expect(SomethingThatMightFail()).Should(Succeed())
99//
100// It is a mistake to use Succeed with a function that has multiple return values. Gomega's Ω and Expect
101// functions automatically trigger failure if any return values after the first return value are non-zero/non-nil.
102// This means that Ω(MultiReturnFunc()).ShouldNot(Succeed()) can never pass.
103func Succeed() types.GomegaMatcher {
104return &matchers.SucceedMatcher{}
105}
106
107// MatchError succeeds if actual is a non-nil error that matches the passed in
108// string, error, function, or matcher.
109//
110// These are valid use-cases:
111//
112// When passed a string:
113//
114// Expect(err).To(MatchError("an error"))
115//
116// asserts that err.Error() == "an error"
117//
118// When passed an error:
119//
120// Expect(err).To(MatchError(SomeError))
121//
122// First checks if errors.Is(err, SomeError).
123// If that fails then it checks if reflect.DeepEqual(err, SomeError) repeatedly for err and any errors wrapped by err
124//
125// When passed a matcher:
126//
127// Expect(err).To(MatchError(ContainSubstring("sprocket not found")))
128//
129// the matcher is passed err.Error(). In this case it asserts that err.Error() contains substring "sprocket not found"
130//
131// When passed a func(err) bool and a description:
132//
133// Expect(err).To(MatchError(os.IsNotExist, "IsNotExist"))
134//
135// the function is passed err and matches if the return value is true. The description is required to allow Gomega
136// to print a useful error message.
137//
138// It is an error for err to be nil or an object that does not implement the
139// Error interface
140//
141// The optional second argument is a description of the error function, if used. This is required when passing a function but is ignored in all other cases.
142func MatchError(expected interface{}, functionErrorDescription ...any) types.GomegaMatcher {
143return &matchers.MatchErrorMatcher{
144Expected: expected,
145FuncErrDescription: functionErrorDescription,
146}
147}
148
149// BeClosed succeeds if actual is a closed channel.
150// It is an error to pass a non-channel to BeClosed, it is also an error to pass nil
151//
152// In order to check whether or not the channel is closed, Gomega must try to read from the channel
153// (even in the `ShouldNot(BeClosed())` case). You should keep this in mind if you wish to make subsequent assertions about
154// values coming down the channel.
155//
156// Also, if you are testing that a *buffered* channel is closed you must first read all values out of the channel before
157// asserting that it is closed (it is not possible to detect that a buffered-channel has been closed until all its buffered values are read).
158//
159// Finally, as a corollary: it is an error to check whether or not a send-only channel is closed.
160func BeClosed() types.GomegaMatcher {
161return &matchers.BeClosedMatcher{}
162}
163
164// Receive succeeds if there is a value to be received on actual.
165// Actual must be a channel (and cannot be a send-only channel) -- anything else is an error.
166//
167// Receive returns immediately and never blocks:
168//
169// - If there is nothing on the channel `c` then Expect(c).Should(Receive()) will fail and Ω(c).ShouldNot(Receive()) will pass.
170//
171// - If the channel `c` is closed then Expect(c).Should(Receive()) will fail and Ω(c).ShouldNot(Receive()) will pass.
172//
173// - If there is something on the channel `c` ready to be read, then Expect(c).Should(Receive()) will pass and Ω(c).ShouldNot(Receive()) will fail.
174//
175// If you have a go-routine running in the background that will write to channel `c` you can:
176//
177// Eventually(c).Should(Receive())
178//
179// This will timeout if nothing gets sent to `c` (you can modify the timeout interval as you normally do with `Eventually`)
180//
181// A similar use-case is to assert that no go-routine writes to a channel (for a period of time). You can do this with `Consistently`:
182//
183// Consistently(c).ShouldNot(Receive())
184//
185// You can pass `Receive` a matcher. If you do so, it will match the received object against the matcher. For example:
186//
187// Expect(c).Should(Receive(Equal("foo")))
188//
189// When given a matcher, `Receive` will always fail if there is nothing to be received on the channel.
190//
191// Passing Receive a matcher is especially useful when paired with Eventually:
192//
193// Eventually(c).Should(Receive(ContainSubstring("bar")))
194//
195// will repeatedly attempt to pull values out of `c` until a value matching "bar" is received.
196//
197// Furthermore, if you want to have a reference to the value *sent* to the channel you can pass the `Receive` matcher a pointer to a variable of the appropriate type:
198//
199// var myThing thing
200// Eventually(thingChan).Should(Receive(&myThing))
201// Expect(myThing.Sprocket).Should(Equal("foo"))
202// Expect(myThing.IsValid()).Should(BeTrue())
203//
204// Finally, if you want to match the received object as well as get the actual received value into a variable, so you can reason further about the value received,
205// you can pass a pointer to a variable of the approriate type first, and second a matcher:
206//
207// var myThing thing
208// Eventually(thingChan).Should(Receive(&myThing, ContainSubstring("bar")))
209func Receive(args ...interface{}) types.GomegaMatcher {
210return &matchers.ReceiveMatcher{
211Args: args,
212}
213}
214
215// BeSent succeeds if a value can be sent to actual.
216// Actual must be a channel (and cannot be a receive-only channel) that can sent the type of the value passed into BeSent -- anything else is an error.
217// In addition, actual must not be closed.
218//
219// BeSent never blocks:
220//
221// - If the channel `c` is not ready to receive then Expect(c).Should(BeSent("foo")) will fail immediately
222// - If the channel `c` is eventually ready to receive then Eventually(c).Should(BeSent("foo")) will succeed.. presuming the channel becomes ready to receive before Eventually's timeout
223// - If the channel `c` is closed then Expect(c).Should(BeSent("foo")) and Ω(c).ShouldNot(BeSent("foo")) will both fail immediately
224//
225// Of course, the value is actually sent to the channel. The point of `BeSent` is less to make an assertion about the availability of the channel (which is typically an implementation detail that your test should not be concerned with).
226// Rather, the point of `BeSent` is to make it possible to easily and expressively write tests that can timeout on blocked channel sends.
227func BeSent(arg interface{}) types.GomegaMatcher {
228return &matchers.BeSentMatcher{
229Arg: arg,
230}
231}
232
233// MatchRegexp succeeds if actual is a string or stringer that matches the
234// passed-in regexp. Optional arguments can be provided to construct a regexp
235// via fmt.Sprintf().
236func MatchRegexp(regexp string, args ...interface{}) types.GomegaMatcher {
237return &matchers.MatchRegexpMatcher{
238Regexp: regexp,
239Args: args,
240}
241}
242
243// ContainSubstring succeeds if actual is a string or stringer that contains the
244// passed-in substring. Optional arguments can be provided to construct the substring
245// via fmt.Sprintf().
246func ContainSubstring(substr string, args ...interface{}) types.GomegaMatcher {
247return &matchers.ContainSubstringMatcher{
248Substr: substr,
249Args: args,
250}
251}
252
253// HavePrefix succeeds if actual is a string or stringer that contains the
254// passed-in string as a prefix. Optional arguments can be provided to construct
255// via fmt.Sprintf().
256func HavePrefix(prefix string, args ...interface{}) types.GomegaMatcher {
257return &matchers.HavePrefixMatcher{
258Prefix: prefix,
259Args: args,
260}
261}
262
263// HaveSuffix succeeds if actual is a string or stringer that contains the
264// passed-in string as a suffix. Optional arguments can be provided to construct
265// via fmt.Sprintf().
266func HaveSuffix(suffix string, args ...interface{}) types.GomegaMatcher {
267return &matchers.HaveSuffixMatcher{
268Suffix: suffix,
269Args: args,
270}
271}
272
273// MatchJSON succeeds if actual is a string or stringer of JSON that matches
274// the expected JSON. The JSONs are decoded and the resulting objects are compared via
275// reflect.DeepEqual so things like key-ordering and whitespace shouldn't matter.
276func MatchJSON(json interface{}) types.GomegaMatcher {
277return &matchers.MatchJSONMatcher{
278JSONToMatch: json,
279}
280}
281
282// MatchXML succeeds if actual is a string or stringer of XML that matches
283// the expected XML. The XMLs are decoded and the resulting objects are compared via
284// reflect.DeepEqual so things like whitespaces shouldn't matter.
285func MatchXML(xml interface{}) types.GomegaMatcher {
286return &matchers.MatchXMLMatcher{
287XMLToMatch: xml,
288}
289}
290
291// MatchYAML succeeds if actual is a string or stringer of YAML that matches
292// the expected YAML. The YAML's are decoded and the resulting objects are compared via
293// reflect.DeepEqual so things like key-ordering and whitespace shouldn't matter.
294func MatchYAML(yaml interface{}) types.GomegaMatcher {
295return &matchers.MatchYAMLMatcher{
296YAMLToMatch: yaml,
297}
298}
299
300// BeEmpty succeeds if actual is empty. Actual must be of type string, array, map, chan, or slice.
301func BeEmpty() types.GomegaMatcher {
302return &matchers.BeEmptyMatcher{}
303}
304
305// HaveLen succeeds if actual has the passed-in length. Actual must be of type string, array, map, chan, or slice.
306func HaveLen(count int) types.GomegaMatcher {
307return &matchers.HaveLenMatcher{
308Count: count,
309}
310}
311
312// HaveCap succeeds if actual has the passed-in capacity. Actual must be of type array, chan, or slice.
313func HaveCap(count int) types.GomegaMatcher {
314return &matchers.HaveCapMatcher{
315Count: count,
316}
317}
318
319// BeZero succeeds if actual is the zero value for its type or if actual is nil.
320func BeZero() types.GomegaMatcher {
321return &matchers.BeZeroMatcher{}
322}
323
324// ContainElement succeeds if actual contains the passed in element. By default
325// ContainElement() uses Equal() to perform the match, however a matcher can be
326// passed in instead:
327//
328// Expect([]string{"Foo", "FooBar"}).Should(ContainElement(ContainSubstring("Bar")))
329//
330// Actual must be an array, slice or map. For maps, ContainElement searches
331// through the map's values.
332//
333// If you want to have a copy of the matching element(s) found you can pass a
334// pointer to a variable of the appropriate type. If the variable isn't a slice
335// or map, then exactly one match will be expected and returned. If the variable
336// is a slice or map, then at least one match is expected and all matches will be
337// stored in the variable.
338//
339// var findings []string
340// Expect([]string{"Foo", "FooBar"}).Should(ContainElement(ContainSubString("Bar", &findings)))
341func ContainElement(element interface{}, result ...interface{}) types.GomegaMatcher {
342return &matchers.ContainElementMatcher{
343Element: element,
344Result: result,
345}
346}
347
348// BeElementOf succeeds if actual is contained in the passed in elements.
349// BeElementOf() always uses Equal() to perform the match.
350// When the passed in elements are comprised of a single element that is either an Array or Slice, BeElementOf() behaves
351// as the reverse of ContainElement() that operates with Equal() to perform the match.
352//
353// Expect(2).Should(BeElementOf([]int{1, 2}))
354// Expect(2).Should(BeElementOf([2]int{1, 2}))
355//
356// Otherwise, BeElementOf() provides a syntactic sugar for Or(Equal(_), Equal(_), ...):
357//
358// Expect(2).Should(BeElementOf(1, 2))
359//
360// Actual must be typed.
361func BeElementOf(elements ...interface{}) types.GomegaMatcher {
362return &matchers.BeElementOfMatcher{
363Elements: elements,
364}
365}
366
367// BeKeyOf succeeds if actual is contained in the keys of the passed in map.
368// BeKeyOf() always uses Equal() to perform the match between actual and the map keys.
369//
370// Expect("foo").Should(BeKeyOf(map[string]bool{"foo": true, "bar": false}))
371func BeKeyOf(element interface{}) types.GomegaMatcher {
372return &matchers.BeKeyOfMatcher{
373Map: element,
374}
375}
376
377// ConsistOf succeeds if actual contains precisely the elements passed into the matcher. The ordering of the elements does not matter.
378// By default ConsistOf() uses Equal() to match the elements, however custom matchers can be passed in instead. Here are some examples:
379//
380// Expect([]string{"Foo", "FooBar"}).Should(ConsistOf("FooBar", "Foo"))
381// Expect([]string{"Foo", "FooBar"}).Should(ConsistOf(ContainSubstring("Bar"), "Foo"))
382// Expect([]string{"Foo", "FooBar"}).Should(ConsistOf(ContainSubstring("Foo"), ContainSubstring("Foo")))
383//
384// Actual must be an array, slice or map. For maps, ConsistOf matches against the map's values.
385//
386// You typically pass variadic arguments to ConsistOf (as in the examples above). However, if you need to pass in a slice you can provided that it
387// is the only element passed in to ConsistOf:
388//
389// Expect([]string{"Foo", "FooBar"}).Should(ConsistOf([]string{"FooBar", "Foo"}))
390//
391// Note that Go's type system does not allow you to write this as ConsistOf([]string{"FooBar", "Foo"}...) as []string and []interface{} are different types - hence the need for this special rule.
392func ConsistOf(elements ...interface{}) types.GomegaMatcher {
393return &matchers.ConsistOfMatcher{
394Elements: elements,
395}
396}
397
398// HaveExactElements succeeds if actual contains elements that precisely match the elemets passed into the matcher. The ordering of the elements does matter.
399// By default HaveExactElements() uses Equal() to match the elements, however custom matchers can be passed in instead. Here are some examples:
400//
401// Expect([]string{"Foo", "FooBar"}).Should(HaveExactElements("Foo", "FooBar"))
402// Expect([]string{"Foo", "FooBar"}).Should(HaveExactElements("Foo", ContainSubstring("Bar")))
403// Expect([]string{"Foo", "FooBar"}).Should(HaveExactElements(ContainSubstring("Foo"), ContainSubstring("Foo")))
404//
405// Actual must be an array or slice.
406func HaveExactElements(elements ...interface{}) types.GomegaMatcher {
407return &matchers.HaveExactElementsMatcher{
408Elements: elements,
409}
410}
411
412// ContainElements succeeds if actual contains the passed in elements. The ordering of the elements does not matter.
413// By default ContainElements() uses Equal() to match the elements, however custom matchers can be passed in instead. Here are some examples:
414//
415// Expect([]string{"Foo", "FooBar"}).Should(ContainElements("FooBar"))
416// Expect([]string{"Foo", "FooBar"}).Should(ContainElements(ContainSubstring("Bar"), "Foo"))
417//
418// Actual must be an array, slice or map.
419// For maps, ContainElements searches through the map's values.
420func ContainElements(elements ...interface{}) types.GomegaMatcher {
421return &matchers.ContainElementsMatcher{
422Elements: elements,
423}
424}
425
426// HaveEach succeeds if actual solely contains elements that match the passed in element.
427// Please note that if actual is empty, HaveEach always will fail.
428// By default HaveEach() uses Equal() to perform the match, however a
429// matcher can be passed in instead:
430//
431// Expect([]string{"Foo", "FooBar"}).Should(HaveEach(ContainSubstring("Foo")))
432//
433// Actual must be an array, slice or map.
434// For maps, HaveEach searches through the map's values.
435func HaveEach(element interface{}) types.GomegaMatcher {
436return &matchers.HaveEachMatcher{
437Element: element,
438}
439}
440
441// HaveKey succeeds if actual is a map with the passed in key.
442// By default HaveKey uses Equal() to perform the match, however a
443// matcher can be passed in instead:
444//
445// Expect(map[string]string{"Foo": "Bar", "BazFoo": "Duck"}).Should(HaveKey(MatchRegexp(`.+Foo$`)))
446func HaveKey(key interface{}) types.GomegaMatcher {
447return &matchers.HaveKeyMatcher{
448Key: key,
449}
450}
451
452// HaveKeyWithValue succeeds if actual is a map with the passed in key and value.
453// By default HaveKeyWithValue uses Equal() to perform the match, however a
454// matcher can be passed in instead:
455//
456// Expect(map[string]string{"Foo": "Bar", "BazFoo": "Duck"}).Should(HaveKeyWithValue("Foo", "Bar"))
457// Expect(map[string]string{"Foo": "Bar", "BazFoo": "Duck"}).Should(HaveKeyWithValue(MatchRegexp(`.+Foo$`), "Bar"))
458func HaveKeyWithValue(key interface{}, value interface{}) types.GomegaMatcher {
459return &matchers.HaveKeyWithValueMatcher{
460Key: key,
461Value: value,
462}
463}
464
465// HaveField succeeds if actual is a struct and the value at the passed in field
466// matches the passed in matcher. By default HaveField used Equal() to perform the match,
467// however a matcher can be passed in in stead.
468//
469// The field must be a string that resolves to the name of a field in the struct. Structs can be traversed
470// using the '.' delimiter. If the field ends with '()' a method named field is assumed to exist on the struct and is invoked.
471// Such methods must take no arguments and return a single value:
472//
473// type Book struct {
474// Title string
475// Author Person
476// }
477// type Person struct {
478// FirstName string
479// LastName string
480// DOB time.Time
481// }
482// Expect(book).To(HaveField("Title", "Les Miserables"))
483// Expect(book).To(HaveField("Title", ContainSubstring("Les"))
484// Expect(book).To(HaveField("Author.FirstName", Equal("Victor"))
485// Expect(book).To(HaveField("Author.DOB.Year()", BeNumerically("<", 1900))
486func HaveField(field string, expected interface{}) types.GomegaMatcher {
487return &matchers.HaveFieldMatcher{
488Field: field,
489Expected: expected,
490}
491}
492
493// HaveExistingField succeeds if actual is a struct and the specified field
494// exists.
495//
496// HaveExistingField can be combined with HaveField in order to cover use cases
497// with optional fields. HaveField alone would trigger an error in such situations.
498//
499// Expect(MrHarmless).NotTo(And(HaveExistingField("Title"), HaveField("Title", "Supervillain")))
500func HaveExistingField(field string) types.GomegaMatcher {
501return &matchers.HaveExistingFieldMatcher{
502Field: field,
503}
504}
505
506// HaveValue applies the given matcher to the value of actual, optionally and
507// repeatedly dereferencing pointers or taking the concrete value of interfaces.
508// Thus, the matcher will always be applied to non-pointer and non-interface
509// values only. HaveValue will fail with an error if a pointer or interface is
510// nil. It will also fail for more than 31 pointer or interface dereferences to
511// guard against mistakenly applying it to arbitrarily deep linked pointers.
512//
513// HaveValue differs from gstruct.PointTo in that it does not expect actual to
514// be a pointer (as gstruct.PointTo does) but instead also accepts non-pointer
515// and even interface values.
516//
517// actual := 42
518// Expect(actual).To(HaveValue(42))
519// Expect(&actual).To(HaveValue(42))
520func HaveValue(matcher types.GomegaMatcher) types.GomegaMatcher {
521return &matchers.HaveValueMatcher{
522Matcher: matcher,
523}
524}
525
526// BeNumerically performs numerical assertions in a type-agnostic way.
527// Actual and expected should be numbers, though the specific type of
528// number is irrelevant (float32, float64, uint8, etc...).
529//
530// There are six, self-explanatory, supported comparators:
531//
532// Expect(1.0).Should(BeNumerically("==", 1))
533// Expect(1.0).Should(BeNumerically("~", 0.999, 0.01))
534// Expect(1.0).Should(BeNumerically(">", 0.9))
535// Expect(1.0).Should(BeNumerically(">=", 1.0))
536// Expect(1.0).Should(BeNumerically("<", 3))
537// Expect(1.0).Should(BeNumerically("<=", 1.0))
538func BeNumerically(comparator string, compareTo ...interface{}) types.GomegaMatcher {
539return &matchers.BeNumericallyMatcher{
540Comparator: comparator,
541CompareTo: compareTo,
542}
543}
544
545// BeTemporally compares time.Time's like BeNumerically
546// Actual and expected must be time.Time. The comparators are the same as for BeNumerically
547//
548// Expect(time.Now()).Should(BeTemporally(">", time.Time{}))
549// Expect(time.Now()).Should(BeTemporally("~", time.Now(), time.Second))
550func BeTemporally(comparator string, compareTo time.Time, threshold ...time.Duration) types.GomegaMatcher {
551return &matchers.BeTemporallyMatcher{
552Comparator: comparator,
553CompareTo: compareTo,
554Threshold: threshold,
555}
556}
557
558// BeAssignableToTypeOf succeeds if actual is assignable to the type of expected.
559// It will return an error when one of the values is nil.
560//
561// Expect(0).Should(BeAssignableToTypeOf(0)) // Same values
562// Expect(5).Should(BeAssignableToTypeOf(-1)) // different values same type
563// Expect("foo").Should(BeAssignableToTypeOf("bar")) // different values same type
564// Expect(struct{ Foo string }{}).Should(BeAssignableToTypeOf(struct{ Foo string }{}))
565func BeAssignableToTypeOf(expected interface{}) types.GomegaMatcher {
566return &matchers.AssignableToTypeOfMatcher{
567Expected: expected,
568}
569}
570
571// Panic succeeds if actual is a function that, when invoked, panics.
572// Actual must be a function that takes no arguments and returns no results.
573func Panic() types.GomegaMatcher {
574return &matchers.PanicMatcher{}
575}
576
577// PanicWith succeeds if actual is a function that, when invoked, panics with a specific value.
578// Actual must be a function that takes no arguments and returns no results.
579//
580// By default PanicWith uses Equal() to perform the match, however a
581// matcher can be passed in instead:
582//
583// Expect(fn).Should(PanicWith(MatchRegexp(`.+Foo$`)))
584func PanicWith(expected interface{}) types.GomegaMatcher {
585return &matchers.PanicMatcher{Expected: expected}
586}
587
588// BeAnExistingFile succeeds if a file exists.
589// Actual must be a string representing the abs path to the file being checked.
590func BeAnExistingFile() types.GomegaMatcher {
591return &matchers.BeAnExistingFileMatcher{}
592}
593
594// BeARegularFile succeeds if a file exists and is a regular file.
595// Actual must be a string representing the abs path to the file being checked.
596func BeARegularFile() types.GomegaMatcher {
597return &matchers.BeARegularFileMatcher{}
598}
599
600// BeADirectory succeeds if a file exists and is a directory.
601// Actual must be a string representing the abs path to the file being checked.
602func BeADirectory() types.GomegaMatcher {
603return &matchers.BeADirectoryMatcher{}
604}
605
606// HaveHTTPStatus succeeds if the Status or StatusCode field of an HTTP response matches.
607// Actual must be either a *http.Response or *httptest.ResponseRecorder.
608// Expected must be either an int or a string.
609//
610// Expect(resp).Should(HaveHTTPStatus(http.StatusOK)) // asserts that resp.StatusCode == 200
611// Expect(resp).Should(HaveHTTPStatus("404 Not Found")) // asserts that resp.Status == "404 Not Found"
612// Expect(resp).Should(HaveHTTPStatus(http.StatusOK, http.StatusNoContent)) // asserts that resp.StatusCode == 200 || resp.StatusCode == 204
613func HaveHTTPStatus(expected ...interface{}) types.GomegaMatcher {
614return &matchers.HaveHTTPStatusMatcher{Expected: expected}
615}
616
617// HaveHTTPHeaderWithValue succeeds if the header is found and the value matches.
618// Actual must be either a *http.Response or *httptest.ResponseRecorder.
619// Expected must be a string header name, followed by a header value which
620// can be a string, or another matcher.
621func HaveHTTPHeaderWithValue(header string, value interface{}) types.GomegaMatcher {
622return &matchers.HaveHTTPHeaderWithValueMatcher{
623Header: header,
624Value: value,
625}
626}
627
628// HaveHTTPBody matches if the body matches.
629// Actual must be either a *http.Response or *httptest.ResponseRecorder.
630// Expected must be either a string, []byte, or other matcher
631func HaveHTTPBody(expected interface{}) types.GomegaMatcher {
632return &matchers.HaveHTTPBodyMatcher{Expected: expected}
633}
634
635// And succeeds only if all of the given matchers succeed.
636// The matchers are tried in order, and will fail-fast if one doesn't succeed.
637//
638// Expect("hi").To(And(HaveLen(2), Equal("hi"))
639//
640// And(), Or(), Not() and WithTransform() allow matchers to be composed into complex expressions.
641func And(ms ...types.GomegaMatcher) types.GomegaMatcher {
642return &matchers.AndMatcher{Matchers: ms}
643}
644
645// SatisfyAll is an alias for And().
646//
647// Expect("hi").Should(SatisfyAll(HaveLen(2), Equal("hi")))
648func SatisfyAll(matchers ...types.GomegaMatcher) types.GomegaMatcher {
649return And(matchers...)
650}
651
652// Or succeeds if any of the given matchers succeed.
653// The matchers are tried in order and will return immediately upon the first successful match.
654//
655// Expect("hi").To(Or(HaveLen(3), HaveLen(2))
656//
657// And(), Or(), Not() and WithTransform() allow matchers to be composed into complex expressions.
658func Or(ms ...types.GomegaMatcher) types.GomegaMatcher {
659return &matchers.OrMatcher{Matchers: ms}
660}
661
662// SatisfyAny is an alias for Or().
663//
664// Expect("hi").SatisfyAny(Or(HaveLen(3), HaveLen(2))
665func SatisfyAny(matchers ...types.GomegaMatcher) types.GomegaMatcher {
666return Or(matchers...)
667}
668
669// Not negates the given matcher; it succeeds if the given matcher fails.
670//
671// Expect(1).To(Not(Equal(2))
672//
673// And(), Or(), Not() and WithTransform() allow matchers to be composed into complex expressions.
674func Not(matcher types.GomegaMatcher) types.GomegaMatcher {
675return &matchers.NotMatcher{Matcher: matcher}
676}
677
678// WithTransform applies the `transform` to the actual value and matches it against `matcher`.
679// The given transform must be either a function of one parameter that returns one value or a
680// function of one parameter that returns two values, where the second value must be of the
681// error type.
682//
683// var plus1 = func(i int) int { return i + 1 }
684// Expect(1).To(WithTransform(plus1, Equal(2))
685//
686// var failingplus1 = func(i int) (int, error) { return 42, "this does not compute" }
687// Expect(1).To(WithTransform(failingplus1, Equal(2)))
688//
689// And(), Or(), Not() and WithTransform() allow matchers to be composed into complex expressions.
690func WithTransform(transform interface{}, matcher types.GomegaMatcher) types.GomegaMatcher {
691return matchers.NewWithTransformMatcher(transform, matcher)
692}
693
694// Satisfy matches the actual value against the `predicate` function.
695// The given predicate must be a function of one paramter that returns bool.
696//
697// var isEven = func(i int) bool { return i%2 == 0 }
698// Expect(2).To(Satisfy(isEven))
699func Satisfy(predicate interface{}) types.GomegaMatcher {
700return matchers.NewSatisfyMatcher(predicate)
701}
702