Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import org.testingisdocumenting.webtau.cfg.WebTauConfig;
import org.testingisdocumenting.webtau.data.ValuePath;
import org.testingisdocumenting.webtau.expectation.equality.ValuePathLazyMessageList;
import org.testingisdocumenting.webtau.expectation.equality.ValuePathMessage;
import org.testingisdocumenting.webtau.reporter.TokenizedMessage;

Expand All @@ -31,8 +32,8 @@ public class TokenizedReportUtils {
private TokenizedReportUtils() {
}

public static TokenizedMessage generateReportPart(ValuePath topLevelActualPath, TokenizedMessage label, List<List<ValuePathMessage>> messagesGroups) {
if (messagesGroups.stream().allMatch(List::isEmpty)) {
public static TokenizedMessage generateReportPart(ValuePath topLevelActualPath, TokenizedMessage label, List<ValuePathLazyMessageList> messagesGroups) {
if (messagesGroups.stream().allMatch(l -> l == null || l.isEmpty())) {
return tokenizedMessage();
}

Expand Down Expand Up @@ -63,21 +64,21 @@ public static TokenizedMessage combineReportParts(TokenizedMessage... parts) {
}

public static TokenizedMessage generateReportPartWithoutLabel(ValuePath topLevelActualPath,
Stream<List<ValuePathMessage>> messagesGroupsStream) {
Stream<ValuePathLazyMessageList> messagesGroupsStream) {
return generateReportPartWithoutLabel(topLevelActualPath, messagesGroupsStream, WebTauConfig.getCfg().getMatchersReportEntriesLimit());
}

public static TokenizedMessage generateReportPartWithoutLabel(ValuePath topLevelActualPath,
Stream<List<ValuePathMessage>> messagesGroupsStream,
Stream<ValuePathLazyMessageList> messagesGroupsStream,
int maxNumberOfEntries) {
List<List<ValuePathMessage>> messagesGroups = messagesGroupsStream.filter(group -> !group.isEmpty()).toList();
List<ValuePathLazyMessageList> messagesGroups = messagesGroupsStream.filter(group -> group != null && !group.isEmpty()).toList();
if (messagesGroups.isEmpty()) {
return tokenizedMessage();
}

TokenizedMessage result = tokenizedMessage();
int groupIdx = 0;
for (List<ValuePathMessage> group : messagesGroups) {
for (ValuePathLazyMessageList group : messagesGroups) {
TokenizedReportUtils.appendToReport(result, topLevelActualPath, group, maxNumberOfEntries);

boolean isLastGroup = groupIdx == messagesGroups.size() - 1;
Expand All @@ -93,7 +94,7 @@ public static TokenizedMessage generateReportPartWithoutLabel(ValuePath topLevel

private static void appendToReport(TokenizedMessage report,
ValuePath topLevelActualPath,
List<ValuePathMessage> messages,
ValuePathLazyMessageList messages,
int maxNumberOfEntries) {
boolean needToLimit = messages.size() > maxNumberOfEntries;
int messageIdx = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.testingisdocumenting.webtau.expectation.contain.handlers.IterableAndTableContainHandler;
import org.testingisdocumenting.webtau.expectation.contain.handlers.IterableAndSingleValueContainHandler;
import org.testingisdocumenting.webtau.expectation.contain.handlers.NullContainHandler;
import org.testingisdocumenting.webtau.expectation.equality.ValuePathLazyMessageList;
import org.testingisdocumenting.webtau.expectation.equality.ValuePathMessage;
import org.testingisdocumenting.webtau.reporter.TokenizedMessage;
import org.testingisdocumenting.webtau.utils.ServiceLoaderUtils;
Expand All @@ -39,9 +40,9 @@
public class ContainAnalyzer {
private static final List<ContainHandler> handlers = discoverHandlers();

private final List<ValuePathMessage> matchMessages;
private final List<ValuePathMessage> mismatchMessages;
private final List<ValuePathMessage> missingMessages;
private final ValuePathLazyMessageList matchMessages;
private final ValuePathLazyMessageList mismatchMessages;
private final ValuePathLazyMessageList missingMessages;

private final Set<ValuePath> extraMismatchPaths;

Expand Down Expand Up @@ -82,7 +83,7 @@ public void reportMismatch(ContainHandler reporter, ValuePathMessage valuePathMe
mismatchMessages.add(valuePathMessage);
}

public void reportMismatches(ContainHandler reporter, List<ValuePathMessage> valuePathMessages) {
public void reportMismatches(ContainHandler reporter, ValuePathLazyMessageList valuePathMessages) {
mismatchMessages.addAll(valuePathMessages);
}

Expand All @@ -98,7 +99,7 @@ public void reportMissing(ContainHandler reporter, ValuePathMessage valuePathMes
missingMessages.add(valuePathMessage);
}

public void reportMissing(ContainHandler reporter, List<ValuePathMessage> valuePathMessages) {
public void reportMissing(ContainHandler reporter, ValuePathLazyMessageList valuePathMessages) {
missingMessages.addAll(valuePathMessages);
}

Expand All @@ -111,13 +112,13 @@ public void reportMatch(ContainHandler reporter, ValuePath actualPath, Supplier<
}

public Set<ValuePath> generateMatchPaths() {
return extractActualPaths(matchMessages);
return matchMessages.extractPaths();
}

public Set<ValuePath> generateMismatchPaths() {
HashSet<ValuePath> result = new HashSet<>(extraMismatchPaths);
result.addAll(extractActualPaths(mismatchMessages));
result.addAll(extractActualPaths(missingMessages));
result.addAll(mismatchMessages.extractPaths());
result.addAll(missingMessages.extractPaths());

return result;
}
Expand Down Expand Up @@ -184,9 +185,9 @@ public void resetReportData() {
}

private ContainAnalyzer() {
this.matchMessages = new ArrayList<>();
this.mismatchMessages = new ArrayList<>();
this.missingMessages = new ArrayList<>();
this.matchMessages = new ValuePathLazyMessageList();
this.mismatchMessages = new ValuePathLazyMessageList();
this.missingMessages = new ValuePathLazyMessageList();
this.mismatchedExpectedValues = new ArrayList<>();
this.extraMismatchPaths = new HashSet<>();
}
Expand All @@ -208,13 +209,6 @@ private boolean contains(ValuePath actualPath, Object actual, Object expected, b
return after == before;
}

private Set<ValuePath> extractActualPaths(List<ValuePathMessage> notEqualMessages) {
return notEqualMessages
.stream()
.map(ValuePathMessage::actualPath)
.collect(Collectors.toSet());
}

private void updateTopLevelActualPath(ValuePath actualPath) {
if (topLevelActualPath == null) {
topLevelActualPath = actualPath;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.testingisdocumenting.webtau.expectation.ValueMatcher;
import org.testingisdocumenting.webtau.expectation.equality.CompareToComparator;
import org.testingisdocumenting.webtau.expectation.equality.CompareToResult;
import org.testingisdocumenting.webtau.expectation.equality.ValuePathLazyMessageList;
import org.testingisdocumenting.webtau.expectation.equality.ValuePathMessage;
import org.testingisdocumenting.webtau.reporter.TokenizedMessage;

Expand All @@ -40,10 +41,10 @@ public class ContainExactlyMatcher implements ValueMatcher, ExpectedValuesAware,
private List<ValuePathWithValue<Object>> actualCopy;
private List<ValuePathWithValue<Object>> expectedCopy;

private final Map<ValuePath, List<List<ValuePathMessage>>> notEqualMessagesByExpectedPath = new HashMap<>();
private final List<ValuePathMessage> notEqualCandidateMessages = new ArrayList<>();
private final List<ValuePathMessage> missingMessages = new ArrayList<>();
private final List<ValuePathMessage> extraMessages = new ArrayList<>();
private final Map<ValuePath, List<ValuePathLazyMessageList>> notEqualMessagesByExpectedPath = new HashMap<>();
private final ValuePathLazyMessageList notEqualCandidateMessages = new ValuePathLazyMessageList();
private final ValuePathLazyMessageList missingMessages = new ValuePathLazyMessageList();
private final ValuePathLazyMessageList extraMessages = new ValuePathLazyMessageList();

private CompareToComparator comparator;

Expand Down Expand Up @@ -191,11 +192,11 @@ private boolean matches(CompareToComparator comparator, ValuePath actualPath, Ob
return actualCopy.isEmpty() && expectedCopy.isEmpty();
}

private List<ValuePathMessage> extractPotentialNotEqualMessages() {
private ValuePathLazyMessageList extractPotentialNotEqualMessages() {
List<ValuePath> actualPaths = actualCopy.stream().map(ValuePathWithValue::getPath).toList();
List<ValuePathMessage> notEqualCandidateMessages = new ArrayList<>();
ValuePathLazyMessageList notEqualCandidateMessages = new ValuePathLazyMessageList();
for (ValuePathWithValue<Object> expectedWithPath : expectedCopy) {
List<List<ValuePathMessage>> notEqualMessageBatches = notEqualMessagesByExpectedPath.get(expectedWithPath.getPath());
List<ValuePathLazyMessageList> notEqualMessageBatches = notEqualMessagesByExpectedPath.get(expectedWithPath.getPath());
if (notEqualMessageBatches == null) {
continue;
}
Expand All @@ -207,7 +208,7 @@ private List<ValuePathMessage> extractPotentialNotEqualMessages() {
return false;
}

ValuePathMessage firstMessage = batch.get(0);
ValuePathMessage firstMessage = batch.first();
return actualPaths.stream().anyMatch(path -> firstMessage.actualPath().startsWith(path));
})
.toList();
Expand All @@ -217,10 +218,10 @@ private List<ValuePathMessage> extractPotentialNotEqualMessages() {
// it will be a potential mismatch detail to display,
//
int minNumberOMismatches = notEqualMessageBatches.stream()
.map(List::size)
.map(ValuePathLazyMessageList::size)
.min(Integer::compareTo).orElse(0);

List<List<ValuePathMessage>> messagesWithMinFailures = notEqualMessageBatches.stream()
List<ValuePathLazyMessageList> messagesWithMinFailures = notEqualMessageBatches.stream()
.filter(v -> v.size() == minNumberOMismatches).toList();

if (notEqualMessageBatches.size() != messagesWithMinFailures.size()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,22 @@
package org.testingisdocumenting.webtau.expectation.contain.handlers;

import org.testingisdocumenting.webtau.data.ValuePath;
import org.testingisdocumenting.webtau.expectation.equality.ValuePathLazyMessageList;
import org.testingisdocumenting.webtau.expectation.equality.ValuePathMessage;

import java.util.List;
import java.util.stream.Stream;

public record CombinedMismatchAndMissing(List<ValuePathMessage> mismatchMessages, List<ValuePathMessage> missingMessage) {
public record CombinedMismatchAndMissing(ValuePathLazyMessageList mismatchMessages, ValuePathLazyMessageList missingMessages) {
int size() {
return mismatchMessages.size() + missingMessage.size();
int mismatchMessagesSize = mismatchMessages == null ? 0 : mismatchMessages.size();
int missingMessagesSize = missingMessages == null ? 0 : missingMessages.size();
return mismatchMessagesSize + missingMessagesSize;
}

List<ValuePath> extractPaths() {
return Stream.concat(
mismatchMessages.stream().map(ValuePathMessage::actualPath),
missingMessage.stream().map(ValuePathMessage::actualPath)).toList();
mismatchMessages == null ? Stream.empty() : mismatchMessages.stream().map(ValuePathMessage::actualPath),
missingMessages == null ? Stream.empty() : missingMessages.stream().map(ValuePathMessage::actualPath)).toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public void analyzeContain(ContainAnalyzer containAnalyzer, ValuePath actualPath
suspects.forEach(list -> containAnalyzer.registerExtraMismatchPaths(list.extractPaths()));
suspects.forEach(list -> {
containAnalyzer.reportMismatches(this, list.mismatchMessages());
containAnalyzer.reportMissing(this, list.missingMessage());
containAnalyzer.reportMissing(this, list.missingMessages());
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ public List<IndexedValue> findContainingIndexedValues() {
Object actualValue = iterator.next();
ValuePath indexedPath = actualPath.index(idx);

// shit is happening here for large numbers
CompareToResult compareToResult = comparator.compareUsingEqualOnly(indexedPath, actualValue, expected);
boolean isEqual = compareToResult.isEqual();
if (isEqual) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,13 @@ private void analyzeMapAndMapSingleExpectedEntry(ContainAnalyzer containAnalyzer

containAnalyzer.registerConvertedActualByPath(comparator.getConvertedActualByPath());
if (!actualValueEqual) {
comparator.getMissingMessages().forEach(m -> containAnalyzer.reportMissing(this, m));
comparator.getNotEqualMessages().forEach(m -> containAnalyzer.reportMismatch(this, m));
if (comparator.getMissingMessages() != null) {
comparator.getMissingMessages().forEach(m -> containAnalyzer.reportMissing(this, m));
}

if (comparator.getNotEqualMessages() != null) {
comparator.getNotEqualMessages().forEach(m -> containAnalyzer.reportMismatch(this, m));
}
} else {
containAnalyzer.reportMatch(this, propertyPath, comparator::generateEqualMatchReport);
}
Expand Down
Loading