aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers
diff options
context:
space:
mode:
authorLibravatar Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7>2021-07-05 23:08:04 +0200
committerLibravatar Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7>2021-07-05 23:08:04 +0200
commit51b544612ff088f6b772eaf2ca9fdd43f56450ec (patch)
tree13428b79589240f567a1a2a10d74894ea973825d /Solvers
parentFirst version of Cursor, Iterator and getSize() (diff)
downloadVIATRA-Generator-51b544612ff088f6b772eaf2ca9fdd43f56450ec.tar.gz
VIATRA-Generator-51b544612ff088f6b772eaf2ca9fdd43f56450ec.tar.zst
VIATRA-Generator-51b544612ff088f6b772eaf2ca9fdd43f56450ec.zip
iterator fix
Diffstat (limited to 'Solvers')
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMap.java12
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNode.java6
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapCursor.java15
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapEntryIterator.java8
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MutableNode.java37
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/Node.java2
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapSmokeTest.java125
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapTestEnvironment.java76
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapUnitTests.java (renamed from Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapTests.java)2
9 files changed, 204 insertions, 79 deletions
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMap.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMap.java
index d5c636d9..4328fde1 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMap.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMap.java
@@ -9,10 +9,10 @@ import org.eclipse.viatra.solver.data.map.internal.MutableNode;
9import org.eclipse.viatra.solver.data.map.internal.Node; 9import org.eclipse.viatra.solver.data.map.internal.Node;
10 10
11public class VersionedMap<KEY,VALUE> implements Versioned{ 11public class VersionedMap<KEY,VALUE> implements Versioned{
12
13 protected final ContinousHashProvider<? super KEY> hashProvider; 12 protected final ContinousHashProvider<? super KEY> hashProvider;
14 protected final VALUE defaultValue; 13 protected final VALUE defaultValue;
15 protected Node<KEY,VALUE> root = null; 14 protected Node<KEY,VALUE> root = null;
15 //TODO: protected final iterators
16 16
17 protected VersionedMap(ContinousHashProvider<? super KEY> hashProvider, VALUE defaultValue) { 17 protected VersionedMap(ContinousHashProvider<? super KEY> hashProvider, VALUE defaultValue) {
18 this.hashProvider = hashProvider; 18 this.hashProvider = hashProvider;
@@ -61,4 +61,14 @@ public class VersionedMap<KEY,VALUE> implements Versioned{
61 public void restore(long state) { 61 public void restore(long state) {
62 // TODO Auto-generated method stub 62 // TODO Auto-generated method stub
63 } 63 }
64
65 public void prettyPrint() {
66 StringBuilder s = new StringBuilder();
67 if(this.root != null) {
68 this.root.prettyPrint(s, 0, -1);
69 System.out.println(s.toString());
70 } else {
71 System.out.println("empty tree");
72 }
73 }
64} 74}
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNode.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNode.java
index 908d335c..70c4daff 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNode.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNode.java
@@ -203,8 +203,8 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> {
203 // 2.1 found next subnode, move down to the subnode 203 // 2.1 found next subnode, move down to the subnode
204 Node<KEY, VALUE> subnode = (Node<KEY, VALUE>) this.content[this.content.length-1-newNodeIndex]; 204 Node<KEY, VALUE> subnode = (Node<KEY, VALUE>) this.content[this.content.length-1-newNodeIndex];
205 cursor.dataIndex = MapCursor.IndexStart; 205 cursor.dataIndex = MapCursor.IndexStart;
206 cursor.nodeStack.add(subnode); 206 cursor.nodeStack.push(subnode);
207 cursor.nodeIndexStack.add(newNodeIndex); 207 cursor.nodeIndexStack.push(newNodeIndex);
208 return subnode.moveToNext(cursor); 208 return subnode.moveToNext(cursor);
209 } else { 209 } else {
210 // 3. no subnode found, move up 210 // 3. no subnode found, move up
@@ -222,7 +222,7 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> {
222 } 222 }
223 223
224 @Override 224 @Override
225 protected void prettyPrint(StringBuilder builder, int depth, int code) { 225 public void prettyPrint(StringBuilder builder, int depth, int code) {
226 for(int i = 0; i<depth; i++) { 226 for(int i = 0; i<depth; i++) {
227 builder.append("\t"); 227 builder.append("\t");
228 } 228 }
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapCursor.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapCursor.java
index 4a4912d8..40ba55fa 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapCursor.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapCursor.java
@@ -20,14 +20,19 @@ public class MapCursor<KEY,VALUE> {
20 // Initializing tree stack 20 // Initializing tree stack
21 super(); 21 super();
22 this.nodeStack = new Stack<>(); 22 this.nodeStack = new Stack<>();
23 this.nodeStack.add(root); 23 if(root != null) {
24 this.nodeStack.add(root);
25 }
24 this.nodeIndexStack = new Stack<>(); 26 this.nodeIndexStack = new Stack<>();
25 this.nodeIndexStack.add(IndexStart); 27 this.nodeIndexStack.push(IndexStart);
26 this.dataIndex = IndexStart; 28 this.dataIndex = IndexStart;
27 29
28 // Initializing cache 30 // Initializing cache
29 this.key = null; 31 this.key = null;
30 this.value = null; 32 this.value = null;
33
34 // move to first
35 move();
31 } 36 }
32 37
33 public KEY getKey() { 38 public KEY getKey() {
@@ -43,10 +48,10 @@ public class MapCursor<KEY,VALUE> {
43 } 48 }
44 49
45 public boolean move() { 50 public boolean move() {
46 if(this.isTerminated()) { 51 if(!isTerminated()) {
47 return false; 52 return this.nodeStack.peek().moveToNext(this);
48 } else { 53 } else {
49 return true; 54 return false;
50 } 55 }
51 } 56 }
52} 57}
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapEntryIterator.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapEntryIterator.java
index 82983484..47976b46 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapEntryIterator.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapEntryIterator.java
@@ -16,20 +16,20 @@ import java.util.NoSuchElementException;
16 */ 16 */
17public class MapEntryIterator<KEY,VALUE> extends MapCursor<KEY, VALUE> implements Iterator<Map.Entry<KEY,VALUE>>{ 17public class MapEntryIterator<KEY,VALUE> extends MapCursor<KEY, VALUE> implements Iterator<Map.Entry<KEY,VALUE>>{
18 18
19
19 public MapEntryIterator(Node<KEY, VALUE> root) { 20 public MapEntryIterator(Node<KEY, VALUE> root) {
20 super(root); 21 super(root);
21 // move to first 22
22 move();
23 } 23 }
24 24
25 @Override 25 @Override
26 public boolean hasNext() { 26 public boolean hasNext() {
27 return this.isTerminated(); 27 return !this.isTerminated();
28 } 28 }
29 29
30 @Override 30 @Override
31 public Entry<KEY, VALUE> next() { 31 public Entry<KEY, VALUE> next() {
32 if(!this.hasNext()) { 32 if(this.hasNext()) {
33 Map.Entry<KEY, VALUE> result = new AbstractMap.SimpleEntry<KEY, VALUE>(this.key, this.value); 33 Map.Entry<KEY, VALUE> result = new AbstractMap.SimpleEntry<KEY, VALUE>(this.key, this.value);
34 this.move(); 34 this.move();
35 return result; 35 return result;
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MutableNode.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MutableNode.java
index 9b30dbb7..4c764f2b 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MutableNode.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MutableNode.java
@@ -112,7 +112,8 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
112 if(value == defaultValue) { 112 if(value == defaultValue) {
113 return removeEntry(selectedHashFragment); 113 return removeEntry(selectedHashFragment);
114 } else { 114 } else {
115 return updateValue(value, selectedHashFragment); 115 content[2*selectedHashFragment+1] = value;
116 return this;
116 } 117 }
117 } else { 118 } else {
118 if(value == defaultValue) { 119 if(value == defaultValue) {
@@ -129,12 +130,24 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
129 Node<KEY, VALUE> newNode = nodeCandidate.putValue(key, value, hashProvider, defaultValue, newHash(hashProvider, key, hash, depth+1), depth+1); 130 Node<KEY, VALUE> newNode = nodeCandidate.putValue(key, value, hashProvider, defaultValue, newHash(hashProvider, key, hash, depth+1), depth+1);
130 return updateSubNode(selectedHashFragment,newNode); 131 return updateSubNode(selectedHashFragment,newNode);
131 } else { 132 } else {
132 content[2*selectedHashFragment] = key; 133 if(value == defaultValue) {
133 return updateValue(value, selectedHashFragment); 134 // dont need to add new key-value pair
135 return this;
136 } else {
137 content[2*selectedHashFragment] = key;
138 content[2*selectedHashFragment+1] = value;
139 return this;
140 }
141
134 } 142 }
135 } 143 }
136 } 144 }
137 145
146 Node<KEY, VALUE> updateValue(VALUE value, int selectedHashFragment) {
147 content[2*selectedHashFragment+1] = value;
148 return this;
149 }
150
138 Node<KEY, VALUE> updateSubNode(int selectedHashFragment, Node<KEY, VALUE> newNode) { 151 Node<KEY, VALUE> updateSubNode(int selectedHashFragment, Node<KEY, VALUE> newNode) {
139 content[2*selectedHashFragment+1] = newNode; 152 content[2*selectedHashFragment+1] = newNode;
140 for(int i = 0; i<this.content.length; i++) { 153 for(int i = 0; i<this.content.length; i++) {
@@ -162,10 +175,6 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
162 return this; 175 return this;
163 } 176 }
164 177
165 Node<KEY, VALUE> updateValue(VALUE value, int selectedHashFragment) {
166 content[2*selectedHashFragment+1] = value;
167 return this;
168 }
169 Node<KEY, VALUE> removeEntry(int selectedHashFragment) { 178 Node<KEY, VALUE> removeEntry(int selectedHashFragment) {
170 content[2*selectedHashFragment] = null; 179 content[2*selectedHashFragment] = null;
171 content[2*selectedHashFragment+1] = null; 180 content[2*selectedHashFragment+1] = null;
@@ -217,8 +226,9 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
217 return true; 226 return true;
218 } 227 }
219 } 228 }
229 cursor.dataIndex = MapCursor.IndexFinish;
220 } 230 }
221 cursor.dataIndex = MapCursor.IndexFinish; 231
222 // 2. look inside the subnodes 232 // 2. look inside the subnodes
223 for(int index = cursor.nodeIndexStack.peek()+1; index < factor; index++) { 233 for(int index = cursor.nodeIndexStack.peek()+1; index < factor; index++) {
224 if(this.content[index*2]==null && this.content[index*2+1] !=null) { 234 if(this.content[index*2]==null && this.content[index*2+1] !=null) {
@@ -226,8 +236,9 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
226 Node<KEY, VALUE> subnode = (Node<KEY, VALUE>) this.content[index*2+1]; 236 Node<KEY, VALUE> subnode = (Node<KEY, VALUE>) this.content[index*2+1];
227 237
228 cursor.dataIndex = MapCursor.IndexStart; 238 cursor.dataIndex = MapCursor.IndexStart;
229 cursor.nodeStack.add(subnode); 239 cursor.nodeIndexStack.set(0,index);
230 cursor.nodeIndexStack.add(index); 240 cursor.nodeStack.push(subnode);
241 cursor.nodeIndexStack.push(MapCursor.IndexStart);
231 242
232 return subnode.moveToNext(cursor); 243 return subnode.moveToNext(cursor);
233 } 244 }
@@ -246,7 +257,7 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
246 } 257 }
247 258
248 @Override 259 @Override
249 protected void prettyPrint(StringBuilder builder, int depth, int code) { 260 public void prettyPrint(StringBuilder builder, int depth, int code) {
250 for(int i = 0; i<depth; i++) { 261 for(int i = 0; i<depth; i++) {
251 builder.append("\t"); 262 builder.append("\t");
252 } 263 }
@@ -255,6 +266,7 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
255 builder.append(":"); 266 builder.append(":");
256 } 267 }
257 builder.append("Mutable("); 268 builder.append("Mutable(");
269 // print content
258 boolean hadContent = false; 270 boolean hadContent = false;
259 for(int i = 0; i<factor; i++) { 271 for(int i = 0; i<factor; i++) {
260 if(content[2*i] != null) { 272 if(content[2*i] != null) {
@@ -271,8 +283,9 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
271 } 283 }
272 } 284 }
273 builder.append(")"); 285 builder.append(")");
286 // print subnodes
274 for(int i = 0; i<factor; i++) { 287 for(int i = 0; i<factor; i++) {
275 if(content[2*i] == null || content[2*i+1]!=null) { 288 if(content[2*i] == null && content[2*i+1]!=null) {
276 @SuppressWarnings("unchecked") 289 @SuppressWarnings("unchecked")
277 Node<KEY,VALUE> subNode = (Node<KEY, VALUE>) content[2*i+1]; 290 Node<KEY,VALUE> subNode = (Node<KEY, VALUE>) content[2*i+1];
278 builder.append("\n"); 291 builder.append("\n");
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/Node.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/Node.java
index 7a6599a2..9b01cfcf 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/Node.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/Node.java
@@ -66,7 +66,7 @@ public abstract class Node<KEY,VALUE>{
66 //abstract boolean moveIteratorToNextData(NodeIterator<KEY,VALUE> iterator, int currentIndex); 66 //abstract boolean moveIteratorToNextData(NodeIterator<KEY,VALUE> iterator, int currentIndex);
67 //abstract boolean moveIteratorToNextNode(NodeIterator<KEY,VALUE> iterator, int currentIndex); 67 //abstract boolean moveIteratorToNextNode(NodeIterator<KEY,VALUE> iterator, int currentIndex);
68 ///////// FOR printing 68 ///////// FOR printing
69 abstract protected void prettyPrint(StringBuilder builder, int depth, int code); 69 abstract public void prettyPrint(StringBuilder builder, int depth, int code);
70 @Override 70 @Override
71 public String toString() { 71 public String toString() {
72 StringBuilder stringBuilder = new StringBuilder(); 72 StringBuilder stringBuilder = new StringBuilder();
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapSmokeTest.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapSmokeTest.java
index e1a7a39b..35940256 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapSmokeTest.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapSmokeTest.java
@@ -1,16 +1,36 @@
1package org.eclipse.viatra.solver.data.map; 1package org.eclipse.viatra.solver.data.map;
2 2
3import static org.junit.Assert.fail;
4
3import java.util.Random; 5import java.util.Random;
4 6
5import org.junit.jupiter.api.Test; 7import org.junit.jupiter.api.Test;
6 8
7public class MapSmokeTest { 9public class MapSmokeTest {
8 10
9 private void runTest(int seed, int steps, int maxKey, int maxValue) { 11 private void runSmokeTest(String scenario, int seed, int steps, int maxKey, int maxValue) {
12 String[] values = prepareValues(maxValue);
13 ContinousHashProvider<Integer> chp = prepareHashProvider();
14
15 VersionedMap<Integer, String> sut = new VersionedMap<Integer, String>(chp, values[0]);
16 MapTestEnvironment<Integer, String> e = new MapTestEnvironment<Integer, String>(sut);
17
18 Random r = new Random(seed);
19
20 iterativeRandomPuts(scenario, steps, maxKey, values, e, r);
21 }
22
23
24
25 private String[] prepareValues(int maxValue) {
10 String[] values = new String[maxValue]; 26 String[] values = new String[maxValue];
11 for(int i = 0; i<values.length; i++) { 27 values[0] = "DEFAULT";
12 values[i] = "VALUE-"+i; 28 for(int i = 1; i<values.length; i++) {
29 values[i] = "VAL"+i;
13 } 30 }
31 return values;
32 }
33 private ContinousHashProvider<Integer> prepareHashProvider() {
14 ContinousHashProvider<Integer> chp = new ContinousHashProvider<Integer>() { 34 ContinousHashProvider<Integer> chp = new ContinousHashProvider<Integer>() {
15 35
16 @Override 36 @Override
@@ -27,56 +47,87 @@ public class MapSmokeTest {
27 return key1.equals(key2); 47 return key1.equals(key2);
28 } 48 }
29 }; 49 };
30 50 return chp;
31 VersionedMap<Integer, String> sut = new VersionedMap<Integer, String>(chp, values[0]);
32 MapTestEnvironment<Integer, String> e = new MapTestEnvironment<Integer, String>(sut);
33
34 Random r = new Random(seed);
35
36 iterativeCall(steps, maxKey, maxValue, values, e, r);
37 } 51 }
38 52
39 void recursiveCall( 53// void recursiveCall(
40 int steps, 54// int steps,
41 int maxKey, 55// int maxKey,
42 int maxValue, 56// int maxValue,
43 String[] values, 57// String[] values,
44 MapTestEnvironment<Integer, String> e, 58// MapTestEnvironment<Integer, String> e,
45 Random r) 59// Random r)
46 { 60// {
47 if(steps<=0) { 61// if(steps<=0) {
48 return; 62// return;
49 } else { 63// } else {
50 e.put(r.nextInt(maxKey), values[r.nextInt(maxValue)]); 64// e.put(r.nextInt(maxKey), values[r.nextInt(maxValue)]);
51 e.checkEquivalence(); 65// e.checkEquivalence();
52 66//
53 recursiveCall(steps-1, maxKey, maxValue, values, e, r); 67// recursiveCall(steps-1, maxKey, maxValue, values, e, r);
54 } 68// }
55 } 69// }
56 70
57 void iterativeCall(int steps, 71 void iterativeRandomPuts(
72 String scenario,
73 int steps,
58 int maxKey, 74 int maxKey,
59 int maxValue,
60 String[] values, 75 String[] values,
61 MapTestEnvironment<Integer, String> e, 76 MapTestEnvironment<Integer, String> e,
62 Random r) 77 Random r)
63 { 78 {
79 int stopAt = -1;
64 for(int i=0; i<steps; i++) { 80 for(int i=0; i<steps; i++) {
65 e.put(r.nextInt(maxKey), values[r.nextInt(maxValue)]); 81 int index = i+1;
66 e.checkEquivalence(); 82 int nextKey = r.nextInt(maxKey);
83 String nextValue = values[r.nextInt(values.length)];
84 if(index == stopAt) {
85 System.out.println("issue!");
86 System.out.println("State before:");
87 e.printComparison();
88 e.sut.prettyPrint();
89 System.out.println("Next: put("+nextKey+","+nextValue+")");
90 }
91 try {
92 e.put(nextKey, nextValue);
93 if(index == stopAt) {
94 e.sut.prettyPrint();
95 }
96 e.checkEquivalence(scenario+":"+index);
97 } catch (Exception exception) {
98 exception.printStackTrace();
99 fail(scenario+":"+index+": exception happened: "+exception);
100 }
101 if(index%10000==0) System.out.println(scenario+":"+index+" finished");
67 } 102 }
68 } 103 }
69 104
70 @Test 105 @Test
71 void runTest1() { 106 void MiniSmokeK3V2v1() {
72 runTest(0, 100000, 3, 2); 107 runSmokeTest("MiniSmokeK3V2v1",0, 1000, 3, 2);
108 }
109 @Test
110 void MiniSmokeK3V2v2() {
111 runSmokeTest("MiniSmokeK3V2v2",1, 1000, 3, 2);
112 }
113 @Test
114 void MiniSmokeK3V2v3() {
115 runSmokeTest("MiniSmokeK3V2v3",3, 1000, 3, 2);
116 }
117 @Test
118 void MediumSmokeK3V2v1() {
119 runSmokeTest("MediumSmokeK3V2v1",1, 1000, 32, 2);
120 }
121 @Test
122 void MediumSmokeK3V2v2() {
123 runSmokeTest("MediumSmokeK3V2v2",2, 1000, 32, 2);
73 } 124 }
74 @Test 125 @Test
75 void runTest2() { 126 void MediumSmokeK3V2v3() {
76 runTest(1, 100000, 3, 2); 127 runSmokeTest("MediumSmokeK3V2v3",3, 1000, 32, 2);
77 } 128 }
78 @Test 129 @Test
79 void runTest3() { 130 void SmokeLarge() {
80 runTest(1, 32*32*32*32, 32*32-1, 2); 131 runSmokeTest("SmokeLarge",0, 32*32*32*32, 32*32-1, 2);
81 } 132 }
82} 133}
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapTestEnvironment.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapTestEnvironment.java
index 5e9b2e5f..04ae6bd0 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapTestEnvironment.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapTestEnvironment.java
@@ -1,13 +1,13 @@
1package org.eclipse.viatra.solver.data.map; 1package org.eclipse.viatra.solver.data.map;
2 2
3import static org.junit.Assert.fail; 3import static org.junit.Assert.fail;
4import static org.junit.jupiter.api.Assertions.assertEquals;
5 4
6import java.util.HashMap; 5import java.util.HashMap;
6import java.util.Iterator;
7import java.util.Map; 7import java.util.Map;
8import java.util.TreeMap;
8import java.util.Map.Entry; 9import java.util.Map.Entry;
9 10import java.util.TreeSet;
10import junit.framework.AssertionFailedError;
11 11
12public class MapTestEnvironment<KEY,VALUE> { 12public class MapTestEnvironment<KEY,VALUE> {
13 VersionedMap<KEY, VALUE> sut; 13 VersionedMap<KEY, VALUE> sut;
@@ -19,23 +19,69 @@ public class MapTestEnvironment<KEY,VALUE> {
19 19
20 public void put(KEY key, VALUE value) { 20 public void put(KEY key, VALUE value) {
21 sut.put(key, value); 21 sut.put(key, value);
22 oracle.put(key, value); 22 if(value != sut.defaultValue) {
23 oracle.put(key, value);
24 } else {
25 oracle.remove(key);
26 }
23 } 27 }
24 28
25 public void checkEquivalence() { 29 public void checkEquivalence(String title) {
26 int nonDefault = 0; 30 // 1. Checking: if Reference contains <key,value> pair, then SUT contains <key,value> pair.
31 // Tests get functions
27 for(Entry<KEY, VALUE> entry : oracle.entrySet()) { 32 for(Entry<KEY, VALUE> entry : oracle.entrySet()) {
28 VALUE sutAnswer = sut.get(entry.getKey()); 33 VALUE sutValue = sut.get(entry.getKey());
29 VALUE oracleAnswer1 = entry.getValue(); 34 VALUE oracleValue = entry.getValue();
30 VALUE oracleAnswer2 = (oracleAnswer1 == null)?sut.getDefaultValue():oracleAnswer1; 35 if(sutValue!=oracleValue) {
31 if(sutAnswer!=oracleAnswer2) { 36 printComparison();
32 fail("Non-equivalent gets: " + sutAnswer + " != " + oracleAnswer2 + "<-[oracle]") ; 37 fail(title + ": Non-equivalent get("+entry.getKey()+") results: SUT=" + sutValue + ", Oracle=" + oracleValue + "!") ;
33 } 38 }
34 if(entry.getValue() != sut.getDefaultValue()) { 39 }
35 nonDefault++; 40
41 // 2. Checking: if SUT contains <key,value> pair, then Reference contains <key,value> pair.
42 // Tests iterators
43 // TODO: Counts the number of elements in the entryset
44 int elementsInSutEntrySet = 0;
45 Iterator<Entry<KEY, VALUE>> iterator = sut.getIterator();
46 while(iterator.hasNext()) {
47 elementsInSutEntrySet++;
48 Entry<KEY, VALUE> entry = iterator.next();
49 KEY key = entry.getKey();
50 VALUE sutValue = entry.getValue();
51 //System.out.println(key + " -> " + sutValue);
52 VALUE oracleValue = oracle.get(key);
53 if(sutValue != oracleValue) {
54 printComparison();
55 fail(title+": Non-equivalent entry in iterator: SUT=<"+key+","+sutValue+">, Oracle=<"+key+","+oracleValue+">!");
36 } 56 }
57
58 }
59
60 // 3. Checking sizes
61 // Counting of non-default value pairs.
62 int oracleSize = oracle.entrySet().size();
63 int sutSize = sut.getSize();
64 if(oracleSize != sutSize || oracleSize != elementsInSutEntrySet) {
65 printComparison();
66 fail(title + ": Non-eqivalent size() result: SUT.getSize()="+sutSize+", SUT.entryset.size="+elementsInSutEntrySet+", Oracle="+oracleSize+"!" );
67 }
68
69 //assertEquals(sutNonDefault, sizeOfNondefaults);
70 }
71 public void printComparison() {
72 System.out.println("SUT:");
73 printEntrySet(sut.getIterator());
74 System.out.println("Oracle:");
75 printEntrySet(oracle.entrySet().iterator());
76 }
77 private void printEntrySet(Iterator<Entry<KEY, VALUE>> iterator) {
78 TreeMap<KEY, VALUE> treemap= new TreeMap<>();
79 while(iterator.hasNext()) {
80 Entry<KEY, VALUE> entry = iterator.next();
81 treemap.put(entry.getKey(),entry.getValue());
82 }
83 for(Entry<KEY, VALUE> e : treemap.entrySet()) {
84 System.out.println("\t" + e.getKey() + " -> " + e.getValue());
37 } 85 }
38 int sutNonDefault = sut.getSize();
39 assertEquals(sutNonDefault, nonDefault);
40 } 86 }
41} 87}
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapTests.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapUnitTests.java
index 28a49380..f4137375 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapTests.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapUnitTests.java
@@ -1,5 +1,5 @@
1package org.eclipse.viatra.solver.data.map; 1package org.eclipse.viatra.solver.data.map;
2 2
3public class MapTests { 3public class MapUnitTests {
4 4
5} 5}