package com.shootoff.session; import static org.junit.Assert.*; import java.io.File; import java.util.HashMap; import java.util.List; import java.util.Optional; import org.junit.Before; import org.junit.Test; 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.MockCanvasManager; import com.shootoff.gui.targets.TargetView; import javafx.scene.Group; public class TestSessionRecorder { private SessionRecorder sessionRecorder; private String cameraName; private DisplayShot shot; private String targetName1; private TargetView target1; private int targetIndex1; private String targetName2; private TargetView target2; private int hitRegionIndex; private String exerciseMessage; @Before public void setUp() throws ConfigurationException { Configuration config = new Configuration(new String[0]); MockCanvasManager canvasManager = new MockCanvasManager(config); sessionRecorder = new SessionRecorder(); cameraName = "Default"; shot = new DisplayShot(ShotColor.RED, 0, 0, 0, 2); targetName1 = "bullseye.target"; target1 = new TargetView(new File(targetName1), new Group(), new HashMap<String, String>(), canvasManager, false); targetName2 = "shoot_dont_shoot" + File.separator + " shoot.target"; target2 = new TargetView(new File(targetName2), new Group(), new HashMap<String, String>(), canvasManager, false); canvasManager.addTarget(target1); canvasManager.addTarget(target2); targetIndex1 = target1.getTargetIndex(); hitRegionIndex = 0; exerciseMessage = "This is a test"; } @Test public void testOneOfEach() { sessionRecorder.recordTargetAdded(cameraName, target1); sessionRecorder.recordShot(cameraName, shot, false, false, Optional.of(target1), Optional.of(hitRegionIndex), Optional.empty()); sessionRecorder.recordShot(cameraName, shot, true, false, Optional.of(target1), Optional.of(hitRegionIndex), Optional.empty()); sessionRecorder.recordShot(cameraName, shot, false, true, Optional.of(target1), Optional.of(hitRegionIndex), Optional.empty()); sessionRecorder.recordTargetResized(cameraName, target1, 10, 20); sessionRecorder.recordTargetMoved(cameraName, target1, 4, 3); sessionRecorder.recordTargetRemoved(cameraName, target1); sessionRecorder.recordExerciseFeedMessage(exerciseMessage); List<Event> events = sessionRecorder.getCameraEvents(cameraName); final int TARGET_ADDED_INDEX = 0; assertEquals(EventType.TARGET_ADDED, events.get(TARGET_ADDED_INDEX).getType()); assertEquals(cameraName, events.get(TARGET_ADDED_INDEX).getCameraName()); assertEquals(targetName1, ((TargetAddedEvent) events.get(TARGET_ADDED_INDEX)).getTargetName()); final int SHOT_INDEX = 1; assertEquals(EventType.SHOT, events.get(SHOT_INDEX).getType()); assertEquals(cameraName, events.get(SHOT_INDEX).getCameraName()); assertEquals(shot, ((ShotEvent) events.get(SHOT_INDEX)).getShot()); assertEquals(ShotColor.RED, ((ShotEvent) events.get(SHOT_INDEX)).getShot().getColor()); assertFalse(((ShotEvent) events.get(SHOT_INDEX)).isMalfunction()); assertFalse(((ShotEvent) events.get(SHOT_INDEX)).isReload()); assertEquals(targetIndex1, ((ShotEvent) events.get(SHOT_INDEX)).getTargetIndex().get().intValue()); assertEquals(hitRegionIndex, ((ShotEvent) events.get(SHOT_INDEX)).getHitRegionIndex().get().intValue()); assertFalse(((ShotEvent) events.get(SHOT_INDEX)).getVideoString().isPresent()); final int SHOT_MALFUNCTION_INDEX = 2; assertEquals(EventType.SHOT, events.get(SHOT_MALFUNCTION_INDEX).getType()); assertEquals(cameraName, events.get(SHOT_MALFUNCTION_INDEX).getCameraName()); assertEquals(shot, ((ShotEvent) events.get(SHOT_MALFUNCTION_INDEX)).getShot()); assertEquals(ShotColor.RED, ((ShotEvent) events.get(SHOT_MALFUNCTION_INDEX)).getShot().getColor()); assertTrue(((ShotEvent) events.get(SHOT_MALFUNCTION_INDEX)).isMalfunction()); assertFalse(((ShotEvent) events.get(SHOT_MALFUNCTION_INDEX)).isReload()); assertEquals(targetIndex1, ((ShotEvent) events.get(SHOT_MALFUNCTION_INDEX)).getTargetIndex().get().intValue()); assertEquals(hitRegionIndex, ((ShotEvent) events.get(SHOT_MALFUNCTION_INDEX)).getHitRegionIndex().get().intValue()); assertFalse(((ShotEvent) events.get(SHOT_MALFUNCTION_INDEX)).getVideoString().isPresent()); final int SHOT_RELOAD_INDEX = 3; assertEquals(EventType.SHOT, events.get(SHOT_RELOAD_INDEX).getType()); assertEquals(cameraName, events.get(SHOT_RELOAD_INDEX).getCameraName()); assertEquals(shot, ((ShotEvent) events.get(SHOT_RELOAD_INDEX)).getShot()); assertEquals(ShotColor.RED, ((ShotEvent) events.get(SHOT_RELOAD_INDEX)).getShot().getColor()); assertFalse(((ShotEvent) events.get(SHOT_RELOAD_INDEX)).isMalfunction()); assertTrue(((ShotEvent) events.get(SHOT_RELOAD_INDEX)).isReload()); assertEquals(targetIndex1, ((ShotEvent) events.get(SHOT_RELOAD_INDEX)).getTargetIndex().get().intValue()); assertEquals(hitRegionIndex, ((ShotEvent) events.get(SHOT_RELOAD_INDEX)).getHitRegionIndex().get().intValue()); assertFalse(((ShotEvent) events.get(SHOT_RELOAD_INDEX)).getVideoString().isPresent()); final int TARGET_RESIZED_INDEX = 4; assertEquals(EventType.TARGET_RESIZED, events.get(TARGET_RESIZED_INDEX).getType()); assertEquals(cameraName, events.get(TARGET_RESIZED_INDEX).getCameraName()); assertEquals(targetIndex1, ((TargetResizedEvent) events.get(TARGET_RESIZED_INDEX)).getTargetIndex()); assertEquals(10, ((TargetResizedEvent) events.get(TARGET_RESIZED_INDEX)).getNewWidth(), 1); assertEquals(20, ((TargetResizedEvent) events.get(TARGET_RESIZED_INDEX)).getNewHeight(), 1); final int TARGET_MOVED_INDEX = 5; assertEquals(EventType.TARGET_MOVED, events.get(TARGET_MOVED_INDEX).getType()); assertEquals(cameraName, events.get(TARGET_MOVED_INDEX).getCameraName()); assertEquals(targetIndex1, ((TargetMovedEvent) events.get(TARGET_MOVED_INDEX)).getTargetIndex()); assertEquals(4, ((TargetMovedEvent) events.get(TARGET_MOVED_INDEX)).getNewX()); assertEquals(3, ((TargetMovedEvent) events.get(TARGET_MOVED_INDEX)).getNewY()); final int TARGET_REMOVED_INDEX = 6; assertEquals(EventType.TARGET_REMOVED, events.get(TARGET_REMOVED_INDEX).getType()); assertEquals(cameraName, events.get(TARGET_REMOVED_INDEX).getCameraName()); assertEquals(targetIndex1, ((TargetRemovedEvent) events.get(TARGET_REMOVED_INDEX)).getTargetIndex()); final int EXERCISE_FEED_INDEX = 7; assertEquals(EventType.EXERCISE_FEED_MESSAGE, events.get(EXERCISE_FEED_INDEX).getType()); assertEquals(cameraName, events.get(EXERCISE_FEED_INDEX).getCameraName()); assertEquals(exerciseMessage, ((ExerciseFeedMessageEvent) events.get(EXERCISE_FEED_INDEX)).getMessage()); assertEquals(8, events.size()); } @Test public void testTargetNonStandardLocation() { sessionRecorder.recordTargetAdded(cameraName, target1); sessionRecorder.recordTargetAdded(cameraName, target2); List<Event> events = sessionRecorder.getCameraEvents(cameraName); final int TARGET_ADDED_INDEX1 = 0; assertEquals(EventType.TARGET_ADDED, events.get(TARGET_ADDED_INDEX1).getType()); assertEquals(cameraName, events.get(TARGET_ADDED_INDEX1).getCameraName()); assertEquals(targetName1, ((TargetAddedEvent) events.get(TARGET_ADDED_INDEX1)).getTargetName()); final int TARGET_ADDED_INDEX2 = 1; assertEquals(EventType.TARGET_ADDED, events.get(TARGET_ADDED_INDEX2).getType()); assertEquals(cameraName, events.get(TARGET_ADDED_INDEX2).getCameraName()); assertEquals(targetName2, ((TargetAddedEvent) events.get(TARGET_ADDED_INDEX2)).getTargetName()); assertEquals(2, events.size()); } @Test public void testCollapseResizesBasic() { sessionRecorder.recordTargetResized(cameraName, target1, 11, 20); sessionRecorder.recordTargetResized(cameraName, target1, 12, 20); sessionRecorder.recordTargetResized(cameraName, target1, 13, 20); sessionRecorder.recordTargetResized(cameraName, target1, 12, 45); List<Event> events = sessionRecorder.getCameraEvents(cameraName); // First two are an add then a move that were artificially inserted assertEquals(3, events.size()); final int TARGET_RESIZED_INDEX = 2; assertEquals(EventType.TARGET_RESIZED, events.get(TARGET_RESIZED_INDEX).getType()); assertEquals(targetIndex1, ((TargetResizedEvent) events.get(TARGET_RESIZED_INDEX)).getTargetIndex()); assertEquals(12, ((TargetResizedEvent) events.get(TARGET_RESIZED_INDEX)).getNewWidth(), 1); assertEquals(45, ((TargetResizedEvent) events.get(TARGET_RESIZED_INDEX)).getNewHeight(), 1); } @Test public void testCollapseResizesMultipleCameras() { String cameraName2 = "AnotherCamera"; sessionRecorder.recordTargetResized(cameraName, target1, 11, 20); sessionRecorder.recordTargetResized(cameraName2, target1, 50, 10); sessionRecorder.recordTargetResized(cameraName, target1, 12, 20); sessionRecorder.recordTargetResized(cameraName, target1, 13, 20); sessionRecorder.recordTargetResized(cameraName2, target1, 55, 20); sessionRecorder.recordTargetResized(cameraName, target1, 12, 45); List<Event> events = sessionRecorder.getCameraEvents(cameraName); // First two are an add then a move that were artificially inserted assertEquals(3, events.size()); final int CAM1_TARGET_RESIZED_INDEX = 2; assertEquals(EventType.TARGET_RESIZED, events.get(CAM1_TARGET_RESIZED_INDEX).getType()); assertEquals(targetIndex1, ((TargetResizedEvent) events.get(CAM1_TARGET_RESIZED_INDEX)).getTargetIndex()); assertEquals(12, ((TargetResizedEvent) events.get(CAM1_TARGET_RESIZED_INDEX)).getNewWidth(), 1); assertEquals(45, ((TargetResizedEvent) events.get(CAM1_TARGET_RESIZED_INDEX)).getNewHeight(), 1); events = sessionRecorder.getCameraEvents(cameraName2); // First two are an add then a move that were artificially inserted assertEquals(3, events.size()); final int CAM2_TARGET_RESIZED_INDEX = 2; assertEquals(EventType.TARGET_RESIZED, events.get(CAM2_TARGET_RESIZED_INDEX).getType()); assertEquals(targetIndex1, ((TargetResizedEvent) events.get(CAM2_TARGET_RESIZED_INDEX)).getTargetIndex()); assertEquals(55, ((TargetResizedEvent) events.get(CAM2_TARGET_RESIZED_INDEX)).getNewWidth(), 1); assertEquals(20, ((TargetResizedEvent) events.get(CAM2_TARGET_RESIZED_INDEX)).getNewHeight(), 1); } @Test public void testCollapseResizesShotInMiddle() { sessionRecorder.recordTargetResized(cameraName, target1, 11, 20); sessionRecorder.recordTargetResized(cameraName, target1, 12, 20); String videoString = "c:test/x.vid"; sessionRecorder.recordShot(cameraName, shot, false, false, Optional.of(target1), Optional.of(hitRegionIndex), Optional.of(videoString)); sessionRecorder.recordTargetResized(cameraName, target1, 13, 20); sessionRecorder.recordTargetResized(cameraName, target1, 12, 45); List<Event> events = sessionRecorder.getCameraEvents(cameraName); // First two are an add then a move that were artificially inserted assertEquals(5, events.size()); assertEquals(EventType.TARGET_RESIZED, events.get(2).getType()); assertEquals(targetIndex1, ((TargetResizedEvent) events.get(2)).getTargetIndex()); assertEquals(12, ((TargetResizedEvent) events.get(2)).getNewWidth(), 1); assertEquals(20, ((TargetResizedEvent) events.get(2)).getNewHeight(), 1); assertEquals(EventType.SHOT, events.get(3).getType()); assertEquals(shot, ((ShotEvent) events.get(3)).getShot()); assertEquals(ShotColor.RED, ((ShotEvent) events.get(3)).getShot().getColor()); assertEquals(targetIndex1, ((ShotEvent) events.get(3)).getTargetIndex().get().intValue()); assertEquals(hitRegionIndex, ((ShotEvent) events.get(3)).getHitRegionIndex().get().intValue()); assertTrue(((ShotEvent) events.get(3)).getVideoString().isPresent()); assertEquals(videoString, ((ShotEvent) events.get(3)).getVideoString().get()); assertEquals(EventType.TARGET_RESIZED, events.get(4).getType()); assertEquals(targetIndex1, ((TargetResizedEvent) events.get(4)).getTargetIndex()); assertEquals(12, ((TargetResizedEvent) events.get(4)).getNewWidth(), 1); assertEquals(45, ((TargetResizedEvent) events.get(4)).getNewHeight(), 1); } @Test public void testCollapseResizesMoveInMiddle() { sessionRecorder.recordTargetResized(cameraName, target1, 11, 20); sessionRecorder.recordTargetResized(cameraName, target1, 12, 20); sessionRecorder.recordTargetMoved(cameraName, target1, 4, 3); sessionRecorder.recordTargetResized(cameraName, target1, 13, 20); sessionRecorder.recordTargetResized(cameraName, target1, 12, 45); List<Event> events = sessionRecorder.getCameraEvents(cameraName); assertEquals(3, events.size()); assertEquals(EventType.TARGET_ADDED, events.get(0).getType()); assertEquals(cameraName, events.get(0).getCameraName()); assertEquals(targetName1, ((TargetAddedEvent) events.get(0)).getTargetName()); assertEquals(EventType.TARGET_MOVED, events.get(1).getType()); assertEquals(targetIndex1, ((TargetMovedEvent) events.get(1)).getTargetIndex()); assertEquals(4, ((TargetMovedEvent) events.get(1)).getNewX()); assertEquals(3, ((TargetMovedEvent) events.get(1)).getNewY()); assertEquals(EventType.TARGET_RESIZED, events.get(2).getType()); assertEquals(targetIndex1, ((TargetResizedEvent) events.get(2)).getTargetIndex()); assertEquals(12, ((TargetResizedEvent) events.get(2)).getNewWidth(), 1); assertEquals(45, ((TargetResizedEvent) events.get(2)).getNewHeight(), 1); } @Test public void testCollapseMovesBasic() { sessionRecorder.recordTargetMoved(cameraName, target1, 11, 20); sessionRecorder.recordTargetMoved(cameraName, target1, 12, 20); sessionRecorder.recordTargetMoved(cameraName, target1, 13, 20); sessionRecorder.recordTargetMoved(cameraName, target1, 12, 45); List<Event> events = sessionRecorder.getCameraEvents(cameraName); // First two are an add then a resize that were artificially inserted assertEquals(3, events.size()); assertEquals(EventType.TARGET_MOVED, events.get(2).getType()); assertEquals(targetIndex1, ((TargetMovedEvent) events.get(2)).getTargetIndex()); assertEquals(12, ((TargetMovedEvent) events.get(2)).getNewX()); assertEquals(45, ((TargetMovedEvent) events.get(2)).getNewY()); } @Test public void testCollapseMovesShotInMiddle() { sessionRecorder.recordTargetMoved(cameraName, target1, 11, 20); sessionRecorder.recordTargetMoved(cameraName, target1, 12, 20); sessionRecorder.recordShot(cameraName, shot, false, false, Optional.of(target1), Optional.of(hitRegionIndex), Optional.empty()); sessionRecorder.recordTargetMoved(cameraName, target1, 13, 20); sessionRecorder.recordTargetMoved(cameraName, target1, 12, 45); List<Event> events = sessionRecorder.getCameraEvents(cameraName); // First two are an add then a resize that were artificially inserted assertEquals(5, events.size()); assertEquals(EventType.TARGET_MOVED, events.get(2).getType()); assertEquals(targetIndex1, ((TargetMovedEvent) events.get(2)).getTargetIndex()); assertEquals(12, ((TargetMovedEvent) events.get(2)).getNewX()); assertEquals(20, ((TargetMovedEvent) events.get(2)).getNewY()); assertEquals(EventType.SHOT, events.get(3).getType()); assertEquals(shot, ((ShotEvent) events.get(3)).getShot()); assertEquals(ShotColor.RED, ((ShotEvent) events.get(3)).getShot().getColor()); assertEquals(targetIndex1, ((ShotEvent) events.get(3)).getTargetIndex().get().intValue()); assertEquals(hitRegionIndex, ((ShotEvent) events.get(3)).getHitRegionIndex().get().intValue()); assertFalse(((ShotEvent) events.get(3)).getVideoString().isPresent()); assertEquals(EventType.TARGET_MOVED, events.get(4).getType()); assertEquals(targetIndex1, ((TargetMovedEvent) events.get(4)).getTargetIndex()); assertEquals(12, ((TargetMovedEvent) events.get(4)).getNewX()); assertEquals(45, ((TargetMovedEvent) events.get(4)).getNewY()); } @Test public void testCollapseMovesResizeInMiddle() { sessionRecorder.recordTargetMoved(cameraName, target1, 11, 20); sessionRecorder.recordTargetMoved(cameraName, target1, 12, 20); sessionRecorder.recordTargetResized(cameraName, target1, 6, 7); sessionRecorder.recordTargetMoved(cameraName, target1, 13, 20); sessionRecorder.recordTargetMoved(cameraName, target1, 12, 45); List<Event> events = sessionRecorder.getCameraEvents(cameraName); // First one is an add that was artificially inserted assertEquals(3, events.size()); final int TARGET_RESIZED_INDEX = 1; assertEquals(EventType.TARGET_RESIZED, events.get(TARGET_RESIZED_INDEX).getType()); assertEquals(targetIndex1, ((TargetResizedEvent) events.get(TARGET_RESIZED_INDEX)).getTargetIndex()); assertEquals(6, ((TargetResizedEvent) events.get(TARGET_RESIZED_INDEX)).getNewWidth(), 1); assertEquals(7, ((TargetResizedEvent) events.get(TARGET_RESIZED_INDEX)).getNewHeight(), 1); final int TARGET_MOVED_INDEX = 2; assertEquals(EventType.TARGET_MOVED, events.get(TARGET_MOVED_INDEX).getType()); assertEquals(targetIndex1, ((TargetMovedEvent) events.get(TARGET_MOVED_INDEX)).getTargetIndex()); assertEquals(12, ((TargetMovedEvent) events.get(TARGET_MOVED_INDEX)).getNewX()); assertEquals(45, ((TargetMovedEvent) events.get(TARGET_MOVED_INDEX)).getNewY()); } @Test public void testCollapseMingledMovesAndResizes() { sessionRecorder.recordTargetMoved(cameraName, target1, 11, 20); sessionRecorder.recordTargetMoved(cameraName, target1, 12, 20); sessionRecorder.recordTargetResized(cameraName, target1, 6, 7); sessionRecorder.recordTargetMoved(cameraName, target1, 13, 20); sessionRecorder.recordTargetResized(cameraName, target1, 12, 20); sessionRecorder.recordTargetResized(cameraName, target1, 13, 20); sessionRecorder.recordTargetResized(cameraName, target1, 12, 20); sessionRecorder.recordTargetResized(cameraName, target1, 13, 40); sessionRecorder.recordTargetMoved(cameraName, target1, 12, 45); sessionRecorder.recordTargetResized(cameraName, target1, 11, 20); sessionRecorder.recordTargetResized(cameraName, target1, 12, 45); List<Event> events = sessionRecorder.getCameraEvents(cameraName); // First one is an add that was artificially inserted assertEquals(3, events.size()); final int TARGET_MOVED_INDEX = 1; assertEquals(EventType.TARGET_MOVED, events.get(TARGET_MOVED_INDEX).getType()); assertEquals(targetIndex1, ((TargetMovedEvent) events.get(TARGET_MOVED_INDEX)).getTargetIndex()); assertEquals(12, ((TargetMovedEvent) events.get(TARGET_MOVED_INDEX)).getNewX()); assertEquals(45, ((TargetMovedEvent) events.get(TARGET_MOVED_INDEX)).getNewY()); final int TARGET_RESIZED_INDEX = 2; assertEquals(EventType.TARGET_RESIZED, events.get(TARGET_RESIZED_INDEX).getType()); assertEquals(targetIndex1, ((TargetResizedEvent) events.get(TARGET_RESIZED_INDEX)).getTargetIndex()); assertEquals(12, ((TargetResizedEvent) events.get(TARGET_RESIZED_INDEX)).getNewWidth(), 1); assertEquals(45, ((TargetResizedEvent) events.get(TARGET_RESIZED_INDEX)).getNewHeight(), 1); } }