package com.shootoff.session.io; 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; 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 com.shootoff.session.Event; import com.shootoff.session.ExerciseFeedMessageEvent; import com.shootoff.session.SessionRecorder; import com.shootoff.session.ShotEvent; import com.shootoff.session.TargetAddedEvent; import com.shootoff.session.TargetMovedEvent; import com.shootoff.session.TargetRemovedEvent; import com.shootoff.session.TargetResizedEvent; import javafx.scene.Group; public class TestSessionIO { private SessionRecorder sessionRecorder; private String cameraName1; private String cameraName2; private String videoString; private DisplayShot redShot; private DisplayShot greenShot; private String targetName; private int hitRegionIndex; private String exerciseMessage; @Before public void setUp() throws ConfigurationException { System.setProperty("shootoff.home", System.getProperty("user.dir")); System.setProperty("shootoff.sessions", System.getProperty("shootoff.home") + File.separator + "sessions"); sessionRecorder = new SessionRecorder(); cameraName1 = "Default"; cameraName2 = "Another Camera"; videoString = "camera1:test/file.mp4,camera2:what/ax.vid"; redShot = new DisplayShot(new Shot(ShotColor.RED, 10, 11, 3), 2); greenShot = new DisplayShot(new Shot(ShotColor.GREEN, 12, 15, 3), 5); targetName = "bullseye.target"; exerciseMessage = "This is a\n\t test"; Configuration config = new Configuration(new String[0]); MockCanvasManager canvasManager = new MockCanvasManager(config); TargetView target = new TargetView(new File(targetName), new Group(), new HashMap<String, String>(), canvasManager, false); canvasManager.addTarget(target); hitRegionIndex = 0; sessionRecorder.recordTargetAdded(cameraName1, target); sessionRecorder.recordTargetAdded(cameraName2, target); sessionRecorder.recordTargetResized(cameraName1, target, 10, 20); sessionRecorder.recordTargetMoved(cameraName1, target, 4, 3); sessionRecorder.recordShot(cameraName1, redShot, false, false, Optional.of(target), Optional.of(hitRegionIndex), Optional.of(videoString)); sessionRecorder.recordShot(cameraName1, greenShot, true, false, Optional.of(target), Optional.of(hitRegionIndex), Optional.of(videoString)); sessionRecorder.recordTargetRemoved(cameraName1, target); sessionRecorder.recordShot(cameraName1, greenShot, false, true, Optional.empty(), Optional.empty(), Optional.empty()); sessionRecorder.recordExerciseFeedMessage(exerciseMessage); } private void checkSession(Optional<SessionRecorder> sessionRecorder) { assertTrue(sessionRecorder.isPresent()); List<Event> events = sessionRecorder.get().getCameraEvents(cameraName1); assertEquals(8, events.size()); final int CAM1_TARGET_ADDED_INDEX = 0; assertEquals(targetName, ((TargetAddedEvent) events.get(CAM1_TARGET_ADDED_INDEX)).getTargetName()); final int CAM1_TARGET_RESIZED_INDEX = 1; assertEquals(0, ((TargetResizedEvent) events.get(CAM1_TARGET_RESIZED_INDEX)).getTargetIndex()); assertEquals(10, ((TargetResizedEvent) events.get(CAM1_TARGET_RESIZED_INDEX)).getNewWidth(), 1); assertEquals(20, ((TargetResizedEvent) events.get(CAM1_TARGET_RESIZED_INDEX)).getNewHeight(), 1); final int CAM1_TARGET_MOVED_INDEX = 2; assertEquals(0, ((TargetMovedEvent) events.get(CAM1_TARGET_MOVED_INDEX)).getTargetIndex()); assertEquals(4, ((TargetMovedEvent) events.get(CAM1_TARGET_MOVED_INDEX)).getNewX()); assertEquals(3, ((TargetMovedEvent) events.get(CAM1_TARGET_MOVED_INDEX)).getNewY()); final int CAM1_SHOT_RED_INDEX = 3; assertEquals(ShotColor.RED, ((ShotEvent) events.get(CAM1_SHOT_RED_INDEX)).getShot().getColor()); assertEquals(redShot.getX(), ((ShotEvent) events.get(CAM1_SHOT_RED_INDEX)).getShot().getX(), 1); assertEquals(redShot.getY(), ((ShotEvent) events.get(CAM1_SHOT_RED_INDEX)).getShot().getY(), 1); assertEquals(redShot.getTimestamp(), ((ShotEvent) events.get(CAM1_SHOT_RED_INDEX)).getShot().getTimestamp()); assertEquals(redShot.getMarker().getRadiusX(), ((ShotEvent) events.get(CAM1_SHOT_RED_INDEX)).getShot().getMarker().getRadiusX(), 1); assertFalse(((ShotEvent) events.get(CAM1_SHOT_RED_INDEX)).isMalfunction()); assertFalse(((ShotEvent) events.get(CAM1_SHOT_RED_INDEX)).isReload()); assertEquals(0, ((ShotEvent) events.get(CAM1_SHOT_RED_INDEX)).getTargetIndex().get().intValue()); assertEquals(hitRegionIndex, ((ShotEvent) events.get(CAM1_SHOT_RED_INDEX)).getHitRegionIndex().get().intValue()); assertEquals(videoString, ((ShotEvent) events.get(CAM1_SHOT_RED_INDEX)).getVideoString().get()); assertEquals(2, ((ShotEvent) events.get(CAM1_SHOT_RED_INDEX)).getVideos().size()); assertEquals(new File("sessions/test/file.mp4"), ((ShotEvent) events.get(CAM1_SHOT_RED_INDEX)).getVideos().get("camera1")); assertEquals(new File("sessions/what/ax.vid"), ((ShotEvent) events.get(CAM1_SHOT_RED_INDEX)).getVideos().get("camera2")); final int CAM1_SHOT_GREEN_ONE_INDEX = 4; assertEquals(ShotColor.GREEN, ((ShotEvent) events.get(CAM1_SHOT_GREEN_ONE_INDEX)).getShot().getColor()); assertEquals(greenShot.getX(), ((ShotEvent) events.get(CAM1_SHOT_GREEN_ONE_INDEX)).getShot().getX(), 1); assertEquals(greenShot.getY(), ((ShotEvent) events.get(CAM1_SHOT_GREEN_ONE_INDEX)).getShot().getY(), 1); assertEquals(greenShot.getTimestamp(), ((ShotEvent) events.get(CAM1_SHOT_GREEN_ONE_INDEX)).getShot().getTimestamp()); assertEquals(greenShot.getMarker().getRadiusX(), ((ShotEvent) events.get(CAM1_SHOT_GREEN_ONE_INDEX)).getShot().getMarker().getRadiusX(), 1); assertTrue(((ShotEvent) events.get(CAM1_SHOT_GREEN_ONE_INDEX)).isMalfunction()); assertFalse(((ShotEvent) events.get(CAM1_SHOT_GREEN_ONE_INDEX)).isReload()); assertEquals(0, ((ShotEvent) events.get(CAM1_SHOT_GREEN_ONE_INDEX)).getTargetIndex().get().intValue()); assertEquals(hitRegionIndex, ((ShotEvent) events.get(CAM1_SHOT_GREEN_ONE_INDEX)).getHitRegionIndex().get().intValue()); assertEquals(videoString, ((ShotEvent) events.get(CAM1_SHOT_GREEN_ONE_INDEX)).getVideoString().get()); assertEquals(2, ((ShotEvent) events.get(CAM1_SHOT_GREEN_ONE_INDEX)).getVideos().size()); assertEquals(new File("sessions/test/file.mp4"), ((ShotEvent) events.get(CAM1_SHOT_GREEN_ONE_INDEX)).getVideos().get("camera1")); assertEquals(new File("sessions/what/ax.vid"), ((ShotEvent) events.get(CAM1_SHOT_GREEN_ONE_INDEX)).getVideos().get("camera2")); final int CAM1_TARGET_REMOVED_INDEX = 5; assertEquals(0, ((TargetRemovedEvent) events.get(CAM1_TARGET_REMOVED_INDEX)).getTargetIndex()); final int CAM1_SHOT_GREEN_TWO_INDEX = 6; assertEquals(ShotColor.GREEN, ((ShotEvent) events.get(CAM1_SHOT_GREEN_TWO_INDEX)).getShot().getColor()); assertEquals(greenShot.getX(), ((ShotEvent) events.get(CAM1_SHOT_GREEN_TWO_INDEX)).getShot().getX(), 1); assertEquals(greenShot.getY(), ((ShotEvent) events.get(CAM1_SHOT_GREEN_TWO_INDEX)).getShot().getY(), 1); assertEquals(greenShot.getTimestamp(), ((ShotEvent) events.get(CAM1_SHOT_GREEN_TWO_INDEX)).getShot().getTimestamp()); assertEquals(greenShot.getMarker().getRadiusX(), ((ShotEvent) events.get(CAM1_SHOT_GREEN_TWO_INDEX)).getShot().getMarker().getRadiusX(), 1); assertFalse(((ShotEvent) events.get(CAM1_SHOT_GREEN_TWO_INDEX)).isMalfunction()); assertTrue(((ShotEvent) events.get(CAM1_SHOT_GREEN_TWO_INDEX)).isReload()); assertFalse(((ShotEvent) events.get(CAM1_SHOT_GREEN_TWO_INDEX)).getTargetIndex().isPresent()); assertFalse(((ShotEvent) events.get(CAM1_SHOT_GREEN_TWO_INDEX)).getHitRegionIndex().isPresent()); assertFalse(((ShotEvent) events.get(CAM1_SHOT_GREEN_TWO_INDEX)).getVideoString().isPresent()); final int CAM1_EXERCISE_MESSAGE_INDEX = 7; assertEquals(exerciseMessage, ((ExerciseFeedMessageEvent) events.get(CAM1_EXERCISE_MESSAGE_INDEX)).getMessage()); events = sessionRecorder.get().getCameraEvents(cameraName2); assertEquals(2, events.size()); final int CAM2_ADD_TARGET_INDEX = 0; assertEquals(targetName, ((TargetAddedEvent) events.get(CAM2_ADD_TARGET_INDEX)).getTargetName()); final int CAM2_EXERCISE_MESSAGE_INDEX = 1; assertEquals(exerciseMessage, ((ExerciseFeedMessageEvent) events.get(CAM2_EXERCISE_MESSAGE_INDEX)).getMessage()); } @Test public void testXMLSerialization() { File tempXMLSession = new File("temp_session.xml"); SessionIO.saveSession(sessionRecorder, tempXMLSession); Optional<SessionRecorder> sessionRecorder = SessionIO.loadSession(tempXMLSession); checkSession(sessionRecorder); if (!tempXMLSession.delete()) System.err.println("Failed to delete " + tempXMLSession.getPath()); } @Test public void testJSONSerialization() { File tempJSONSession = new File("temp_session.json"); SessionIO.saveSession(sessionRecorder, tempJSONSession); Optional<SessionRecorder> sessionRecorder = SessionIO.loadSession(tempJSONSession); checkSession(sessionRecorder); if (!tempJSONSession.delete()) System.err.println("Failed to delete " + tempJSONSession.getPath()); } }