Skip to content
Snippets Groups Projects
Commit fcc0a98c authored by Lukas Köhler's avatar Lukas Köhler
Browse files

lab03 revision

parent 301426a2
No related branches found
No related tags found
No related merge requests found
......@@ -22,7 +22,7 @@ public abstract class Lab03Game {
protected Lab02EntityManager lab02EntityManager;
/**
* Setter for Lab01Data.
* Setter for Lab01Data. Do not touch this method.
*
* @param lab01Data lab01Data
*/
......@@ -31,7 +31,7 @@ public abstract class Lab03Game {
}
/**
* Setter fro Lab02EntityManager.
* Setter fro Lab02EntityManager. Do not touch this method.
*
* @param lab02EntityManager lab02EntityManager
*/
......@@ -40,68 +40,113 @@ public abstract class Lab03Game {
}
/**
* This method should create a game. For this you have to do the following things: - Ask for
* player - Ask for categories - Ask for maximum questions per category and choose questions
* Creates a new Player or retrieves it from the database.
* <p>
* This function shall try to retrieve the player with the given name playerName from the
* database. If no such player exists, it shall be created as a Java Object. It is not necessary
* to persist the Player yet.
* </p>
*
* <p>You do not have to play the game here. This should only create a game
* <p>This function is primarily used for testing. There exists a version with user interaction
* which shall be used from the menu
* </p>
*
* @return the game entity object. IMPORTANT: This has to be a entity.
* @param playerName The name for the new Player.
* @return Player object which was created or retrieved.
* @see Lab03Game#interactiveGetOrCreatePlayer()
*/
public abstract Object createGame();
public abstract Object getOrCreatePlayer(String playerName);
/**
* This should create a game with the given arguments. You do not have to read data from console.
* The game should be create only with the given arguments. You do not have to play the game
* here.
* Creates a new Player or retrieves it from the database (interactive version).
*
* @param playerName name of the player
* @param questions chosen questions
* @return a game object
* <p>
* This function shall ask the user for a player name, and then shall try to retrieve such a
* player from the database. If no such player exists, it shall be created as a Java Object. It is
* not necessary to persist the player yet.
* </p>
*
* <p>This function is primarily used for user interaction. There exists a version used for
* testing, @see getOrCreatePlayer</p>
*
* @return Player object which was created or retrieved.
* @see Lab03Game#getOrCreatePlayer(String)
*/
public abstract Object createGame(String playerName, List<Object> questions);
public abstract Object interactiveGetOrCreatePlayer();
/**
* Here you have to play the game 'game'.
* This function shall generate a random list of questions which are from the given categories.
*
* <p>Per category there shall be a certain amount of questions chosen. If a category hosts less
* questions than that amount, then all of the questions shall be chosen. Questions shall be
* randomly selected.
* </p>
*
* @param game the game that should be played
* <p>There is also an interactive version of this function which asks the user for categories
* instead of randomly selecting them.</p>
*
* @param categories A list of categories to select questions from
* @param amountOfQuestionsForCategory The amount of questions per category. If a category has
* less than this amount, then all questions of that category
* shall be selected.
* @return A List of randomly chosen Questions from the given Categories.
* @see Lab03Game#interactiveGetQuestions()
*/
public abstract void playGame(Object game);
public abstract List<?> getQuestions(List<?> categories, int amountOfQuestionsForCategory);
/**
* Simulate a game play. You do not have to read anything from console.
* This function shall generate a random list of questions after asking the user for categories.
*
* @param game given game
* <p>In this function, ask the user for categories and the number of questions per category.
* Then, randomly select questions from those categories. Choose as many questions per category as
* were entered, as long as the category has that many questions. If there are fewer questions,
* then select all of them.</p>
*
* @return A List of randomly chosen Questions from categories which the user entered.
* @see Lab03Game#getQuestions(List, int)
*/
public abstract void simulateGame(Object game);
public abstract List<?> interactiveGetQuestions();
/**
* This should return the appropriate player for the given game.
* This function creates a Game Object with the given player and questions, but without playing
* the game yet.
*
* <p>It is important that you neither play the game yet nor persist the game! This is just meant
* to create the game object.</p>
*
* @param game given game for returning player
* @return player for given game
* @param player The Player which shall play the game.
* @param questions The Questions which shall be asked during the game.
* @return A Game Object which contains an unplayed game
* for the given player with the given questions.
*/
public abstract Object getPlayer(Object game);
public abstract Object createGame(Object player, List<?> questions);
/**
* Return the player entity with given name.
* This function simulates a game play without user interaction by randomly choosing answers.
*
* <p>There is also an interactive version of this function which shall be called from the menu.
* </p>
*
* @param name name of the player
* @return the player entity
* @param game The Game Object which shall be played.
* @see Lab03Game#interactivePlayGame(Object)
*/
public abstract Object getPlayer(String name);
public abstract void playGame(Object game);
/**
* return the right answers of a played game.
* This function plays the given game with the user, that is by using user interaction.
*
* <p>This is the function that should be called from the menu. Here you can implement the
* necessary user interaction for the playing of the game.</p>
*
* @param game given game
* @return number of right answers
* @param game The Game Object which shall be played.
* @see Lab03Game#playGame(Object)
*/
public abstract int getRightAnswers(Object game);
public abstract void interactivePlayGame(Object game);
/**
* persist the game object in the database.
* Persists a played game, including the player which played it.
*
* @param game given game
* @param game The Game Object to be persisted.
*/
public abstract void persistGame(Object game);
}
......@@ -4,6 +4,7 @@ import de.hda.fbi.db2.api.Lab03Game;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.List;
/**
* MenuController Created by l.koehler on 05.08.2019.
......@@ -76,8 +77,10 @@ public class MenuController {
private void playTest() {
Lab03Game gameController = controller.getLab03Game();
Object game = gameController.createGame();
gameController.playGame(game);
Object player = gameController.interactiveGetOrCreatePlayer();
List<?> questions = gameController.interactiveGetQuestions();
Object game = gameController.createGame(player, questions);
gameController.interactivePlayGame(game);
gameController.persistGame(game);
}
......
......@@ -5,13 +5,8 @@ import de.hda.fbi.db2.api.Lab03Game;
import de.hda.fbi.db2.controller.Controller;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.EmbeddableType;
import javax.persistence.metamodel.EntityType;
import javax.persistence.metamodel.Metamodel;
import javax.persistence.metamodel.PluralAttribute;
import javax.persistence.metamodel.Type;
import org.eclipse.persistence.internal.jpa.metamodel.EntityTypeImpl;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
......@@ -79,11 +74,13 @@ public class Lab03Test {
Lab03Game gameController = controller.getLab03Game();
Lab01Data lab01Data = controller.getLab01Data();
List<Object> questions = new ArrayList<>();
questions.add(lab01Data.getQuestions().get(0));
questions.add(lab01Data.getQuestions().get(1));
Object game = gameController.createGame("PlayerName", questions);
gameController.simulateGame(game);
List<Object> categories = new ArrayList<>();
categories.add(lab01Data.getCategories().get(0));
categories.add(lab01Data.getCategories().get(1));
List<?> questions = gameController.getQuestions(categories, 2);
Object player = gameController.getOrCreatePlayer("PlayerName");
Object game = gameController.createGame(player, questions);
gameController.playGame(game);
gameController.persistGame(game);
}
......@@ -95,10 +92,12 @@ public class Lab03Test {
Lab03Game gameController = controller.getLab03Game();
Lab01Data lab01Data = controller.getLab01Data();
List<Object> questions = new ArrayList<>();
questions.add(lab01Data.getQuestions().get(0));
questions.add(lab01Data.getQuestions().get(1));
Object game = gameController.createGame("PlayerName", questions);
List<Object> categories = new ArrayList<>();
categories.add(lab01Data.getCategories().get(0));
categories.add(lab01Data.getCategories().get(1));
List<?> questions = gameController.getQuestions(categories, 2);
Object player = gameController.getOrCreatePlayer("PlayerName");
Object game = gameController.createGame(player, questions);
boolean gameFound = false;
for (EntityType<?> clazzes : metaData.getEntities()) {
......@@ -120,12 +119,7 @@ public class Lab03Test {
}
Lab03Game gameController = controller.getLab03Game();
Lab01Data lab01Data = controller.getLab01Data();
List<Object> questions = new ArrayList<>();
questions.add(lab01Data.getQuestions().get(0));
questions.add(lab01Data.getQuestions().get(1));
Object game = gameController.createGame("PlayerName", questions);
Object player = gameController.getPlayer(game);
Object player = gameController.getOrCreatePlayer("PlayerName");
boolean playerFound = false;
for (EntityType<?> clazzes : metaData.getEntities()) {
......@@ -138,62 +132,4 @@ public class Lab03Test {
Assert.fail("Could not find player class as entity");
}
}
@Test
public void test4FindReferences() {
if (metaData == null) {
Assert.fail("No MetaModel");
}
if (gameEntity == null) {
Assert.fail("No GameEntity found");
}
EntityTypeImpl questionEntity = null;
for (EntityType current : metaData.getEntities()) {
if (current.getName().toLowerCase().equals("question")) {
questionEntity = (EntityTypeImpl) current;
}
}
if (questionEntity == null) {
Assert.fail("No Question Entity found");
}
Type answerEntity = null;
for (EntityType current : metaData.getEntities()) {
if (current.getName().toLowerCase().equals("answer")) {
answerEntity = (EntityTypeImpl) current;
}
}
for (EmbeddableType embeddable : metaData.getEmbeddables()) {
if (embeddable.getJavaType().getSimpleName().toLowerCase().equals("answer")
|| embeddable.getJavaType().getSimpleName().toLowerCase().equals("answers")) {
answerEntity = embeddable;
}
}
if (answerEntity == null) {
Assert.fail("No Answer Entity found");
}
boolean correct = false;
for (Attribute attr : gameEntity.getAttributes()) {
try {
PluralAttribute plrAttr = (PluralAttribute) attr;
if (plrAttr.getElementType().getJavaType() == questionEntity.getJavaType()) {
correct = true;
}
if (plrAttr.getElementType().getJavaType() == answerEntity.getJavaType()) {
correct = true;
}
} catch (Exception ignored) {
//This is expected
}
}
if (!correct) {
Assert.fail("Could not find any right answer or question reference in game");
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment