Merge pull request #19 from Team4388/templates

Add Custom Templates for Easy Class Creation
This commit is contained in:
Keenan D. Buckley
2020-06-18 19:48:33 +00:00
committed by GitHub
7 changed files with 308 additions and 62 deletions
+40
View File
@@ -0,0 +1,40 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2019 FIRST. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package frc4388.robot.commands;
import edu.wpi.first.wpilibj2.command.*;
import frc4388.robot.subsystems.*;
import org.junit.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
public class CommandTest {
private CommandScheduler scheduler = null;
@Before
public void setup() {
scheduler = CommandScheduler.getInstance();
}
// TODO: Update this to use an actual command. Won't work with inline commands for some reason
@Test
public void testExample() {
// Arrange
Drive drive = mock(Drive.class);
RunCommand command = new RunCommand(() -> drive.driveWithInput(0, 0), drive);
// Act
scheduler.schedule(command);
scheduler.run();
// Assert
verify(drive).driveWithInput(0, 0);
}
}
+59
View File
@@ -0,0 +1,59 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2018-2019 FIRST. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package frc4388.robot.subsystems;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import org.junit.*;
import edu.wpi.first.wpilibj.Spark;
import frc4388.robot.Constants.LEDConstants;
import frc4388.utility.LEDPatterns;
/**
* Based off the LEDSubsystemTest class
*/
public class SubsystemTest {
@Test
public void testConstructor() {
// Arrange
Spark ledController = mock(Spark.class);
// Act
LED led = new LED(ledController);
// Assert
assertEquals(LEDConstants.DEFAULT_PATTERN.getValue(), led.getPattern().getValue(), 0.0001);
}
@Test
public void testPatterns() {
// Arrange
Spark ledController = mock(Spark.class);
LED led = new LED(ledController);
// Act
led.setPattern(LEDPatterns.RAINBOW_RAINBOW);
// Assert
assertEquals(LEDPatterns.RAINBOW_RAINBOW.getValue(), led.getPattern().getValue(), 0.0001);
// Act
led.setPattern(LEDPatterns.BLUE_BREATH);
// Assert
assertEquals(LEDPatterns.BLUE_BREATH.getValue(), led.getPattern().getValue(), 0.0001);
// Act
led.setPattern(LEDPatterns.SOLID_BLACK);
// Assert
assertEquals(LEDPatterns.SOLID_BLACK.getValue(), led.getPattern().getValue(), 0.0001);
}
}
+61
View File
@@ -0,0 +1,61 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2018-2019 FIRST. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package frc4388.utility;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import com.kauailabs.navx.frc.AHRS;
import org.junit.*;
import frc4388.mocks.MockPigeonIMU;
import frc4388.robot.Constants.DriveConstants;
/**
* Based on the RobotGyroUtilityTest class
*/
public class UtilityTest {
private RobotGyro gyroPigeon;
private RobotGyro gyroNavX;
@Test
public void testConstructor() {
// Arrange
MockPigeonIMU pigeon = new MockPigeonIMU(DriveConstants.DRIVE_PIGEON_ID);
AHRS navX = mock(AHRS.class);
gyroPigeon = new RobotGyro(pigeon);
gyroNavX = new RobotGyro(navX);
// Assert
assertEquals(true, gyroPigeon.m_isGyroAPigeon);
assertEquals(pigeon, gyroPigeon.getPigeon());
assertEquals(null, gyroPigeon.getNavX());
assertEquals(false, gyroNavX.m_isGyroAPigeon);
assertEquals(navX, gyroNavX.getNavX());
assertEquals(null, gyroNavX.getPigeon());
}
@Test
public void testHeadingPigeon() {
// Arrange
MockPigeonIMU pigeon = new MockPigeonIMU(DriveConstants.DRIVE_PIGEON_ID);
gyroPigeon = new RobotGyro(pigeon);
// Act & Assert
assertEquals(-90, gyroPigeon.getHeading(270), 0.0001);
assertEquals(-45, gyroPigeon.getHeading(315), 0.0001);
assertEquals(-60, gyroPigeon.getHeading(-60), 0.0001);
assertEquals(30, gyroPigeon.getHeading(30), 0.0001);
assertEquals(0, gyroPigeon.getHeading(0), 0.0001);
assertEquals(180, gyroPigeon.getHeading(180), 0.0001);
assertEquals(-180, gyroPigeon.getHeading(-180), 0.0001);
assertEquals(97, gyroPigeon.getHeading(1537), 0.0001);
assertEquals(99, gyroPigeon.getHeading(-2781), 0.0001);
}
}
@@ -7,9 +7,11 @@
package frc4388.robot.subsystems; package frc4388.robot.subsystems;
import static org.junit.Assert.*; import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.mock;
import org.junit.*;
import org.junit.Test;
import edu.wpi.first.wpilibj.*; import edu.wpi.first.wpilibj.*;
import frc4388.robot.Constants.LEDConstants; import frc4388.robot.Constants.LEDConstants;
import frc4388.utility.LEDPatterns; import frc4388.utility.LEDPatterns;
@@ -18,24 +20,40 @@ import frc4388.utility.LEDPatterns;
* Add your docs here. * Add your docs here.
*/ */
public class LEDSubsystemTest { public class LEDSubsystemTest {
@Test
public void testConstructor() {
// Arrange
Spark ledController = mock(Spark.class); Spark ledController = mock(Spark.class);
// Act
LED led = new LED(ledController); LED led = new LED(ledController);
// Assert
assertEquals(LEDConstants.DEFAULT_PATTERN.getValue(), led.getPattern().getValue(), 0.0001);
}
@Test @Test
public void testPatterns() { public void testPatterns() {
// TEST 1 // Arrange
assertEquals(LEDConstants.DEFAULT_PATTERN.getValue(), led.getPattern().getValue(), 0.0001); Spark ledController = mock(Spark.class);
LED led = new LED(ledController);
// TEST 2 // Act
led.setPattern(LEDPatterns.RAINBOW_RAINBOW); led.setPattern(LEDPatterns.RAINBOW_RAINBOW);
// Assert
assertEquals(LEDPatterns.RAINBOW_RAINBOW.getValue(), led.getPattern().getValue(), 0.0001); assertEquals(LEDPatterns.RAINBOW_RAINBOW.getValue(), led.getPattern().getValue(), 0.0001);
// TEST 3 // Act
led.setPattern(LEDPatterns.BLUE_BREATH); led.setPattern(LEDPatterns.BLUE_BREATH);
// Assert
assertEquals(LEDPatterns.BLUE_BREATH.getValue(), led.getPattern().getValue(), 0.0001); assertEquals(LEDPatterns.BLUE_BREATH.getValue(), led.getPattern().getValue(), 0.0001);
// TEST 4 // Act
led.setPattern(LEDPatterns.SOLID_BLACK); led.setPattern(LEDPatterns.SOLID_BLACK);
// Assert
assertEquals(LEDPatterns.SOLID_BLACK.getValue(), led.getPattern().getValue(), 0.0001); assertEquals(LEDPatterns.SOLID_BLACK.getValue(), led.getPattern().getValue(), 0.0001);
} }
} }
@@ -9,44 +9,47 @@ package frc4388.utility;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import org.junit.*;
import edu.wpi.first.wpilibj.*;
import com.ctre.phoenix.sensors.PigeonIMU;
import com.kauailabs.navx.frc.AHRS; import com.kauailabs.navx.frc.AHRS;
import org.junit.*;
import frc4388.mocks.MockPigeonIMU; import frc4388.mocks.MockPigeonIMU;
import frc4388.robot.Constants.DriveConstants; import frc4388.robot.Constants.DriveConstants;
import frc4388.utility.RobotGyro;
/** /**
* Add your docs here. * Add your docs here.
*/ */
public class RobotGyroUtilityTest { public class RobotGyroUtilityTest {
MockPigeonIMU pigeon = new MockPigeonIMU(DriveConstants.DRIVE_PIGEON_ID);
RobotGyro gyroPigeon = new RobotGyro(pigeon);
AHRS navX = mock(AHRS.class);
RobotGyro gyroNavX = new RobotGyro(navX);
RobotTime robotTime = RobotTime.getInstance();
// TODO UNTESTED: most functions for NavX // TODO UNTESTED: most functions for NavX
private RobotGyro gyroPigeon;
private RobotGyro gyroNavX;
@Test @Test
public void testConfig() { public void testConstructor() {
// TEST 1 // Arrange
MockPigeonIMU pigeon = new MockPigeonIMU(DriveConstants.DRIVE_PIGEON_ID);
AHRS navX = mock(AHRS.class);
gyroPigeon = new RobotGyro(pigeon);
gyroNavX = new RobotGyro(navX);
// Assert
assertEquals(true, gyroPigeon.m_isGyroAPigeon); assertEquals(true, gyroPigeon.m_isGyroAPigeon);
assertEquals(pigeon, gyroPigeon.getPigeon()); assertEquals(pigeon, gyroPigeon.getPigeon());
assertEquals(null, gyroPigeon.getNavX()); assertEquals(null, gyroPigeon.getNavX());
// TEST 2
assertEquals(false, gyroNavX.m_isGyroAPigeon); assertEquals(false, gyroNavX.m_isGyroAPigeon);
assertEquals(navX, gyroNavX.getNavX()); assertEquals(navX, gyroNavX.getNavX());
assertEquals(null, gyroNavX.getPigeon()); assertEquals(null, gyroNavX.getPigeon());
} }
@Test @Test
public void testHeading() { public void testHeadingPigeon() {
// TESTS // Arrange
MockPigeonIMU pigeon = new MockPigeonIMU(DriveConstants.DRIVE_PIGEON_ID);
gyroPigeon = new RobotGyro(pigeon);
// Act & Assert
assertEquals(-90, gyroPigeon.getHeading(270), 0.0001); assertEquals(-90, gyroPigeon.getHeading(270), 0.0001);
assertEquals(-45, gyroPigeon.getHeading(315), 0.0001); assertEquals(-45, gyroPigeon.getHeading(315), 0.0001);
assertEquals(-60, gyroPigeon.getHeading(-60), 0.0001); assertEquals(-60, gyroPigeon.getHeading(-60), 0.0001);
@@ -59,97 +62,123 @@ public class RobotGyroUtilityTest {
} }
@Test @Test
public void testYawPitchRoll() { public void testYawPitchRollPigeon() {
// TEST 1 // Arrange
MockPigeonIMU pigeon = new MockPigeonIMU(DriveConstants.DRIVE_PIGEON_ID);
gyroPigeon = new RobotGyro(pigeon);
// Assert
assertEquals(0, gyroPigeon.getAngle(), 0.0001); assertEquals(0, gyroPigeon.getAngle(), 0.0001);
// TEST 2 // Act
pigeon.setYaw(40); pigeon.setYaw(40);
// Assert
assertEquals(40, gyroPigeon.getAngle(), 0.0001); assertEquals(40, gyroPigeon.getAngle(), 0.0001);
// TEST 3 // Act
gyroPigeon.reset(); gyroPigeon.reset();
// Assert
assertEquals(0, gyroPigeon.getAngle(), 0.0001); assertEquals(0, gyroPigeon.getAngle(), 0.0001);
// TEST 4 // Act
pigeon.setYaw(-1457); pigeon.setYaw(-1457);
pigeon.setCurrentPitch(100); pigeon.setCurrentPitch(100);
pigeon.setCurrentRoll(100); pigeon.setCurrentRoll(100);
// Assert
assertEquals(-1457, gyroPigeon.getAngle(), 0.0001); assertEquals(-1457, gyroPigeon.getAngle(), 0.0001);
assertEquals(90, gyroPigeon.getPitch(), 0.0001); assertEquals(90, gyroPigeon.getPitch(), 0.0001);
assertEquals(90, gyroPigeon.getRoll(), 0.0001); assertEquals(90, gyroPigeon.getRoll(), 0.0001);
// TEST 5 // Act
pigeon.setCurrentPitch(45); pigeon.setCurrentPitch(45);
pigeon.setCurrentRoll(45); pigeon.setCurrentRoll(45);
// Assert
assertEquals(45, gyroPigeon.getPitch(), 0.0001); assertEquals(45, gyroPigeon.getPitch(), 0.0001);
assertEquals(45, gyroPigeon.getRoll(), 0.0001); assertEquals(45, gyroPigeon.getRoll(), 0.0001);
// TEST 6 // Act
pigeon.setCurrentPitch(0); pigeon.setCurrentPitch(0);
pigeon.setCurrentRoll(0); pigeon.setCurrentRoll(0);
// Assert
assertEquals(0, gyroPigeon.getPitch(), 0.0001); assertEquals(0, gyroPigeon.getPitch(), 0.0001);
assertEquals(0, gyroPigeon.getRoll(), 0.0001); assertEquals(0, gyroPigeon.getRoll(), 0.0001);
// TEST 7 // Act
pigeon.setCurrentPitch(-60); pigeon.setCurrentPitch(-60);
pigeon.setCurrentRoll(-60); pigeon.setCurrentRoll(-60);
// Assert
assertEquals(-60, gyroPigeon.getPitch(), 0.0001); assertEquals(-60, gyroPigeon.getPitch(), 0.0001);
assertEquals(-60, gyroPigeon.getRoll(), 0.0001); assertEquals(-60, gyroPigeon.getRoll(), 0.0001);
// TEST 8 // Act
pigeon.setCurrentPitch(-90); pigeon.setCurrentPitch(-90);
pigeon.setCurrentRoll(-90); pigeon.setCurrentRoll(-90);
// Assert
assertEquals(-90, gyroPigeon.getPitch(), 0.0001); assertEquals(-90, gyroPigeon.getPitch(), 0.0001);
assertEquals(-90, gyroPigeon.getRoll(), 0.0001); assertEquals(-90, gyroPigeon.getRoll(), 0.0001);
// TEST 9 // Act
pigeon.setCurrentPitch(-100); pigeon.setCurrentPitch(-100);
pigeon.setCurrentRoll(-100); pigeon.setCurrentRoll(-100);
// Assert
assertEquals(-90, gyroPigeon.getPitch(), 0.0001); assertEquals(-90, gyroPigeon.getPitch(), 0.0001);
assertEquals(-90, gyroPigeon.getRoll(), 0.0001); assertEquals(-90, gyroPigeon.getRoll(), 0.0001);
} }
@Test @Test
public void testRates() { public void testRatesPigeon() {
// SETUP // Arrange
pigeon.setYaw(0); MockPigeonIMU pigeon = new MockPigeonIMU(DriveConstants.DRIVE_PIGEON_ID);
gyroPigeon = new RobotGyro(pigeon);
RobotTime robotTime = RobotTime.getInstance();
gyroPigeon.updatePigeonDeltas(); gyroPigeon.updatePigeonDeltas();
// TEST 1 // Act
robotTime.m_deltaTime = 5; robotTime.m_deltaTime = 5;
pigeon.setYaw(0); pigeon.setYaw(0);
gyroPigeon.updatePigeonDeltas(); gyroPigeon.updatePigeonDeltas();
// Assert
assertEquals(0, gyroPigeon.getRate(), 1); assertEquals(0, gyroPigeon.getRate(), 1);
// TEST 2 // Act
robotTime.m_deltaTime = 5; robotTime.m_deltaTime = 5;
pigeon.setYaw(90); pigeon.setYaw(90);
gyroPigeon.updatePigeonDeltas(); gyroPigeon.updatePigeonDeltas();
// Assert
assertEquals(18000, gyroPigeon.getRate(), 0.001); assertEquals(18000, gyroPigeon.getRate(), 0.001);
// TEST 3 // Act
robotTime.m_deltaTime = 5; robotTime.m_deltaTime = 5;
pigeon.setYaw(90); pigeon.setYaw(90);
gyroPigeon.updatePigeonDeltas(); gyroPigeon.updatePigeonDeltas();
// Assert
assertEquals(0, gyroPigeon.getRate(), 0.001); assertEquals(0, gyroPigeon.getRate(), 0.001);
// TEST 4 // Act
robotTime.m_deltaTime = 3; robotTime.m_deltaTime = 3;
pigeon.setYaw(-30); pigeon.setYaw(-30);
gyroPigeon.updatePigeonDeltas(); gyroPigeon.updatePigeonDeltas();
// Assert
assertEquals(-40000, gyroPigeon.getRate(), 0.001); assertEquals(-40000, gyroPigeon.getRate(), 0.001);
// TEST 5 // Act
robotTime.m_deltaTime = 6; robotTime.m_deltaTime = 6;
pigeon.setYaw(690); pigeon.setYaw(690);
gyroPigeon.updatePigeonDeltas(); gyroPigeon.updatePigeonDeltas();
// Assert
assertEquals(120000, gyroPigeon.getRate(), 0.001); assertEquals(120000, gyroPigeon.getRate(), 0.001);
} }
private void wait(int millis) {
try {
Thread.sleep(millis);
} catch (Exception e) {}
}
} }
@@ -8,10 +8,8 @@
package frc4388.utility; package frc4388.utility;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import org.junit.*;
import edu.wpi.first.wpilibj.*; import org.junit.*;
/** /**
* Add your docs here. * Add your docs here.
@@ -21,7 +19,7 @@ public class RobotTimeUtilityTest {
@Test @Test
public void testUpdateTimes() { public void testUpdateTimes() {
// SETUP // Arrange
long lastTime; long lastTime;
robotTime.m_deltaTime = 0; robotTime.m_deltaTime = 0;
robotTime.m_robotTime = 0; robotTime.m_robotTime = 0;
@@ -30,25 +28,29 @@ public class RobotTimeUtilityTest {
robotTime.endMatchTime(); robotTime.endMatchTime();
robotTime.m_lastMatchTime = 0; robotTime.m_lastMatchTime = 0;
// TEST 1 // Assert
assertEquals(0, robotTime.m_deltaTime); assertEquals(0, robotTime.m_deltaTime);
assertEquals(0, robotTime.m_robotTime); assertEquals(0, robotTime.m_robotTime);
assertEquals(0, robotTime.m_lastRobotTime); assertEquals(0, robotTime.m_lastRobotTime);
assertEquals(0, robotTime.m_frameNumber); assertEquals(0, robotTime.m_frameNumber);
lastTime = robotTime.m_robotTime; lastTime = robotTime.m_robotTime;
// TEST 2 // Act
wait(1); wait(1);
robotTime.updateTimes(); robotTime.updateTimes();
// Assert
assertEquals(true, robotTime.m_deltaTime > 0); assertEquals(true, robotTime.m_deltaTime > 0);
assertEquals(true, robotTime.m_robotTime > 0); assertEquals(true, robotTime.m_robotTime > 0);
assertEquals(lastTime, robotTime.m_lastRobotTime); assertEquals(lastTime, robotTime.m_lastRobotTime);
assertEquals(1, robotTime.m_frameNumber); assertEquals(1, robotTime.m_frameNumber);
lastTime = robotTime.m_robotTime; lastTime = robotTime.m_robotTime;
// TEST 3 // Act
wait(1); wait(1);
robotTime.updateTimes(); robotTime.updateTimes();
// Assert
assertEquals(true, robotTime.m_deltaTime > 0); assertEquals(true, robotTime.m_deltaTime > 0);
assertEquals(true, robotTime.m_robotTime > 0); assertEquals(true, robotTime.m_robotTime > 0);
assertEquals(lastTime, robotTime.m_lastRobotTime); assertEquals(lastTime, robotTime.m_lastRobotTime);
@@ -57,33 +59,39 @@ public class RobotTimeUtilityTest {
@Test @Test
public void testMatchTime() { public void testMatchTime() {
// SETUP // Arrange
long lastTime; long lastTime;
// TEST 1 // Assert
assertEquals(0, robotTime.m_matchTime); assertEquals(0, robotTime.m_matchTime);
assertEquals(0, robotTime.m_lastMatchTime); assertEquals(0, robotTime.m_lastMatchTime);
lastTime = robotTime.m_matchTime; lastTime = robotTime.m_matchTime;
// TEST 2 // Act
robotTime.startMatchTime(); robotTime.startMatchTime();
wait(1); wait(1);
robotTime.updateTimes(); robotTime.updateTimes();
// Assert
assertEquals(true, robotTime.m_matchTime > 0); assertEquals(true, robotTime.m_matchTime > 0);
assertEquals(lastTime, robotTime.m_lastMatchTime); assertEquals(lastTime, robotTime.m_lastMatchTime);
lastTime = robotTime.m_matchTime; lastTime = robotTime.m_matchTime;
// TEST 3 // Act
wait(1); wait(1);
robotTime.updateTimes(); robotTime.updateTimes();
robotTime.endMatchTime(); robotTime.endMatchTime();
// Assert
assertEquals(0, robotTime.m_matchTime); assertEquals(0, robotTime.m_matchTime);
assertEquals(lastTime, robotTime.m_lastMatchTime); assertEquals(lastTime, robotTime.m_lastMatchTime);
lastTime = robotTime.m_matchTime; lastTime = robotTime.m_matchTime;
// TEST 4 // Act
wait(1); wait(1);
robotTime.updateTimes(); robotTime.updateTimes();
// Assert
assertEquals(0, robotTime.m_matchTime); assertEquals(0, robotTime.m_matchTime);
assertEquals(lastTime, robotTime.m_lastMatchTime); assertEquals(lastTime, robotTime.m_lastMatchTime);
} }
+31
View File
@@ -0,0 +1,31 @@
/**
* This file is a configuration file generated by the `Template` extension on `vscode`
* @see https://marketplace.visualstudio.com/items?itemName=yongwoo.template
*/
module.exports = {
// You can change the template path to another path
templateRootPath: "./.templates",
// After copying the template file the `replaceFileTextFn` function is executed
replaceFileTextFn: (fileText, templateName, utils) => {
// @see https://www.npmjs.com/package/change-case
const { changeCase } = utils;
// You can change the text in the file
return fileText
.replace(/__templateName__/gm, templateName)
.replace(
/__templateNameToPascalCase__/gm,
changeCase.pascalCase(templateName)
)
.replace(
/__templateNameToParamCase__/gm,
changeCase.paramCase(templateName)
);
},
replaceFileNameFn: (fileName, templateName, utils) => {
const { path } = utils;
// @see https://nodejs.org/api/path.html#path_path_parse_path
const { base } = path.parse(fileName);
// You can change the file name
return base;
}
};