Skip to content

Commit ed6f0c4

Browse files
committed
unittests for labels inside labels and guards
1 parent 1d56c79 commit ed6f0c4

4 files changed

Lines changed: 220 additions & 198 deletions

File tree

prism/src/simulator/LabelEvaluator.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,26 +34,25 @@ public class LabelEvaluator
3434
public LabelEvaluator(LabelList labelList) throws PrismLangException
3535
{
3636
this.labelList = labelList;
37-
this.evaluationOrder = fixEvaluationOrder(labelList);
37+
this.evaluationOrder = fixEvaluationOrder(labelList.getLabelDependencies());
3838
}
3939

4040
/**
4141
* Fix an order on the labels such that l1 < l2 if l2 depends on l1.
4242
*
43-
* @param labels a {@link LabelList} of labels to be evaluated
43+
* @param deps an adjacency matrix with adj[i][j] iff i->j
4444
* @return an int array of the label indices in ascending order
45-
* @throws PrismLangException In case a label dependencies could not be computed.
4645
*/
47-
private int[] fixEvaluationOrder(LabelList labels) throws PrismLangException
46+
public int[] fixEvaluationOrder(boolean[][] deps)
4847
{
49-
boolean[][] deps = labels.getLabelDependencies();
50-
assert PrismUtils.findCycle(deps) == -1 : "label dependencies must not contain a cylce";
48+
assert deps.length == 0 || deps.length == deps[0].length : "dependency matrix must be square";
49+
assert PrismUtils.findCycle(deps) == -1 : "label dependencies must not contain a cycle";
5150

52-
int numLabels = labels.size();
51+
int numLabels = deps.length;
5352
BitSet done = new BitSet(numLabels);
5453
int[] order = new int[numLabels];
55-
for (int l = done.nextClearBit(0); l < numLabels; l = done.nextClearBit(l)) {
56-
traverseDfs(deps, l, order, -1, done);
54+
for (int l = done.nextClearBit(0), last = -1; l < numLabels; l = done.nextClearBit(l)) {
55+
last = traverseDfs(deps, l, order, last, done);
5756
}
5857
return order;
5958
}
@@ -113,7 +112,7 @@ public Predicate<String> getLabelValues(State state) throws PrismLangException
113112
* This method provides all values of a certain label. They will be ordered by the given statesList. <br>
114113
* States will be evaluated if necessary.
115114
*
116-
* @param label The name of the label.
115+
* @param label The name of the label.
117116
* @param statesList The states to evaluate against in correct order.
118117
* @return All values of the label.
119118
* @throws PrismException In case a label evaluation fails.
@@ -133,7 +132,7 @@ public BitSet getLabel(String label, List<State> statesList) throws PrismExcepti
133132

134133
/**
135134
* This method provides all label values of a certain state as a {@link BitSet}.
136-
* The labels are indexed in the same order as inside the {@link LabelEvaluator#labelList}
135+
* The labels are indexed in the same order as inside the {@link LabelEvaluator#labelList}.
137136
*
138137
* @param state The state to evaluate in.
139138
* @return Always returns a BitSet with the label values.
@@ -150,7 +149,7 @@ protected BitSet getStateValues(State state) throws PrismLangException
150149
}
151150

152151
/**
153-
* Evaluates all label with the given state. <br>
152+
* Evaluates all label with the given state.
154153
*
155154
* @param state The state to evaluate the labels in.
156155
* @return A {@link BitSet} of all label values in this state.
@@ -173,7 +172,7 @@ private BitSet evaluateState(State state) throws PrismLangException
173172
* Convert the label values for a state to a predicate on the label names.
174173
*
175174
* @param values the label values for some state
176-
* @return a Predicate evaluating to {@code true} for a label name if the Bit at the corresponding index in {@code values} is set
175+
* @return a Predicate evaluating to {@code true} for a label name iff the Bit at the corresponding index in {@code values} is set
177176
*/
178177
public Predicate<String> asPredicate(BitSet values)
179178
{
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package parser.ast;
2+
3+
import org.junit.jupiter.api.Test;
4+
import parser.State;
5+
import prism.PrismLangException;
6+
import simulator.LabelEvaluator;
7+
8+
import java.util.Arrays;
9+
import java.util.List;
10+
import java.util.function.Predicate;
11+
import java.util.stream.Collectors;
12+
13+
import static org.junit.jupiter.api.Assertions.assertEquals;
14+
import static org.junit.jupiter.api.Assertions.assertTrue;
15+
import static parser.ast.LabelTest.createLabelListWithDependencyChain;
16+
import static parser.ast.LabelTest.createLabelListWithoutCycle;
17+
18+
public class LabelEvaluatorTest
19+
{
20+
@Test
21+
public void testGetLabelValues() throws PrismLangException
22+
{
23+
/*
24+
creating LabelList with
25+
26+
label "l2" = d<=3;
27+
label "l1" = "l2" | d=5;
28+
29+
and checking for [0..5] of int d
30+
*/
31+
LabelList ll = createLabelListWithoutCycle();
32+
LabelEvaluator labelEvaluator = new LabelEvaluator(ll);
33+
34+
// loop through all states and check label values
35+
for (int i = 0; i <= 5; i++) {
36+
// create the new state with 1 variable
37+
State state = new State(1);
38+
// set d to [0..5]
39+
state.setValue(0, i); // index of d is 0
40+
41+
// expected labelValues
42+
boolean l2 = i <= 3;
43+
boolean l1 = l2 || i == 5;
44+
45+
// compare
46+
Predicate<String> actualValues = labelEvaluator.getLabelValues(state);
47+
assertEquals(l1, actualValues.test("l1"));
48+
assertEquals(l2, actualValues.test("l2"));
49+
}
50+
}
51+
52+
@Test
53+
public void testLabelChainEvaluation() throws PrismLangException
54+
{
55+
LabelList ll = createLabelListWithDependencyChain();
56+
LabelEvaluator labelEvaluator = new LabelEvaluator(ll);
57+
58+
State state = new State(0);
59+
assertTrue(labelEvaluator.getLabelValue(state, "l1"));
60+
assertTrue(labelEvaluator.getLabelValue(state, "l2"));
61+
assertTrue(labelEvaluator.getLabelValue(state, "l3"));
62+
}
63+
64+
@Test
65+
public void testLabelDFS_chain() throws PrismLangException
66+
{
67+
/*
68+
* label "l0" = "l2"
69+
* label "l2" = "l4"
70+
* label "l4" = "l3"
71+
* label "l3" = "l1"
72+
*/
73+
boolean[][] dependencies = new boolean[5][5];
74+
dependencies[0][2] = true;
75+
dependencies[2][4] = true;
76+
dependencies[4][3] = true;
77+
dependencies[3][1] = true;
78+
79+
List<Integer> order = getEvaluationOrder(dependencies);
80+
81+
assertTrue(order.indexOf(2) < order.indexOf(0));
82+
assertTrue(order.indexOf(4) < order.indexOf(2));
83+
assertTrue(order.indexOf(3) < order.indexOf(4));
84+
assertTrue(order.indexOf(1) < order.indexOf(3));
85+
}
86+
87+
@Test
88+
public void testLabelDFS_unrelatedLabels() throws PrismLangException
89+
{
90+
// all false -- no dependencies
91+
boolean[][] dependencies = new boolean[5][5];
92+
93+
List<Integer> order = getEvaluationOrder(dependencies);
94+
95+
assertEquals(5, order.size());
96+
}
97+
98+
@Test
99+
public void testLabelDFS_multipleCorrelationComponents() throws PrismLangException
100+
{
101+
/*
102+
* label "l0" = "l1" & "l3"
103+
* label "l3" = "l1"
104+
*
105+
* label "l4" = "l2" & "l5"
106+
* label "l2" = "l6"
107+
*/
108+
boolean[][] dependencies = new boolean[7][7];
109+
dependencies[0][1] = dependencies[0][3] = true;
110+
dependencies[3][1] = true;
111+
dependencies[4][2] = dependencies[4][5] = true;
112+
dependencies[2][6] = true;
113+
114+
List<Integer> order = getEvaluationOrder(dependencies);
115+
116+
assertTrue(order.indexOf(1) < order.indexOf(0));
117+
assertTrue(order.indexOf(3) < order.indexOf(0));
118+
119+
assertTrue(order.indexOf(1) < order.indexOf(3));
120+
121+
assertTrue(order.indexOf(2) < order.indexOf(4));
122+
assertTrue(order.indexOf(5) < order.indexOf(4));
123+
124+
assertTrue(order.indexOf(6) < order.indexOf(2));
125+
}
126+
127+
private List<Integer> getEvaluationOrder(boolean[][] deps) throws PrismLangException
128+
{
129+
LabelEvaluator labelEvaluator = new LabelEvaluator(new LabelList());
130+
return Arrays.stream(labelEvaluator.fixEvaluationOrder(deps)).boxed().collect(Collectors.toList());
131+
}
132+
133+
}

prism/unit-tests/parser/ast/LabelListTest.java

Lines changed: 0 additions & 109 deletions
This file was deleted.

0 commit comments

Comments
 (0)