Files
allwpilib/commandsv2/src/test/python/compositiontestbase.py
PJ Reiniger 1a99a348cb [robotpy] Mirror robotpy's commands-v2 (#8369)
Project import generated by Copybara.

GitOrigin-RevId: 715c8e8372d936f447f2937aab6b1a22dc619126
2025-11-13 21:55:54 -08:00

167 lines
6.8 KiB
Python

from typing import Generic, TypeVar
import commands2
import pytest
# T = TypeVar("T", bound=commands2.Command)
# T = commands2.Command
from util import *
class SingleCompositionTestBase:
def composeSingle(self, member: commands2.Command):
raise NotImplementedError
@pytest.mark.parametrize(
"interruptionBehavior",
[
commands2.InterruptionBehavior.kCancelSelf,
commands2.InterruptionBehavior.kCancelIncoming,
],
)
def test_interruptible(self, interruptionBehavior: commands2.InterruptionBehavior):
command = self.composeSingle(
commands2.WaitUntilCommand(lambda: False).withInterruptBehavior(
interruptionBehavior
)
)
assert command.getInterruptionBehavior() == interruptionBehavior
@pytest.mark.parametrize("runsWhenDisabled", [True, False])
def test_runWhenDisabled(self, runsWhenDisabled: bool):
command = self.composeSingle(
commands2.WaitUntilCommand(lambda: False).ignoringDisable(runsWhenDisabled)
)
assert command.runsWhenDisabled() == runsWhenDisabled
def test_command_in_other_composition(self):
command = commands2.InstantCommand()
wrapped = commands2.WrapperCommand(command)
with pytest.raises(commands2.IllegalCommandUse):
self.composeSingle(command)
def test_command_in_multiple_compositions(self):
command = commands2.InstantCommand()
self.composeSingle(command)
with pytest.raises(commands2.IllegalCommandUse):
self.composeSingle(command)
def test_compose_then_schedule(self, scheduler: commands2.CommandScheduler):
command = commands2.InstantCommand()
self.composeSingle(command)
with pytest.raises(commands2.IllegalCommandUse):
scheduler.schedule(command)
def test_schedule_then_compose(self, scheduler: commands2.CommandScheduler):
command = commands2.RunCommand(lambda: None)
scheduler.schedule(command)
with pytest.raises(commands2.IllegalCommandUse):
self.composeSingle(command)
class MultiCompositionTestBase(SingleCompositionTestBase):
def compose(self, *members: commands2.Command):
raise NotImplementedError
def composeSingle(self, member: commands2.Command):
return self.compose(member)
@pytest.mark.parametrize(
"expected,command1,command2,command3",
[
pytest.param(
commands2.InterruptionBehavior.kCancelSelf,
commands2.WaitUntilCommand(lambda: False).withInterruptBehavior(
commands2.InterruptionBehavior.kCancelSelf
),
commands2.WaitUntilCommand(lambda: False).withInterruptBehavior(
commands2.InterruptionBehavior.kCancelSelf
),
commands2.WaitUntilCommand(lambda: False).withInterruptBehavior(
commands2.InterruptionBehavior.kCancelSelf
),
id="AllCancelSelf",
),
pytest.param(
commands2.InterruptionBehavior.kCancelIncoming,
commands2.WaitUntilCommand(lambda: False).withInterruptBehavior(
commands2.InterruptionBehavior.kCancelIncoming
),
commands2.WaitUntilCommand(lambda: False).withInterruptBehavior(
commands2.InterruptionBehavior.kCancelIncoming
),
commands2.WaitUntilCommand(lambda: False).withInterruptBehavior(
commands2.InterruptionBehavior.kCancelIncoming
),
id="AllCancelIncoming",
),
pytest.param(
commands2.InterruptionBehavior.kCancelSelf,
commands2.WaitUntilCommand(lambda: False).withInterruptBehavior(
commands2.InterruptionBehavior.kCancelSelf
),
commands2.WaitUntilCommand(lambda: False).withInterruptBehavior(
commands2.InterruptionBehavior.kCancelSelf
),
commands2.WaitUntilCommand(lambda: False).withInterruptBehavior(
commands2.InterruptionBehavior.kCancelIncoming
),
id="TwoCancelSelfOneIncoming",
),
pytest.param(
commands2.InterruptionBehavior.kCancelSelf,
commands2.WaitUntilCommand(lambda: False).withInterruptBehavior(
commands2.InterruptionBehavior.kCancelIncoming
),
commands2.WaitUntilCommand(lambda: False).withInterruptBehavior(
commands2.InterruptionBehavior.kCancelIncoming
),
commands2.WaitUntilCommand(lambda: False).withInterruptBehavior(
commands2.InterruptionBehavior.kCancelSelf
),
id="TwoCancelIncomingOneSelf",
),
],
)
def test_interruptible(self, expected, command1, command2, command3):
command = self.compose(command1, command2, command3)
assert command.getInterruptionBehavior() == expected
@pytest.mark.parametrize(
"expected,command1,command2,command3",
[
pytest.param(
False,
commands2.WaitUntilCommand(lambda: False).ignoringDisable(False),
commands2.WaitUntilCommand(lambda: False).ignoringDisable(False),
commands2.WaitUntilCommand(lambda: False).ignoringDisable(False),
id="AllFalse",
),
pytest.param(
True,
commands2.WaitUntilCommand(lambda: False).ignoringDisable(True),
commands2.WaitUntilCommand(lambda: False).ignoringDisable(True),
commands2.WaitUntilCommand(lambda: False).ignoringDisable(True),
id="AllTrue",
),
pytest.param(
False,
commands2.WaitUntilCommand(lambda: False).ignoringDisable(True),
commands2.WaitUntilCommand(lambda: False).ignoringDisable(True),
commands2.WaitUntilCommand(lambda: False).ignoringDisable(False),
id="TwoTrueOneFalse",
),
pytest.param(
False,
commands2.WaitUntilCommand(lambda: False).ignoringDisable(False),
commands2.WaitUntilCommand(lambda: False).ignoringDisable(False),
commands2.WaitUntilCommand(lambda: False).ignoringDisable(True),
id="TwoFalseOneTrue",
),
],
)
def test_runWhenDisabled(self, expected, command1, command2, command3):
command = self.compose(command1, command2, command3)
assert command.runsWhenDisabled() == expected