forked from cloudfoundry/cli
/
actual.go
96 lines (82 loc) · 2.94 KB
/
actual.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package gomega
import (
"fmt"
"reflect"
)
type actual struct {
actualInput interface{}
fail OmegaFailHandler
offset int
extra []interface{}
}
func newActual(actualInput interface{}, fail OmegaFailHandler, offset int, extra ...interface{}) *actual {
return &actual{
actualInput: actualInput,
fail: fail,
offset: offset,
extra: extra,
}
}
func (actual *actual) Should(matcher interface{}, optionalDescription ...interface{}) bool {
return actual.vetExtras(optionalDescription...) && actual.match(shimIfNecessary(matcher), true, optionalDescription...)
}
func (actual *actual) ShouldNot(matcher interface{}, optionalDescription ...interface{}) bool {
return actual.vetExtras(optionalDescription...) && actual.match(shimIfNecessary(matcher), false, optionalDescription...)
}
func (actual *actual) To(matcher interface{}, optionalDescription ...interface{}) bool {
return actual.vetExtras(optionalDescription...) && actual.match(shimIfNecessary(matcher), true, optionalDescription...)
}
func (actual *actual) ToNot(matcher interface{}, optionalDescription ...interface{}) bool {
return actual.vetExtras(optionalDescription...) && actual.match(shimIfNecessary(matcher), false, optionalDescription...)
}
func (actual *actual) NotTo(matcher interface{}, optionalDescription ...interface{}) bool {
return actual.vetExtras(optionalDescription...) && actual.match(shimIfNecessary(matcher), false, optionalDescription...)
}
func (actual *actual) buildDescription(optionalDescription ...interface{}) string {
switch len(optionalDescription) {
case 0:
return ""
default:
return fmt.Sprintf(optionalDescription[0].(string), optionalDescription[1:]...) + "\n"
}
}
func (actual *actual) match(matcher OmegaMatcher, desiredMatch bool, optionalDescription ...interface{}) bool {
matches, err := matcher.Match(actual.actualInput)
description := actual.buildDescription(optionalDescription...)
if err != nil {
actual.fail(description+err.Error(), 2+actual.offset)
return false
}
if matches != desiredMatch {
var message string
if desiredMatch {
message = matcher.FailureMessage(actual.actualInput)
} else {
message = matcher.NegatedFailureMessage(actual.actualInput)
}
actual.fail(description+message, 2+actual.offset)
return false
}
return true
}
func (actual *actual) vetExtras(optionalDescription ...interface{}) bool {
success, message := vetExtras(actual.extra)
if success {
return true
}
description := actual.buildDescription(optionalDescription...)
actual.fail(description+message, 2+actual.offset)
return false
}
func vetExtras(extras []interface{}) (bool, string) {
for i, extra := range extras {
if extra != nil {
zeroValue := reflect.Zero(reflect.TypeOf(extra)).Interface()
if !reflect.DeepEqual(zeroValue, extra) {
message := fmt.Sprintf("Unexpected non-nil/non-zero extra argument at index %d:\n\t<%T>: %#v", i+1, extra, extra)
return false, message
}
}
}
return true, ""
}