|
19 | 19 | import java.util.Collection; |
20 | 20 | import java.util.Locale; |
21 | 21 | import java.util.Map; |
| 22 | +import java.util.Objects; |
22 | 23 | import java.util.Optional; |
| 24 | +import java.util.function.BiPredicate; |
23 | 25 | import java.util.function.Predicate; |
24 | 26 | import java.util.regex.Pattern; |
25 | 27 |
|
@@ -110,88 +112,57 @@ private <T> Predicate<ExampleMatcher.PropertySpecifier> createPredicateForSpecif |
110 | 112 | return this.createPredicateForStringMatcher( |
111 | 113 | specifier, |
112 | 114 | setOrDefaultMatcher, |
113 | | - transformedExampledValue, |
114 | | - transformedValue); |
| 115 | + transformedExampledValue.get(), |
| 116 | + transformedValue.orElse(null)); |
115 | 117 | }; |
116 | 118 | } |
117 | 119 |
|
118 | 120 | private boolean createPredicateForStringMatcher( |
119 | 121 | final ExampleMatcher.PropertySpecifier specifier, |
120 | 122 | final ExampleMatcher.StringMatcher setOrDefaultMatcher, |
121 | | - final Optional<Object> transformedExampledValue, |
122 | | - final Optional<Object> transformedValue) |
| 123 | + final Object transformedExampledValue, // Never null |
| 124 | + final Object transformedValue) // Nullable |
123 | 125 | { |
124 | | - switch(setOrDefaultMatcher) |
| 126 | + // Check exact matches |
| 127 | + if(ExampleMatcher.StringMatcher.DEFAULT.equals(setOrDefaultMatcher) |
| 128 | + || ExampleMatcher.StringMatcher.EXACT.equals(setOrDefaultMatcher)) |
125 | 129 | { |
126 | | - case DEFAULT, EXACT -> |
| 130 | + if(transformedExampledValue instanceof String) |
127 | 131 | { |
128 | | - if(transformedExampledValue.get() instanceof String) |
129 | | - { |
130 | | - return this.valueToString(transformedValue, specifier).equals(this.valueToString( |
131 | | - transformedExampledValue, |
132 | | - specifier)); |
133 | | - } |
134 | | - return transformedExampledValue.equals(transformedValue); |
135 | | - } |
136 | | - case STARTING -> |
137 | | - { |
138 | | - final Optional<String> valueAsString = this.valueToString(transformedValue, specifier); |
139 | | - if(valueAsString.isEmpty()) |
140 | | - { |
141 | | - return false; |
142 | | - } |
143 | | - return valueAsString.get() |
144 | | - .startsWith(this.valueToString(transformedExampledValue, specifier).get()); |
145 | | - } |
146 | | - case ENDING -> |
147 | | - { |
148 | | - final Optional<String> valueAsString = this.valueToString(transformedValue, specifier); |
149 | | - if(valueAsString.isEmpty()) |
150 | | - { |
151 | | - return false; |
152 | | - } |
153 | | - return valueAsString.get().endsWith(this.valueToString(transformedExampledValue, specifier).get()); |
154 | | - } |
155 | | - case CONTAINING -> |
156 | | - { |
157 | | - final Optional<String> valueAsString = this.valueToString(transformedValue, specifier); |
158 | | - if(valueAsString.isEmpty()) |
159 | | - { |
160 | | - return false; |
161 | | - } |
162 | | - return valueAsString.get().contains(this.valueToString(transformedExampledValue, specifier).get()); |
163 | | - } |
164 | | - case REGEX -> |
165 | | - { |
166 | | - final Optional<String> valueAsString = this.valueToString(transformedValue, specifier); |
167 | | - if(valueAsString.isEmpty()) |
168 | | - { |
169 | | - return false; |
170 | | - } |
171 | | - return Pattern.compile( |
172 | | - this.valueToString(transformedExampledValue, specifier).get() |
173 | | - ) |
174 | | - .matcher(valueAsString.get()).find(); |
175 | | - } |
176 | | - default -> |
177 | | - { |
178 | | - return false; |
| 132 | + return Objects.equals( |
| 133 | + this.valueToString(transformedExampledValue, specifier), |
| 134 | + this.valueToString(transformedValue, specifier)); |
179 | 135 | } |
| 136 | + return Objects.equals(transformedExampledValue, transformedValue); |
180 | 137 | } |
| 138 | + |
| 139 | + // Check comparisons |
| 140 | + final BiPredicate<String, String> compareFunc = switch(setOrDefaultMatcher) |
| 141 | + { |
| 142 | + case STARTING -> String::startsWith; |
| 143 | + case ENDING -> String::endsWith; |
| 144 | + case CONTAINING -> String::contains; |
| 145 | + case REGEX -> (v, example) -> Pattern.compile(example).matcher(v).find(); |
| 146 | + default -> null; |
| 147 | + }; |
| 148 | + |
| 149 | + return compareFunc != null |
| 150 | + && Optional.ofNullable(this.valueToString(transformedValue, specifier)) |
| 151 | + .map(v -> compareFunc.test(v, this.valueToString(transformedExampledValue, specifier))) |
| 152 | + .orElse(false); |
181 | 153 | } |
182 | 154 |
|
183 | | - private Optional<String> valueToString( |
184 | | - final Optional<Object> value, |
| 155 | + private String valueToString( |
| 156 | + final Object value, |
185 | 157 | final ExampleMatcher.PropertySpecifier specifier) |
186 | 158 | { |
187 | | - if(value.isEmpty()) |
188 | | - { |
189 | | - return Optional.empty(); |
190 | | - } |
191 | | - if(specifier != null && Boolean.TRUE.equals(specifier.getIgnoreCase())) |
| 159 | + if(value == null) |
192 | 160 | { |
193 | | - return Optional.of(value.get().toString().toLowerCase(Locale.ROOT)); |
| 161 | + return null; |
194 | 162 | } |
195 | | - return Optional.of(value.get().toString()); |
| 163 | + |
| 164 | + return (specifier != null && Boolean.TRUE.equals(specifier.getIgnoreCase())) |
| 165 | + ? value.toString().toLowerCase(Locale.ROOT) |
| 166 | + : value.toString(); |
196 | 167 | } |
197 | 168 | } |
0 commit comments