diff --git a/build.gradle b/build.gradle index 3eb689d1..3beb83a6 100644 --- a/build.gradle +++ b/build.gradle @@ -88,6 +88,9 @@ dependencies { simulationRelease wpi.sim.enableRelease() testImplementation libs.junit.jupiter + testImplementation libs.mockito.core + testImplementation libs.mockito.junit.jupiter + testRuntimeOnly libs.junit.platform.launcher } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ca21c212..ecfadb56 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,6 +6,8 @@ errorproneCore = "2.28.0" errorproneAnnotations = "2.28.0" junit = "5.10.1" junitPlatform = "1.10.1" +mockito = "5.11.0" + [libraries] wpilib-java = { module = "edu.wpi.first.gradle:edu.wpi.first.gradle.gradle.plugin", version.ref = "wpilib" } @@ -17,6 +19,9 @@ errorprone-core = { module = "com.google.errorprone:error_prone_core", version.r junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher", version.ref = "junitPlatform" } +mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito" } +mockito-junit-jupiter = { module = "org.mockito:mockito-junit-jupiter", version.ref = "mockito" } + [plugins] wpilib = { id = "edu.wpi.first.GradleRIO", version.ref = "wpilib" } spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } diff --git a/src/test/TestHowTo.md b/src/test/TestHowTo.md new file mode 100644 index 00000000..8130f0fd --- /dev/null +++ b/src/test/TestHowTo.md @@ -0,0 +1,12 @@ +## How to Run Tests +You can run the tests using the Gradle wrapper: + +```bash +./gradlew test +``` + +## How to Debug Tests +You can debug tests directly in VS Code: +1. Open the test file (e.g., [src/test/java/frc/robot/ExampleTest.java](java/frc/robot/ExampleTest.java)). +2. Click the "Run" or "Debug" codelens above the test method or class. +3. Alternatively, use the Testing view in the sidebar to run or debug specific tests. diff --git a/src/test/java/frc/robot/ExampleTest.java b/src/test/java/frc/robot/ExampleTest.java new file mode 100644 index 00000000..e6cdb9da --- /dev/null +++ b/src/test/java/frc/robot/ExampleTest.java @@ -0,0 +1,28 @@ +package frc.robot; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.function.DoubleSupplier; +import org.junit.jupiter.api.Test; + +class ExampleTest { + + @Test + void testMocking() { + // Create a mock object + DoubleSupplier mockSupplier = mock(DoubleSupplier.class); + + // Define behavior + when(mockSupplier.getAsDouble()).thenReturn(10.0); + + // Verify behavior + assertEquals(10.0, mockSupplier.getAsDouble(), 0.001); + } + + @Test + void testBasicAssertion() { + assertEquals(2, 1 + 1); + } +} diff --git a/src/test/java/frc/robot/util/AllianceUtilsTest.java b/src/test/java/frc/robot/util/AllianceUtilsTest.java new file mode 100644 index 00000000..95ad9b12 --- /dev/null +++ b/src/test/java/frc/robot/util/AllianceUtilsTest.java @@ -0,0 +1,52 @@ +package frc.robot.util; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mockStatic; + +import edu.wpi.first.wpilibj.DriverStation; +import edu.wpi.first.wpilibj.DriverStation.Alliance; +import java.util.Optional; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; + +class AllianceUtilsTest { + + private MockedStatic mockedDriverStation; + + @BeforeEach + void setUp() { + mockedDriverStation = mockStatic(DriverStation.class); + } + + @AfterEach + void tearDown() { + mockedDriverStation.close(); + } + + @Test + void testIsBlue() { + mockedDriverStation.when(DriverStation::getAlliance).thenReturn(Optional.of(Alliance.Blue)); + + assertTrue(AllianceUtils.isBlue()); + assertFalse(AllianceUtils.isRed()); + } + + @Test + void testIsRed() { + mockedDriverStation.when(DriverStation::getAlliance).thenReturn(Optional.of(Alliance.Red)); + + assertTrue(AllianceUtils.isRed()); + assertFalse(AllianceUtils.isBlue()); + } + + @Test + void testNoAlliance() { + mockedDriverStation.when(DriverStation::getAlliance).thenReturn(Optional.empty()); + + assertFalse(AllianceUtils.isBlue()); + assertFalse(AllianceUtils.isRed()); + } +}