Skip to content

Commit 883f1e3

Browse files
authored
Merge pull request #18 from antkorwin/feature/matcher-refactoring-map-and-list
Refactoring data matching and fix the matching of nested Arrays in the expected DataSet.
2 parents 270981f + 414e70a commit 883f1e3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+995
-321
lines changed

pom.xml

+13
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,19 @@
230230
<check/>
231231
</configuration>
232232
</plugin>
233+
234+
<plugin>
235+
<groupId>org.apache.maven.plugins</groupId>
236+
<artifactId>maven-source-plugin</artifactId>
237+
<executions>
238+
<execution>
239+
<id>attach-sources</id>
240+
<goals>
241+
<goal>jar</goal>
242+
</goals>
243+
</execution>
244+
</executions>
245+
</plugin>
233246
</plugins>
234247

235248
<resources>

src/main/java/com/antkorwin/springtestmongo/internal/MongoDbTest.java

+7
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,17 @@
22

33
import com.antkorwin.commonutils.exceptions.InternalException;
44
import com.antkorwin.commonutils.validation.Guard;
5+
import com.antkorwin.springtestmongo.internal.DataSet;
56
import com.antkorwin.springtestmongo.internal.expect.MatchDataSets;
67
import com.antkorwin.springtestmongo.internal.expect.dynamic.value.DynamicDataSet;
78
import com.antkorwin.springtestmongo.internal.expect.dynamic.value.DynamicValue;
89
import com.antkorwin.springtestmongo.internal.expect.dynamic.value.GroovyDynamicValue;
10+
import com.antkorwin.springtestmongo.internal.exportdata.ExportFile;
11+
import com.antkorwin.springtestmongo.internal.exportdata.JsonExport;
12+
import com.antkorwin.springtestmongo.internal.exportdata.MongoDataExport;
13+
import com.antkorwin.springtestmongo.internal.importdata.ImportFile;
14+
import com.antkorwin.springtestmongo.internal.importdata.JsonImport;
15+
import com.antkorwin.springtestmongo.internal.importdata.MongoDataImport;
916
import com.google.common.collect.Sets;
1017
import org.springframework.data.mongodb.core.MongoTemplate;
1118

