Compare commits

..
Author SHA1 Message Date
schrom01 5ed0f38db6 fixed FileIO Test. 2022-05-13 23:54:27 +02:00
Leonardo Brandenberger 1aa05d6251 Merge remote-tracking branch 'origin/main' 2022-05-13 23:48:38 +02:00
Leonardo Brandenberger 73ba3b3b9e Created Readme 2022-05-13 23:48:13 +02:00
fassbandandGitHub Enterprise b598eb660b Merge pull request #55 from PM2-IT21bWIN-ruiz-mach-krea/testing
Testing
2022-05-13 23:48:11 +02:00
Andrin Fassbind ec256d40c6 FactoryDecoratorTest 2022-05-13 23:47:06 +02:00
Andrin Fassbind 2a8caf8efd FactoryDecoratorTest 2022-05-13 23:45:49 +02:00
Roman SchenkandGitHub Enterprise 186c389bd2 uploaded new ClassDiagram 2022-05-13 23:04:17 +02:00
Roman SchenkandGitHub Enterprise 9f745b3198 Merge pull request #54 from PM2-IT21bWIN-ruiz-mach-krea/testing
Testing
2022-05-13 23:03:37 +02:00
Andrin Fassbind 4db2c582e2 merge conflict 2022-05-13 23:03:15 +02:00
Roman SchenkandGitHub Enterprise 4392fabc38 Merge branch 'main' into testing 2022-05-13 22:59:35 +02:00
Andrin Fassbind a8a2a0a463 create FactoryTest
merged
2022-05-13 22:56:24 +02:00
Andrin Fassbind 418f583955 Merge remote-tracking branch 'origin/logging_and_docs' into testing
# Conflicts:
#	app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/Factory.java
#	app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/FactoryDecorator.java
#	app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/LogConfiguration.java
#	app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindow.java
#	app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/MainWindowController.java
#	app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/AlertNewSchedule.java
#	app/src/main/java/ch/zhaw/projekt2/turnierverwaltung/main/gameScheduleView/GameController.java
2022-05-13 22:53:30 +02:00
Andrin Fassbind 7f8de3e8f1 create FactoryTest 2022-05-13 22:35:01 +02:00
Andrin Fassbind df3fc5df2d create TeamTest 2022-05-13 22:22:39 +02:00
Andrin Fassbind 2e314497db create PlaceTest 2022-05-13 22:06:58 +02:00
Andrin Fassbind fd06e24e21 create PersonTest 2022-05-13 21:54:21 +02:00
Andrin Fassbind 2ef4c3f584 create PlayerTest 2022-05-13 21:46:31 +02:00
Andrin Fassbind 135ec7e8d5 sync TournamentTest with new changes
create GameTest
2022-05-13 21:11:33 +02:00
Andrin Fassbind c8eff00e33 Merge remote-tracking branch 'origin/main' into testing 2022-05-13 20:54:58 +02:00
Andrin Fassbind c086cf18a4 test game 2022-05-13 19:41:20 +02:00
20 changed files with 356 additions and 126 deletions
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 694 KiB

