From 3ad521ea9b9386870f89c8955f8680a125386797 Mon Sep 17 00:00:00 2001 From: "Keenan D. Buckley" Date: Sat, 11 Apr 2020 11:50:13 -0600 Subject: [PATCH 1/7] Add Templates Extension --- .templates/.editorconfig | 21 +++++++++++++ .templates/.gitignore | 29 +++++++++++++++++ .../template-sample-react-component/index.jsx | 12 +++++++ .../index.scss | 3 ++ .templates/template-sample/index.js | 5 +++ template.config.js | 31 +++++++++++++++++++ 6 files changed, 101 insertions(+) create mode 100644 .templates/.editorconfig create mode 100644 .templates/.gitignore create mode 100644 .templates/template-sample-react-component/index.jsx create mode 100644 .templates/template-sample-react-component/index.scss create mode 100644 .templates/template-sample/index.js create mode 100644 template.config.js diff --git a/.templates/.editorconfig b/.templates/.editorconfig new file mode 100644 index 0000000..689fb50 --- /dev/null +++ b/.templates/.editorconfig @@ -0,0 +1,21 @@ +# @see https://editorconfig-specification.readthedocs.io/en/latest/ + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +charset = utf-8 + +# 4 space indentation +[*.py] +indent_style = space +indent_size = 4 + +# Tab indentation (no size specified) +[Makefile] +indent_style = tab diff --git a/.templates/.gitignore b/.templates/.gitignore new file mode 100644 index 0000000..e748d61 --- /dev/null +++ b/.templates/.gitignore @@ -0,0 +1,29 @@ +# @see https://git-scm.com/docs/gitignore + +# `.DS_Store` is a file that stores custom attributes of its containing folder +.DS_Store + +# Logs +logs +*.log + +# Dependencies +node_modules +bower_components +vendor + +# Caches +.cache +.npm +.eslintcache + +# Temporaries +.tmp +.temp + +# Built +dist +target +built +output +out diff --git a/.templates/template-sample-react-component/index.jsx b/.templates/template-sample-react-component/index.jsx new file mode 100644 index 0000000..d52bbc7 --- /dev/null +++ b/.templates/template-sample-react-component/index.jsx @@ -0,0 +1,12 @@ +import React from "react"; +import classNames from "classnames/bind"; + +import styles from "./index.scss"; + +const cx = classNames.bind(styles); + +function __templateNameToPascalCase__() { + return
Hello :)
; +} + +export default __templateNameToPascalCase__; diff --git a/.templates/template-sample-react-component/index.scss b/.templates/template-sample-react-component/index.scss new file mode 100644 index 0000000..c2488a6 --- /dev/null +++ b/.templates/template-sample-react-component/index.scss @@ -0,0 +1,3 @@ +.__templateNameToParamCase__ { + display: inline-block; +} diff --git a/.templates/template-sample/index.js b/.templates/template-sample/index.js new file mode 100644 index 0000000..0c0ef38 --- /dev/null +++ b/.templates/template-sample/index.js @@ -0,0 +1,5 @@ +export default function __templateNameToPascalCase__() { + console.log("TemplateName -> __templateName__"); + console.log("TemplateName to ParamCase -> __templateNameToParamCase__"); + console.log("TemplateName to PascalCase -> __templateNameToPascalCase__"); +} diff --git a/template.config.js b/template.config.js new file mode 100644 index 0000000..54f2425 --- /dev/null +++ b/template.config.js @@ -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; + } +}; From 8b081c894282f48ac429bdd161b60e829ae852ba Mon Sep 17 00:00:00 2001 From: "Keenan D. Buckley" Date: Sat, 11 Apr 2020 12:39:53 -0600 Subject: [PATCH 2/7] Add UtilityTest Template --- .templates/.editorconfig | 21 --------- .templates/.gitignore | 29 ------------ .templates/UtilityTest.java | 47 +++++++++++++++++++ .../template-sample-react-component/index.jsx | 12 ----- .../index.scss | 3 -- .templates/template-sample/index.js | 5 -- 6 files changed, 47 insertions(+), 70 deletions(-) delete mode 100644 .templates/.editorconfig delete mode 100644 .templates/.gitignore create mode 100644 .templates/UtilityTest.java delete mode 100644 .templates/template-sample-react-component/index.jsx delete mode 100644 .templates/template-sample-react-component/index.scss delete mode 100644 .templates/template-sample/index.js diff --git a/.templates/.editorconfig b/.templates/.editorconfig deleted file mode 100644 index 689fb50..0000000 --- a/.templates/.editorconfig +++ /dev/null @@ -1,21 +0,0 @@ -# @see https://editorconfig-specification.readthedocs.io/en/latest/ - -# top-most EditorConfig file -root = true - -# Unix-style newlines with a newline ending every file -[*] -end_of_line = lf -insert_final_newline = true -indent_style = space -indent_size = 2 -charset = utf-8 - -# 4 space indentation -[*.py] -indent_style = space -indent_size = 4 - -# Tab indentation (no size specified) -[Makefile] -indent_style = tab diff --git a/.templates/.gitignore b/.templates/.gitignore deleted file mode 100644 index e748d61..0000000 --- a/.templates/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -# @see https://git-scm.com/docs/gitignore - -# `.DS_Store` is a file that stores custom attributes of its containing folder -.DS_Store - -# Logs -logs -*.log - -# Dependencies -node_modules -bower_components -vendor - -# Caches -.cache -.npm -.eslintcache - -# Temporaries -.tmp -.temp - -# Built -dist -target -built -output -out diff --git a/.templates/UtilityTest.java b/.templates/UtilityTest.java new file mode 100644 index 0000000..7dd40d0 --- /dev/null +++ b/.templates/UtilityTest.java @@ -0,0 +1,47 @@ +/*----------------------------------------------------------------------------*/ +/* 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 org.junit.*; + +import edu.wpi.first.wpilibj.*; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +/** + * Add your docs here. + */ +public class UtilityTest { + @Test + public void testExample() { + // Arrange + boolean isFalse = false; + int i = 0; + double d = 0.0; + + // Act + wait(1); + isFalse = !isFalse; + i++; + d -= Math.PI; + + // Assert + assertEquals(1, i); + assertEquals(-Math.PI, d, 0.001); + assertEquals(true, isFalse); + } + + private void wait(int millis) { + try { + Thread.sleep(millis); + } catch (Exception e) {} + } +} diff --git a/.templates/template-sample-react-component/index.jsx b/.templates/template-sample-react-component/index.jsx deleted file mode 100644 index d52bbc7..0000000 --- a/.templates/template-sample-react-component/index.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from "react"; -import classNames from "classnames/bind"; - -import styles from "./index.scss"; - -const cx = classNames.bind(styles); - -function __templateNameToPascalCase__() { - return
Hello :)
; -} - -export default __templateNameToPascalCase__; diff --git a/.templates/template-sample-react-component/index.scss b/.templates/template-sample-react-component/index.scss deleted file mode 100644 index c2488a6..0000000 --- a/.templates/template-sample-react-component/index.scss +++ /dev/null @@ -1,3 +0,0 @@ -.__templateNameToParamCase__ { - display: inline-block; -} diff --git a/.templates/template-sample/index.js b/.templates/template-sample/index.js deleted file mode 100644 index 0c0ef38..0000000 --- a/.templates/template-sample/index.js +++ /dev/null @@ -1,5 +0,0 @@ -export default function __templateNameToPascalCase__() { - console.log("TemplateName -> __templateName__"); - console.log("TemplateName to ParamCase -> __templateNameToParamCase__"); - console.log("TemplateName to PascalCase -> __templateNameToPascalCase__"); -} From 2e8b5b54707b0a70d0e2a95cb58e37331f0f1dee Mon Sep 17 00:00:00 2001 From: "Keenan D. Buckley" Date: Sat, 11 Apr 2020 12:43:42 -0600 Subject: [PATCH 3/7] Add Subsystem Test Template --- .templates/SubsystemTest.java | 65 +++++++++++++++++++ .../robot/subsystems/LEDSubsystemTest.java | 36 ++++++++-- 2 files changed, 94 insertions(+), 7 deletions(-) create mode 100644 .templates/SubsystemTest.java diff --git a/.templates/SubsystemTest.java b/.templates/SubsystemTest.java new file mode 100644 index 0000000..a138c61 --- /dev/null +++ b/.templates/SubsystemTest.java @@ -0,0 +1,65 @@ +/*----------------------------------------------------------------------------*/ +/* 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 org.junit.*; + +import edu.wpi.first.wpilibj.*; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +/** + * Add your docs here. + */ +public class UtilityTest { + @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); + } + + private void wait(int millis) { + try { + Thread.sleep(millis); + } catch (Exception e) {} + } +} diff --git a/src/test/java/frc4388/robot/subsystems/LEDSubsystemTest.java b/src/test/java/frc4388/robot/subsystems/LEDSubsystemTest.java index 3852edb..b1dd630 100644 --- a/src/test/java/frc4388/robot/subsystems/LEDSubsystemTest.java +++ b/src/test/java/frc4388/robot/subsystems/LEDSubsystemTest.java @@ -18,24 +18,46 @@ import frc4388.utility.LEDPatterns; * Add your docs here. */ public class LEDSubsystemTest { - Spark ledController = mock(Spark.class); - LED led = new LED(ledController); + @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() { - // TEST 1 - assertEquals(LEDConstants.DEFAULT_PATTERN.getValue(), led.getPattern().getValue(), 0.0001); + // Arrange + Spark ledController = mock(Spark.class); + LED led = new LED(ledController); - // TEST 2 + // Act led.setPattern(LEDPatterns.RAINBOW_RAINBOW); + + // Assert assertEquals(LEDPatterns.RAINBOW_RAINBOW.getValue(), led.getPattern().getValue(), 0.0001); - // TEST 3 + // Act led.setPattern(LEDPatterns.BLUE_BREATH); + + // Assert assertEquals(LEDPatterns.BLUE_BREATH.getValue(), led.getPattern().getValue(), 0.0001); - // TEST 4 + // Act led.setPattern(LEDPatterns.SOLID_BLACK); + + // Assert assertEquals(LEDPatterns.SOLID_BLACK.getValue(), led.getPattern().getValue(), 0.0001); } + + private void wait(int millis) { + try { + Thread.sleep(millis); + } catch (Exception e) {} + } } From af0966884303d84ab518a194b48bae86cc6f89c0 Mon Sep 17 00:00:00 2001 From: "Keenan D. Buckley" Date: Sat, 11 Apr 2020 12:58:28 -0600 Subject: [PATCH 4/7] Restructure RobotGyroUtilityTest to be more modular --- .../frc4388/utility/RobotGyroUtilityTest.java | 96 +++++++++++++------ 1 file changed, 67 insertions(+), 29 deletions(-) diff --git a/src/test/java/frc4388/utility/RobotGyroUtilityTest.java b/src/test/java/frc4388/utility/RobotGyroUtilityTest.java index 7b5d5bb..b5957b6 100644 --- a/src/test/java/frc4388/utility/RobotGyroUtilityTest.java +++ b/src/test/java/frc4388/utility/RobotGyroUtilityTest.java @@ -23,30 +23,36 @@ import frc4388.utility.RobotGyro; * Add your docs here. */ 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 @Test - public void testConfig() { - // TEST 1 + public void testConstructor() { + // Arrange + MockPigeonIMU pigeon = new MockPigeonIMU(DriveConstants.DRIVE_PIGEON_ID); + AHRS navX = mock(AHRS.class); + + // Act + RobotGyro gyroPigeon = new RobotGyro(pigeon); + RobotGyro gyroNavX = new RobotGyro(navX); + + // Assert 1 assertEquals(true, gyroPigeon.m_isGyroAPigeon); assertEquals(pigeon, gyroPigeon.getPigeon()); assertEquals(null, gyroPigeon.getNavX()); - // TEST 2 + // Assert 2 assertEquals(false, gyroNavX.m_isGyroAPigeon); assertEquals(navX, gyroNavX.getNavX()); assertEquals(null, gyroNavX.getPigeon()); } @Test - public void testHeading() { - // TESTS + public void testHeadingPigeon() { + // Arrange + MockPigeonIMU pigeon = new MockPigeonIMU(DriveConstants.DRIVE_PIGEON_ID); + RobotGyro 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); @@ -59,91 +65,123 @@ public class RobotGyroUtilityTest { } @Test - public void testYawPitchRoll() { - // TEST 1 + public void testYawPitchRollPigeon() { + // Arrange + MockPigeonIMU pigeon = new MockPigeonIMU(DriveConstants.DRIVE_PIGEON_ID); + RobotGyro gyroPigeon = new RobotGyro(pigeon); + + // Assert assertEquals(0, gyroPigeon.getAngle(), 0.0001); - // TEST 2 + // Act pigeon.setYaw(40); + + // Assert assertEquals(40, gyroPigeon.getAngle(), 0.0001); - // TEST 3 + // Act gyroPigeon.reset(); + + // Assert assertEquals(0, gyroPigeon.getAngle(), 0.0001); - // TEST 4 + // Act pigeon.setYaw(-1457); pigeon.setCurrentPitch(100); pigeon.setCurrentRoll(100); + + // Assert assertEquals(-1457, gyroPigeon.getAngle(), 0.0001); assertEquals(90, gyroPigeon.getPitch(), 0.0001); assertEquals(90, gyroPigeon.getRoll(), 0.0001); - // TEST 5 + // Act pigeon.setCurrentPitch(45); pigeon.setCurrentRoll(45); + + // Assert assertEquals(45, gyroPigeon.getPitch(), 0.0001); assertEquals(45, gyroPigeon.getRoll(), 0.0001); - // TEST 6 + // Act pigeon.setCurrentPitch(0); pigeon.setCurrentRoll(0); + + // Assert assertEquals(0, gyroPigeon.getPitch(), 0.0001); assertEquals(0, gyroPigeon.getRoll(), 0.0001); - // TEST 7 + // Act pigeon.setCurrentPitch(-60); pigeon.setCurrentRoll(-60); + + // Assert assertEquals(-60, gyroPigeon.getPitch(), 0.0001); assertEquals(-60, gyroPigeon.getRoll(), 0.0001); - // TEST 8 + // Act pigeon.setCurrentPitch(-90); pigeon.setCurrentRoll(-90); + + // Assert assertEquals(-90, gyroPigeon.getPitch(), 0.0001); assertEquals(-90, gyroPigeon.getRoll(), 0.0001); - // TEST 9 + // Act pigeon.setCurrentPitch(-100); pigeon.setCurrentRoll(-100); + + // Assert assertEquals(-90, gyroPigeon.getPitch(), 0.0001); assertEquals(-90, gyroPigeon.getRoll(), 0.0001); } @Test - public void testRates() { - // SETUP - pigeon.setYaw(0); + public void testRatesPigeon() { + // Arrange + MockPigeonIMU pigeon = new MockPigeonIMU(DriveConstants.DRIVE_PIGEON_ID); + RobotGyro gyroPigeon = new RobotGyro(pigeon); + RobotTime robotTime = RobotTime.getInstance(); gyroPigeon.updatePigeonDeltas(); - // TEST 1 + // Act robotTime.m_deltaTime = 5; pigeon.setYaw(0); gyroPigeon.updatePigeonDeltas(); + + // Assert assertEquals(0, gyroPigeon.getRate(), 1); - // TEST 2 + // Act robotTime.m_deltaTime = 5; pigeon.setYaw(90); gyroPigeon.updatePigeonDeltas(); + + // Assert assertEquals(18000, gyroPigeon.getRate(), 0.001); - // TEST 3 + // Act robotTime.m_deltaTime = 5; pigeon.setYaw(90); gyroPigeon.updatePigeonDeltas(); + + // Assert assertEquals(0, gyroPigeon.getRate(), 0.001); - // TEST 4 + // Act robotTime.m_deltaTime = 3; pigeon.setYaw(-30); gyroPigeon.updatePigeonDeltas(); + + // Assert assertEquals(-40000, gyroPigeon.getRate(), 0.001); - // TEST 5 + // Act robotTime.m_deltaTime = 6; pigeon.setYaw(690); gyroPigeon.updatePigeonDeltas(); + + // Assert assertEquals(120000, gyroPigeon.getRate(), 0.001); } From fc82caf124898d31143d4c07f4cb4f34f3f2edac Mon Sep 17 00:00:00 2001 From: "Keenan D. Buckley" Date: Sat, 11 Apr 2020 13:07:05 -0600 Subject: [PATCH 5/7] Extract RobotGyros to Prevent Resource Leak --- .../frc4388/utility/RobotGyroUtilityTest.java | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/test/java/frc4388/utility/RobotGyroUtilityTest.java b/src/test/java/frc4388/utility/RobotGyroUtilityTest.java index b5957b6..f7bbe67 100644 --- a/src/test/java/frc4388/utility/RobotGyroUtilityTest.java +++ b/src/test/java/frc4388/utility/RobotGyroUtilityTest.java @@ -25,22 +25,21 @@ import frc4388.utility.RobotGyro; public class RobotGyroUtilityTest { // TODO UNTESTED: most functions for NavX + 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); - // Act - RobotGyro gyroPigeon = new RobotGyro(pigeon); - RobotGyro gyroNavX = new RobotGyro(navX); - - // Assert 1 + // Assert assertEquals(true, gyroPigeon.m_isGyroAPigeon); assertEquals(pigeon, gyroPigeon.getPigeon()); assertEquals(null, gyroPigeon.getNavX()); - - // Assert 2 assertEquals(false, gyroNavX.m_isGyroAPigeon); assertEquals(navX, gyroNavX.getNavX()); assertEquals(null, gyroNavX.getPigeon()); @@ -50,7 +49,7 @@ public class RobotGyroUtilityTest { public void testHeadingPigeon() { // Arrange MockPigeonIMU pigeon = new MockPigeonIMU(DriveConstants.DRIVE_PIGEON_ID); - RobotGyro gyroPigeon = new RobotGyro(pigeon); + gyroPigeon = new RobotGyro(pigeon); // Act & Assert assertEquals(-90, gyroPigeon.getHeading(270), 0.0001); @@ -68,7 +67,7 @@ public class RobotGyroUtilityTest { public void testYawPitchRollPigeon() { // Arrange MockPigeonIMU pigeon = new MockPigeonIMU(DriveConstants.DRIVE_PIGEON_ID); - RobotGyro gyroPigeon = new RobotGyro(pigeon); + gyroPigeon = new RobotGyro(pigeon); // Assert assertEquals(0, gyroPigeon.getAngle(), 0.0001); @@ -140,7 +139,7 @@ public class RobotGyroUtilityTest { public void testRatesPigeon() { // Arrange MockPigeonIMU pigeon = new MockPigeonIMU(DriveConstants.DRIVE_PIGEON_ID); - RobotGyro gyroPigeon = new RobotGyro(pigeon); + gyroPigeon = new RobotGyro(pigeon); RobotTime robotTime = RobotTime.getInstance(); gyroPigeon.updatePigeonDeltas(); @@ -184,10 +183,4 @@ public class RobotGyroUtilityTest { // Assert assertEquals(120000, gyroPigeon.getRate(), 0.001); } - - private void wait(int millis) { - try { - Thread.sleep(millis); - } catch (Exception e) {} - } } From 63c6d3dea0045bcd65364dcf65ef3dffe582c630 Mon Sep 17 00:00:00 2001 From: "Keenan D. Buckley" Date: Sat, 11 Apr 2020 13:18:40 -0600 Subject: [PATCH 6/7] Cleanup code and improve Templates --- .templates/SubsystemTest.java | 20 +++---- .templates/UtilityTest.java | 60 ++++++++++++------- .../robot/subsystems/LEDSubsystemTest.java | 14 ++--- .../frc4388/utility/RobotGyroUtilityTest.java | 6 +- .../frc4388/utility/RobotTimeUtilityTest.java | 32 ++++++---- 5 files changed, 71 insertions(+), 61 deletions(-) diff --git a/.templates/SubsystemTest.java b/.templates/SubsystemTest.java index a138c61..51f30d5 100644 --- a/.templates/SubsystemTest.java +++ b/.templates/SubsystemTest.java @@ -5,21 +5,21 @@ /* the project. */ /*----------------------------------------------------------------------------*/ -package frc4388.utility; +package frc4388.robot.subsystems; import static org.junit.Assert.*; import static org.mockito.Mockito.*; + import org.junit.*; -import edu.wpi.first.wpilibj.*; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; +import edu.wpi.first.wpilibj.Spark; +import frc4388.robot.Constants.LEDConstants; +import frc4388.utility.LEDPatterns; /** - * Add your docs here. + * Based off the LEDSubsystemTest class */ -public class UtilityTest { +public class SubsystemTest { @Test public void testConstructor() { // Arrange @@ -56,10 +56,4 @@ public class UtilityTest { // Assert assertEquals(LEDPatterns.SOLID_BLACK.getValue(), led.getPattern().getValue(), 0.0001); } - - private void wait(int millis) { - try { - Thread.sleep(millis); - } catch (Exception e) {} - } } diff --git a/.templates/UtilityTest.java b/.templates/UtilityTest.java index 7dd40d0..11c15cd 100644 --- a/.templates/UtilityTest.java +++ b/.templates/UtilityTest.java @@ -9,39 +9,53 @@ package frc4388.utility; import static org.junit.Assert.*; import static org.mockito.Mockito.*; + +import com.kauailabs.navx.frc.AHRS; + import org.junit.*; -import edu.wpi.first.wpilibj.*; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; +import frc4388.mocks.MockPigeonIMU; +import frc4388.robot.Constants.DriveConstants; /** - * Add your docs here. + * Based on the RobotGyroUtilityTest class */ public class UtilityTest { - @Test - public void testExample() { - // Arrange - boolean isFalse = false; - int i = 0; - double d = 0.0; + private RobotGyro gyroPigeon; + private RobotGyro gyroNavX; - // Act - wait(1); - isFalse = !isFalse; - i++; - d -= Math.PI; + @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(1, i); - assertEquals(-Math.PI, d, 0.001); - assertEquals(true, isFalse); + 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()); } - private void wait(int millis) { - try { - Thread.sleep(millis); - } catch (Exception e) {} + @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); } } diff --git a/src/test/java/frc4388/robot/subsystems/LEDSubsystemTest.java b/src/test/java/frc4388/robot/subsystems/LEDSubsystemTest.java index b1dd630..8fcbf53 100644 --- a/src/test/java/frc4388/robot/subsystems/LEDSubsystemTest.java +++ b/src/test/java/frc4388/robot/subsystems/LEDSubsystemTest.java @@ -7,9 +7,11 @@ package frc4388.robot.subsystems; -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; -import org.junit.*; +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; + +import org.junit.Test; + import edu.wpi.first.wpilibj.*; import frc4388.robot.Constants.LEDConstants; import frc4388.utility.LEDPatterns; @@ -54,10 +56,4 @@ public class LEDSubsystemTest { // Assert assertEquals(LEDPatterns.SOLID_BLACK.getValue(), led.getPattern().getValue(), 0.0001); } - - private void wait(int millis) { - try { - Thread.sleep(millis); - } catch (Exception e) {} - } } diff --git a/src/test/java/frc4388/utility/RobotGyroUtilityTest.java b/src/test/java/frc4388/utility/RobotGyroUtilityTest.java index f7bbe67..8c0b1e5 100644 --- a/src/test/java/frc4388/utility/RobotGyroUtilityTest.java +++ b/src/test/java/frc4388/utility/RobotGyroUtilityTest.java @@ -9,15 +9,13 @@ package frc4388.utility; import static org.junit.Assert.*; 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 org.junit.*; + import frc4388.mocks.MockPigeonIMU; import frc4388.robot.Constants.DriveConstants; -import frc4388.utility.RobotGyro; /** * Add your docs here. diff --git a/src/test/java/frc4388/utility/RobotTimeUtilityTest.java b/src/test/java/frc4388/utility/RobotTimeUtilityTest.java index c520321..2c31a34 100644 --- a/src/test/java/frc4388/utility/RobotTimeUtilityTest.java +++ b/src/test/java/frc4388/utility/RobotTimeUtilityTest.java @@ -8,10 +8,8 @@ package frc4388.utility; 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. @@ -21,7 +19,7 @@ public class RobotTimeUtilityTest { @Test public void testUpdateTimes() { - // SETUP + // Arrange long lastTime; robotTime.m_deltaTime = 0; robotTime.m_robotTime = 0; @@ -30,25 +28,29 @@ public class RobotTimeUtilityTest { robotTime.endMatchTime(); robotTime.m_lastMatchTime = 0; - // TEST 1 + // Assert assertEquals(0, robotTime.m_deltaTime); assertEquals(0, robotTime.m_robotTime); assertEquals(0, robotTime.m_lastRobotTime); assertEquals(0, robotTime.m_frameNumber); lastTime = robotTime.m_robotTime; - // TEST 2 + // Act wait(1); robotTime.updateTimes(); + + // Assert assertEquals(true, robotTime.m_deltaTime > 0); assertEquals(true, robotTime.m_robotTime > 0); assertEquals(lastTime, robotTime.m_lastRobotTime); assertEquals(1, robotTime.m_frameNumber); lastTime = robotTime.m_robotTime; - // TEST 3 + // Act wait(1); robotTime.updateTimes(); + + // Assert assertEquals(true, robotTime.m_deltaTime > 0); assertEquals(true, robotTime.m_robotTime > 0); assertEquals(lastTime, robotTime.m_lastRobotTime); @@ -57,33 +59,39 @@ public class RobotTimeUtilityTest { @Test public void testMatchTime() { - // SETUP + // Arrange long lastTime; - // TEST 1 + // Assert assertEquals(0, robotTime.m_matchTime); assertEquals(0, robotTime.m_lastMatchTime); lastTime = robotTime.m_matchTime; - // TEST 2 + // Act robotTime.startMatchTime(); wait(1); robotTime.updateTimes(); + + // Assert assertEquals(true, robotTime.m_matchTime > 0); assertEquals(lastTime, robotTime.m_lastMatchTime); lastTime = robotTime.m_matchTime; - // TEST 3 + // Act wait(1); robotTime.updateTimes(); robotTime.endMatchTime(); + + // Assert assertEquals(0, robotTime.m_matchTime); assertEquals(lastTime, robotTime.m_lastMatchTime); lastTime = robotTime.m_matchTime; - // TEST 4 + // Act wait(1); robotTime.updateTimes(); + + // Assert assertEquals(0, robotTime.m_matchTime); assertEquals(lastTime, robotTime.m_lastMatchTime); } From 5471e12403e4622eb5e09e0cdb7922043c257a5c Mon Sep 17 00:00:00 2001 From: "Keenan D. Buckley" Date: Sat, 11 Apr 2020 14:02:37 -0600 Subject: [PATCH 7/7] Add CommandTest Template (Broken) --- .templates/CommandTest.java | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 .templates/CommandTest.java diff --git a/.templates/CommandTest.java b/.templates/CommandTest.java new file mode 100644 index 0000000..72b31df --- /dev/null +++ b/.templates/CommandTest.java @@ -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); + } +}