package com.shootoff.plugins; import static org.junit.Assert.*; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.Random; 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.config.Configuration; import com.shootoff.config.ConfigurationException; import com.shootoff.gui.JavaFXThreadingRule; import com.shootoff.gui.MockCanvasManager; import com.shootoff.gui.targets.TargetView; import com.shootoff.gui.controller.MockProjectorArenaController; import com.shootoff.targets.Hit; import com.shootoff.targets.MockHit; import com.shootoff.targets.Target; import com.shootoff.targets.TargetRegion; import ch.qos.logback.classic.Logger; public class TestShootDontShoot { @Rule public JavaFXThreadingRule javafxRule = new JavaFXThreadingRule(); private PrintStream originalOut; private ByteArrayOutputStream stringOut = new ByteArrayOutputStream(); private PrintStream stringOutStream; private ShootDontShoot sds; private List<Target> shootTargets; private List<Target> dontShootTargets; @Before public void setUp() throws UnsupportedEncodingException, ConfigurationException { stringOutStream = new PrintStream(stringOut, false, "UTF-8"); TextToSpeech.silence(true); TrainingExerciseBase.silence(true); originalOut = System.out; System.setOut(stringOutStream); System.setProperty("shootoff.home", System.getProperty("user.dir")); Random rng = new Random(15); // Changing this seed will cause tests to // fail shootTargets = new ArrayList<Target>(); dontShootTargets = new ArrayList<Target>(); sds = new ShootDontShoot(new ArrayList<Target>(), rng, shootTargets, dontShootTargets); Configuration config = new Configuration(new String[0]); config.setDebugMode(true); CamerasSupervisor cs = new CamerasSupervisor(config); MockProjectorArenaController pac = new MockProjectorArenaController(config, new MockCanvasManager(config)); sds.init(config, cs, null, null, pac); } @After public void tearDown() { TextToSpeech.silence(false); TrainingExerciseBase.silence(false); System.setOut(originalOut); Logger rootLogger = (Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); rootLogger.detachAndStopAllAppenders(); } @Test public void testAddRemoveTargets() { sds.addTargets(shootTargets, "targets/shoot_dont_shoot/shoot.target"); assertEquals(4, shootTargets.size()); sds.removeTarget(shootTargets, (TargetRegion) ((TargetView) shootTargets.get(0)).getTargetGroup().getChildren().get(0)); assertEquals(3, shootTargets.size()); } @Test public void testMissGoodOneBad() throws UnsupportedEncodingException { sds.addTargets(shootTargets, "targets/shoot_dont_shoot/shoot.target"); assertEquals(4, shootTargets.size()); sds.addTargets(dontShootTargets, "targets/shoot_dont_shoot/dont_shoot.target"); assertEquals(5, dontShootTargets.size()); // Shoot dont shoot target Hit dontShootHit = new MockHit(dontShootTargets.get(0), (TargetRegion) ((TargetView) dontShootTargets.get(0)).getTargetGroup().getChildren().get(0), 0, 0); sds.shotListener(null, Optional.of(dontShootHit)); assertEquals("Bad shoot!", stringOut.toString("UTF-8").replace(String.format("%n"), "")); stringOut.reset(); sds.callNewRound(); String roundEndText = String.format("You missed %d targets.%nmissed targets: %d%nbad hits: %d%n", shootTargets.size(), shootTargets.size(), 1); assertEquals(roundEndText, stringOut.toString("UTF-8")); stringOut.reset(); } }