+69
View File
@@ -1 +1,70 @@
# team02-AngryNerds-projekt2-turnierverwaltung # team02-AngryNerds-projekt2-turnierverwaltung
## Tournament administration
### Documentation
> Our Tournament Administration Tool is available in german and english,
> to change the language click on start in the top left corner and then select your
> desired language under 'Sprache' or 'Language' (documentation is only provided in english).
Once you start the Programm you will be presented with the possibility to either create a new tournament or load one if one has already been saved.
>To create a new tournament simply type in the name of it and press create
>To load a tournament select the tournament on the list and click open
>You can also delete a tournament by selecting it and then clicking delete
Once a tournament has been created you will be sent to the tournament screen.
Your next step should be adding a place or players you can do so vie Edit Participants or Edit Locations.
Once you have enough Players(min 4 and only number that are 2^n e.g. 4, 8, 16...), you can click the Create game schedule button and the schedule will be created
you can then input the location where a game takes place and as well the points a team scored
the winning team will then automatically advance in the tree.
The Programm automatically saves, so no worries you won't lose your progress.
# Startup and Testing
To Start the Programm use the command
>./gradlew run
To run the tests use the command
>./gradlew test
# Branching Model
We used a simple branching model, for each new functionality or working step a new branch would be created, once a segment was finished the branch would then be reviewed by peers and be pushed into the main branch via a pull request, no direct work is usually done in the main branch.
# Class Diagramm
Our class Diagramm can be found [here](https://github.zhaw.ch/PM2-IT21bWIN-ruiz-mach-krea/team02-AngryNerds-projekt2-turnierverwaltung/blob/main/ClassDiagram.png)
# Architecture
Our Model View Pattern has been set, so that the class Tournament acts as the Model.
Each View has its own unique controller assigned
For Comprehensive Reasons all Controller Classes inherit from the abstract super class FX Controller.
The Class Tournament decorator has the purpose of communication of the controller classes with the Model of the tournament, the same Decorator also communicates with the FileIO and inherits the task of saving or importing save files into the program.
The Class Tournament Decorator always stores the Tournament that is opened in a data field.
The Factory and its associated Factory Decorators are responsible to load all the views if application is started. And to switch between the views while using the application.
The Factory decorator is placed between the controllers and the factory to enable the communication.
The Model tournament saves a List of all participants, all places and all games. Participants are implemented as an interface, since we want to be able to save a team or a single player as participant (in the prototype it is not possible to create a team).
To refresh the view of the tournament tree, each game has its own game decorator with a list of listeners.
To realize the tree there are listeners placed in the game decorators of the previous round to gather the winner and calculate the new participants of a game. Listeners are only placed
Loggers are implemented in all relevant classes
Each class creates its own logger a root logger is created in the LogConfiguration class and two Handlers are specified for use, one File Handler and one Console Handler.
The setting of those handlers can be set in the file log.properties.
We choose this architecture since it gives us the advantage to add more views without having any more code duplication.
We also think it is an advantage that the saving automatically takes place and the user does not have to take into consideration to save from time to time.
It also closely resembles what we learned already in lectures we had previously, so we were able to implement it accordingly.
# Notable Pullrequests
[Number 1](https://github.zhaw.ch/PM2-IT21bWIN-ruiz-mach-krea/team02-AngryNerds-projekt2-turnierverwaltung/pull/22)
[Number 2](https://github.zhaw.ch/PM2-IT21bWIN-ruiz-mach-krea/team02-AngryNerds-projekt2-turnierverwaltung/pull/20)
@@ -8,7 +8,6 @@ import javafx.scene.control.Label;
import javafx.scene.layout.*; import javafx.scene.layout.*;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import javafx.scene.text.Font; import javafx.scene.text.Font;
import java.io.IOException; import java.io.IOException;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -70,7 +69,7 @@ public class Factory {
view.loadView(tournamentDecorator, fileIO, factoryDecorator, pane); view.loadView(tournamentDecorator, fileIO, factoryDecorator, pane);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
logger.warning("failed to load views."); //TODO Handle and logging.
} }
} }
} }
@@ -82,7 +81,6 @@ public class Factory {
public void showTournamentList(BorderPane pane) { public void showTournamentList(BorderPane pane) {
tournamentDecorator.setTournament(null); tournamentDecorator.setTournament(null);
setCenterOfBorderPane(pane, View.tournamentList); setCenterOfBorderPane(pane, View.tournamentList);
logger.fine("showing Tournament List");
} }
/** /**
@@ -91,7 +89,6 @@ public class Factory {
*/ */
public void showParticipantFormular(BorderPane pane) { public void showParticipantFormular(BorderPane pane) {
setCenterOfBorderPane(pane, View.participantFormular); setCenterOfBorderPane(pane, View.participantFormular);
logger.fine("showing Participant Formular");
} }
/** /**
@@ -100,7 +97,6 @@ public class Factory {
*/ */
public void showPlacesFormular(BorderPane pane) { public void showPlacesFormular(BorderPane pane) {
setCenterOfBorderPane(pane, View.placesFormular); setCenterOfBorderPane(pane, View.placesFormular);
logger.fine("showing Places Formular");
} }
/** /**
@@ -109,7 +105,6 @@ public class Factory {
*/ */
public void showGameScheduler(BorderPane pane) { public void showGameScheduler(BorderPane pane) {
setCenterOfBorderPane(pane, View.gameScheduler); setCenterOfBorderPane(pane, View.gameScheduler);
logger.fine("showing Game Scheduler");
} }
/** /**
@@ -136,7 +131,6 @@ public class Factory {
box.getChildren().add(loader.load()); box.getChildren().add(loader.load());
GameController controller = loader.getController(); GameController controller = loader.getController();
controller.setup(tournamentDecorator, fileIO, factoryDecorator, box, gameDecorator, languageConfigurator); controller.setup(tournamentDecorator, fileIO, factoryDecorator, box, gameDecorator, languageConfigurator);
logger.fine("loaded game view");
return controller; return controller;
} catch (IOException e) { } catch (IOException e) {
logger.warning("Fatal error program can not continue after this: " + e ); logger.warning("Fatal error program can not continue after this: " + e );
@@ -152,7 +146,6 @@ public class Factory {
* @param error true if it's a error message. * @param error true if it's a error message.
*/ */
public void printMessageToFooter(BorderPane pane, String msg, boolean error) { public void printMessageToFooter(BorderPane pane, String msg, boolean error) {
logger.fine("message is printed to footer of window.");
VBox bottom = (VBox) pane.getBottom(); VBox bottom = (VBox) pane.getBottom();
Label label = new Label(); Label label = new Label();
VBox innerVbox; VBox innerVbox;
@@ -175,8 +168,6 @@ public class Factory {
innerVbox.getChildren().add(label); innerVbox.getChildren().add(label);
} }
} }
/** /**
@@ -185,7 +176,6 @@ public class Factory {
* @param error true if the error message should be cleared. * @param error true if the error message should be cleared.
*/ */
public void resetFooter(BorderPane pane,boolean error) { public void resetFooter(BorderPane pane,boolean error) {
logger.fine("messages are removed from footer of window.");
VBox bottom = (VBox) pane.getBottom(); VBox bottom = (VBox) pane.getBottom();
VBox vBox; VBox vBox;
if (error) { if (error) {
@@ -109,6 +109,7 @@ public class FactoryDecorator implements IsObservable {
logger.warning("Failed to open tournament file Error: " + e); logger.warning("Failed to open tournament file Error: " + e);
printMessageToFooter("Fehler beim lesen der Datei.", true); printMessageToFooter("Fehler beim lesen der Datei.", true);
String msg = factory.getLanguageConfigurator().getSelectedLanguage("IOException"); String msg = factory.getLanguageConfigurator().getSelectedLanguage("IOException");
logger.warning("Failed to open tournament file Error: " + e);
printMessageToFooter(msg, true); printMessageToFooter(msg, true);
} }
} }
@@ -140,20 +141,11 @@ public class FactoryDecorator implements IsObservable {
informListener(); informListener();
} }
/**
* Initializes the view of gameSchedule
*/
public void openScheduleView() { public void openScheduleView() {
factory.showGameScheduler((BorderPane) pane); factory.showGameScheduler((BorderPane) pane);
informListener(); informListener();
} }
/**
* Method to load all game views to show.
* @param hBoxCenter the box where the games should be shown.
* @param tournamentDecorator the tournamentDecorator to communicate to tournament
* @param treeView true if the games should be arranged like a tree.
*/
public void loadGameList(HBox hBoxCenter, TournamentDecorator tournamentDecorator, boolean treeView) { public void loadGameList(HBox hBoxCenter, TournamentDecorator tournamentDecorator, boolean treeView) {
hBoxCenter.getChildren().clear(); hBoxCenter.getChildren().clear();
@@ -203,13 +195,6 @@ public class FactoryDecorator implements IsObservable {
} }
} }
/**
* Method to draw the lines between the game views in the tree view.
* @param gameVBox the box with the games where lines should be drawn.
* @param gameBoxHeight the heigth of a single game box.
* @param lineLength the length of the horizontal lines.
* @return a box which contains the drawn lines.
*/
public VBox drawLines(VBox gameVBox, double gameBoxHeight, double lineLength) { public VBox drawLines(VBox gameVBox, double gameBoxHeight, double lineLength) {
VBox completeLineVBox = new VBox(); VBox completeLineVBox = new VBox();
completeLineVBox.setAlignment(Pos.CENTER_LEFT); completeLineVBox.setAlignment(Pos.CENTER_LEFT);
@@ -243,8 +228,8 @@ public class FactoryDecorator implements IsObservable {
/** /**
* Method Initializes the Game View, in order to do that a vbox is needed and the gameDecorator * Method Initializes the Game View, in order to do that a vbox is needed and the gameDecorator
* @param vBox used for display * @param vBox used for display
* @param gameDecorator the gameDecorator Object to communicate with game * @param gameDecorator
* @return the controller of the loaded game view. * @return
*/ */
public GameController openGameView(VBox vBox, GameDecorator gameDecorator) { public GameController openGameView(VBox vBox, GameDecorator gameDecorator) {
@@ -271,10 +256,9 @@ public class FactoryDecorator implements IsObservable {
factory.resetFooter((BorderPane) pane, error); factory.resetFooter((BorderPane) pane, error);
} }
/**
* getter Method of languageConfigurator
* @return the languageConfigurator object.
*/
public LanguageConfigurator getLanguageConfigurator() { public LanguageConfigurator getLanguageConfigurator() {
return factory.getLanguageConfigurator(); return factory.getLanguageConfigurator();
} }
@@ -2,7 +2,6 @@ package ch.zhaw.projekt2.turnierverwaltung;
import javafx.scene.control.Labeled; import javafx.scene.control.Labeled;
import javafx.scene.control.MenuItem; import javafx.scene.control.MenuItem;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -103,11 +102,9 @@ public class LanguageConfigurator {
englishDictionary.put("participantNotExist","Participant does not exist"); englishDictionary.put("participantNotExist","Participant does not exist");
germanDictionary.put("placeNotExist","Teilnehmer existiert nicht"); germanDictionary.put("placeNotExist","Teilnehmer existiert nicht");
englishDictionary.put("placeNotExist","Participant does not exist"); englishDictionary.put("placeNotExist","Participant does not exist");
//SaveMsg //SaveMsg
germanDictionary.put("save","Zuletzt gespeichert: "); germanDictionary.put("save","Zuletzt gespeichert: ");
englishDictionary.put("save","Last saved: "); englishDictionary.put("save","Last saved: ");
//Alert //Alert
germanDictionary.put("yes","Ja"); germanDictionary.put("yes","Ja");
englishDictionary.put("yes","Yes"); englishDictionary.put("yes","Yes");
@@ -119,7 +116,6 @@ public class LanguageConfigurator {
englishDictionary.put("headerDelete","Delete Tournament?"); englishDictionary.put("headerDelete","Delete Tournament?");
germanDictionary.put("contentDelete","Sind Sie sicher, dass sie das Turnier entfernen wollen?\nNach diesem Vorgang kann es nicht wiederhergestellt werden."); germanDictionary.put("contentDelete","Sind Sie sicher, dass sie das Turnier entfernen wollen?\nNach diesem Vorgang kann es nicht wiederhergestellt werden.");
englishDictionary.put("contentDelete","Are you shure you want to delete the tournament?\nAfter that there is no way to restore."); englishDictionary.put("contentDelete","Are you shure you want to delete the tournament?\nAfter that there is no way to restore.");
germanDictionary.put("titleSchedule","Neu erstellen"); germanDictionary.put("titleSchedule","Neu erstellen");
englishDictionary.put("titleSchedule","Create new"); englishDictionary.put("titleSchedule","Create new");
germanDictionary.put("headerSchedule","Spielplan neu erstellen?"); germanDictionary.put("headerSchedule","Spielplan neu erstellen?");
@@ -4,7 +4,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.logging.Logger; import java.util.logging.Logger;
/** /**
* Class Team represents a team that can be added to a tournament * Class Team represents a team that can be added to a tournament
* (in the prototype there is no functionality for the team) * (in the prototype there is no functionality for the team)
@@ -1,7 +1,6 @@
package ch.zhaw.projekt2.turnierverwaltung; package ch.zhaw.projekt2.turnierverwaltung;
import javafx.application.Platform; import javafx.application.Platform;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
@@ -9,8 +8,6 @@ import java.util.List;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
public class TournamentDecorator implements IsObservable{ public class TournamentDecorator implements IsObservable{
private Tournament tournament; private Tournament tournament;
@@ -19,84 +16,48 @@ public class TournamentDecorator implements IsObservable{
private ExecutorService executorService; private ExecutorService executorService;
private FactoryDecorator factoryDecorator; private FactoryDecorator factoryDecorator;
private static final Logger logger = Logger.getLogger(TournamentDecorator.class.getCanonicalName());
/**
* Constructor to initialize TournamentDecorator
* adds a listener to save the tournament every time if something is changed.
* creates a executer service to do the saving process in separate thread for better performance.
* @param fileIO
*/
public TournamentDecorator(FileIO fileIO){ public TournamentDecorator(FileIO fileIO){
logger.fine("initializing TournamentDecorator");
setFileIO(fileIO); setFileIO(fileIO);
addListener(new IsObserver() { addListener(new IsObserver() {
@Override @Override
public void update() { public void update() {
if(tournament != null){ if(tournament != null){
saveTournament(); saveTournament();
logger.fine("listener to save tournament was added");
} }
} }
}); });
executorService = Executors.newFixedThreadPool(1); executorService = Executors.newFixedThreadPool(1);
} }
/**
* Setter method of FactoryDecorator
* @param factoryDecorator the factory decorator to load different views.
*/
public void setFactoryDecorator(FactoryDecorator factoryDecorator) { public void setFactoryDecorator(FactoryDecorator factoryDecorator) {
this.factoryDecorator = factoryDecorator; this.factoryDecorator = factoryDecorator;
} }
/**
* Setter Method of FileIO
* @param fileIO the fileIO object to read and save to files.
*/
public void setFileIO(FileIO fileIO) { public void setFileIO(FileIO fileIO) {
this.fileIO = fileIO; this.fileIO = fileIO;
} }
/**
* setter Method of Tournament
* @param tournament the new Tournament Object which was selected by user.
*/
public void setTournament(Tournament tournament) { public void setTournament(Tournament tournament) {
this.tournament = tournament; this.tournament = tournament;
} }
/**
* getter Method of Tournament
* @return the actual tournament which is open.
*/
public Tournament getTournament() { public Tournament getTournament() {
return tournament; return tournament;
} }
/**
* Method to add a listener in list.
* @param observer the observer object which should be informed.
*/
@Override @Override
public void addListener(IsObserver observer) { public void addListener(IsObserver observer) {
listener.add(observer); listener.add(observer);
} }
/**
* Method to remove a listener from list.
* @param observer the object to remove.
*/
@Override @Override
public void removeListener(IsObserver observer) { public void removeListener(IsObserver observer) {
listener.remove(observer); listener.remove(observer);
} }
/**
* Method to save the actual tournament to files.
*/
public void saveTournament(){ public void saveTournament(){
logger.fine("Saving Tournament to File.");
executorService.execute(new saveTask()); executorService.execute(new saveTask());
factoryDecorator.clearMessage(false); factoryDecorator.clearMessage(false);
String msg = factoryDecorator.getLanguageConfigurator().getSelectedLanguage("save"); String msg = factoryDecorator.getLanguageConfigurator().getSelectedLanguage("save");
@@ -104,49 +65,40 @@ public class TournamentDecorator implements IsObservable{
} }
/**
* Method to create a new Tournament. It checks if the name is valid, creates a new instance of Tournament and calls
* FileIO to save the new Tournament.
* @param name The name which was entered by the user.
* @param type The type of Tournament
*/
public void createTournament(String name, Tournament.Type type){ public void createTournament(String name, Tournament.Type type){
try { try {
if(fileIO.tournamentExists(name)){ if(fileIO.tournamentExists(name)){
logger.warning("a tournament with name " + name + "exists already."); //TODO:Logger
String msg = factoryDecorator.getLanguageConfigurator().getSelectedLanguage("tournamentExists"); String msg = factoryDecorator.getLanguageConfigurator().getSelectedLanguage("tournamentExists");
factoryDecorator.printMessageToFooter(msg, true); factoryDecorator.printMessageToFooter(msg, true);
return; return;
} }
Tournament tournament = new Tournament(name, type); Tournament tournament = new Tournament(name, type);
logger.fine("new tournament instance was created.");
fileIO.saveTournament(tournament); fileIO.saveTournament(tournament);
logger.fine("new Tournament File is saved.");
factoryDecorator.clearMessage(true); factoryDecorator.clearMessage(true);
informListener(); informListener();
} catch (InvalidNameException e) { } catch (InvalidNameException e) {
e.printStackTrace(); e.printStackTrace();
logger.warning("The name which was entered is invalid."); //TODO: Logger
String msg = factoryDecorator.getLanguageConfigurator().getSelectedLanguage("invalidName"); String msg = factoryDecorator.getLanguageConfigurator().getSelectedLanguage("invalidName");
factoryDecorator.printMessageToFooter(msg, true); factoryDecorator.printMessageToFooter(msg, true);
} catch (Tournament.InvalidTypeException e) { } catch (Tournament.InvalidTypeException e) {
e.printStackTrace(); e.printStackTrace();
logger.warning("The selected type of tournament is not valid."); //TODO: Logger
String msg = factoryDecorator.getLanguageConfigurator().getSelectedLanguage("invalidMode"); String msg = factoryDecorator.getLanguageConfigurator().getSelectedLanguage("invalidMode");
factoryDecorator.printMessageToFooter(msg, true); factoryDecorator.printMessageToFooter(msg, true);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
logger.warning("Creating a new Tournament File was failed."); //TODO: Logger
String msg = factoryDecorator.getLanguageConfigurator().getSelectedLanguage("IOException"); String msg = factoryDecorator.getLanguageConfigurator().getSelectedLanguage("IOException");
factoryDecorator.printMessageToFooter(msg, true); factoryDecorator.printMessageToFooter(msg, true);
} }
} }
/**
* Method to delete a Tournament File
* @param tournamentFile The File which should be deleted.
*/
public void deleteTournament(FileIO.TournamentFile tournamentFile){ public void deleteTournament(FileIO.TournamentFile tournamentFile){
try { try {
fileIO.deleteTournament(tournamentFile); fileIO.deleteTournament(tournamentFile);
@@ -159,11 +111,8 @@ public class TournamentDecorator implements IsObservable{
} }
} }
/**
* Method to create the list of games. The participants are entered in random order.
*/
public void createNewGameSchedule() { public void createNewGameSchedule() {
logger.fine("Creating new Game Schedule"); //TODO: logging
try { try {
tournament.createGameSchedule(); tournament.createGameSchedule();
factoryDecorator.clearMessage(true); factoryDecorator.clearMessage(true);
@@ -171,7 +120,6 @@ public class TournamentDecorator implements IsObservable{
e.printStackTrace(); e.printStackTrace();
String msg = factoryDecorator.getLanguageConfigurator().getSelectedLanguage("numberParticipant"); String msg = factoryDecorator.getLanguageConfigurator().getSelectedLanguage("numberParticipant");
factoryDecorator.printMessageToFooter(msg, true); factoryDecorator.printMessageToFooter(msg, true);
logger.warning("Failed to create Game Schedule. The number of Participants is invalid.");
} }
informListener(); informListener();
} }
@@ -21,7 +21,6 @@ public class MainWindow extends Application {
private Factory factory = new Factory(fileIO, tournamentDecorator, languageConfigurator); private Factory factory = new Factory(fileIO, tournamentDecorator, languageConfigurator);
private static final Logger logger = Logger.getLogger(FileIO.class.getCanonicalName()); private static final Logger logger = Logger.getLogger(FileIO.class.getCanonicalName());
/** /**
* Start method used to initialize the main window and load it's needed component * Start method used to initialize the main window and load it's needed component
* Also sets the scene and set some values like min width and height * Also sets the scene and set some values like min width and height
@@ -7,6 +7,7 @@ import javafx.fxml.FXML;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.Menu; import javafx.scene.control.Menu;
import javafx.scene.control.MenuItem; import javafx.scene.control.MenuItem;
import java.util.logging.Logger;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -36,11 +37,13 @@ public class MainWindowController extends FXController {
@FXML @FXML
void changeLangToGerman() { void changeLangToGerman() {
getLanguageConfigurator().changeLanguage(LanguageConfigurator.Language.GERMAN); getLanguageConfigurator().changeLanguage(LanguageConfigurator.Language.GERMAN);
logger.fine("language setting changed to german");
} }
@FXML @FXML
void changeLangToEnglish() { void changeLangToEnglish() {
getLanguageConfigurator().changeLanguage(LanguageConfigurator.Language.ENGLISH); getLanguageConfigurator().changeLanguage(LanguageConfigurator.Language.ENGLISH);
logger.fine("language setting changed to english");
} }
/** /**
@@ -63,7 +66,9 @@ public class MainWindowController extends FXController {
} }
/**
* There is no content to load
*/
@Override @Override
public void loadContent() { public void loadContent() {
} }
@@ -6,6 +6,9 @@ import ch.zhaw.projekt2.turnierverwaltung.LanguageConfigurator;
import javafx.scene.control.Alert; import javafx.scene.control.Alert;
import javafx.scene.control.ButtonBar; import javafx.scene.control.ButtonBar;
import javafx.scene.control.ButtonType; import javafx.scene.control.ButtonType;
/**
* Class that is used to display the popup window to confirm a sensitive action of the user.
*/
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -23,6 +26,9 @@ public class AlertNewSchedule extends Alert {
private String headerDelete; private String headerDelete;
private String contentDelete; private String contentDelete;
/**
* Popup to ask the user if he is sure that he wants to reshuffle the game board.
*/
public AlertNewSchedule(LanguageConfigurator languageConfigurator){ public AlertNewSchedule(LanguageConfigurator languageConfigurator){
super(Alert.AlertType.WARNING); super(Alert.AlertType.WARNING);
yes = languageConfigurator.getSelectedLanguage("yes"); yes = languageConfigurator.getSelectedLanguage("yes");
@@ -45,7 +45,7 @@ public class GameController extends FXController{
} }
@FXML @FXML
void saveGameResult(Event event) { void saveGameResult() {
gameDecorator.saveGameResult(pointsTeamOne.getText(), pointsTeamTwo.getText()); gameDecorator.saveGameResult(pointsTeamOne.getText(), pointsTeamTwo.getText());
} }
@@ -0,0 +1,38 @@
package ch.zhaw.projekt2.turnierverwaltung;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import org.junit.jupiter.api.Test;
import org.mockito.InOrder;
import org.mockito.Mockito;
import java.io.IOException;
import static org.junit.jupiter.api.Assertions.fail;
import static org.mockito.Mockito.inOrder;
public class FactoryDecoratorTest {
private FactoryDecorator factoryDecorator;
@Test
void test() {
FileIO io = Mockito.mock(FileIO.class);
Factory fc = Mockito.mock(Factory.class);
Pane pn = Mockito.mock(BorderPane.class);
FileIO.TournamentFile tf = Mockito.mock(FileIO.TournamentFile.class);
factoryDecorator = new FactoryDecorator(io,fc,pn);
factoryDecorator.openTournament(tf);
InOrder order = inOrder(io,fc,pn);
try {
order.verify(fc).setTournament(io.loadTournament(tf));
order.verify(fc).showGameScheduler((BorderPane) pn);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
fail();
}
}
}
@@ -0,0 +1,41 @@
package ch.zhaw.projekt2.turnierverwaltung;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
public class GameTest {
private Game game;
@Test
@DisplayName("TestWinner")
void testWinnerFunction() {
Participant one = Mockito.mock(Player.class);
Participant two = Mockito.mock(Player.class);
game = new Game(one,two);
game.setPoints1(1);
Assertions.assertEquals(one,game.getWinner());
game.setPoints2(2);
Assertions.assertEquals(two,game.getWinner());
}
@Test
@DisplayName("Test refresh Participant")
void refreshTest() {
Participant one = Mockito.mock(Player.class);
Participant two = Mockito.mock(Player.class);
Game game1 = new Game(one,two);
Game game2 = new Game(one,two);
game = new Game(game1,game2);
game1.setPoints1(2);
game2.setPoints2(2);
Assertions.assertNull(game.getParticipant1());
Assertions.assertNull(game.getParticipant2());
game.refreshParticipants();
Assertions.assertEquals(one,game.getParticipant1());
Assertions.assertEquals(two,game.getParticipant2());
}
}
@@ -0,0 +1,18 @@
package ch.zhaw.projekt2.turnierverwaltung;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class LanguageTest {
@Test
@DisplayName("Test Dictionary")
void test() {
LanguageConfigurator languageConfigurator = new LanguageConfigurator();
Assertions.assertEquals("Ja",languageConfigurator.getSelectedLanguage("yes"));
languageConfigurator.changeLanguage(LanguageConfigurator.Language.ENGLISH);
Assertions.assertEquals("Yes",languageConfigurator.getSelectedLanguage("yes"));
}
}
@@ -0,0 +1,25 @@
package ch.zhaw.projekt2.turnierverwaltung;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class PersonTest {
private Person person;
@Test
@DisplayName("Test invalid Parameter")
void invalidParams() {
try {
assertThrows(Person.InvalidPhoneNumberException.class,()->new Person("A","a",".sad"));
person = new Person("A","A","");
assertEquals("A", person.getFirstName());
assertEquals("A", person.getName());
assertEquals("", person.getPhoneNumber());
} catch (InvalidNameException | Person.InvalidPhoneNumberException e) {
fail();
}
}
}
@@ -0,0 +1,36 @@
package ch.zhaw.projekt2.turnierverwaltung;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class PlaceTest {
private Place place;
@Test
@DisplayName("Test Params")
void paramTest() {
Assertions.assertThrows(InvalidNameException.class, () -> new Place("*"));
try {
place = new Place("placeA");
assertEquals("placeA", place.getName());
} catch (InvalidNameException e) {
fail();
}
}
@Test
@DisplayName("Place Equals Test")
void testEqual() {
try {
place = new Place("placeA");
assertTrue(place.equals(place));
assertTrue(place.equals(new Place("placeA")));
assertFalse(place.equals(new Place("nads")));
} catch (InvalidNameException e) {
fail();
}
}
}
@@ -0,0 +1,39 @@
package ch.zhaw.projekt2.turnierverwaltung;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class PlayerTest {
private Player player;
@Test
@DisplayName("Test invalid Parameter")
void invalidParams() {
try {
assertThrows(Person.InvalidPhoneNumberException.class,()->new Player("A","a",".sad",""));
assertThrows(Player.InvalidDateException.class,()->new Player("A","a","","a"));
player = new Player("A","A","","");
assertEquals("A",player.getFirstName());
assertEquals("A",player.getName());
assertEquals("",player.getPhoneNumber());
assertNull(player.getDateOfBirth());
} catch (InvalidNameException | Person.InvalidPhoneNumberException | Player.InvalidDateException e) {
fail();
}
}
@Test
@DisplayName("Test equals")
void equalsTest() {
try {
player = new Player("A","A","","");
assertTrue(player.equals(player));
assertFalse(player.equals(new Player("B", "D", "", "")));
assertTrue(player.equals(new Player("A", "A", "", "")));
} catch (InvalidNameException | Person.InvalidPhoneNumberException | Player.InvalidDateException e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,31 @@
package ch.zhaw.projekt2.turnierverwaltung;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
public class TeamTest {
private Team team;
@Test
@DisplayName("Team Params")
void testParams() {
Player player = Mockito.mock(Player.class);
team = new Team("Team1");
for (int i = 0; i < 3; i++) {
Assertions.assertEquals(i,team.getPlayers().size());
team.addPlayer(player);
}
}
@Test
@DisplayName("Team Equals")
void equalTeam() {
team = new Team("A");
Assertions.assertTrue(team.equals(team));
Assertions.assertTrue(team.equals(new Team("A")));
Assertions.assertFalse(team.equals(new Team("B")));
}
}
@@ -44,20 +44,21 @@ public class TournamentTest {
//Checks if one Participant gets added //Checks if one Participant gets added
Participant participantOne = Mockito.mock(Player.class); Participant participantOne = Mockito.mock(Player.class);
when(participantOne.equals(any(Participant.class))).thenReturn(false); when(participantOne.equals(any(Participant.class))).thenReturn(false);
try {
assertEquals(0, tournament.getParticipants().size()); assertEquals(0, tournament.getParticipants().size());
tournament.saveParticipant(participantOne); tournament.saveParticipant(participantOne);
assertEquals(1, tournament.getParticipants().size()); assertEquals(1, tournament.getParticipants().size());
//Checks if a second Participant gets added //Checks if a second Participant gets added
Participant participantTwo = Mockito.mock(Player.class); Participant participantTwo = Mockito.mock(Player.class);
tournament.saveParticipant(participantTwo); tournament.saveParticipant(participantTwo);
assertEquals(2, tournament.getParticipants().size()); assertEquals(2, tournament.getParticipants().size());
//Checks if a allready added Particpant does not get added //Checks if a allready added Particpant does not get added
when(participantOne.equals(any(Participant.class))).thenReturn(true); when(participantOne.equals(any(Participant.class))).thenReturn(true);
tournament.saveParticipant(participantTwo); tournament.saveParticipant(participantTwo);
assertEquals(2, tournament.getParticipants().size()); assertEquals(2, tournament.getParticipants().size());
} catch (Person.InvalidPhoneNumberException e) {
fail();
}
} }
@@ -69,13 +70,13 @@ public class TournamentTest {
//Checks if Error is thrown if Participant not in list //Checks if Error is thrown if Participant not in list
assertThrows(Tournament.ParticipantNotExistsException.class, () -> tournament.removeParticipant(participant)); assertThrows(Tournament.ParticipantNotExistsException.class, () -> tournament.removeParticipant(participant));
try {
//Checks if participant gets removed //Checks if participant gets removed
tournament.saveParticipant(participant); tournament.saveParticipant(participant);
assertEquals(1, tournament.getParticipants().size()); assertEquals(1, tournament.getParticipants().size());
try {
tournament.removeParticipant(participant); tournament.removeParticipant(participant);
assertEquals(0, tournament.getParticipants().size()); assertEquals(0, tournament.getParticipants().size());
} catch (Tournament.ParticipantNotExistsException e) { } catch (Tournament.ParticipantNotExistsException | Person.InvalidPhoneNumberException e) {
fail(); fail();
} }
} }
@@ -126,13 +127,18 @@ public class TournamentTest {
tournament.createGameSchedule(); tournament.createGameSchedule();
assertEquals(2, tournament.getGameList().size()); assertEquals(2, tournament.getGameList().size());
tournament.saveParticipant(participant); tournament.saveParticipant(participant);
} catch (Tournament.NumberOfParticipantInvalidException e) { } catch (Tournament.NumberOfParticipantInvalidException | Person.InvalidPhoneNumberException e) {
fail(); fail();
} }
} else { } else {
assertThrows(Tournament.NumberOfParticipantInvalidException.class, () -> tournament.createGameSchedule()); assertThrows(Tournament.NumberOfParticipantInvalidException.class, () -> tournament.createGameSchedule());
try {
tournament.saveParticipant(participant); tournament.saveParticipant(participant);
} catch (Person.InvalidPhoneNumberException e) {
e.printStackTrace();
}
} }
} }
try { try {