@@ -19,6 +19,9 @@ package com.mongodb
19
19
import org.hamcrest.BaseMatcher
20
20
import org.hamcrest.Description
21
21
22
+ import java.lang.reflect.Field
23
+ import java.lang.reflect.Modifier
24
+
22
25
@SuppressWarnings (' NoDef' )
23
26
class CustomMatchers {
24
27
@@ -55,25 +58,32 @@ class CustomMatchers {
55
58
if (actual. class. name != expected. class. name) {
56
59
return false
57
60
}
58
- getFieldNames(actual. class). findAll { ! ignoreNames. contains(it) } .collect {
59
- if (nominallyTheSame(it)) {
60
- return actual. " $it " . class == expected. " $it " . class
61
- } else if (actual. " $it " != expected. " $it " ) {
62
- def (a1, e1) = [actual. " $it " , expected. " $it " ]
63
- if ([a1, e1]. contains(null ) && [a1, e1] != nullList) {
61
+ getFields(actual. class). findAll { ! ignoreNames. contains(it. name) } .collect {
62
+ it. setAccessible(true )
63
+ def actualPropertyValue = it. get(actual)
64
+ def expectedPropertyValue = it. get(expected)
65
+
66
+ if (nominallyTheSame(it. name)) {
67
+ return actualPropertyValue. class == expectedPropertyValue. class
68
+ } else if (actualPropertyValue != expectedPropertyValue) {
69
+ if ([actualPropertyValue, expectedPropertyValue]. contains(null )
70
+ && [actualPropertyValue, expectedPropertyValue] != nullList) {
64
71
return false
65
- } else if (List . isCase(a1) && List . isCase(e1) && (a1. size() == e1. size())) {
72
+ } else if (List . isCase(actualPropertyValue) && List . isCase(expectedPropertyValue)
73
+ && (actualPropertyValue. size() == expectedPropertyValue. size())) {
66
74
def i = -1
67
- return a1. collect { a -> i++ ; compare(a, e1[i]) }. every { it }
68
- } else if (a1. class != null && a1. class. name. startsWith(' com.mongodb' ) && a1. class == e1. class) {
69
- return compare(a1, e1)
75
+ return actualPropertyValue. collect { a -> i++ ; compare(a, expectedPropertyValue[i]) }. every { it }
76
+ } else if (actualPropertyValue. class != null && actualPropertyValue. class. name. startsWith(' com.mongodb' )
77
+ && actualPropertyValue. class == expectedPropertyValue. class) {
78
+ return compare(actualPropertyValue, expectedPropertyValue)
70
79
}
71
80
return false
72
81
}
73
82
true
74
83
}. every { it }
75
84
}
76
85
86
+
77
87
static describer (expected , actual , description ) {
78
88
describer(expected, actual, [], description)
79
89
}
@@ -91,48 +101,52 @@ class CustomMatchers {
91
101
return false
92
102
}
93
103
94
- getFieldNames(actual. class). findAll { ! ignoreNames. contains(it) } .collect {
104
+ getFields(actual. class). findAll { ! ignoreNames. contains(it. name) } .collect {
105
+ it. setAccessible(true )
106
+ def actualPropertyValue = it. get(actual)
107
+ def expectedPropertyValue = it. get(expected)
95
108
if (nominallyTheSame(it)) {
96
- if (actual . " $i t " . class != expected . " $i t " . class) {
97
- description. appendText(" different classes $it :" +
98
- " ${ expected."$it". class.name} != ${ actual."$it" .class.name} , " )
109
+ if (actualPropertyValue . class != expectedPropertyValue . class) {
110
+ description. appendText(" different classes in $it . name :" +
111
+ " ${ expectedPropertyValue. class.name} != ${ actualPropertyValue .class.name} , " )
99
112
return false
100
113
}
101
- } else if (actual. " $it " != expected. " $it " ) {
102
- def (a1, e1) = [actual. " $it " , expected. " $it " ]
103
- if (([a1, e1]. contains(null ) || [a1. class, e1. class]. contains(null )) && [a1, e1] != nullList) {
104
- description. appendText(" different values in $it : $e1 != $a1 \n " )
114
+ } else if (actualPropertyValue != expectedPropertyValue) {
115
+ if (([actualPropertyValue, expectedPropertyValue]. contains(null )
116
+ || [actualPropertyValue. class, expectedPropertyValue. class]. contains(null ))
117
+ && [actualPropertyValue, expectedPropertyValue] != nullList) {
118
+ description. appendText(" different values in $it . name : ${ expectedPropertyValue} != ${ actualPropertyValue} \n " )
105
119
return false
106
- } else if (List . isCase(a1) && List . isCase(e1) && (a1. size() == e1. size())) {
120
+ } else if (List . isCase(actualPropertyValue) && List . isCase(expectedPropertyValue)
121
+ && (actualPropertyValue. size() == expectedPropertyValue. size())) {
107
122
def i = -1
108
- a1 . each { a ->
109
- i++ ; if (! compare(a, e1 [i])) {
110
- describer(a, e1 [i], description)
123
+ actualPropertyValue . each { a ->
124
+ i++ ; if (! compare(a, expectedPropertyValue [i])) {
125
+ describer(a, expectedPropertyValue [i], description)
111
126
}
112
127
}. every { it }
113
- } else if (a1. class. name. startsWith(' com.mongodb' ) && a1. class == e1. class) {
114
- return describer(a1, e1, description)
128
+ } else if (actualPropertyValue. class. name. startsWith(' com.mongodb' )
129
+ && actualPropertyValue. class == expectedPropertyValue. class) {
130
+ return describer(actualPropertyValue, expectedPropertyValue, description)
115
131
}
116
- description. appendText(" different values in $it : $e 1 != $a 1 \n " )
132
+ description. appendText(" different values in $it . name : ${ expectedPropertyValue } != ${ actualPropertyValue } \n " )
117
133
return false
118
134
}
119
135
true
120
136
}
121
137
}
122
138
123
- static List<String > getFieldNames (Class curClass ) {
124
- getFieldNames(curClass, [])
125
- }
126
-
127
- static List<String > getFieldNames (Class curClass , names ) {
128
- if (curClass != Object ) {
129
- getFieldNames(curClass. getSuperclass(), names + = curClass. declaredFields. findAll { ! it. synthetic }* . name)
139
+ static List<Field > getFields (Class curClass ) {
140
+ if (curClass == Object ) {
141
+ return []
130
142
}
131
- names
143
+ def fields = getFields(curClass. getSuperclass())
144
+ fields. addAll(curClass. declaredFields. findAll { ! it. synthetic && ! Modifier . isStatic(it. modifiers) })
145
+ fields
132
146
}
133
147
134
- static nominallyTheSame (String className ) {
135
- className in [' decoder' , ' executor' ]
136
- }
137
148
149
+ static nominallyTheSame (String propertyName ) {
150
+ propertyName in [' decoder' , ' executor' ]
151
+ }
138
152
}
0 commit comments