Skip to content

Commit 99de0f1

Browse files
matchers: optimize message generation (#1567)
1 parent 0cd95e3 commit 99de0f1

28 files changed

Lines changed: 111 additions & 112 deletions

webtau-cli/src/main/java/org/testingisdocumenting/webtau/cli/expectation/CliOutputContainHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,12 @@ public void analyzeNotContain(ContainAnalyzer containAnalyzer, ValuePath actualP
5959

6060
indexedValues.forEach(indexedValue ->
6161
containAnalyzer.reportMatch(this, actualPath.index(indexedValue.idx()),
62-
tokenizedMessage().matcher("equals").value(indexedValue.value())
62+
() -> tokenizedMessage().matcher("equals").value(indexedValue.value())
6363
));
6464
}
6565

6666
/*
67-
for output we want to be able to mark matched lines, and so want to treat output as a list of lines.
67+
for output, we want to be able to mark matched lines, and so want to treat output as a list of lines.
6868
at the same time we want a substring match within a line.
6969
so we will automatically convert expected text to a quoted regexp and pass it down to contain analyzer.
7070
*/

webtau-core/src/main/java/org/testingisdocumenting/webtau/data/datanode/DataNodeListAndValueContainHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public void analyzeNotContain(ContainAnalyzer containAnalyzer, ValuePath actualP
7777
ValuePath indexedPath = actualPath.index(indexedValue.idx());
7878

7979
containAnalyzer.reportMatch(this, indexedPath,
80-
tokenizedMessage().error("equals").valueFirstLinesOnly(indexedValue.value()));
80+
() -> tokenizedMessage().error("equals").valueFirstLinesOnly(indexedValue.value()));
8181
comparator.compareUsingEqualOnly(indexedPath, dataNodes.get(indexedValue.idx()), expected);
8282
});
8383
}

webtau-core/src/main/java/org/testingisdocumenting/webtau/expectation/TokenizedReportUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,8 @@ private static void appendToReport(TokenizedMessage report,
104104
return;
105105
}
106106

107-
boolean useFullMessage = !message.getActualPath().equals(topLevelActualPath);
108-
report.add(useFullMessage ? message.getFullMessage() : message.getMessage());
107+
boolean useFullMessage = !message.actualPath().equals(topLevelActualPath);
108+
report.add(useFullMessage ? message.buildFullMessage() : message.buildMessage());
109109

