@Test
public void testRun() {

	testController.addPlayer(user1, robot1);
	testController.addSpectator(user2);
	robot1.sendCommand(RobotCommand.setPosition(new Pose(2000, 2000, 0)));
	
	// Launch the game
	new Thread(testController).start();
	
	// Ensure game events are being propagated when robot state changes
	robot1.sendCommand(RobotCommand.moveContinuous(5));
	// Give the robot proxy time to report the position change
	try {
		Thread.sleep(500);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
	assertEquals(true, user1.getLastEvent() instanceof GameEvent);
	robot1.sendCommand(RobotCommand.stop());
	
	// Ensure that commands from the user are propagated to robots correctly
	user1.processGameplayCommand((float)0, (float)0, (float)0, "w");
	// Give the robot proxy time to receive the command
	try {
		Thread.sleep(500);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
	assertEquals(CommandType.MOVE_CONTINUOUS, robot1.getRobot().getLastCommand().getType());
	robot1.sendCommand(RobotCommand.stop());
	
	// Ensure termination works
	testController.triggerTermination();
	assertEquals(true, testController.isTerminating());
	// Give the game controller time to terminate
	try {
		Thread.sleep(1500);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
	assertEquals(null, testController.getGameModel());
}