src/main/java/com/antkorwin/springtestmongo/internal/Text.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
* @author Korovin Anatoliy
88
*/
9-
interface Text {
9+
public interface Text {
1010

1111
/**
1212
* read text data

src/main/java/com/antkorwin/springtestmongo/internal/expect/MatchDataSets.java

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package com.antkorwin.springtestmongo.internal.expect;
22

33
import com.antkorwin.springtestmongo.internal.DataSet;
4+
import com.antkorwin.springtestmongo.internal.expect.graph.AssertGraph;
5+
import com.antkorwin.springtestmongo.internal.expect.graph.IndexedGraph;
6+
import com.antkorwin.springtestmongo.internal.expect.graph.MatchGraph;
7+
import com.antkorwin.springtestmongo.internal.expect.graph.ReachabilityGraph;
48
import org.junit.jupiter.api.Assertions;
59

610
import java.util.List;

src/main/java/com/antkorwin/springtestmongo/internal/expect/ObjectMatcher.java

-86
This file was deleted.

src/main/java/com/antkorwin/springtestmongo/internal/expect/dynamic/value/DynamicDataSet.java

+29-4
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
/**
1212
* Created on 16.12.2018.
13-
*
13+
* <p>
1414
* Evaluate dynamic-values in the DataSet
1515
*
1616
* @author Korovin Anatoliy
@@ -44,7 +44,10 @@ public Map<String, List<Map<String, Object>>> read() {
4444
return evaluatedDataSet;
4545
}
4646

47-
private void applyReplacerToMap(Map<String, Object> maps) {
47+
private void applyReplacerToMap(Map<String, Object> mapValues) {
48+
49+
Map<String, Object> maps = this.objectMapper.convertValue(mapValues, Map.class);
50+
4851
for (String key : maps.keySet()) {
4952
Object value = maps.get(key);
5053
if (!this.complexityDataTypes.isComplexType(value)) {
@@ -54,8 +57,30 @@ private void applyReplacerToMap(Map<String, Object> maps) {
5457
}
5558
}
5659
} else {
57-
Map<String, Object> map = this.objectMapper.convertValue(value, Map.class);
58-
applyReplacerToMap(map);
60+
if (value instanceof Map) {
61+
applyReplacerToMap((Map<String, Object>) value);
62+
} else if (value instanceof List) {
63+
applyReplacerToList((List<Object>) value);
64+
}
65+
}
66+
}
67+
}
68+
69+
private void applyReplacerToList(List<Object> listValues) {
70+
for (int i = 0; i < listValues.size(); i++) {
71+
Object value = listValues.get(i);
72+
if (value instanceof Map) {
73+
applyReplacerToMap((Map<String, Object>) value);
74+
continue;
75+
}
76+
if (value instanceof List) {
77+
applyReplacerToList((List<Object>) value);
78+
continue;
79+
}
80+
for (DynamicValue replacer : this.dynamicValueEvaluators) {
81+
if (replacer.isNecessary(value)) {
82+
listValues.set(i, replacer.evaluate(value));
83+
}
5984
}
6085
}
6186
}

src/main/java/com/antkorwin/springtestmongo/internal/expect/AssertGraph.java src/main/java/com/antkorwin/springtestmongo/internal/expect/graph/AssertGraph.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.antkorwin.springtestmongo.internal.expect;
1+
package com.antkorwin.springtestmongo.internal.expect.graph;
22

33
import com.antkorwin.commonutils.exceptions.InternalException;
44
import com.fasterxml.jackson.core.JsonProcessingException;

src/main/java/com/antkorwin/springtestmongo/internal/expect/Graph.java src/main/java/com/antkorwin/springtestmongo/internal/expect/graph/Graph.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.antkorwin.springtestmongo.internal.expect;
1+
package com.antkorwin.springtestmongo.internal.expect.graph;
22

33
import java.util.Map;
44

src/main/java/com/antkorwin/springtestmongo/internal/expect/IndexedGraph.java src/main/java/com/antkorwin/springtestmongo/internal/expect/graph/IndexedGraph.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.antkorwin.springtestmongo.internal.expect;
1+
package com.antkorwin.springtestmongo.internal.expect.graph;
22

33
import java.util.HashSet;
44
import java.util.Map;

src/main/java/com/antkorwin/springtestmongo/internal/expect/MatchGraph.java src/main/java/com/antkorwin/springtestmongo/internal/expect/graph/MatchGraph.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
package com.antkorwin.springtestmongo.internal.expect;
1+
package com.antkorwin.springtestmongo.internal.expect.graph;
2+
3+
import com.antkorwin.springtestmongo.internal.expect.match.MatchAny;
24

35
import java.util.List;
46
import java.util.Map;
57

68
/**
79
* Created on 09.12.2018.
8-
*
10+
* <p>
911
* Evaluate the graph of the object matching,
1012
* try to match all data records to each pattern,
1113
* and save this in the matrix.
@@ -17,13 +19,15 @@ public class MatchGraph implements Graph {
1719
private final List<Map<String, Object>> dataRecords;
1820
private final List<Map<String, Object>> patterns;
1921
private final String documentName;
22+
private final MatchAny matchAny;
2023

2124
public MatchGraph(String documentName,
2225
List<Map<String, Object>> dataRecords,
2326
List<Map<String, Object>> patterns) {
2427
this.documentName = documentName;
2528
this.dataRecords = dataRecords;
2629
this.patterns = patterns;
30+
this.matchAny = new MatchAny();
2731
}
2832

2933
@Override
@@ -35,9 +39,8 @@ public boolean[][] calculate() {
3539
boolean[][] matrix = new boolean[matchedSize][patternSize];
3640

3741
for (int i = 0; i < matchedSize; i++) {
38-
ObjectMatcher actualItem = new ObjectMatcher(dataRecords.get(i));
3942
for (int j = 0; j < patternSize; j++) {
40-
matrix[i][j] = actualItem.match(patterns.get(j));
43+
matrix[i][j] = matchAny.match(dataRecords.get(i), patterns.get(j));
4144
}
4245
}
4346

src/main/java/com/antkorwin/springtestmongo/internal/expect/Printer.java src/main/java/com/antkorwin/springtestmongo/internal/expect/graph/Printer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.antkorwin.springtestmongo.internal.expect;
1+
package com.antkorwin.springtestmongo.internal.expect.graph;
22

33
/**
44
* Created on 09.12.2018.

src/main/java/com/antkorwin/springtestmongo/internal/expect/ReachabilityGraph.java src/main/java/com/antkorwin/springtestmongo/internal/expect/graph/ReachabilityGraph.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.antkorwin.springtestmongo.internal.expect;
1+
package com.antkorwin.springtestmongo.internal.expect.graph;
22

33
import java.util.ArrayList;
44
import java.util.HashMap;

src/main/java/com/antkorwin/springtestmongo/internal/expect/TestGraph.java src/main/java/com/antkorwin/springtestmongo/internal/expect/graph/TestGraph.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.antkorwin.springtestmongo.internal.expect;
1+
package com.antkorwin.springtestmongo.internal.expect.graph;
22

33
import java.util.ArrayList;
44
import java.util.List;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.antkorwin.springtestmongo.internal.expect.match;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
6+
/**
7+
* Created on 18.12.2018.
8+
* <p>
9+
* Top-level matcher, to match objects of any types
10+
* (List, Map, Number e.t.c.)
11+
*
12+
* @author Korovin Anatoliy
13+
*/
14+
public class MatchAny implements MatchData {
15+
16+
private final MatchDataFactory matchDataFactory;
17+
18+
public MatchAny() {
19+
this.matchDataFactory = new MatchDataFactory();
20+
}
21+
22+
@Override
23+
public boolean match(Object original, Object expected) {
24+
25+
JsonNode originalNode = new ObjectMapper().valueToTree(original);
26+
JsonNode expectedNode = new ObjectMapper().valueToTree(expected);
27+
28+
if (original == null) {
29+
return expected == null;
30+
}
31+
32+
if (expected == null) {
33+
return true;
34+
}
35+
36+
if (originalNode.getNodeType() != expectedNode.getNodeType()) {
37+
return false;
38+
}
39+
40+
return matchDataFactory.get(originalNode.getNodeType())
41+
.match(original, expected);
42+
}
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.antkorwin.springtestmongo.internal.expect.match;
2+
3+
import java.math.BigInteger;
4+
5+
/**
6+
* Created on 19.12.2018.
7+
*
8+
* Match two {@link BigInteger} values or
9+
* {@link BigInteger} with {@link Long} or
10+
* {@link BigInteger} with {@link Integer}
11+
*
12+
* @author Korovin Anatoliy
13+
*/
14+
public class MatchBigInteger implements MatchData {
15+
16+
private final MatchObjects matchObjects;
17+
18+
public MatchBigInteger() {
19+
this.matchObjects = new MatchObjects();
20+
}
21+
22+
@Override
23+
public boolean match(Object original, Object expected) {
24+
25+
if (original instanceof BigInteger &&
26+
expected instanceof BigInteger) {
27+
28+
BigInteger originalValue = (BigInteger) original;
29+
BigInteger expectedValue = (BigInteger) expected;
30+
return originalValue.equals(expectedValue);
31+
}
32+
33+
if ((original instanceof Long || original instanceof Integer) &&
34+
expected instanceof BigInteger) {
35+
36+
BigInteger originalValue = BigInteger.valueOf(((Number) original).longValue());
37+
BigInteger expectedValue = (BigInteger) expected;
38+
return originalValue.equals(expectedValue);
39+
}
40+
41+
if (original instanceof BigInteger &&
42+
(expected instanceof Long || expected instanceof Integer)) {
43+
44+
BigInteger originalValue = (BigInteger) original;
45+
BigInteger expectedValue = BigInteger.valueOf(((Number) expected).longValue());
46+
return originalValue.equals(expectedValue);
47+
}
48+
49+
return matchObjects.match(original, expected);
50+
}
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.antkorwin.springtestmongo.internal.expect.match;
2+
3+
/**
4+
* Created on 18.12.2018.
5+
*
6+
* Checks the equality of two objects.
7+
*
8+
* @author Korovin Anatoliy
9+
*/
10+
public interface MatchData {
11+
12+
/**
13+
* @param original value of the original object (this object we try to check on equals to another)
14+
* @param expected expected value of the original object
15+
* @return true if the original value match to the expected value,
16+
* and false if not.
17+
*/
18+
boolean match(Object original, Object expected);
19+
}

0 commit comments

Comments
 (0)