110110
boolean isLast = messageIdx == messages.size() - 1;
111111
if (!isLast) {

webtau-core/src/main/java/org/testingisdocumenting/webtau/expectation/contain/ContainAnalyzer.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.testingisdocumenting.webtau.utils.TraceUtils;
3030

3131
import java.util.*;
32+
import java.util.function.Supplier;
3233
import java.util.stream.Collectors;
3334
import java.util.stream.Stream;
3435

@@ -85,12 +86,12 @@ public void reportMismatches(ContainHandler reporter, List<ValuePathMessage> val
8586
mismatchMessages.addAll(valuePathMessages);
8687
}
8788

88-
public void reportMismatch(ContainHandler reporter, ValuePath actualPath, TokenizedMessage mismatch) {
89+
public void reportMismatch(ContainHandler reporter, ValuePath actualPath, Supplier<TokenizedMessage> mismatch) {
8990
reportMismatch(reporter, new ValuePathMessage(actualPath, mismatch));
9091
}
9192

9293
public void reportMissing(ContainHandler reporter, ValuePath actualPath, Object value) {
93-
missingMessages.add(new ValuePathMessage(actualPath, tokenizedMessage().value(value)));
94+
missingMessages.add(new ValuePathMessage(actualPath, () -> tokenizedMessage().value(value)));
9495
}
9596

9697
public void reportMissing(ContainHandler reporter, ValuePathMessage valuePathMessage) {
@@ -105,7 +106,7 @@ public void reportMismatchedValue(Object oneOfExpectedValues) {
105106
mismatchedExpectedValues.add(oneOfExpectedValues);
106107
}
107108

108-
public void reportMatch(ContainHandler reporter, ValuePath actualPath, TokenizedMessage mismatch) {
109+
public void reportMatch(ContainHandler reporter, ValuePath actualPath, Supplier<TokenizedMessage> mismatch) {
109110
matchMessages.add(new ValuePathMessage(actualPath, mismatch));
110111
}
111112

@@ -123,9 +124,9 @@ public Set<ValuePath> generateMismatchPaths() {
123124

124125
public TokenizedMessage generateMatchReport() {
125126
return TokenizedMessage.join("\n", matchMessages.stream().map(message ->
126-
message.getActualPath().equals(topLevelActualPath) ?
127-
message.getMessage() :
128-
message.getFullMessage()).collect(Collectors.toList()));
127+
message.actualPath().equals(topLevelActualPath) ?
128+
message.buildMessage() :
129+
message.buildFullMessage()).collect(Collectors.toList()));
129130
}
130131

131132
public TokenizedMessage generateMismatchReport() {
@@ -158,6 +159,14 @@ public boolean noMatches() {
158159
return matchMessages.isEmpty();
159160
}
160161

162+
public int numberMatchMessages() {
163+
return matchMessages.size();
164+
}
165+
166+
public int numberOfMismatchMessages() {
167+
return mismatchMessages.size() + missingMessages.size() + mismatchedExpectedValues.size();
168+
}
169+
161170
public void registerConvertedActualByPath(Map<ValuePath, Object> convertedActualByPath) {
162171
this.convertedActualByPath.putAll(convertedActualByPath);
163172
}
@@ -192,17 +201,17 @@ private boolean contains(ValuePath actualPath, Object actual, Object expected, b
192201

193202
Object convertedExpected = handler.convertedExpected(actual, expected);
194203

195-
int before = isNegative ? matchMessages.size() : (mismatchMessages.size() + missingMessages.size() + mismatchedExpectedValues.size());
204+
int before = isNegative ? numberMatchMessages() : numberOfMismatchMessages();
196205
containsLogic.execute(handler, convertedActual, convertedExpected);
197-
int after = isNegative ? matchMessages.size() : (mismatchMessages.size() + missingMessages.size() + mismatchedExpectedValues.size());
206+
int after = isNegative ? numberMatchMessages() : numberOfMismatchMessages();
198207

199208
return after == before;
200209
}
201210

202211
private Set<ValuePath> extractActualPaths(List<ValuePathMessage> notEqualMessages) {
203212
return notEqualMessages
204213
.stream()
205-
.map(ValuePathMessage::getActualPath)
214+
.map(ValuePathMessage::actualPath)
206215
.collect(Collectors.toSet());
207216
}
208217

webtau-core/src/main/java/org/testingisdocumenting/webtau/expectation/contain/ContainExactlyMatcher.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ public Stream<Object> expectedValues() {
6363

6464
@Override
6565
public Set<ValuePath> mismatchedPaths() {
66-
Set<ValuePath> potentialPaths = Stream.concat(missingMessages.stream().map(ValuePathMessage::getActualPath),
67-
Stream.concat(extraMessages.stream().map(ValuePathMessage::getActualPath),
68-
notEqualCandidateMessages.stream().map(ValuePathMessage::getActualPath)))
66+
Set<ValuePath> potentialPaths = Stream.concat(missingMessages.stream().map(ValuePathMessage::actualPath),
67+
Stream.concat(extraMessages.stream().map(ValuePathMessage::actualPath),
68+
notEqualCandidateMessages.stream().map(ValuePathMessage::actualPath)))
6969
.collect(Collectors.toSet());
7070
return potentialPaths.isEmpty() ?
7171
actualCopy.stream().map(ValuePathWithValue::getPath).collect(Collectors.toSet()) :
@@ -208,7 +208,7 @@ private List<ValuePathMessage> extractPotentialNotEqualMessages() {
208208
}
209209

210210
ValuePathMessage firstMessage = batch.get(0);
211-
return actualPaths.stream().anyMatch(path -> firstMessage.getActualPath().startsWith(path));
211+
return actualPaths.stream().anyMatch(path -> firstMessage.actualPath().startsWith(path));
212212
})
213213
.toList();
214214

webtau-core/src/main/java/org/testingisdocumenting/webtau/expectation/contain/handlers/CombinedMismatchAndMissing.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ int size() {
2929

3030
List<ValuePath> extractPaths() {
3131
return Stream.concat(
32-
mismatchMessages.stream().map(ValuePathMessage::getActualPath),
33-
missingMessage.stream().map(ValuePathMessage::getActualPath)).toList();
32+
mismatchMessages.stream().map(ValuePathMessage::actualPath),
33+
missingMessage.stream().map(ValuePathMessage::actualPath)).toList();
3434
}
3535
}

webtau-core/src/main/java/org/testingisdocumenting/webtau/expectation/contain/handlers/IterableAndSingleValueContainHandler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ public void analyzeNotContain(ContainAnalyzer containAnalyzer, ValuePath actualP
6666
List<IndexedValue> indexedValues = analyzer.findContainingIndexedValues();
6767

6868
if (!indexedValues.isEmpty()) {
69-
analyzer.getComparator().getEqualMessages().forEach(message -> containAnalyzer.reportMatch(this, message.getActualPath(), message.getMessage()));
69+
analyzer.getComparator().getEqualMessages().forEach(message ->
70+
containAnalyzer.reportMatch(this, message.actualPath(), message.messageFunc()));
7071
}
7172

7273
containAnalyzer.registerConvertedActualByPath(analyzer.getComparator().getConvertedActualByPath());

webtau-core/src/main/java/org/testingisdocumenting/webtau/expectation/contain/handlers/IterableContainAnalyzer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public List<IndexedValue> findContainingIndexedValues() {
4949
Object actualValue = iterator.next();
5050
ValuePath indexedPath = actualPath.index(idx);
5151

52+
// shit is happening here for large numbers
5253
CompareToResult compareToResult = comparator.compareUsingEqualOnly(indexedPath, actualValue, expected);
5354
boolean isEqual = compareToResult.isEqual();
5455
if (isEqual) {

webtau-core/src/main/java/org/testingisdocumenting/webtau/expectation/contain/handlers/MapContainHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ private void analyzeMapAndMapSingleExpectedEntry(ContainAnalyzer containAnalyzer
7979
comparator.getMissingMessages().forEach(m -> containAnalyzer.reportMissing(this, m));
8080
comparator.getNotEqualMessages().forEach(m -> containAnalyzer.reportMismatch(this, m));
8181
} else {
82-
containAnalyzer.reportMatch(this, propertyPath, comparator.generateEqualMatchReport());
82+
containAnalyzer.reportMatch(this, propertyPath, comparator::generateEqualMatchReport);
8383
}
8484
}
8585
}

webtau-core/src/main/java/org/testingisdocumenting/webtau/expectation/contain/handlers/NullContainHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ public boolean handle(Object actual, Object expected) {
3131

3232
@Override
3333
public void analyzeContain(ContainAnalyzer containAnalyzer, ValuePath actualPath, Object actual, Object expected) {
34-
containAnalyzer.reportMismatch(this, actualPath, tokenizedMessage().valueFirstLinesOnly(actual).error("doesn't contain").valueFirstLinesOnly(expected));
34+
containAnalyzer.reportMismatch(this, actualPath, () -> tokenizedMessage().valueFirstLinesOnly(actual).error("doesn't contain").valueFirstLinesOnly(expected));
3535
}
3636

3737
@Override
3838
public void analyzeNotContain(ContainAnalyzer containAnalyzer, ValuePath actualPath, Object actual, Object expected) {
39-
containAnalyzer.reportMismatch(this, actualPath, tokenizedMessage().valueFirstLinesOnly(actual).error("doesn't contain").valueFirstLinesOnly(expected));
39+
containAnalyzer.reportMismatch(this, actualPath, () -> tokenizedMessage().valueFirstLinesOnly(actual).error("doesn't contain").valueFirstLinesOnly(expected));
4040
}
4141
}

0 commit comments

Comments
 (0)