package com.shootoff.config; import static org.junit.Assert.*; import java.io.File; import java.io.IOException; import javafx.scene.paint.Color; import org.junit.Before; import org.junit.Test; public class TestConfiguration { Configuration defaultConfig; @Before public void setUp() throws ConfigurationException, IOException { // This is required because testWriteConfigFile loads a // configuration file after writing it, which causes // cameras to be enumerated then opened with OpenCV nu.pattern.OpenCV.loadShared(); System.setProperty("shootoff.home", System.getProperty("user.dir")); String[] emptyArgs = new String[0]; defaultConfig = new Configuration(emptyArgs); } @Test public void testConfirmDefaults() { assertFalse(defaultConfig.isFirstRun()); assertTrue(defaultConfig.useErrorReporting()); assertEquals(0, defaultConfig.getWebcams().size()); assertEquals(4, defaultConfig.getMarkerRadius()); assertEquals(false, defaultConfig.ignoreLaserColor()); assertEquals("None", defaultConfig.getIgnoreLaserColorName()); assertEquals(false, defaultConfig.useRedLaserSound()); assertEquals(System.getProperty("user.dir") + File.separator + "sounds" + File.separator + "walther_ppq.wav", defaultConfig.getRedLaserSound().getPath()); assertEquals(false, defaultConfig.useGreenLaserSound()); assertEquals(System.getProperty("user.dir") + File.separator + "sounds" + File.separator + "walther_ppq.wav", defaultConfig.getGreenLaserSound().getPath()); assertEquals(false, defaultConfig.useVirtualMagazine()); assertEquals(7, defaultConfig.getVirtualMagazineCapacity()); assertEquals(false, defaultConfig.useMalfunctions()); assertTrue(defaultConfig.getMalfunctionsProbability() == 10.0); assertEquals(false, defaultConfig.inDebugMode()); assertFalse(defaultConfig.getArenaPosition().isPresent()); assertFalse(defaultConfig.isChimeMuted("Rare and worth hearing")); } @Test(expected = ConfigurationException.class) public void testMarkerRadiusBelowRange() throws ConfigurationException { defaultConfig.setMarkerRadius(0); defaultConfig.validateConfiguration(); } @Test(expected = ConfigurationException.class) public void testMarkerRadiusAboveRange() throws ConfigurationException { defaultConfig.setMarkerRadius(21); defaultConfig.validateConfiguration(); } @Test public void testMarkerRadiusInRange() { try { defaultConfig.setMarkerRadius(1); defaultConfig.validateConfiguration(); defaultConfig.setMarkerRadius(10); defaultConfig.validateConfiguration(); defaultConfig.setMarkerRadius(20); defaultConfig.validateConfiguration(); } catch (ConfigurationException e) { fail("Marker radius values are in range but got ConfigurationException"); } } @Test(expected = ConfigurationException.class) public void testIgnoreLaserColorInvalid() throws ConfigurationException { defaultConfig.setIgnoreLaserColor(true); defaultConfig.setIgnoreLaserColorName("purple"); defaultConfig.validateConfiguration(); } @Test public void testIgnoreLaserColorValid() { try { defaultConfig.setIgnoreLaserColor(true); defaultConfig.setIgnoreLaserColorName("red"); defaultConfig.validateConfiguration(); assertEquals(Color.RED, defaultConfig.getIgnoreLaserColor().get()); defaultConfig.setIgnoreLaserColorName("green"); defaultConfig.validateConfiguration(); assertEquals(Color.GREEN, defaultConfig.getIgnoreLaserColor().get()); } catch (ConfigurationException e) { fail("Ignore laser color values are correct but got ConfigurationException"); } } @Test(expected = ConfigurationException.class) public void testRedLaserSoundInvalid() throws ConfigurationException { defaultConfig.setUseRedLaserSound(true); defaultConfig.setRedLaserSound(new File("sounds/some_crazy_sound.wav")); defaultConfig.validateConfiguration(); } @Test public void testRedLaserSoundValid() { try { defaultConfig.setUseRedLaserSound(true); defaultConfig.setRedLaserSound(new File("sounds/walther_ppq.wav")); defaultConfig.validateConfiguration(); } catch (ConfigurationException e) { fail("Red laser sound values are correct but got ConfigurationException"); } } @Test(expected = ConfigurationException.class) public void testGreenLaserSoundInvalid() throws ConfigurationException { defaultConfig.setUseGreenLaserSound(true); defaultConfig.setGreenLaserSound(new File("sounds/some_crazy_sound.wav")); defaultConfig.validateConfiguration(); } @Test public void testGreenLaserSoundValid() { try { defaultConfig.setUseGreenLaserSound(true); defaultConfig.setGreenLaserSound(new File("sounds/walther_ppq.wav")); defaultConfig.validateConfiguration(); } catch (ConfigurationException e) { fail("Red laser sound values are correct but got ConfigurationException"); } } @Test(expected = ConfigurationException.class) public void testVirtualMagazineCapacityBelowRange() throws ConfigurationException { defaultConfig.setVirtualMagazineCapacity(0); defaultConfig.validateConfiguration(); } @Test(expected = ConfigurationException.class) public void testVirtualMagazineCapacityAboveRange() throws ConfigurationException { defaultConfig.setVirtualMagazineCapacity(46); defaultConfig.validateConfiguration(); } @Test public void testVirtualMagazineCapacityInRange() { try { defaultConfig.setVirtualMagazineCapacity(1); defaultConfig.validateConfiguration(); defaultConfig.setVirtualMagazineCapacity(10); defaultConfig.validateConfiguration(); defaultConfig.setVirtualMagazineCapacity(45); defaultConfig.validateConfiguration(); } catch (ConfigurationException e) { fail("Virtual magazine values are in range but got ConfigurationException"); } } @Test(expected = ConfigurationException.class) public void testMalfunctionsProbabilityBelowRange() throws ConfigurationException { defaultConfig.setMalfunctionsProbability((float) 0.09); defaultConfig.validateConfiguration(); } @Test(expected = ConfigurationException.class) public void testMalfunctionsProbabilityAboveRange() throws ConfigurationException { defaultConfig.setMalfunctionsProbability((float) 99.91); defaultConfig.validateConfiguration(); } @Test public void testMalfunctionsProbabilityInRange() { try { defaultConfig.setMalfunctionsProbability((float) 0.1); defaultConfig.validateConfiguration(); defaultConfig.setMalfunctionsProbability((float) 50.5); defaultConfig.validateConfiguration(); defaultConfig.setMalfunctionsProbability((float) 99.9); defaultConfig.validateConfiguration(); } catch (ConfigurationException e) { fail("Malfunction probability values are in range but got ConfigurationException"); } } @Test public void testReadConfigFile() throws IOException, ConfigurationException { Configuration config = new Configuration(TestConfiguration.class.getResourceAsStream("/test.properties"), "test.properties"); assertTrue(config.isFirstRun()); assertFalse(config.useErrorReporting()); assertEquals(4, config.getMarkerRadius()); assertEquals(true, config.ignoreLaserColor()); assertEquals("green", config.getIgnoreLaserColorName()); assertEquals(true, config.useRedLaserSound()); assertEquals(System.getProperty("user.dir") + File.separator + "sounds" + File.separator + "steel_sound_1.wav", config.getRedLaserSound().getPath()); assertEquals(false, config.useGreenLaserSound()); assertEquals(System.getProperty("user.dir") + File.separator + "sounds" + File.separator + "beep.wav", config.getGreenLaserSound().getPath()); assertEquals(true, config.useVirtualMagazine()); assertEquals(25, config.getVirtualMagazineCapacity()); assertEquals(true, config.useMalfunctions()); assertEquals(43.15f, config.getMalfunctionsProbability(), 0.5); assertEquals(false, config.inDebugMode()); assertTrue(config.getArenaPosition().isPresent()); assertEquals(10, config.getArenaPosition().get().getX(), 0.1); assertEquals(200, config.getArenaPosition().get().getY(), 0.1); assertTrue(config.isChimeMuted("Test message1")); assertTrue(config.isChimeMuted("annoying message2")); assertFalse(config.isChimeMuted("Rare and worth hearing")); assertTrue(config.getCameraDistance("Camera1").isPresent()); assertEquals(100, config.getCameraDistance("Camera1").get().intValue()); assertTrue(config.getCameraDistance("Camera 2 Name").isPresent()); assertEquals(13, config.getCameraDistance("Camera 2 Name").get().intValue()); assertFalse(config.getCameraDistance("Unheard of Camera").isPresent()); } @Test public void testReadConfigFileCmdLineOverride() throws IOException, ConfigurationException { Configuration config = new Configuration(TestConfiguration.class.getResourceAsStream("/test.properties"), "test.properties", new String[] { "-m", "6" }); assertEquals(6, config.getMarkerRadius()); assertEquals(true, config.ignoreLaserColor()); assertEquals("green", config.getIgnoreLaserColorName()); assertEquals(true, config.useVirtualMagazine()); assertEquals(25, config.getVirtualMagazineCapacity()); assertEquals(true, config.useMalfunctions()); assertEquals(43.15f, config.getMalfunctionsProbability(), 0.5); assertEquals(false, config.inDebugMode()); } @Test public void testReadCmdLineShort() throws IOException, ConfigurationException { Configuration config = new Configuration( new String[] { "-d", "-m", "4", "-c", "green", "-u", "25", "-f", "43.15" }); assertFalse(config.isFirstRun()); assertEquals(4, config.getMarkerRadius()); assertEquals(true, config.ignoreLaserColor()); assertEquals("green", config.getIgnoreLaserColorName()); assertEquals(true, config.useVirtualMagazine()); assertEquals(25, config.getVirtualMagazineCapacity()); assertEquals(true, config.useMalfunctions()); assertEquals(43.15f, config.getMalfunctionsProbability(), 0.5); assertEquals(true, config.inDebugMode()); } @Test public void testReadCmdLineLong() throws IOException, ConfigurationException { Configuration config = new Configuration(new String[] { "--debug", "--marker-radius", "4", "--ignore-laser-color", "green", "--use-virtual-magazine", "25", "--use-malfunctions", "43.15" }); assertFalse(config.isFirstRun()); assertEquals(4, config.getMarkerRadius()); assertEquals(true, config.ignoreLaserColor()); assertEquals("green", config.getIgnoreLaserColorName()); assertEquals(true, config.useVirtualMagazine()); assertEquals(25, config.getVirtualMagazineCapacity()); assertEquals(true, config.useMalfunctions()); assertEquals(43.15f, config.getMalfunctionsProbability(), 0.5); assertEquals(true, config.inDebugMode()); } @Test public void testWriteConfigFile() throws IOException, ConfigurationException { File props = new File("test_write.properties"); if (!props.createNewFile()) { System.err.println("Can't create test config file: " + props.getPath()); } Configuration writtenConfig = new Configuration(props.getPath(), new String[] { "--marker-radius", "4", "--ignore-laser-color", "green", "--use-virtual-magazine", "25", "--use-malfunctions", "43.15" }); writtenConfig.muteMessageChime("annoying message"); writtenConfig.muteMessageChime("good message"); writtenConfig.muteMessageChime("bad message"); writtenConfig.unmuteMessageChime("good message"); writtenConfig.setCameraDistance("Camera1", 100); writtenConfig.setCameraDistance("Camera2", 509); writtenConfig.writeConfigurationFile(); Configuration readConfig = new Configuration(props.getPath()); assertEquals(writtenConfig.getMarkerRadius(), readConfig.getMarkerRadius()); assertEquals(Color.GREEN, writtenConfig.getIgnoreLaserColor().get()); assertEquals(writtenConfig.getIgnoreLaserColorName(), readConfig.getIgnoreLaserColorName()); assertEquals(writtenConfig.useVirtualMagazine(), readConfig.useVirtualMagazine()); assertEquals(25, writtenConfig.getVirtualMagazineCapacity()); assertEquals(writtenConfig.getVirtualMagazineCapacity(), readConfig.getVirtualMagazineCapacity()); assertEquals(writtenConfig.useMalfunctions(), readConfig.useMalfunctions()); assertEquals(43.15f, writtenConfig.getMalfunctionsProbability(), 0.5f); assertTrue(readConfig.isChimeMuted("annoying message")); assertTrue(readConfig.isChimeMuted("bad message")); assertFalse(readConfig.isChimeMuted("good message")); assertEquals(writtenConfig.getCameraDistance("Camera1"), readConfig.getCameraDistance("Camera1")); assertEquals(writtenConfig.getCameraDistance("Camera2"), readConfig.getCameraDistance("Camera2")); if (!props.delete()) { System.err.println("Can't delete test config file: " + props.getPath()); } } @Test public void testPOIAdjustment() { assertFalse(defaultConfig.getPOIAdjustmentX().isPresent()); assertFalse(defaultConfig.getPOIAdjustmentY().isPresent()); defaultConfig.updatePOIAdjustment(-1, -1); assertEquals(1.0f, defaultConfig.getPOIAdjustmentX().get(), .1f); assertEquals(1.0f, defaultConfig.getPOIAdjustmentY().get(), .1f); defaultConfig.updatePOIAdjustment(-1, -1); assertEquals(1.0f, defaultConfig.getPOIAdjustmentX().get(), .1f); assertEquals(1.0f, defaultConfig.getPOIAdjustmentY().get(), .1f); defaultConfig.updatePOIAdjustment(-1, -1); assertEquals(1.0f, defaultConfig.getPOIAdjustmentX().get(), .1f); assertEquals(1.0f, defaultConfig.getPOIAdjustmentY().get(), .1f); defaultConfig.updatePOIAdjustment(-1, -1); assertEquals(1.0f, defaultConfig.getPOIAdjustmentX().get(), .1f); assertEquals(1.0f, defaultConfig.getPOIAdjustmentY().get(), .1f); defaultConfig.updatePOIAdjustment(-1, -1); assertEquals(1.0f, defaultConfig.getPOIAdjustmentX().get(), .1f); assertEquals(1.0f, defaultConfig.getPOIAdjustmentY().get(), .1f); } }