[cmd3] Fix StateMachineTest (#8876)

This commit is contained in:
Ryan Blue
2026-05-08 00:42:16 -04:00
committed by GitHub
parent 1021ff88a9
commit 878da3d54c
2 changed files with 43 additions and 47 deletions

View File

@@ -115,8 +115,8 @@ class StateMachineTest extends CommandTestBase {
@Test @Test
void transitionsIfConditionIsAlreadyTrueWhenEntered() { void transitionsIfConditionIsAlreadyTrueWhenEntered() {
var command1 = Command.noRequirements().executing(Coroutine::park).named("Command 1"); var command1 = Command.noRequirements(Coroutine::park).named("Command 1");
var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); var command2 = Command.noRequirements(Coroutine::park).named("Command 2");
var signal = new AtomicBoolean(false); var signal = new AtomicBoolean(false);
var stateMachine = new StateMachine("State Machine"); var stateMachine = new StateMachine("State Machine");
@@ -137,9 +137,8 @@ class StateMachineTest extends CommandTestBase {
void commandExits() { void commandExits() {
AtomicBoolean signal = new AtomicBoolean(false); AtomicBoolean signal = new AtomicBoolean(false);
var command1 = var command1 = Command.noRequirements(co -> co.waitUntil(signal::get)).named("Command 1");
Command.noRequirements().executing(co -> co.waitUntil(signal::get)).named("Command 1"); var command2 = Command.noRequirements(Coroutine::park).named("Command 2");
var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2");
var stateMachine = new StateMachine("State Machine"); var stateMachine = new StateMachine("State Machine");
var state1 = stateMachine.addState(command1); var state1 = stateMachine.addState(command1);
@@ -168,8 +167,7 @@ class StateMachineTest extends CommandTestBase {
AtomicInteger initCount = new AtomicInteger(0); AtomicInteger initCount = new AtomicInteger(0);
var command = var command =
Command.noRequirements() Command.noRequirements(
.executing(
co -> { co -> {
initCount.incrementAndGet(); initCount.incrementAndGet();
co.park(); co.park();
@@ -213,7 +211,7 @@ class StateMachineTest extends CommandTestBase {
@Test @Test
void oneshotCommandTransitionsToSelfOnComplete() { void oneshotCommandTransitionsToSelfOnComplete() {
AtomicInteger count = new AtomicInteger(0); AtomicInteger count = new AtomicInteger(0);
var command = Command.noRequirements().executing(c -> count.incrementAndGet()).named("Command"); var command = Command.noRequirements(c -> count.incrementAndGet()).named("Command");
var stateMachine = new StateMachine("State Machine"); var stateMachine = new StateMachine("State Machine");
var state = stateMachine.addState(command); var state = stateMachine.addState(command);
stateMachine.setInitialState(state); stateMachine.setInitialState(state);
@@ -229,9 +227,9 @@ class StateMachineTest extends CommandTestBase {
void onlyFirstExplicitTransitionFires() { void onlyFirstExplicitTransitionFires() {
var signal = new AtomicBoolean(false); var signal = new AtomicBoolean(false);
var command1 = Command.noRequirements().executing(Coroutine::park).named("Command 1"); var command1 = Command.noRequirements(Coroutine::park).named("Command 1");
var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); var command2 = Command.noRequirements(Coroutine::park).named("Command 2");
var command3 = Command.noRequirements().executing(Coroutine::park).named("Command 3"); var command3 = Command.noRequirements(Coroutine::park).named("Command 3");
var stateMachine = new StateMachine("State Machine"); var stateMachine = new StateMachine("State Machine");
var state1 = stateMachine.addState(command1); var state1 = stateMachine.addState(command1);
@@ -253,9 +251,9 @@ class StateMachineTest extends CommandTestBase {
@Test @Test
void onlyLastWhenCompleteTransitionFires() { void onlyLastWhenCompleteTransitionFires() {
var command1 = Command.noRequirements().executing(Coroutine::yield).named("Command 1"); var command1 = Command.noRequirements(Coroutine::yield).named("Command 1");
var command2 = Command.noRequirements().executing(Coroutine::yield).named("Command 2"); var command2 = Command.noRequirements(Coroutine::yield).named("Command 2");
var command3 = Command.noRequirements().executing(Coroutine::yield).named("Command 3"); var command3 = Command.noRequirements(Coroutine::yield).named("Command 3");
var stateMachine = new StateMachine("State Machine"); var stateMachine = new StateMachine("State Machine");
var state1 = stateMachine.addState(command1); var state1 = stateMachine.addState(command1);
@@ -278,9 +276,9 @@ class StateMachineTest extends CommandTestBase {
void whenCompleteAndTakesPriorityOverWhenCompleteIfCalledLast() { void whenCompleteAndTakesPriorityOverWhenCompleteIfCalledLast() {
var signal = new AtomicBoolean(false); var signal = new AtomicBoolean(false);
var command1 = Command.noRequirements().executing(Coroutine::yield).named("Command 1"); var command1 = Command.noRequirements(Coroutine::yield).named("Command 1");
var command2 = Command.noRequirements().executing(Coroutine::yield).named("Command 2"); var command2 = Command.noRequirements(Coroutine::yield).named("Command 2");
var command3 = Command.noRequirements().executing(Coroutine::yield).named("Command 3"); var command3 = Command.noRequirements(Coroutine::yield).named("Command 3");
var stateMachine = new StateMachine("State Machine"); var stateMachine = new StateMachine("State Machine");
var state1 = stateMachine.addState(command1); var state1 = stateMachine.addState(command1);
@@ -306,9 +304,9 @@ class StateMachineTest extends CommandTestBase {
void whenCompleteAndTakesPriorityOverWhenCompleteIfCalleFirst() { void whenCompleteAndTakesPriorityOverWhenCompleteIfCalleFirst() {
var signal = new AtomicBoolean(false); var signal = new AtomicBoolean(false);
var command1 = Command.noRequirements().executing(Coroutine::yield).named("Command 1"); var command1 = Command.noRequirements(Coroutine::yield).named("Command 1");
var command2 = Command.noRequirements().executing(Coroutine::yield).named("Command 2"); var command2 = Command.noRequirements(Coroutine::yield).named("Command 2");
var command3 = Command.noRequirements().executing(Coroutine::yield).named("Command 3"); var command3 = Command.noRequirements(Coroutine::yield).named("Command 3");
var stateMachine = new StateMachine("State Machine"); var stateMachine = new StateMachine("State Machine");
var state1 = stateMachine.addState(command1); var state1 = stateMachine.addState(command1);
@@ -333,8 +331,8 @@ class StateMachineTest extends CommandTestBase {
@Test @Test
void composingComplete() { void composingComplete() {
AtomicBoolean signal = new AtomicBoolean(false); AtomicBoolean signal = new AtomicBoolean(false);
var command1 = Command.noRequirements().executing(Coroutine::yield).named("Command 1"); var command1 = Command.noRequirements(Coroutine::yield).named("Command 1");
var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); var command2 = Command.noRequirements(Coroutine::park).named("Command 2");
var stateMachine = new StateMachine("State Machine"); var stateMachine = new StateMachine("State Machine");
var state1 = stateMachine.addState(command1); var state1 = stateMachine.addState(command1);
@@ -372,9 +370,9 @@ class StateMachineTest extends CommandTestBase {
@Test @Test
void switchFromAny() { void switchFromAny() {
var command1 = Command.noRequirements().executing(Coroutine::yield).named("Command 1"); var command1 = Command.noRequirements(Coroutine::yield).named("Command 1");
var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); var command2 = Command.noRequirements(Coroutine::park).named("Command 2");
var command3 = Command.noRequirements().executing(Coroutine::park).named("Command 3"); var command3 = Command.noRequirements(Coroutine::park).named("Command 3");
AtomicBoolean signal = new AtomicBoolean(false); AtomicBoolean signal = new AtomicBoolean(false);
@@ -430,15 +428,14 @@ class StateMachineTest extends CommandTestBase {
AtomicInteger count = new AtomicInteger(0); AtomicInteger count = new AtomicInteger(0);
var command1 = var command1 =
Command.noRequirements() Command.noRequirements(
.executing(
co -> { co -> {
count.incrementAndGet(); count.incrementAndGet();
co.yield(); co.yield();
}) })
.named("Command 1"); .named("Command 1");
var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); var command2 = Command.noRequirements(Coroutine::park).named("Command 2");
var command3 = Command.noRequirements().executing(Coroutine::park).named("Command 3"); var command3 = Command.noRequirements(Coroutine::park).named("Command 3");
var stateMachine = new StateMachine("State Machine"); var stateMachine = new StateMachine("State Machine");
var state1 = stateMachine.addState(command1); var state1 = stateMachine.addState(command1);
@@ -471,8 +468,7 @@ class StateMachineTest extends CommandTestBase {
void switchToSupplierWithCondition() { void switchToSupplierWithCondition() {
AtomicInteger count = new AtomicInteger(0); AtomicInteger count = new AtomicInteger(0);
var command1 = var command1 =
Command.noRequirements() Command.noRequirements(
.executing(
co -> { co -> {
while (true) { while (true) {
// Increment after yielding. Otherwise, the condition is checked and the state // Increment after yielding. Otherwise, the condition is checked and the state
@@ -483,8 +479,8 @@ class StateMachineTest extends CommandTestBase {
} }
}) })
.named("Command 1"); .named("Command 1");
var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); var command2 = Command.noRequirements(Coroutine::park).named("Command 2");
var command3 = Command.noRequirements().executing(Coroutine::park).named("Command 3"); var command3 = Command.noRequirements(Coroutine::park).named("Command 3");
var stateMachine = new StateMachine("State Machine"); var stateMachine = new StateMachine("State Machine");
var state1 = stateMachine.addState(command1); var state1 = stateMachine.addState(command1);
@@ -512,8 +508,8 @@ class StateMachineTest extends CommandTestBase {
@Test @Test
void runsOnEnterForInitialState() { void runsOnEnterForInitialState() {
var command1 = Command.noRequirements().executing(Coroutine::park).named("Command 1"); var command1 = Command.noRequirements(Coroutine::park).named("Command 1");
var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); var command2 = Command.noRequirements(Coroutine::park).named("Command 2");
AtomicInteger enterCount = new AtomicInteger(0); AtomicInteger enterCount = new AtomicInteger(0);
var stateMachine = new StateMachine("State Machine"); var stateMachine = new StateMachine("State Machine");
@@ -530,8 +526,8 @@ class StateMachineTest extends CommandTestBase {
@Test @Test
void runsOnExitOnTransition() { void runsOnExitOnTransition() {
var command1 = Command.noRequirements().executing(Coroutine::park).named("Command 1"); var command1 = Command.noRequirements(Coroutine::park).named("Command 1");
var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); var command2 = Command.noRequirements(Coroutine::park).named("Command 2");
AtomicInteger exitCount = new AtomicInteger(0); AtomicInteger exitCount = new AtomicInteger(0);
AtomicBoolean signal = new AtomicBoolean(false); AtomicBoolean signal = new AtomicBoolean(false);
@@ -553,7 +549,7 @@ class StateMachineTest extends CommandTestBase {
@Test @Test
void runsOnExitWhenComplete() { void runsOnExitWhenComplete() {
var command1 = Command.noRequirements().executing(co -> {}).named("Command 1"); var command1 = Command.noRequirements(co -> {}).named("Command 1");
AtomicInteger exitCount = new AtomicInteger(0); AtomicInteger exitCount = new AtomicInteger(0);
var stateMachine = new StateMachine("State Machine"); var stateMachine = new StateMachine("State Machine");
@@ -572,7 +568,7 @@ class StateMachineTest extends CommandTestBase {
var mech = new Mechanism("Mechanism", m_scheduler); var mech = new Mechanism("Mechanism", m_scheduler);
var mainMechCommand = mech.run(Coroutine::park).named("Main Mech Command"); var mainMechCommand = mech.run(Coroutine::park).named("Main Mech Command");
var backgroundMechCommand = mech.run(Coroutine::park).named("Background Mech Command"); var backgroundMechCommand = mech.run(Coroutine::park).named("Background Mech Command");
var nextStateCommand = Command.noRequirements().executing(Coroutine::park).named("Next"); var nextStateCommand = Command.noRequirements(Coroutine::park).named("Next");
AtomicBoolean signal = new AtomicBoolean(false); AtomicBoolean signal = new AtomicBoolean(false);
var stateMachine = new StateMachine("State Machine"); var stateMachine = new StateMachine("State Machine");
@@ -598,7 +594,7 @@ class StateMachineTest extends CommandTestBase {
@Test @Test
void runsOnEnterCallbacksInInsertionOrder() { void runsOnEnterCallbacksInInsertionOrder() {
var command1 = Command.noRequirements().executing(co -> {}).named("Command 1"); var command1 = Command.noRequirements(co -> {}).named("Command 1");
List<String> callbackInfo = new ArrayList<>(); List<String> callbackInfo = new ArrayList<>();
var stateMachine = new StateMachine("State Machine"); var stateMachine = new StateMachine("State Machine");
@@ -616,7 +612,7 @@ class StateMachineTest extends CommandTestBase {
@Test @Test
void runsOnExitCallbacksInInsertionOrder() { void runsOnExitCallbacksInInsertionOrder() {
// Make the command immediately exit // Make the command immediately exit
var command1 = Command.noRequirements().executing(co -> {}).named("Command 1"); var command1 = Command.noRequirements(co -> {}).named("Command 1");
List<String> callbackInfo = new ArrayList<>(); List<String> callbackInfo = new ArrayList<>();
var stateMachine = new StateMachine("State Machine"); var stateMachine = new StateMachine("State Machine");
@@ -633,7 +629,7 @@ class StateMachineTest extends CommandTestBase {
@Test @Test
void onEnterSeesNewCommand() { void onEnterSeesNewCommand() {
var command1 = Command.noRequirements().executing(Coroutine::park).named("Command 1"); var command1 = Command.noRequirements(Coroutine::park).named("Command 1");
AtomicBoolean sawCommand1OnEnter = new AtomicBoolean(false); AtomicBoolean sawCommand1OnEnter = new AtomicBoolean(false);
var stateMachine = new StateMachine("State Machine"); var stateMachine = new StateMachine("State Machine");
@@ -648,8 +644,8 @@ class StateMachineTest extends CommandTestBase {
@Test @Test
void onExitWithTransitionSeesExitedCommand() { void onExitWithTransitionSeesExitedCommand() {
var command1 = Command.noRequirements().executing(Coroutine::park).named("Command 1"); var command1 = Command.noRequirements(Coroutine::park).named("Command 1");
var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); var command2 = Command.noRequirements(Coroutine::park).named("Command 2");
AtomicBoolean sawCommand1OnExit = new AtomicBoolean(false); AtomicBoolean sawCommand1OnExit = new AtomicBoolean(false);
AtomicBoolean signal = new AtomicBoolean(false); AtomicBoolean signal = new AtomicBoolean(false);
@@ -673,8 +669,8 @@ class StateMachineTest extends CommandTestBase {
// command has finished. // command has finished.
@Test @Test
void onExitWithCompleteCannotSeeExitedCommand() { void onExitWithCompleteCannotSeeExitedCommand() {
var command1 = Command.noRequirements().executing(Coroutine::yield).named("Command 1"); var command1 = Command.noRequirements(Coroutine::yield).named("Command 1");
var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); var command2 = Command.noRequirements(Coroutine::park).named("Command 2");
AtomicBoolean onExitCalled = new AtomicBoolean(false); AtomicBoolean onExitCalled = new AtomicBoolean(false);
AtomicBoolean sawCommand1OnExit = new AtomicBoolean(false); AtomicBoolean sawCommand1OnExit = new AtomicBoolean(false);

View File

@@ -54,7 +54,7 @@ public Command autoWithStateMachine() {
```java ```java
Command autoWithCoroutines() { Command autoWithCoroutines() {
return Command.noRequirements().executing(coroutine -> { return Command.noRequirements(coroutine -> {
// Automatically score while the robot is in scoring position. // Automatically score while the robot is in scoring position.
// This will be canceled if the robot is bumped away from the scoring location. // This will be canceled if the robot is bumped away from the scoring location.
atScoringLocation.whileTrue( atScoringLocation.whileTrue(