package com.shootoff.gui.targets; import static org.junit.Assert.*; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import com.shootoff.config.Configuration; import com.shootoff.config.ConfigurationException; import com.shootoff.gui.CanvasManager; import com.shootoff.gui.JavaFXThreadingRule; import com.shootoff.gui.MockCanvasManager; import com.shootoff.targets.EllipseRegion; import com.shootoff.targets.ImageRegion; import com.shootoff.targets.RegionType; import com.shootoff.targets.Target; import com.shootoff.targets.TargetRegion; import com.shootoff.targets.io.TargetIO; import com.shootoff.targets.io.TargetIO.TargetComponents; import javafx.event.Event; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; public class TestTarget { @Rule public JavaFXThreadingRule javafxRule = new JavaFXThreadingRule(); private TargetRegion tr0, trPlateRackPlate, trPepperPopper; private Configuration config; private TargetView pepperPopper; private List<Target> targets; private CanvasManager canvasManager; @Before public void setUp() throws ConfigurationException { System.setProperty("shootoff.home", System.getProperty("user.dir")); tr0 = new EllipseRegion(0, 0, 10, 10); trPlateRackPlate = new EllipseRegion(0, 0, 10, 10); Map<String, String> tags1 = new HashMap<String, String>(); tags1.put("command", "animate;reverse;play_sound(sounds/steel_sound_1.wav)"); trPlateRackPlate.setTags(tags1); trPepperPopper = new EllipseRegion(0, 0, 10, 10); Map<String, String> tags2 = new HashMap<String, String>(); tags2.put("command", "animate(pepper_popper);play_sound(sounds/steel_sound_1.wav,pepper_popper)"); trPepperPopper.setTags(tags2); config = new Configuration(new String[0]); canvasManager = new MockCanvasManager(config); canvasManager.getCanvasGroup().getChildren().clear(); targets = new ArrayList<Target>(); TargetComponents popperComponents = TargetIO.loadTarget(new File("targets/Pepper_Popper.target")).get(); pepperPopper = (TargetView) canvasManager.addTarget( new TargetView(popperComponents.getTargetGroup(), popperComponents.getTargetTags(), targets)); targets.add(pepperPopper); TargetComponents resetComponents = TargetIO.loadTarget(new File("targets/Reset.target")).get(); targets.add(new TargetView(resetComponents.getTargetGroup(), resetComponents.getTargetTags(), targets)); } @Test public void testParseCommandNoTags() { TargetView.parseCommandTag(tr0, (commands, commandName, args) -> { assertEquals(0, commands.size()); }); } @Test public void testParseCommandTagDuelTree() { TargetView.parseCommandTag(trPlateRackPlate, (commands, commandName, args) -> { assertEquals(3, commands.size()); switch (commandName) { case "animate": assertEquals(0, args.size()); break; case "reverse": assertEquals(0, args.size()); break; case "play_sound": assertEquals(1, args.size()); assertEquals("sounds/steel_sound_1.wav", args.get(0)); break; default: fail("Unexpected command tag: " + commandName); break; } }); } @Test public void testParseCommandTagPepperPopper() { TargetView.parseCommandTag(trPepperPopper, (commands, commandName, args) -> { assertEquals(2, commands.size()); switch (commandName) { case "animate": assertEquals(1, args.size()); assertEquals("pepper_popper", args.get(0)); break; case "play_sound": assertEquals(2, args.size()); assertEquals("sounds/steel_sound_1.wav", args.get(0)); assertEquals("pepper_popper", args.get(1)); break; default: fail("Unexpected command tag: " + commandName); break; } }); } @Test public void testGetTargetRegionByName() { Optional<TargetRegion> r = TargetView.getTargetRegionByName(targets, (TargetRegion) pepperPopper.getRegions().get(0), "pepper_popper"); assertTrue(r.isPresent()); assertTrue(r.get().tagExists("name")); assertEquals("pepper_popper", r.get().getTag("name")); r = TargetView.getTargetRegionByName(targets, (TargetRegion) pepperPopper.getRegions().get(0), "not present"); assertFalse(r.isPresent()); } @Test public void testAnimateAndResetPepperPopper() { TargetRegion r = (TargetRegion) pepperPopper.getRegions().get(0); assertEquals(RegionType.IMAGE, r.getType()); ImageRegion animated = (ImageRegion) r; assertTrue(animated.getAnimation().isPresent()); assertTrue(animated.onFirstFrame()); pepperPopper.animate(animated, new ArrayList<String>()); animated.reset(); assertTrue(animated.onFirstFrame()); } @Test public void testAnimateAndResetFlagPepperPopper() { TargetRegion r = (TargetRegion) pepperPopper.getTargetGroup().getChildren().get(0); assertEquals(RegionType.IMAGE, r.getType()); ImageRegion animated = (ImageRegion) r; assertTrue(animated.getAnimation().isPresent()); assertTrue(animated.onFirstFrame()); List<String> args = new ArrayList<String>(); args.add("true"); pepperPopper.animate(animated, args); assertTrue(animated.onFirstFrame()); } @Test public void testLeftArrowKeyMoveTarget() { double oldX = pepperPopper.getPosition().getX(); double oldY = pepperPopper.getPosition().getY(); KeyEvent leftArrowEvent = new KeyEvent(null, pepperPopper.getTargetGroup(), KeyEvent.KEY_PRESSED, "left", "left", KeyCode.LEFT, false, false, false, false); Event.fireEvent(pepperPopper.getTargetGroup(), leftArrowEvent); assertEquals(oldX - TargetView.MOVEMENT_DELTA, pepperPopper.getPosition().getX(), .001); assertEquals(oldY, pepperPopper.getPosition().getY(), .001); } @Test public void testRightArrowKeyMoveTarget() { double oldX = pepperPopper.getPosition().getX(); double oldY = pepperPopper.getPosition().getY(); KeyEvent rightArrowEvent = new KeyEvent(null, pepperPopper.getTargetGroup(), KeyEvent.KEY_PRESSED, "right", "right", KeyCode.RIGHT, false, false, false, false); Event.fireEvent(pepperPopper.getTargetGroup(), rightArrowEvent); assertEquals(oldX + TargetView.MOVEMENT_DELTA, pepperPopper.getPosition().getX(), .001); assertEquals(oldY, pepperPopper.getPosition().getY(), .001); } @Test public void testUpArrowKeyMoveTarget() { double oldX = pepperPopper.getPosition().getX(); double oldY = pepperPopper.getPosition().getY(); KeyEvent upArrowEvent = new KeyEvent(null, pepperPopper.getTargetGroup(), KeyEvent.KEY_PRESSED, "up", "up", KeyCode.UP, false, false, false, false); Event.fireEvent(pepperPopper.getTargetGroup(), upArrowEvent); assertEquals(oldX, pepperPopper.getPosition().getX(), .001); assertEquals(oldY - TargetView.MOVEMENT_DELTA, pepperPopper.getPosition().getY(), .001); } @Test public void testDownArrowKeyMoveTarget() { double oldX = pepperPopper.getPosition().getX(); double oldY = pepperPopper.getPosition().getY(); KeyEvent downArrowEvent = new KeyEvent(null, pepperPopper.getTargetGroup(), KeyEvent.KEY_PRESSED, "down", "down", KeyCode.DOWN, false, false, false, false); Event.fireEvent(pepperPopper.getTargetGroup(), downArrowEvent); assertEquals(oldX, pepperPopper.getPosition().getX(), .001); assertEquals(oldY + TargetView.MOVEMENT_DELTA, pepperPopper.getPosition().getY(), .001); } @Test public void testLeftArrowKeyResizeTarget() { double oldWidth = pepperPopper.getDimension().getWidth(); double oldHeight = pepperPopper.getDimension().getHeight(); KeyEvent leftArrowEvent = new KeyEvent(null, pepperPopper.getTargetGroup(), KeyEvent.KEY_PRESSED, "left", "left", KeyCode.LEFT, true, false, false, false); Event.fireEvent(pepperPopper.getTargetGroup(), leftArrowEvent); assertEquals(oldWidth + TargetView.SCALE_DELTA, pepperPopper.getDimension().getWidth(), .001); assertEquals(oldHeight, pepperPopper.getDimension().getHeight(), .001); } @Test public void testRightArrowKeyResizeTarget() { double oldWidth = pepperPopper.getDimension().getWidth(); double oldHeight = pepperPopper.getDimension().getHeight(); KeyEvent rightArrowEvent = new KeyEvent(null, pepperPopper.getTargetGroup(), KeyEvent.KEY_PRESSED, "right", "right", KeyCode.RIGHT, true, false, false, false); Event.fireEvent(pepperPopper.getTargetGroup(), rightArrowEvent); assertEquals(oldWidth - TargetView.SCALE_DELTA, pepperPopper.getDimension().getWidth(), .001); assertEquals(oldHeight, pepperPopper.getDimension().getHeight(), .001); } @Test public void testUpArrowKeyResizeTarget() { double oldWidth = pepperPopper.getDimension().getWidth(); double oldHeight = pepperPopper.getDimension().getHeight(); KeyEvent upArrowEvent = new KeyEvent(null, pepperPopper.getTargetGroup(), KeyEvent.KEY_PRESSED, "up", "up", KeyCode.UP, true, false, false, false); Event.fireEvent(pepperPopper.getTargetGroup(), upArrowEvent); assertEquals(oldWidth, pepperPopper.getDimension().getWidth(), .001); assertEquals(oldHeight + TargetView.SCALE_DELTA, pepperPopper.getDimension().getHeight(), .001); } @Test public void testDownArrowKeyResizeTarget() { double oldWidth = pepperPopper.getDimension().getWidth(); double oldHeight = pepperPopper.getDimension().getHeight(); KeyEvent downArrowEvent = new KeyEvent(null, pepperPopper.getTargetGroup(), KeyEvent.KEY_PRESSED, "down", "down", KeyCode.DOWN, true, false, false, false); Event.fireEvent(pepperPopper.getTargetGroup(), downArrowEvent); assertEquals(oldWidth, pepperPopper.getDimension().getWidth(), .001); assertEquals(oldHeight - TargetView.SCALE_DELTA, pepperPopper.getDimension().getHeight(), .001); } @Test public void testUpArrowKeyProportionalResizeTarget() { double oldWidth = pepperPopper.getDimension().getWidth(); double oldHeight = pepperPopper.getDimension().getHeight(); KeyEvent upArrowEvent = new KeyEvent(null, pepperPopper.getTargetGroup(), KeyEvent.KEY_PRESSED, "up", "up", KeyCode.UP, true, true, false, false); Event.fireEvent(pepperPopper.getTargetGroup(), upArrowEvent); assertEquals(oldWidth + (TargetView.SCALE_DELTA * (oldWidth / oldHeight)), pepperPopper.getDimension().getWidth(), .001); assertEquals(oldHeight + TargetView.SCALE_DELTA, pepperPopper.getDimension().getHeight(), .001); } @Test public void testDownArrowKeyProportionalResizeTarget() { double oldWidth = pepperPopper.getDimension().getWidth(); double oldHeight = pepperPopper.getDimension().getHeight(); KeyEvent downArrowEvent = new KeyEvent(null, pepperPopper.getTargetGroup(), KeyEvent.KEY_PRESSED, "down", "down", KeyCode.DOWN, true, true, false, false); Event.fireEvent(pepperPopper.getTargetGroup(), downArrowEvent); assertEquals(oldWidth - (TargetView.SCALE_DELTA * (oldWidth / oldHeight)), pepperPopper.getDimension().getWidth(), .001); assertEquals(oldHeight - TargetView.SCALE_DELTA, pepperPopper.getDimension().getHeight(), .001); } }