From 878da3d54cbc6b64d663bded17d87d5bed040ed9 Mon Sep 17 00:00:00 2001 From: Ryan Blue Date: Fri, 8 May 2026 00:42:16 -0400 Subject: [PATCH] [cmd3] Fix StateMachineTest (#8876) --- .../org/wpilib/command3/StateMachineTest.java | 88 +++++++++---------- design-docs/commands-v3-state-machines.md | 2 +- 2 files changed, 43 insertions(+), 47 deletions(-) diff --git a/commandsv3/src/test/java/org/wpilib/command3/StateMachineTest.java b/commandsv3/src/test/java/org/wpilib/command3/StateMachineTest.java index c35375c545..fcb09277fb 100644 --- a/commandsv3/src/test/java/org/wpilib/command3/StateMachineTest.java +++ b/commandsv3/src/test/java/org/wpilib/command3/StateMachineTest.java @@ -115,8 +115,8 @@ class StateMachineTest extends CommandTestBase { @Test void transitionsIfConditionIsAlreadyTrueWhenEntered() { - var command1 = Command.noRequirements().executing(Coroutine::park).named("Command 1"); - var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); + var command1 = Command.noRequirements(Coroutine::park).named("Command 1"); + var command2 = Command.noRequirements(Coroutine::park).named("Command 2"); var signal = new AtomicBoolean(false); var stateMachine = new StateMachine("State Machine"); @@ -137,9 +137,8 @@ class StateMachineTest extends CommandTestBase { void commandExits() { AtomicBoolean signal = new AtomicBoolean(false); - var command1 = - Command.noRequirements().executing(co -> co.waitUntil(signal::get)).named("Command 1"); - var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); + var command1 = Command.noRequirements(co -> co.waitUntil(signal::get)).named("Command 1"); + var command2 = Command.noRequirements(Coroutine::park).named("Command 2"); var stateMachine = new StateMachine("State Machine"); var state1 = stateMachine.addState(command1); @@ -168,8 +167,7 @@ class StateMachineTest extends CommandTestBase { AtomicInteger initCount = new AtomicInteger(0); var command = - Command.noRequirements() - .executing( + Command.noRequirements( co -> { initCount.incrementAndGet(); co.park(); @@ -213,7 +211,7 @@ class StateMachineTest extends CommandTestBase { @Test void oneshotCommandTransitionsToSelfOnComplete() { 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 state = stateMachine.addState(command); stateMachine.setInitialState(state); @@ -229,9 +227,9 @@ class StateMachineTest extends CommandTestBase { void onlyFirstExplicitTransitionFires() { var signal = new AtomicBoolean(false); - var command1 = Command.noRequirements().executing(Coroutine::park).named("Command 1"); - var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); - var command3 = Command.noRequirements().executing(Coroutine::park).named("Command 3"); + var command1 = Command.noRequirements(Coroutine::park).named("Command 1"); + var command2 = Command.noRequirements(Coroutine::park).named("Command 2"); + var command3 = Command.noRequirements(Coroutine::park).named("Command 3"); var stateMachine = new StateMachine("State Machine"); var state1 = stateMachine.addState(command1); @@ -253,9 +251,9 @@ class StateMachineTest extends CommandTestBase { @Test void onlyLastWhenCompleteTransitionFires() { - var command1 = Command.noRequirements().executing(Coroutine::yield).named("Command 1"); - var command2 = Command.noRequirements().executing(Coroutine::yield).named("Command 2"); - var command3 = Command.noRequirements().executing(Coroutine::yield).named("Command 3"); + var command1 = Command.noRequirements(Coroutine::yield).named("Command 1"); + var command2 = Command.noRequirements(Coroutine::yield).named("Command 2"); + var command3 = Command.noRequirements(Coroutine::yield).named("Command 3"); var stateMachine = new StateMachine("State Machine"); var state1 = stateMachine.addState(command1); @@ -278,9 +276,9 @@ class StateMachineTest extends CommandTestBase { void whenCompleteAndTakesPriorityOverWhenCompleteIfCalledLast() { var signal = new AtomicBoolean(false); - var command1 = Command.noRequirements().executing(Coroutine::yield).named("Command 1"); - var command2 = Command.noRequirements().executing(Coroutine::yield).named("Command 2"); - var command3 = Command.noRequirements().executing(Coroutine::yield).named("Command 3"); + var command1 = Command.noRequirements(Coroutine::yield).named("Command 1"); + var command2 = Command.noRequirements(Coroutine::yield).named("Command 2"); + var command3 = Command.noRequirements(Coroutine::yield).named("Command 3"); var stateMachine = new StateMachine("State Machine"); var state1 = stateMachine.addState(command1); @@ -306,9 +304,9 @@ class StateMachineTest extends CommandTestBase { void whenCompleteAndTakesPriorityOverWhenCompleteIfCalleFirst() { var signal = new AtomicBoolean(false); - var command1 = Command.noRequirements().executing(Coroutine::yield).named("Command 1"); - var command2 = Command.noRequirements().executing(Coroutine::yield).named("Command 2"); - var command3 = Command.noRequirements().executing(Coroutine::yield).named("Command 3"); + var command1 = Command.noRequirements(Coroutine::yield).named("Command 1"); + var command2 = Command.noRequirements(Coroutine::yield).named("Command 2"); + var command3 = Command.noRequirements(Coroutine::yield).named("Command 3"); var stateMachine = new StateMachine("State Machine"); var state1 = stateMachine.addState(command1); @@ -333,8 +331,8 @@ class StateMachineTest extends CommandTestBase { @Test void composingComplete() { AtomicBoolean signal = new AtomicBoolean(false); - var command1 = Command.noRequirements().executing(Coroutine::yield).named("Command 1"); - var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); + var command1 = Command.noRequirements(Coroutine::yield).named("Command 1"); + var command2 = Command.noRequirements(Coroutine::park).named("Command 2"); var stateMachine = new StateMachine("State Machine"); var state1 = stateMachine.addState(command1); @@ -372,9 +370,9 @@ class StateMachineTest extends CommandTestBase { @Test void switchFromAny() { - var command1 = Command.noRequirements().executing(Coroutine::yield).named("Command 1"); - var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); - var command3 = Command.noRequirements().executing(Coroutine::park).named("Command 3"); + var command1 = Command.noRequirements(Coroutine::yield).named("Command 1"); + var command2 = Command.noRequirements(Coroutine::park).named("Command 2"); + var command3 = Command.noRequirements(Coroutine::park).named("Command 3"); AtomicBoolean signal = new AtomicBoolean(false); @@ -430,15 +428,14 @@ class StateMachineTest extends CommandTestBase { AtomicInteger count = new AtomicInteger(0); var command1 = - Command.noRequirements() - .executing( + Command.noRequirements( co -> { count.incrementAndGet(); co.yield(); }) .named("Command 1"); - var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); - var command3 = Command.noRequirements().executing(Coroutine::park).named("Command 3"); + var command2 = Command.noRequirements(Coroutine::park).named("Command 2"); + var command3 = Command.noRequirements(Coroutine::park).named("Command 3"); var stateMachine = new StateMachine("State Machine"); var state1 = stateMachine.addState(command1); @@ -471,8 +468,7 @@ class StateMachineTest extends CommandTestBase { void switchToSupplierWithCondition() { AtomicInteger count = new AtomicInteger(0); var command1 = - Command.noRequirements() - .executing( + Command.noRequirements( co -> { while (true) { // Increment after yielding. Otherwise, the condition is checked and the state @@ -483,8 +479,8 @@ class StateMachineTest extends CommandTestBase { } }) .named("Command 1"); - var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); - var command3 = Command.noRequirements().executing(Coroutine::park).named("Command 3"); + var command2 = Command.noRequirements(Coroutine::park).named("Command 2"); + var command3 = Command.noRequirements(Coroutine::park).named("Command 3"); var stateMachine = new StateMachine("State Machine"); var state1 = stateMachine.addState(command1); @@ -512,8 +508,8 @@ class StateMachineTest extends CommandTestBase { @Test void runsOnEnterForInitialState() { - var command1 = Command.noRequirements().executing(Coroutine::park).named("Command 1"); - var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); + var command1 = Command.noRequirements(Coroutine::park).named("Command 1"); + var command2 = Command.noRequirements(Coroutine::park).named("Command 2"); AtomicInteger enterCount = new AtomicInteger(0); var stateMachine = new StateMachine("State Machine"); @@ -530,8 +526,8 @@ class StateMachineTest extends CommandTestBase { @Test void runsOnExitOnTransition() { - var command1 = Command.noRequirements().executing(Coroutine::park).named("Command 1"); - var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); + var command1 = Command.noRequirements(Coroutine::park).named("Command 1"); + var command2 = Command.noRequirements(Coroutine::park).named("Command 2"); AtomicInteger exitCount = new AtomicInteger(0); AtomicBoolean signal = new AtomicBoolean(false); @@ -553,7 +549,7 @@ class StateMachineTest extends CommandTestBase { @Test void runsOnExitWhenComplete() { - var command1 = Command.noRequirements().executing(co -> {}).named("Command 1"); + var command1 = Command.noRequirements(co -> {}).named("Command 1"); AtomicInteger exitCount = new AtomicInteger(0); var stateMachine = new StateMachine("State Machine"); @@ -572,7 +568,7 @@ class StateMachineTest extends CommandTestBase { var mech = new Mechanism("Mechanism", m_scheduler); var mainMechCommand = mech.run(Coroutine::park).named("Main 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); var stateMachine = new StateMachine("State Machine"); @@ -598,7 +594,7 @@ class StateMachineTest extends CommandTestBase { @Test void runsOnEnterCallbacksInInsertionOrder() { - var command1 = Command.noRequirements().executing(co -> {}).named("Command 1"); + var command1 = Command.noRequirements(co -> {}).named("Command 1"); List callbackInfo = new ArrayList<>(); var stateMachine = new StateMachine("State Machine"); @@ -616,7 +612,7 @@ class StateMachineTest extends CommandTestBase { @Test void runsOnExitCallbacksInInsertionOrder() { // Make the command immediately exit - var command1 = Command.noRequirements().executing(co -> {}).named("Command 1"); + var command1 = Command.noRequirements(co -> {}).named("Command 1"); List callbackInfo = new ArrayList<>(); var stateMachine = new StateMachine("State Machine"); @@ -633,7 +629,7 @@ class StateMachineTest extends CommandTestBase { @Test 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); var stateMachine = new StateMachine("State Machine"); @@ -648,8 +644,8 @@ class StateMachineTest extends CommandTestBase { @Test void onExitWithTransitionSeesExitedCommand() { - var command1 = Command.noRequirements().executing(Coroutine::park).named("Command 1"); - var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); + var command1 = Command.noRequirements(Coroutine::park).named("Command 1"); + var command2 = Command.noRequirements(Coroutine::park).named("Command 2"); AtomicBoolean sawCommand1OnExit = new AtomicBoolean(false); AtomicBoolean signal = new AtomicBoolean(false); @@ -673,8 +669,8 @@ class StateMachineTest extends CommandTestBase { // command has finished. @Test void onExitWithCompleteCannotSeeExitedCommand() { - var command1 = Command.noRequirements().executing(Coroutine::yield).named("Command 1"); - var command2 = Command.noRequirements().executing(Coroutine::park).named("Command 2"); + var command1 = Command.noRequirements(Coroutine::yield).named("Command 1"); + var command2 = Command.noRequirements(Coroutine::park).named("Command 2"); AtomicBoolean onExitCalled = new AtomicBoolean(false); AtomicBoolean sawCommand1OnExit = new AtomicBoolean(false); diff --git a/design-docs/commands-v3-state-machines.md b/design-docs/commands-v3-state-machines.md index df2c9eea74..e1602fd6c4 100644 --- a/design-docs/commands-v3-state-machines.md +++ b/design-docs/commands-v3-state-machines.md @@ -54,7 +54,7 @@ public Command autoWithStateMachine() { ```java Command autoWithCoroutines() { - return Command.noRequirements().executing(coroutine -> { + return Command.noRequirements(coroutine -> { // Automatically score while the robot is in scoring position. // This will be canceled if the robot is bumped away from the scoring location. atScoringLocation.whileTrue(