Path: blob/main/vendor/github.com/onsi/gomega/matchers/panic_matcher.go
2880 views
package matchers12import (3"fmt"4"reflect"56"github.com/onsi/gomega/format"7)89type PanicMatcher struct {10Expected any11object any12}1314func (matcher *PanicMatcher) Match(actual any) (success bool, err error) {15if actual == nil {16return false, fmt.Errorf("PanicMatcher expects a non-nil actual.")17}1819actualType := reflect.TypeOf(actual)20if actualType.Kind() != reflect.Func {21return false, fmt.Errorf("PanicMatcher expects a function. Got:\n%s", format.Object(actual, 1))22}23if !(actualType.NumIn() == 0 && actualType.NumOut() == 0) {24return false, fmt.Errorf("PanicMatcher expects a function with no arguments and no return value. Got:\n%s", format.Object(actual, 1))25}2627success = false28defer func() {29if e := recover(); e != nil {30matcher.object = e3132if matcher.Expected == nil {33success = true34return35}3637valueMatcher, valueIsMatcher := matcher.Expected.(omegaMatcher)38if !valueIsMatcher {39valueMatcher = &EqualMatcher{Expected: matcher.Expected}40}4142success, err = valueMatcher.Match(e)43if err != nil {44err = fmt.Errorf("PanicMatcher's value matcher failed with:\n%s%s", format.Indent, err.Error())45}46}47}()4849reflect.ValueOf(actual).Call([]reflect.Value{})5051return52}5354func (matcher *PanicMatcher) FailureMessage(actual any) (message string) {55if matcher.Expected == nil {56// We wanted any panic to occur, but none did.57return format.Message(actual, "to panic")58}5960if matcher.object == nil {61// We wanted a panic with a specific value to occur, but none did.62switch matcher.Expected.(type) {63case omegaMatcher:64return format.Message(actual, "to panic with a value matching", matcher.Expected)65default:66return format.Message(actual, "to panic with", matcher.Expected)67}68}6970// We got a panic, but the value isn't what we expected.71switch matcher.Expected.(type) {72case omegaMatcher:73return format.Message(74actual,75fmt.Sprintf(76"to panic with a value matching\n%s\nbut panicked with\n%s",77format.Object(matcher.Expected, 1),78format.Object(matcher.object, 1),79),80)81default:82return format.Message(83actual,84fmt.Sprintf(85"to panic with\n%s\nbut panicked with\n%s",86format.Object(matcher.Expected, 1),87format.Object(matcher.object, 1),88),89)90}91}9293func (matcher *PanicMatcher) NegatedFailureMessage(actual any) (message string) {94if matcher.Expected == nil {95// We didn't want any panic to occur, but one did.96return format.Message(actual, fmt.Sprintf("not to panic, but panicked with\n%s", format.Object(matcher.object, 1)))97}9899// We wanted a to ensure a panic with a specific value did not occur, but it did.100switch matcher.Expected.(type) {101case omegaMatcher:102return format.Message(103actual,104fmt.Sprintf(105"not to panic with a value matching\n%s\nbut panicked with\n%s",106format.Object(matcher.Expected, 1),107format.Object(matcher.object, 1),108),109)110default:111return format.Message(actual, "not to panic with", matcher.Expected)112}113}114115116