stop memoizing result of HaveField · onsi/gomega@3bdbc4e

@@ -17,7 +17,7 @@ func (e missingFieldError) Error() string {

1717

return string(e)

1818

}

191920-

func extractField(actual interface{}, field string, matchername string) (interface{}, error) {

20+

func extractField(actual interface{}, field string, matchername string) (any, error) {

2121

fields := strings.SplitN(field, ".", 2)

2222

actualValue := reflect.ValueOf(actual)

2323

@@ -64,36 +64,46 @@ func extractField(actual interface{}, field string, matchername string) (interfa

6464

type HaveFieldMatcher struct {

6565

Field string

6666

Expected interface{}

67+

}

676868-

extractedField interface{}

69-

expectedMatcher omegaMatcher

69+

func (matcher *HaveFieldMatcher) expectedMatcher() omegaMatcher {

70+

var isMatcher bool

71+

expectedMatcher, isMatcher := matcher.Expected.(omegaMatcher)

72+

if !isMatcher {

73+

expectedMatcher = &EqualMatcher{Expected: matcher.Expected}

74+

}

75+

return expectedMatcher

7076

}

71777278

func (matcher *HaveFieldMatcher) Match(actual interface{}) (success bool, err error) {

73-

matcher.extractedField, err = extractField(actual, matcher.Field, "HaveField")

79+

extractedField, err := extractField(actual, matcher.Field, "HaveField")

7480

if err != nil {

7581

return false, err

7682

}

778378-

var isMatcher bool

79-

matcher.expectedMatcher, isMatcher = matcher.Expected.(omegaMatcher)

80-

if !isMatcher {

81-

matcher.expectedMatcher = &EqualMatcher{Expected: matcher.Expected}

82-

}

83-84-

return matcher.expectedMatcher.Match(matcher.extractedField)

84+

return matcher.expectedMatcher().Match(extractedField)

8585

}

86868787

func (matcher *HaveFieldMatcher) FailureMessage(actual interface{}) (message string) {

88+

extractedField, err := extractField(actual, matcher.Field, "HaveField")

89+

if err != nil {

90+

// this really shouldn't happen

91+

return fmt.Sprintf("Failed to extract field '%s': %s", matcher.Field, err)

92+

}

8893

message = fmt.Sprintf("Value for field '%s' failed to satisfy matcher.\n", matcher.Field)

89-

message += matcher.expectedMatcher.FailureMessage(matcher.extractedField)

94+

message += matcher.expectedMatcher().FailureMessage(extractedField)

90959196

return message

9297

}

93989499

func (matcher *HaveFieldMatcher) NegatedFailureMessage(actual interface{}) (message string) {

100+

extractedField, err := extractField(actual, matcher.Field, "HaveField")

101+

if err != nil {

102+

// this really shouldn't happen

103+

return fmt.Sprintf("Failed to extract field '%s': %s", matcher.Field, err)

104+

}

95105

message = fmt.Sprintf("Value for field '%s' satisfied matcher, but should not have.\n", matcher.Field)

96-

message += matcher.expectedMatcher.NegatedFailureMessage(matcher.extractedField)

106+

message += matcher.expectedMatcher().NegatedFailureMessage(extractedField)

9710798108

return message

99109

}