diff options
author | Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7> | 2021-07-05 23:08:04 +0200 |
---|---|---|
committer | Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7> | 2021-07-05 23:08:04 +0200 |
commit | 51b544612ff088f6b772eaf2ca9fdd43f56450ec (patch) | |
tree | 13428b79589240f567a1a2a10d74894ea973825d /Solvers | |
parent | First version of Cursor, Iterator and getSize() (diff) | |
download | VIATRA-Generator-51b544612ff088f6b772eaf2ca9fdd43f56450ec.tar.gz VIATRA-Generator-51b544612ff088f6b772eaf2ca9fdd43f56450ec.tar.zst VIATRA-Generator-51b544612ff088f6b772eaf2ca9fdd43f56450ec.zip |
iterator fix
Diffstat (limited to 'Solvers')
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; | |||
9 | import org.eclipse.viatra.solver.data.map.internal.Node; | 9 | import org.eclipse.viatra.solver.data.map.internal.Node; |
10 | 10 | ||
11 | public class VersionedMap<KEY,VALUE> implements Versioned{ | 11 | public 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 | */ |
17 | public class MapEntryIterator<KEY,VALUE> extends MapCursor<KEY, VALUE> implements Iterator<Map.Entry<KEY,VALUE>>{ | 17 | public 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 @@ | |||
1 | package org.eclipse.viatra.solver.data.map; | 1 | package org.eclipse.viatra.solver.data.map; |
2 | 2 | ||
3 | import static org.junit.Assert.fail; | ||
4 | |||
3 | import java.util.Random; | 5 | import java.util.Random; |
4 | 6 | ||
5 | import org.junit.jupiter.api.Test; | 7 | import org.junit.jupiter.api.Test; |
6 | 8 | ||
7 | public class MapSmokeTest { | 9 | public 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 @@ | |||
1 | package org.eclipse.viatra.solver.data.map; | 1 | package org.eclipse.viatra.solver.data.map; |
2 | 2 | ||
3 | import static org.junit.Assert.fail; | 3 | import static org.junit.Assert.fail; |
4 | import static org.junit.jupiter.api.Assertions.assertEquals; | ||
5 | 4 | ||
6 | import java.util.HashMap; | 5 | import java.util.HashMap; |
6 | import java.util.Iterator; | ||
7 | import java.util.Map; | 7 | import java.util.Map; |
8 | import java.util.TreeMap; | ||
8 | import java.util.Map.Entry; | 9 | import java.util.Map.Entry; |
9 | 10 | import java.util.TreeSet; | |
10 | import junit.framework.AssertionFailedError; | ||
11 | 11 | ||
12 | public class MapTestEnvironment<KEY,VALUE> { | 12 | public 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 @@ | |||
1 | package org.eclipse.viatra.solver.data.map; | 1 | package org.eclipse.viatra.solver.data.map; |
2 | 2 | ||
3 | public class MapTests { | 3 | public class MapUnitTests { |
4 | 4 | ||
5 | } | 5 | } |