Skip to content

Commit 4a25634

Browse files
matchers: notEqual matcher delegates to nested matcher (#1441)
1 parent acc5036 commit 4a25634

File tree

4 files changed

+79
-2
lines changed

4 files changed

+79
-2
lines changed

webtau-core/src/main/java/org/testingisdocumenting/webtau/expectation/equality/EqualMatcher.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ public TokenizedMessage matchedTokenizedMessage(ValuePath actualPath, Object act
6565
return tokenizedMessage().matcher("equals").valueFirstLinesOnly(expected);
6666
}
6767

68-
6968
@Override
7069
public Set<ValuePath> matchedPaths() {
7170
if (expectedMatcher != null) {

webtau-core/src/main/java/org/testingisdocumenting/webtau/expectation/equality/NotEqualMatcher.java

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.testingisdocumenting.webtau.expectation.equality;
1919

2020
import org.testingisdocumenting.webtau.data.ValuePath;
21+
import org.testingisdocumenting.webtau.data.converters.ValueConverter;
2122
import org.testingisdocumenting.webtau.expectation.ExpectedValuesAware;
2223
import org.testingisdocumenting.webtau.expectation.ValueMatcher;
2324
import org.testingisdocumenting.webtau.reporter.TokenizedMessage;
@@ -30,51 +31,93 @@ public class NotEqualMatcher implements ValueMatcher, ExpectedValuesAware {
3031
private CompareToComparator comparator;
3132

3233
private final Object expected;
34+
private final ValueMatcher expectedMatcher;
3335

3436
public NotEqualMatcher(Object expected) {
3537
this.expected = expected;
38+
this.expectedMatcher = expected instanceof ValueMatcher ?
39+
(ValueMatcher) expected :
40+
null;
41+
}
42+
43+
@Override
44+
public ValueConverter valueConverter() {
45+
return comparator == null ? ValueConverter.EMPTY : comparator.createValueConverter();
3646
}
3747

3848
@Override
3949
public TokenizedMessage matchingTokenizedMessage(ValuePath actualPath, Object actual) {
40-
comparator = CompareToComparator.comparator();
50+
if (expectedMatcher != null) {
51+
return expectedMatcher.negativeMatchingTokenizedMessage(actualPath, actual);
52+
}
4153

54+
comparator = CompareToComparator.comparator();
4255
return tokenizedMessage().matcher("to not equal").valueFirstLinesOnly(expected);
4356
}
4457

4558
@Override
4659
public TokenizedMessage matchedTokenizedMessage(ValuePath actualPath, Object actual) {
60+
if (expectedMatcher != null) {
61+
return expectedMatcher.negativeMatchedTokenizedMessage(actualPath, actual);
62+
}
63+
4764
return tokenizedMessage().matcher("doesn't equal").valueFirstLinesOnly(expected);
4865
}
4966

5067
@Override
5168
public TokenizedMessage mismatchedTokenizedMessage(ValuePath actualPath, Object actual) {
69+
if (expectedMatcher != null) {
70+
return expectedMatcher.negativeMismatchedTokenizedMessage(actualPath, actual);
71+
}
72+
5273
return comparator.generateNotEqualMismatchReport();
5374
}
5475

5576
@Override
5677
public boolean matches(ValuePath actualPath, Object actual) {
78+
if (expectedMatcher != null) {
79+
return expectedMatcher.negativeMatches(actualPath, actual);
80+
}
81+
82+
comparator.resetReportData();
5783
return comparator.compareIsNotEqual(actualPath, actual, expected);
5884
}
5985

6086
@Override
6187
public TokenizedMessage negativeMatchingTokenizedMessage(ValuePath actualPath, Object actual) {
88+
if (expectedMatcher != null) {
89+
return expectedMatcher.matchingTokenizedMessage(actualPath, actual);
90+
}
91+
6292
comparator = CompareToComparator.comparator();
6393
return tokenizedMessage().matcher("to equal").valueFirstLinesOnly(expected);
6494
}
6595

6696
@Override
6797
public TokenizedMessage negativeMatchedTokenizedMessage(ValuePath actualPath, Object actual) {
98+
if (expectedMatcher != null) {
99+
return expectedMatcher.matchedTokenizedMessage(actualPath, actual);
100+
}
101+
68102
return tokenizedMessage().matcher("equals").valueFirstLinesOnly(expected);
69103
}
70104

71105
@Override
72106
public TokenizedMessage negativeMismatchedTokenizedMessage(ValuePath actualPath, Object actual) {
107+
if (expectedMatcher != null) {
108+
return expectedMatcher.mismatchedTokenizedMessage(actualPath, actual);
109+
}
110+
73111
return comparator.generateEqualMismatchReport();
74112
}
75113

76114
@Override
77115
public boolean negativeMatches(ValuePath actualPath, Object actual) {
116+
if (expectedMatcher != null) {
117+
return expectedMatcher.matches(actualPath, actual);
118+
}
119+
120+
comparator.resetReportData();
78121
return comparator.compareIsEqual(actualPath, actual, expected);
79122
}
80123

webtau-core/src/test/groovy/org/testingisdocumenting/webtau/expectation/equality/NotEqualMatcherTest.groovy

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,40 @@ class NotEqualMatcherTest {
6060
}
6161
}
6262

63+
@Test
64+
void "delegates to matcher in case of negative mismatch if passed as expected"() {
65+
runExpectExceptionAndValidateOutput(AssertionError.class, 'X failed expecting [value] to not match any of [30, 100]:\n' +
66+
' actual: 100 <java.lang.Integer>\n' +
67+
' expected: not 100 <java.lang.Integer> (Xms)') {
68+
actual(100).should(notEqual(anyOf(30, 100)))
69+
}
70+
}
71+
72+
@Test
73+
void "delegates to matcher in case of negative match if passed as expected"() {
74+
runAndValidateOutput(". [value] doesn't match any of [30, 110] (Xms)") {
75+
actual(100).should(notEqual(anyOf(30, 110)))
76+
}
77+
}
78+
79+
@Test
80+
void "delegates to matcher in case of positive mismatch if passed as expected"() {
81+
runExpectExceptionAndValidateOutput(AssertionError.class, 'X failed expecting [value] to match any of [30, 110]:\n' +
82+
' actual: 100 <java.lang.Integer>\n' +
83+
' expected: 30 <java.lang.Integer>\n' +
84+
' actual: 100 <java.lang.Integer>\n' +
85+
' expected: 110 <java.lang.Integer> (Xms)') {
86+
actual(100).shouldNot(notEqual(anyOf(30, 110)))
87+
}
88+
}
89+
90+
@Test
91+
void "delegates to matcher in case of positive match if passed as expected"() {
92+
runAndValidateOutput(". [value] matches any of [30, 100] (Xms)") {
93+
actual(100).shouldNot(notEqual(anyOf(30, 100)))
94+
}
95+
}
96+
6397
@Test
6498
void "matching message"() {
6599
assert matcher.matchingTokenizedMessage(actualPath, 100).toString() == "to not equal $expected"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* Fix: `notEqual` [Matcher](matchers/introduction) now properly delegates to nested matcher such as `anyOf`

0 commit comments

Comments
 (0)