Skip to content

Commit 1d54ad7

Browse files
committed
fix bug in IncrementalWMethodTestsIterator
single-state automata have no distinguishing suffixes. The iterator wrongfully tried to access an empty suffix list which caused an IndexOutOfBoundsException.
1 parent bd52696 commit 1d54ad7

File tree

2 files changed

+28
-8
lines changed

2 files changed

+28
-8
lines changed

util/src/main/java/net/automatalib/util/automata/conformance/IncrementalWMethodTestsIterator.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public void update(UniversalDeterministicAutomaton<?, I, ?, ?, ?> automaton) {
7272
item.maxPrefix = oldNumPrefixes;
7373
item.suffixIdx = oldNumSuffixes;
7474
item.minSuffix = oldNumSuffixes;
75-
item.middle = startMiddleWord();
75+
item.middle = Word.epsilon();
7676
itemQueue.insert(item);
7777
}
7878
// new prefixes with *all* suffixes
@@ -83,15 +83,11 @@ public void update(UniversalDeterministicAutomaton<?, I, ?, ?, ?> automaton) {
8383
item.maxPrefix = prefixes.size();
8484
item.suffixIdx = 0;
8585
item.minSuffix = 0;
86-
item.middle = startMiddleWord();
86+
item.middle = Word.epsilon();
8787
itemQueue.insert(item);
8888
}
8989
}
9090

91-
private Word<I> startMiddleWord() {
92-
return Word.epsilon();
93-
}
94-
9591
@Override
9692
public boolean hasNext() {
9793
return !itemQueue.isEmpty();
@@ -111,8 +107,10 @@ public Word<I> next() {
111107

112108
private Word<I> assembleWord(Item<I> item) {
113109
Word<I> prefix = prefixes.get(item.prefixIdx);
114-
Word<I> suffix = suffixes.get(item.suffixIdx);
115-
return prefix.concat(item.middle, suffix);
110+
if (suffixes.isEmpty()) {
111+
return prefix.concat(item.middle);
112+
}
113+
return prefix.concat(item.middle, suffixes.get(item.suffixIdx));
116114
}
117115

118116
private @Nullable Item<I> increment(Item<I> item) {

util/src/test/java/net/automatalib/util/automata/conformance/IncrementalWMethodTestsIteratorTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import com.google.common.collect.Sets;
2323
import com.google.common.collect.Streams;
24+
import net.automatalib.automata.fsa.impl.compact.CompactDFA;
2425
import net.automatalib.automata.transducers.impl.compact.CompactMealy;
2526
import net.automatalib.commons.util.collections.CollectionsUtil;
2627
import net.automatalib.util.automata.Automata;
@@ -98,6 +99,27 @@ public void testIncrementalCover() {
9899
Assert.assertEquals(wMethodTests, iteratorTests);
99100
}
100101

102+
@Test
103+
public void testSingleStateAutomaton() {
104+
105+
final CompactDFA<Character> dfa = new CompactDFA<>(alphabet);
106+
final int init = dfa.addIntInitialState(false);
107+
108+
for (Character c : alphabet) {
109+
dfa.setTransition(init, c, init, null);
110+
}
111+
112+
final IncrementalWMethodTestsIterator<Character> iter = new IncrementalWMethodTestsIterator<>(alphabet);
113+
iter.setMaxDepth(MAX_DEPTH);
114+
iter.update(dfa);
115+
116+
final Set<Word<Character>> tests = Streams.stream(iter).collect(Collectors.toSet());
117+
118+
for (Character c : alphabet) {
119+
Assert.assertTrue(tests.contains(Word.fromLetter(c)));
120+
}
121+
}
122+
101123
private Set<Word<Character>> computeWMethodTests() {
102124

103125
final List<Word<Character>> characterizingSet = Automata.characterizingSet(mealy, alphabet);

0 commit comments

Comments
 (0)