Skip to content

Commit df4e0be

Browse files
Name every state set when the unchanged sets are recombined
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 01b389e commit df4e0be

2 files changed

Lines changed: 14 additions & 6 deletions

File tree

‎liquidjava-verifier/src/main/java/liquidjava/processor/state_machine/StateMachine.java‎

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -258,19 +258,23 @@ public List<List<String>> describeOnly(Collection<State> subset, Set<Integer> sh
258258

259259
/**
260260
* The state sets, as indexes into {@link State#names()}, whose states in {@code after} differ from those in
261-
* {@code before}; every set if no set differs on its own, since then only their combination changed
261+
* {@code before}. Every set if the other sets, taken together, differ too: then how the states of different sets
262+
* are combined changed, which naming the changed sets alone would hide.
262263
*/
263264
public Set<Integer> stateSetsChanged(Collection<State> before, Collection<State> after) {
264265
Set<Integer> every = IntStream.range(0, states.get(0).names().size()).boxed()
265266
.collect(Collectors.toCollection(TreeSet::new));
266-
Set<Integer> changed = every.stream().filter(k -> !statesIn(before, k).equals(statesIn(after, k)))
267+
Set<Integer> changed = every.stream()
268+
.filter(k -> !statesIn(before, Set.of(k)).equals(statesIn(after, Set.of(k))))
267269
.collect(Collectors.toCollection(TreeSet::new));
268-
return changed.isEmpty() ? every : changed;
270+
Set<Integer> kept = every.stream().filter(k -> !changed.contains(k)).collect(Collectors.toSet());
271+
return !changed.isEmpty() && statesIn(before, kept).equals(statesIn(after, kept)) ? changed : every;
269272
}
270273

271-
/** The states of the set {@code k} that {@code subset} has */
272-
private static Set<String> statesIn(Collection<State> subset, int k) {
273-
return subset.stream().map(s -> s.names().get(k)).collect(Collectors.toSet());
274+
/** The states of the sets {@code sets} that {@code subset} has, combined as in its states */
275+
private static Set<List<String>> statesIn(Collection<State> subset, Set<Integer> sets) {
276+
return subset.stream().map(s -> sets.stream().sorted().map(s.names()::get).toList())
277+
.collect(Collectors.toSet());
274278
}
275279

276280
/**

‎liquidjava-verifier/src/test/java/liquidjava/processor/state_machine/StateMachineTest.java‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ void setsChangedAreThoseWhoseStatesDiffer() {
8383
// each set has the same states on both sides, only how they are combined changed
8484
assertEquals(Set.of(0, 1),
8585
MACHINE.stateSetsChanged(Set.of(OPEN_LOCKED, CLOSED_UNLOCKED), Set.of(OPEN_UNLOCKED, CLOSED_LOCKED)));
86+
// the third set changed, and so did how the first two are combined
87+
List<State> before = List.of(state("a", "x", "old"), state("b", "y", "old"));
88+
List<State> after = List.of(state("a", "y", "new"), state("b", "x", "new"));
89+
assertEquals(Set.of(0, 1, 2), machine(before).stateSetsChanged(before, after));
8690
}
8791

8892
@Test

0 commit comments

Comments
 (0)