package com.shootoff.plugins; import static org.junit.Assert.*; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.util.Optional; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.slf4j.LoggerFactory; import com.shootoff.camera.CamerasSupervisor; import com.shootoff.camera.Shot; import com.shootoff.camera.shot.DisplayShot; import com.shootoff.camera.shot.ShotColor; import com.shootoff.config.Configuration; import com.shootoff.config.ConfigurationException; import com.shootoff.gui.JavaFXThreadingRule; import com.shootoff.gui.ShotEntry; import com.shootoff.gui.targets.TargetView; import com.shootoff.targets.Hit; import com.shootoff.targets.MockHit; import com.shootoff.targets.Target; import com.shootoff.targets.TargetRegion; import com.shootoff.targets.io.TargetIO; import com.shootoff.targets.io.TargetIO.TargetComponents; import ch.qos.logback.classic.Logger; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.embed.swing.JFXPanel; import javafx.scene.control.TableView; public class TestISSFStandardPistol { @Rule public JavaFXThreadingRule javafxRule = new JavaFXThreadingRule(); private PrintStream originalOut; private ByteArrayOutputStream stringOut = new ByteArrayOutputStream(); private PrintStream stringOutStream; private List<Target> targets; private ISSFStandardPistol issfExercise; private Hit scoredRegionHit; private int regionScore; @Before public void setUp() throws UnsupportedEncodingException, ConfigurationException { new JFXPanel(); // Initialize the JFX toolkit stringOutStream = new PrintStream(stringOut, false, "UTF-8"); System.setProperty("shootoff.home", System.getProperty("user.dir")); TextToSpeech.silence(true); TrainingExerciseBase.silence(true); originalOut = System.out; System.setOut(stringOutStream); Configuration config = new Configuration(new String[0]); config.setDebugMode(true); CamerasSupervisor cs = new CamerasSupervisor(config); targets = new ArrayList<Target>(); TargetComponents tc = TargetIO.loadTarget(new File("targets/ISSF.target")).get(); TargetView issfTarget = new TargetView(tc.getTargetGroup(), tc.getTargetTags(), targets); targets.add(issfTarget); scoredRegionHit = new MockHit(issfTarget, (TargetRegion) issfTarget.getTargetGroup().getChildren().get(0), 0, 0); regionScore = Integer.parseInt(scoredRegionHit.getHitRegion().getTag("points")); issfExercise = new ISSFStandardPistol(targets); TableView<ShotEntry> shotTimerTable = new TableView<ShotEntry>(); ObservableList<ShotEntry> shotEntries = FXCollections.observableArrayList(); shotEntries .add(new ShotEntry(new DisplayShot(ShotColor.RED, 0, 0, 0, 2), Optional.empty(), Optional.empty(), false, false)); shotTimerTable.setItems(shotEntries); issfExercise.init(config, cs, null, shotTimerTable); issfExercise.init(0, 0); } @After public void tearDown() { TextToSpeech.silence(false); TrainingExerciseBase.silence(false); System.setOut(originalOut); issfExercise.destroy(); Logger rootLogger = (Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); rootLogger.detachAndStopAllAppenders(); } private String getScoreString(int roundOne, int roundTwo, int roundThree, boolean roundOver, boolean gameOver) { String scoreString = String.format("150s score: %d%n20s score: %d%n10s score: %d%ntotal score: %d%n", roundOne, roundTwo, roundThree, roundOne + roundTwo + roundThree); if (gameOver) { return scoreString + String.format("sounds/voice/shootoff-roundover.wav%nEvent over... Your score is 60%n") .replace('/', File.separatorChar); } if (roundOver) { return scoreString + String.format("sounds/voice/shootoff-roundover.wav%nsounds/beep.wav%n").replace('/', File.separatorChar); } return scoreString; } @Test public void testFullRound() throws UnsupportedEncodingException { assertEquals(String.format("sounds/voice/shootoff-makeready.wav%nsounds/beep.wav%n"), stringOut.toString("UTF-8").replace(File.separatorChar, '/')); stringOut.reset(); // 150s round 1-4 for (int i = 0; i < 4; i++) { issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); // (regionScore * 5 * i) = last round's score assertEquals(getScoreString((regionScore * 5 * i) + regionScore, 0, 0, false, false), stringOut.toString("UTF-8")); stringOut.reset(); issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); assertEquals(getScoreString((regionScore * 5 * i) + regionScore * 2, 0, 0, false, false), stringOut.toString("UTF-8")); stringOut.reset(); issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); assertEquals(getScoreString((regionScore * 5 * i) + regionScore * 3, 0, 0, false, false), stringOut.toString("UTF-8")); stringOut.reset(); issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); assertEquals(getScoreString((regionScore * 5 * i) + regionScore * 4, 0, 0, false, false), stringOut.toString("UTF-8")); stringOut.reset(); issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); assertEquals(getScoreString((regionScore * 5 * i) + regionScore * 5, 0, 0, true, false), stringOut.toString("UTF-8")); stringOut.reset(); } // 20s round 1-4 for (int i = 0; i < 4; i++) { issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); // (regionScore * 5 * i) = last round's score assertEquals(getScoreString(regionScore * 20, (regionScore * 5 * i) + regionScore, 0, false, false), stringOut.toString("UTF-8")); stringOut.reset(); issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); assertEquals(getScoreString(regionScore * 20, (regionScore * 5 * i) + regionScore * 2, 0, false, false), stringOut.toString("UTF-8")); stringOut.reset(); issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); assertEquals(getScoreString(regionScore * 20, (regionScore * 5 * i) + regionScore * 3, 0, false, false), stringOut.toString("UTF-8")); stringOut.reset(); issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); assertEquals(getScoreString(regionScore * 20, (regionScore * 5 * i) + regionScore * 4, 0, false, false), stringOut.toString("UTF-8")); stringOut.reset(); issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); assertEquals(getScoreString(regionScore * 20, (regionScore * 5 * i) + regionScore * 5, 0, true, false), stringOut.toString("UTF-8")); stringOut.reset(); } // 10s round 1-4 for (int i = 0; i < 4; i++) { issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); // (regionScore * 5 * i) = last round's score assertEquals(getScoreString(regionScore * 20, regionScore * 20, (regionScore * 5 * i) + regionScore, false, false), stringOut.toString("UTF-8")); stringOut.reset(); issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); assertEquals(getScoreString(regionScore * 20, regionScore * 20, (regionScore * 5 * i) + regionScore * 2, false, false), stringOut.toString("UTF-8")); stringOut.reset(); issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); assertEquals(getScoreString(regionScore * 20, regionScore * 20, (regionScore * 5 * i) + regionScore * 3, false, false), stringOut.toString("UTF-8")); stringOut.reset(); issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); assertEquals(getScoreString(regionScore * 20, regionScore * 20, (regionScore * 5 * i) + regionScore * 4, false, false), stringOut.toString("UTF-8")); stringOut.reset(); boolean gameOver = i == 3; issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); assertEquals(getScoreString(regionScore * 20, regionScore * 20, (regionScore * 5 * i) + regionScore * 5, true, gameOver), stringOut.toString("UTF-8")); stringOut.reset(); } } @Test public void testFull150sThenReset() throws UnsupportedEncodingException { assertEquals(String.format("sounds/voice/shootoff-makeready.wav%nsounds/beep.wav%n"), stringOut.toString("UTF-8").replace(File.separatorChar, '/')); stringOut.reset(); // 150s round 1-4 for (int i = 0; i < 4; i++) { issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); // (regionScore * 5 * i) = last round's score assertEquals(getScoreString((regionScore * 5 * i) + regionScore, 0, 0, false, false), stringOut.toString("UTF-8")); stringOut.reset(); issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); assertEquals(getScoreString((regionScore * 5 * i) + regionScore * 2, 0, 0, false, false), stringOut.toString("UTF-8")); stringOut.reset(); issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); assertEquals(getScoreString((regionScore * 5 * i) + regionScore * 3, 0, 0, false, false), stringOut.toString("UTF-8")); stringOut.reset(); issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); assertEquals(getScoreString((regionScore * 5 * i) + regionScore * 4, 0, 0, false, false), stringOut.toString("UTF-8")); stringOut.reset(); issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); assertEquals(getScoreString((regionScore * 5 * i) + regionScore * 5, 0, 0, true, false), stringOut.toString("UTF-8")); stringOut.reset(); } issfExercise.reset(targets); issfExercise.shotListener(new Shot(ShotColor.RED, 0, 0, 0, 2), Optional.of(scoredRegionHit)); // (regionScore * 5 * i) = last round's score assertEquals(String.format("%n") + getScoreString(regionScore, 0, 0, false, false), stringOut.toString("UTF-8")); stringOut.reset(); } }