From a456a3ac8bedf1c828f452cbd759e796989c35d8 Mon Sep 17 00:00:00 2001
From: EspenTinius
Date: Wed, 27 May 2026 08:50:47 +0200
Subject: [PATCH 1/7] Enhetstest
---
.../mappe/service/SaveGameServiceTest.java | 449 ++++++++++++++++++
1 file changed, 449 insertions(+)
create mode 100644 src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/service/SaveGameServiceTest.java
diff --git a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/service/SaveGameServiceTest.java b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/service/SaveGameServiceTest.java
new file mode 100644
index 0000000..bdd9487
--- /dev/null
+++ b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/service/SaveGameServiceTest.java
@@ -0,0 +1,449 @@
+package edu.ntnu.idi.idatt2003.g40.mappe.service;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import edu.ntnu.idi.idatt2003.g40.mappe.model.OwnedShareData;
+import edu.ntnu.idi.idatt2003.g40.mappe.model.SaveGame;
+import edu.ntnu.idi.idatt2003.g40.mappe.model.Stock;
+import edu.ntnu.idi.idatt2003.g40.mappe.model.TransactionData;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+/**
+ * Test class for {@link SaveGameService}.
+ *
+ *
+ * Each test uses a fresh {@link TempDir} so the on-disk state is
+ * fully isolated from the real saves directory and from other tests.
+ *
+ */
+class SaveGameServiceTest {
+
+ /**
+ * Temporary directory used as the saves folder for each test.
+ */
+ @TempDir
+ private Path tempDir;
+
+ /**
+ * Service under test, pointed at {@link #tempDir}.
+ */
+ private SaveGameService testService;
+
+ /**
+ * A populated {@link SaveGame} used as a baseline for write/read tests.
+ */
+ private SaveGame testSaveGame;
+
+ @BeforeEach
+ void setUp() {
+ testService = new SaveGameService(tempDir.toString());
+
+ List ownedShares = List.of(
+ new OwnedShareData("AAPL",
+ new BigDecimal("5"),
+ new BigDecimal("150.00")),
+ new OwnedShareData("NVID",
+ new BigDecimal("2"),
+ new BigDecimal("241.59")));
+
+ List transactions = List.of(
+ new TransactionData(TransactionType.PURCHASE,
+ "AAPL",
+ new BigDecimal("5"),
+ new BigDecimal("150.00"),
+ 1),
+ new TransactionData(TransactionType.SALE,
+ "NVID",
+ new BigDecimal("1"),
+ new BigDecimal("245.00"),
+ 2));
+
+ Stock apple = new Stock("AAPL", "Apple Inc", new BigDecimal("150.00"));
+ apple.addNewSalesPrice(new BigDecimal("152.30"));
+ apple.addNewSalesPrice(new BigDecimal("155.25"));
+ apple.setFortune(1.5);
+
+ Stock nvidia = new Stock("NVID", "Nvidia Corporation",
+ new BigDecimal("241.59"));
+ nvidia.addNewSalesPrice(new BigDecimal("245.00"));
+
+ List exchangeStocks = List.of(apple, nvidia);
+
+ List netWorthHistory = List.of(
+ new BigDecimal("10000.00"),
+ new BigDecimal("10026.25"),
+ new BigDecimal("10125.75"));
+
+ testSaveGame = new SaveGame("MySave",
+ 10026.25,
+ 10000.00,
+ null,
+ 3,
+ ownedShares,
+ transactions,
+ exchangeStocks,
+ netWorthHistory);
+ }
+
+ @Test
+ void saveGameWritesFileWithSanitisedName() throws IOException {
+ SaveGame messyName = new SaveGame("My Save / Game!",
+ 500, 500, null);
+
+ testService.saveGame(messyName);
+
+ // Slashes, spaces and exclamation marks become underscores.
+ Path expected = tempDir.resolve("My_Save___Game_.json");
+ assertTrue(Files.isRegularFile(expected),
+ "Expected sanitised file to exist at " + expected);
+ }
+
+ @Test
+ void saveGameCreatesDirectoryWhenItDoesNotExist() throws IOException {
+ Path nested = tempDir.resolve("nested").resolve("saves");
+ SaveGameService nestedService = new SaveGameService(nested.toString());
+
+ nestedService.saveGame(new SaveGame("Nested", 100, 100, null));
+
+ assertTrue(Files.isDirectory(nested),
+ "Saves directory should be auto-created");
+ assertTrue(Files.isRegularFile(nested.resolve("Nested.json")));
+ }
+
+ @Test
+ void saveGameThrowsExceptionOnNullSave() {
+ assertThrows(IllegalArgumentException.class,
+ () -> testService.saveGame(null));
+ }
+
+ @Test
+ void saveGameWritesAndReadsBackPaddedName() throws IOException {
+ SaveGame padded = new SaveGame(" Padded ", 100, 100, null);
+
+ testService.saveGame(padded);
+
+ Path expected = tempDir.resolve("Padded.json");
+ assertTrue(Files.isRegularFile(expected),
+ "Expected trimmed file name on disk");
+ }
+
+ @Test
+ void saveExistsReturnsTrueAfterWritingAndFalseOtherwise()
+ throws IOException {
+ assertFalse(testService.saveExists("MySave"));
+
+ testService.saveGame(testSaveGame);
+
+ assertTrue(testService.saveExists("MySave"));
+ assertFalse(testService.saveExists("DoesNotExist"));
+ }
+
+ @Test
+ void saveExistsReturnsFalseForNullOrBlankName() {
+ assertFalse(testService.saveExists(null));
+ assertFalse(testService.saveExists(""));
+ assertFalse(testService.saveExists(" "));
+ }
+
+ @Test
+ void loadSavesReturnsEmptyListWhenDirectoryMissing() {
+ SaveGameService missingDirService = new SaveGameService(
+ tempDir.resolve("does-not-exist").toString());
+
+ List result = missingDirService.loadSaves();
+
+ assertNotNull(result);
+ assertTrue(result.isEmpty());
+ }
+
+ @Test
+ void loadSavesIgnoresFilesWithNonJsonExtensions() throws IOException {
+ Files.writeString(tempDir.resolve("notes.txt"),
+ "this should be ignored", StandardCharsets.UTF_8);
+ testService.saveGame(testSaveGame);
+
+ List loaded = testService.loadSaves();
+
+ assertEquals(1, loaded.size());
+ assertEquals("MySave", loaded.get(0).getName());
+ }
+
+ @Test
+ void loadSavesSkipsMalformedJsonFilesAndKeepsValidOnes()
+ throws IOException {
+ testService.saveGame(testSaveGame);
+ Files.writeString(tempDir.resolve("broken.json"),
+ "this is not valid json", StandardCharsets.UTF_8);
+ Files.writeString(tempDir.resolve("empty.json"),
+ "", StandardCharsets.UTF_8);
+
+ List loaded = testService.loadSaves();
+
+ assertEquals(1, loaded.size());
+ assertEquals("MySave", loaded.get(0).getName());
+ }
+
+ @Test
+ void loadSavesReturnsSavesSortedByFileName() throws IOException {
+ testService.saveGame(new SaveGame("B-save", 100, 100, null));
+ testService.saveGame(new SaveGame("A-save", 100, 100, null));
+ testService.saveGame(new SaveGame("C-save", 100, 100, null));
+
+ List loaded = testService.loadSaves();
+
+ assertEquals(3, loaded.size());
+ assertEquals("A-save", loaded.get(0).getName());
+ assertEquals("B-save", loaded.get(1).getName());
+ assertEquals("C-save", loaded.get(2).getName());
+ }
+
+ @Test
+ void saveAndLoadRoundTripPreservesAllFields() throws IOException {
+ testService.saveGame(testSaveGame);
+
+ List loaded = testService.loadSaves();
+ assertEquals(1, loaded.size());
+
+ SaveGame result = loaded.get(0);
+ assertEquals("MySave", result.getName());
+ assertEquals(10026.25, result.getBalance());
+ assertEquals(10000.00, result.getStartingCapital());
+ assertNull(result.getStockDataPath());
+ assertEquals(3, result.getWeek());
+
+ // Owned shares.
+ assertEquals(2, result.getOwnedShares().size());
+ OwnedShareData firstShare = result.getOwnedShares().get(0);
+ assertEquals("AAPL", firstShare.getSymbol());
+ assertEquals(new BigDecimal("5"), firstShare.getQuantity());
+ assertEquals(new BigDecimal("150.00"), firstShare.getPurchasePrice());
+
+ // Transactions.
+ assertEquals(2, result.getTransactions().size());
+ TransactionData firstTx = result.getTransactions().get(0);
+ assertEquals(TransactionType.PURCHASE, firstTx.getType());
+ assertEquals("AAPL", firstTx.getSymbol());
+ assertEquals(new BigDecimal("5"), firstTx.getQuantity());
+ assertEquals(new BigDecimal("150.00"), firstTx.getPrice());
+ assertEquals(1, firstTx.getWeek());
+
+ TransactionData secondTx = result.getTransactions().get(1);
+ assertEquals(TransactionType.SALE, secondTx.getType());
+ assertEquals(2, secondTx.getWeek());
+
+ // Exchange stocks - full price history must round-trip.
+ assertEquals(2, result.getExchangeStocks().size());
+ Stock loadedApple = result.getExchangeStocks().get(0);
+ assertEquals("AAPL", loadedApple.getSymbol());
+ assertEquals("Apple Inc", loadedApple.getCompany());
+ assertEquals(3, loadedApple.getHistoricalPrices().size());
+ assertEquals(new BigDecimal("150.00"),
+ loadedApple.getHistoricalPrices().get(0));
+ assertEquals(new BigDecimal("152.30"),
+ loadedApple.getHistoricalPrices().get(1));
+ assertEquals(new BigDecimal("155.25"), loadedApple.getSalesPrice());
+ assertEquals(1.5, loadedApple.getFortune());
+
+ // Net worth history.
+ assertEquals(3, result.getNetWorthHistory().size());
+ assertEquals(new BigDecimal("10000.00"),
+ result.getNetWorthHistory().get(0));
+ assertEquals(new BigDecimal("10125.75"),
+ result.getNetWorthHistory().get(2));
+ }
+
+ @Test
+ void saveAndLoadRoundTripPreservesNonNullStockDataPath()
+ throws IOException {
+ SaveGame withPath = new SaveGame("WithPath",
+ 500.0, 500.0,
+ "C:\\some\\stocks.txt",
+ 1,
+ Collections.emptyList(),
+ Collections.emptyList(),
+ Collections.emptyList(),
+ Collections.emptyList());
+
+ testService.saveGame(withPath);
+ List loaded = testService.loadSaves();
+
+ assertEquals(1, loaded.size());
+ assertEquals("C:\\some\\stocks.txt", loaded.get(0).getStockDataPath());
+ }
+
+ @Test
+ void saveOverwritesExistingFileWithSameName() throws IOException {
+ SaveGame first = new SaveGame("Same", 100.0, 100.0, null);
+ testService.saveGame(first);
+
+ SaveGame second = new SaveGame("Same", 250.0, 100.0, null);
+ testService.saveGame(second);
+
+ List loaded = testService.loadSaves();
+ assertEquals(1, loaded.size());
+ assertEquals(250.0, loaded.get(0).getBalance());
+ }
+
+ @Test
+ void loadSavesParsesLegacyFileWithoutWeekOrListFields()
+ throws IOException {
+ String legacy = """
+ {
+ "name": "Legacy",
+ "balance": 750.50,
+ "startingCapital": 500.00,
+ "stockDataPath": null
+ }
+ """;
+ Files.writeString(tempDir.resolve("Legacy.json"),
+ legacy, StandardCharsets.UTF_8);
+
+ List loaded = testService.loadSaves();
+
+ assertEquals(1, loaded.size());
+ SaveGame result = loaded.get(0);
+ assertEquals("Legacy", result.getName());
+ assertEquals(750.50, result.getBalance());
+ assertEquals(500.00, result.getStartingCapital());
+ assertNull(result.getStockDataPath());
+ assertEquals(1, result.getWeek());
+ assertTrue(result.getOwnedShares().isEmpty());
+ assertTrue(result.getTransactions().isEmpty());
+ assertTrue(result.getExchangeStocks().isEmpty());
+ assertTrue(result.getNetWorthHistory().isEmpty());
+ }
+
+ @Test
+ void loadSavesParsesLegacyStockWithoutPriceHistory()
+ throws IOException {
+ String legacy = """
+ {
+ "name": "OldStocks",
+ "balance": 1000.00,
+ "startingCapital": 1000.00,
+ "stockDataPath": null,
+ "week": 1,
+ "ownedShares": [],
+ "transactions": [],
+ "stocks": [
+ { "symbol": "AAPL", "name": "Apple Inc", "price": 150.00 }
+ ],
+ "netWorthHistory": []
+ }
+ """;
+ Files.writeString(tempDir.resolve("OldStocks.json"),
+ legacy, StandardCharsets.UTF_8);
+
+ List loaded = testService.loadSaves();
+
+ assertEquals(1, loaded.size());
+ Stock stock = loaded.get(0).getExchangeStocks().get(0);
+ assertEquals("AAPL", stock.getSymbol());
+ assertEquals(1, stock.getHistoricalPrices().size());
+ assertEquals(new BigDecimal("150.00"), stock.getSalesPrice());
+ assertEquals(0.0, stock.getFortune());
+ }
+
+ @Test
+ void loadSavesSkipsMalformedOwnedSharesAndKeepsValidOnes()
+ throws IOException {
+ String content = """
+ {
+ "name": "MixedShares",
+ "balance": 100.00,
+ "startingCapital": 100.00,
+ "stockDataPath": null,
+ "week": 1,
+ "ownedShares": [
+ { "symbol": "AAPL", "quantity": 5, "purchasePrice": 150.00 },
+ { "symbol": "NVID", "purchasePrice": 240.00 },
+ { "symbol": "TSLA", "quantity": "abc", "purchasePrice": 200.00 }
+ ],
+ "transactions": [],
+ "stocks": [],
+ "netWorthHistory": []
+ }
+ """;
+ Files.writeString(tempDir.resolve("MixedShares.json"),
+ content, StandardCharsets.UTF_8);
+
+ List loaded = testService.loadSaves();
+
+ assertEquals(1, loaded.size());
+ List shares = loaded.get(0).getOwnedShares();
+ assertEquals(1, shares.size());
+ assertEquals("AAPL", shares.get(0).getSymbol());
+ }
+
+ @Test
+ void loadSaveFromFileReturnsNullForNullOrMissingFile() {
+ assertNull(testService.loadSaveFromFile(null));
+ assertNull(testService.loadSaveFromFile(
+ tempDir.resolve("does-not-exist.json")));
+ }
+
+ @Test
+ void loadSaveFromFileParsesValidSaveOutsideSavesDirectory()
+ throws IOException {
+ Path external = tempDir.resolve("external");
+ Files.createDirectories(external);
+ Path target = external.resolve("Imported.json");
+
+ testService.saveGame(testSaveGame);
+ Files.copy(tempDir.resolve("MySave.json"), target);
+
+ SaveGame loaded = testService.loadSaveFromFile(target);
+
+ assertNotNull(loaded);
+ assertEquals("MySave", loaded.getName());
+ assertEquals(2, loaded.getOwnedShares().size());
+ }
+
+ @Test
+ void saveAndLoadHandlesEmptyOwnedSharesAndTransactions()
+ throws IOException {
+ SaveGame empty = new SaveGame("Empty",
+ 100.0, 100.0, null, 1,
+ new ArrayList<>(), new ArrayList<>(),
+ new ArrayList<>(), new ArrayList<>());
+
+ testService.saveGame(empty);
+ List loaded = testService.loadSaves();
+
+ assertEquals(1, loaded.size());
+ assertTrue(loaded.get(0).getOwnedShares().isEmpty());
+ assertTrue(loaded.get(0).getTransactions().isEmpty());
+ assertTrue(loaded.get(0).getExchangeStocks().isEmpty());
+ assertTrue(loaded.get(0).getNetWorthHistory().isEmpty());
+ }
+
+ @Test
+ void saveAndLoadEscapesSpecialCharactersInNameField()
+ throws IOException {
+ SaveGame special = new SaveGame(
+ "Name with \"quotes\" and \\ backslash",
+ 100.0, 100.0, null);
+
+ testService.saveGame(special);
+ List loaded = testService.loadSaves();
+
+ assertEquals(1, loaded.size());
+ assertEquals("Name with \"quotes\" and \\ backslash",
+ loaded.get(0).getName());
+ }
+}
\ No newline at end of file
From 8af9842f19e4817bbc35b2424d505235a1365c95 Mon Sep 17 00:00:00 2001
From: =
Date: Wed, 27 May 2026 10:06:53 +0200
Subject: [PATCH 2/7] Feat: More package structure.
---
.../java/edu/ntnu/idi/idatt2003/g40/mappe/Main.java | 6 +++---
.../idi/idatt2003/g40/mappe/engine/package-info.java | 5 -----
.../g40/mappe/{engine => model}/Exchange.java | 10 ++++------
.../{exceptions => model}/NotEnoughMoneyException.java | 2 +-
.../idi/idatt2003/g40/mappe/model/OwnedShareData.java | 2 +-
.../edu/ntnu/idi/idatt2003/g40/mappe/model/Player.java | 4 +---
.../mappe/{engine => model}/TransactionArchive.java | 5 +----
.../idi/idatt2003/g40/mappe/model/TransactionData.java | 2 +-
.../idatt2003/g40/mappe/service/GameStateLoader.java | 4 ++--
.../mappe/view/creategame/CreateGameController.java | 2 +-
.../mappe/view/ingame/quit/QuitDialogController.java | 2 +-
.../idatt2003/g40/mappe/view/widgets/WidgetEnum.java | 4 +++-
.../view/widgets/dashboard/DashBoardController.java | 4 ++--
.../widgets/financialsummary/SummaryController.java | 7 +++++--
.../mappe/view/widgets/market/MarketController.java | 2 +-
.../view/widgets/minigames/MiniGamesController.java | 1 +
.../mappe/view/widgets/minigames/MiniGamesView.java | 1 +
.../minigames/{ => engine}/GameEngineController.java | 4 +++-
.../widgets/minigames/{ => engine}/GameEngineView.java | 5 +++--
.../widgets/minigames/{ => engine}/GameGimmick.java | 2 +-
.../view/widgets/minigames/games/ClickerGame.java | 2 +-
.../view/widgets/minigames/games/FindStockGame.java | 9 ++++++---
.../view/widgets/minigames/games/TimeInputsGame.java | 5 +++--
.../g40/mappe/view/widgets/stats/StatsController.java | 2 +-
.../widgets/transactions/TransactionsController.java | 2 +-
.../g40/mappe/{engine => model}/ExchangeTest.java | 8 +-------
.../ntnu/idi/idatt2003/g40/mappe/model/PlayerTest.java | 1 -
.../{engine => model}/TransactionArchiveTest.java | 7 +------
28 files changed, 50 insertions(+), 60 deletions(-)
delete mode 100644 src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/package-info.java
rename src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/{engine => model}/Exchange.java (97%)
rename src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/{exceptions => model}/NotEnoughMoneyException.java (88%)
rename src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/{engine => model}/TransactionArchive.java (94%)
rename src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/{ => engine}/GameEngineController.java (96%)
rename src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/{ => engine}/GameEngineView.java (96%)
rename src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/{ => engine}/GameGimmick.java (90%)
rename src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/{engine => model}/ExchangeTest.java (96%)
rename src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/{engine => model}/TransactionArchiveTest.java (93%)
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Main.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Main.java
index 186a096..b0c4bdb 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Main.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/Main.java
@@ -1,6 +1,6 @@
package edu.ntnu.idi.idatt2003.g40.mappe;
-import edu.ntnu.idi.idatt2003.g40.mappe.engine.Exchange;
+import edu.ntnu.idi.idatt2003.g40.mappe.model.Exchange;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Player;
import edu.ntnu.idi.idatt2003.g40.mappe.model.SaveGame;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Stock;
@@ -36,8 +36,8 @@
import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.financialsummary.SummaryView;
import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.market.MarketController;
import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.market.MarketView;
-import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.GameEngineController;
-import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.GameEngineView;
+import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.engine.GameEngineController;
+import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.engine.GameEngineView;
import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.MiniGamesController;
import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.MiniGamesView;
import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.games.ClickerGame;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/package-info.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/package-info.java
deleted file mode 100644
index 70a3863..0000000
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/package-info.java
+++ /dev/null
@@ -1,5 +0,0 @@
-/**
- * Contains classes giving a high level control of the application,
- * such as {@link edu.ntnu.idi.idatt2003.g40.mappe.engine.Exchange}.
- * */
-package edu.ntnu.idi.idatt2003.g40.mappe.engine;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/Exchange.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Exchange.java
similarity index 97%
rename from src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/Exchange.java
rename to src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Exchange.java
index 10775cc..10ee41f 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/Exchange.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Exchange.java
@@ -1,9 +1,5 @@
-package edu.ntnu.idi.idatt2003.g40.mappe.engine;
+package edu.ntnu.idi.idatt2003.g40.mappe.model;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Player;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Share;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Stock;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Transaction;
import edu.ntnu.idi.idatt2003.g40.mappe.service.TransactionFactory;
import edu.ntnu.idi.idatt2003.g40.mappe.service.TransactionType;
import edu.ntnu.idi.idatt2003.g40.mappe.utils.Validator;
@@ -13,6 +9,8 @@
import java.util.List;
import java.util.Map;
import java.util.Random;
+
+import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.engine.GameEngineView;
import javafx.beans.property.ReadOnlyIntegerProperty;
import javafx.beans.property.ReadOnlyIntegerWrapper;
@@ -331,7 +329,7 @@ public Transaction sell(BigDecimal amount,
* -10% to +10%.
*
*
- * @see edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.GameEngineView
+ * @see GameEngineView
*/
public void advance() {
for (Stock stock : stockMap.values()) {
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/exceptions/NotEnoughMoneyException.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/NotEnoughMoneyException.java
similarity index 88%
rename from src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/exceptions/NotEnoughMoneyException.java
rename to src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/NotEnoughMoneyException.java
index 8d19749..05ae352 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/exceptions/NotEnoughMoneyException.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/NotEnoughMoneyException.java
@@ -1,4 +1,4 @@
-package edu.ntnu.idi.idatt2003.g40.mappe.exceptions;
+package edu.ntnu.idi.idatt2003.g40.mappe.model;
/**
* Exception primarily thrown when the active
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/OwnedShareData.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/OwnedShareData.java
index 92aaa30..c524b2d 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/OwnedShareData.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/OwnedShareData.java
@@ -9,7 +9,7 @@
* Holds just enough information to recreate a {@link Share} when the save is
* loaded: the stock symbol, the quantity owned and the original purchase
* price. The actual {@link Stock} object is looked up on the live
- * {@link edu.ntnu.idi.idatt2003.g40.mappe.engine.Exchange} when the save is
+ * {@link Exchange} when the save is
* applied.
*
*
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Player.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Player.java
index afc0b11..76c998c 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Player.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Player.java
@@ -1,8 +1,6 @@
package edu.ntnu.idi.idatt2003.g40.mappe.model;
import edu.ntnu.idi.idatt2003.g40.mappe.controller.PlayerStatusController;
-import edu.ntnu.idi.idatt2003.g40.mappe.engine.TransactionArchive;
-import edu.ntnu.idi.idatt2003.g40.mappe.exceptions.NotEnoughMoneyException;
import edu.ntnu.idi.idatt2003.g40.mappe.utils.Validator;
import java.math.BigDecimal;
import java.util.ArrayList;
@@ -17,7 +15,7 @@
*
* - Has a portfolio
* - Can buy and sell shares on an
- * {@link edu.ntnu.idi.idatt2003.g40.mappe.engine.Exchange}.
+ * {@link Exchange}.
* - Has a set amount of money to use on said exchange.
* - Has a {@link TransactionArchive}
*
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/TransactionArchive.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/TransactionArchive.java
similarity index 94%
rename from src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/TransactionArchive.java
rename to src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/TransactionArchive.java
index 48baa7a..37afa33 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/TransactionArchive.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/TransactionArchive.java
@@ -1,8 +1,5 @@
-package edu.ntnu.idi.idatt2003.g40.mappe.engine;
+package edu.ntnu.idi.idatt2003.g40.mappe.model;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Purchase;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Sale;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Transaction;
import edu.ntnu.idi.idatt2003.g40.mappe.utils.Validator;
import java.util.ArrayList;
import java.util.Collections;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/TransactionData.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/TransactionData.java
index 45f1bde..38c16a4 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/TransactionData.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/TransactionData.java
@@ -12,7 +12,7 @@
* quantity traded, the price per unit at the time of the transaction, and
* the in-game week it took place. Used by the
* {@link edu.ntnu.idi.idatt2003.g40.mappe.service.SaveGameService} to
- * persist the {@link edu.ntnu.idi.idatt2003.g40.mappe.engine.TransactionArchive}
+ * persist the {@link TransactionArchive}
* across sessions.
*
*
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/GameStateLoader.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/GameStateLoader.java
index 0137ad2..0831427 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/GameStateLoader.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/service/GameStateLoader.java
@@ -1,7 +1,7 @@
package edu.ntnu.idi.idatt2003.g40.mappe.service;
-import edu.ntnu.idi.idatt2003.g40.mappe.engine.Exchange;
-import edu.ntnu.idi.idatt2003.g40.mappe.engine.TransactionArchive;
+import edu.ntnu.idi.idatt2003.g40.mappe.model.Exchange;
+import edu.ntnu.idi.idatt2003.g40.mappe.model.TransactionArchive;
import edu.ntnu.idi.idatt2003.g40.mappe.model.OwnedShareData;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Player;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Portfolio;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/creategame/CreateGameController.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/creategame/CreateGameController.java
index fabe231..4ca9034 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/creategame/CreateGameController.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/creategame/CreateGameController.java
@@ -1,6 +1,6 @@
package edu.ntnu.idi.idatt2003.g40.mappe.view.creategame;
-import edu.ntnu.idi.idatt2003.g40.mappe.engine.Exchange;
+import edu.ntnu.idi.idatt2003.g40.mappe.model.Exchange;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Player;
import edu.ntnu.idi.idatt2003.g40.mappe.model.SaveGame;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Stock;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/ingame/quit/QuitDialogController.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/ingame/quit/QuitDialogController.java
index 051481d..51bbd07 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/ingame/quit/QuitDialogController.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/ingame/quit/QuitDialogController.java
@@ -1,6 +1,6 @@
package edu.ntnu.idi.idatt2003.g40.mappe.view.ingame.quit;
-import edu.ntnu.idi.idatt2003.g40.mappe.engine.Exchange;
+import edu.ntnu.idi.idatt2003.g40.mappe.model.Exchange;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Player;
import edu.ntnu.idi.idatt2003.g40.mappe.model.SaveGame;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Share;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/WidgetEnum.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/WidgetEnum.java
index 9bf85ac..7d33946 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/WidgetEnum.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/WidgetEnum.java
@@ -1,5 +1,7 @@
package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets;
+import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.engine.GameEngineView;
+
/**
* Enum used to define the various widgets for the application.
*
@@ -23,7 +25,7 @@ public enum WidgetEnum {
MINIGAMES_OVERVIEW,
/**
- * {@link edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.GameEngineView}.
+ * {@link GameEngineView}.
* */
MINIGAMES_ENGINE,
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/dashboard/DashBoardController.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/dashboard/DashBoardController.java
index 52f005c..64fbad8 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/dashboard/DashBoardController.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/dashboard/DashBoardController.java
@@ -1,7 +1,7 @@
package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.dashboard;
-import edu.ntnu.idi.idatt2003.g40.mappe.engine.Exchange;
-import edu.ntnu.idi.idatt2003.g40.mappe.exceptions.NotEnoughMoneyException;
+import edu.ntnu.idi.idatt2003.g40.mappe.model.Exchange;
+import edu.ntnu.idi.idatt2003.g40.mappe.model.NotEnoughMoneyException;
import edu.ntnu.idi.idatt2003.g40.mappe.model.*;
import edu.ntnu.idi.idatt2003.g40.mappe.service.PurchaseCalculator;
import edu.ntnu.idi.idatt2003.g40.mappe.service.SaleCalculator;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/financialsummary/SummaryController.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/financialsummary/SummaryController.java
index 4fd2020..8f88ab0 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/financialsummary/SummaryController.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/financialsummary/SummaryController.java
@@ -1,12 +1,14 @@
package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.financialsummary;
-import edu.ntnu.idi.idatt2003.g40.mappe.engine.Exchange;
+import edu.ntnu.idi.idatt2003.g40.mappe.model.Exchange;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Player;
import edu.ntnu.idi.idatt2003.g40.mappe.service.event.EventData;
import edu.ntnu.idi.idatt2003.g40.mappe.service.event.EventManager;
import edu.ntnu.idi.idatt2003.g40.mappe.service.event.EventSubscriber;
import edu.ntnu.idi.idatt2003.g40.mappe.service.event.EventType;
import edu.ntnu.idi.idatt2003.g40.mappe.view.ViewController;
+
+import javax.swing.event.ChangeListener;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@@ -34,6 +36,8 @@ public class SummaryController extends ViewController
* */
private List playerNetWorthHistory;
+ private ChangeListener changeListener1;
+
/**
* {@inheritDoc}.
*/
@@ -103,7 +107,6 @@ public void handleContextUpdate(final Exchange criticalExchange, final Player ac
} else {
this.playerNetWorthHistory.add(this.player.getStartingMoney());
}
-
getViewElement().setWeek(this.exchange.getWeek());
getViewElement().updateChart(this.playerNetWorthHistory.stream().map(BigDecimal::floatValue).toList());
getViewElement().setBalance(this.player.getMoney().floatValue(), this.player.getNetWorth().floatValue());
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/market/MarketController.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/market/MarketController.java
index 1ae01e5..7aa94f6 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/market/MarketController.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/market/MarketController.java
@@ -1,6 +1,6 @@
package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.market;
-import edu.ntnu.idi.idatt2003.g40.mappe.engine.Exchange;
+import edu.ntnu.idi.idatt2003.g40.mappe.model.Exchange;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Player;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Share;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Stock;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/MiniGamesController.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/MiniGamesController.java
index adafb12..4758464 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/MiniGamesController.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/MiniGamesController.java
@@ -7,6 +7,7 @@
import edu.ntnu.idi.idatt2003.g40.mappe.service.event.EventType;
import edu.ntnu.idi.idatt2003.g40.mappe.view.ViewController;
import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.WidgetEnum;
+import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.engine.GameEngineController;
import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.games.ClickerGame;
import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.games.FindStockGame;
import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.games.TimeInputsGame;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/MiniGamesView.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/MiniGamesView.java
index dad45a7..0b51e71 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/MiniGamesView.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/MiniGamesView.java
@@ -1,6 +1,7 @@
package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames;
import edu.ntnu.idi.idatt2003.g40.mappe.view.ViewElement;
+import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.engine.GameEngineView;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/GameEngineController.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/engine/GameEngineController.java
similarity index 96%
rename from src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/GameEngineController.java
rename to src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/engine/GameEngineController.java
index 9210f8d..9ce8708 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/GameEngineController.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/engine/GameEngineController.java
@@ -1,4 +1,4 @@
-package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames;
+package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.engine;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Stock;
import edu.ntnu.idi.idatt2003.g40.mappe.service.event.EventData;
@@ -6,6 +6,8 @@
import edu.ntnu.idi.idatt2003.g40.mappe.service.event.EventType;
import edu.ntnu.idi.idatt2003.g40.mappe.view.ViewController;
import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.WidgetEnum;
+import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.MiniGamesActions;
+import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.MiniGamesView;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.util.Duration;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/GameEngineView.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/engine/GameEngineView.java
similarity index 96%
rename from src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/GameEngineView.java
rename to src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/engine/GameEngineView.java
index 3b13eb1..9db844c 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/GameEngineView.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/engine/GameEngineView.java
@@ -1,7 +1,8 @@
-package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames;
+package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.engine;
import edu.ntnu.idi.idatt2003.g40.mappe.view.ViewElement;
-import java.util.function.IntConsumer;
+
+import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.MiniGamesActions;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/GameGimmick.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/engine/GameGimmick.java
similarity index 90%
rename from src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/GameGimmick.java
rename to src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/engine/GameGimmick.java
index 0f09224..6d694bf 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/GameGimmick.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/engine/GameGimmick.java
@@ -1,4 +1,4 @@
-package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames;
+package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.engine;
import java.util.function.IntConsumer;
import javafx.scene.Node;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/games/ClickerGame.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/games/ClickerGame.java
index 3fe6d86..dbba157 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/games/ClickerGame.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/games/ClickerGame.java
@@ -1,7 +1,7 @@
package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.games;
import edu.ntnu.idi.idatt2003.g40.mappe.view.ViewElement;
-import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.GameGimmick;
+import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.engine.GameGimmick;
import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.MiniGamesActions;
import java.util.function.IntConsumer;
import javafx.scene.Node;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/games/FindStockGame.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/games/FindStockGame.java
index d841f72..4a5f184 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/games/FindStockGame.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/games/FindStockGame.java
@@ -1,12 +1,15 @@
package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.games;
import edu.ntnu.idi.idatt2003.g40.mappe.view.ViewElement;
-import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.GameGimmick;
+import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.engine.GameEngineController;
+import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.engine.GameGimmick;
import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.MiniGamesActions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.IntConsumer;
+
+import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.engine.GameEngineView;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
@@ -21,7 +24,7 @@
*
* Implements {@link GameGimmick}
*
- * @see edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.GameEngineView
+ * @see GameEngineView
* @see edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.MiniGamesView
* */
public final class FindStockGame
@@ -52,7 +55,7 @@ public final class FindStockGame
* The logic for changing score.
*
* Gotten from
- * {@link edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.GameEngineController}
+ * {@link GameEngineController}
* */
private IntConsumer scoreModifier;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/games/TimeInputsGame.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/games/TimeInputsGame.java
index 91eeb8d..0679ab2 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/games/TimeInputsGame.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/minigames/games/TimeInputsGame.java
@@ -1,7 +1,8 @@
package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.games;
import edu.ntnu.idi.idatt2003.g40.mappe.view.ViewElement;
-import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.GameGimmick;
+import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.engine.GameEngineController;
+import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.engine.GameGimmick;
import edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.MiniGamesActions;
import java.util.Random;
import java.util.function.IntConsumer;
@@ -50,7 +51,7 @@ public final class TimeInputsGame
private final double successZoneExtent = 30;
/**
- * Consumer given by {@link edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.minigames.GameEngineController}
+ * Consumer given by {@link GameEngineController}
* That determines how to calculate point gains/losses.
* */
private IntConsumer scoreModifier;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/stats/StatsController.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/stats/StatsController.java
index 5fe9992..7f839f7 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/stats/StatsController.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/stats/StatsController.java
@@ -1,6 +1,6 @@
package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.stats;
-import edu.ntnu.idi.idatt2003.g40.mappe.engine.Exchange;
+import edu.ntnu.idi.idatt2003.g40.mappe.model.Exchange;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Player;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Share;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Stock;
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/transactions/TransactionsController.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/transactions/TransactionsController.java
index dabc63b..8b4ecbd 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/transactions/TransactionsController.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/view/widgets/transactions/TransactionsController.java
@@ -1,6 +1,6 @@
package edu.ntnu.idi.idatt2003.g40.mappe.view.widgets.transactions;
-import edu.ntnu.idi.idatt2003.g40.mappe.engine.TransactionArchive;
+import edu.ntnu.idi.idatt2003.g40.mappe.model.TransactionArchive;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Sale;
import edu.ntnu.idi.idatt2003.g40.mappe.model.Transaction;
import edu.ntnu.idi.idatt2003.g40.mappe.service.event.EventData;
diff --git a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/ExchangeTest.java b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/model/ExchangeTest.java
similarity index 96%
rename from src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/ExchangeTest.java
rename to src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/model/ExchangeTest.java
index 65337f7..77b507e 100644
--- a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/ExchangeTest.java
+++ b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/model/ExchangeTest.java
@@ -1,4 +1,4 @@
-package edu.ntnu.idi.idatt2003.g40.mappe.engine;
+package edu.ntnu.idi.idatt2003.g40.mappe.model;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -9,12 +9,6 @@
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Player;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Purchase;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Sale;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Share;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Stock;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Transaction;
import edu.ntnu.idi.idatt2003.g40.mappe.service.PurchaseCalculator;
import edu.ntnu.idi.idatt2003.g40.mappe.service.SaleCalculator;
import edu.ntnu.idi.idatt2003.g40.mappe.service.TransactionCalculator;
diff --git a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/model/PlayerTest.java b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/model/PlayerTest.java
index 3837214..3d9d78a 100644
--- a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/model/PlayerTest.java
+++ b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/model/PlayerTest.java
@@ -5,7 +5,6 @@
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
-import edu.ntnu.idi.idatt2003.g40.mappe.exceptions.NotEnoughMoneyException;
import edu.ntnu.idi.idatt2003.g40.mappe.service.TransactionFactory;
import edu.ntnu.idi.idatt2003.g40.mappe.service.TransactionType;
import java.math.BigDecimal;
diff --git a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/TransactionArchiveTest.java b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/model/TransactionArchiveTest.java
similarity index 93%
rename from src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/TransactionArchiveTest.java
rename to src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/model/TransactionArchiveTest.java
index fce1960..9e3f587 100644
--- a/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/engine/TransactionArchiveTest.java
+++ b/src/test/java/edu/ntnu/idi/idatt2003/g40/mappe/model/TransactionArchiveTest.java
@@ -1,4 +1,4 @@
-package edu.ntnu.idi.idatt2003.g40.mappe.engine;
+package edu.ntnu.idi.idatt2003.g40.mappe.model;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -6,11 +6,6 @@
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Purchase;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Sale;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Share;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Stock;
-import edu.ntnu.idi.idatt2003.g40.mappe.model.Transaction;
import edu.ntnu.idi.idatt2003.g40.mappe.service.TransactionFactory;
import edu.ntnu.idi.idatt2003.g40.mappe.service.TransactionType;
import java.math.BigDecimal;
From 72a197c8ad76b0de4e012aec2cfbfa69b0715a8e Mon Sep 17 00:00:00 2001
From: =
Date: Wed, 27 May 2026 11:26:09 +0200
Subject: [PATCH 3/7] Feat: Final refactor
---
.../ntnu/idi/idatt2003/g40/mappe/model/Portfolio.java | 2 --
.../ntnu/idi/idatt2003/g40/mappe/model/Purchase.java | 10 ----------
.../edu/ntnu/idi/idatt2003/g40/mappe/model/Sale.java | 10 ----------
.../idi/idatt2003/g40/mappe/model/Transaction.java | 11 ++---------
4 files changed, 2 insertions(+), 31 deletions(-)
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Portfolio.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Portfolio.java
index 3b08af9..8a77791 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Portfolio.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Portfolio.java
@@ -3,9 +3,7 @@
import edu.ntnu.idi.idatt2003.g40.mappe.utils.Validator;
import java.math.BigDecimal;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
/**
* Represents a player's portfolio of shares.
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Purchase.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Purchase.java
index af28170..01645b4 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Purchase.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Purchase.java
@@ -23,14 +23,4 @@ public Purchase(final Share share,
final TransactionCalculator calculator) {
super(share, week, calculator);
}
-
- /**
- * Commits the purchase.
- *
- * @param player the {@link Player} object performing the purchase.
- * */
- @Override
- public void commit(final Player player) {
- setCommitted(true);
- }
}
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Sale.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Sale.java
index 7731aff..955201a 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Sale.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Sale.java
@@ -23,14 +23,4 @@ public Sale(final Share share,
final TransactionCalculator calculator) {
super(share, week, calculator);
}
-
- /**
- * Commits the purchase.
- *
- * @param player the {@link Player} object performing the purchase.
- * */
- @Override
- public void commit(final Player player) {
- setCommitted(true);
- }
}
diff --git a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Transaction.java b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Transaction.java
index 62993f1..04c1dd1 100644
--- a/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Transaction.java
+++ b/src/main/java/edu/ntnu/idi/idatt2003/g40/mappe/model/Transaction.java
@@ -97,14 +97,7 @@ public boolean isCommited() {
*
* @param player The player that performed the transaction.
* */
- public abstract void commit(Player player);
-
- /**
- * Sets the committed flag.
- *
- * @param value the value to set the committed flag to.
- * */
- protected void setCommitted(final boolean value) {
- committed = value;
+ public void commit(final Player player) {
+ committed = true;
}
}
From c9e8bc77016741430c8fbb9b8896ca51ef73ae70 Mon Sep 17 00:00:00 2001
From: Tommy Aas Hjelle
Date: Wed, 27 May 2026 11:28:04 +0200
Subject: [PATCH 4/7] Delete src/main/resources/saves.txt
---
src/main/resources/saves.txt | 5 -----
1 file changed, 5 deletions(-)
delete mode 100644 src/main/resources/saves.txt
diff --git a/src/main/resources/saves.txt b/src/main/resources/saves.txt
deleted file mode 100644
index fec18df..0000000
--- a/src/main/resources/saves.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-# Save file format: name, balance
-# Lines starting with # are comments
-
-fuck, -1000000000.00
-Halleluja, 1000650901.43
\ No newline at end of file
From b5e3c13b1280ba3b026fbed5fb8ea3dd8d6bee17 Mon Sep 17 00:00:00 2001
From: Tommy Aas Hjelle
Date: Wed, 27 May 2026 11:28:20 +0200
Subject: [PATCH 5/7] Delete src/main/resources/dummydata.csv
---
src/main/resources/dummydata.csv | 14 --------------
1 file changed, 14 deletions(-)
delete mode 100644 src/main/resources/dummydata.csv
diff --git a/src/main/resources/dummydata.csv b/src/main/resources/dummydata.csv
deleted file mode 100644
index 25144a3..0000000
--- a/src/main/resources/dummydata.csv
+++ /dev/null
@@ -1,14 +0,0 @@
-#THIS IS A COMMENT.
-
-AAPL, Apple Inc., 276.43
-NVID, Nvidida Corporation, 241.591
-
-#Above me are some valid formats.
-#Below me are some invalid formats
-
-COOLI, This is a cool name, 252.2
-
-COOL, This is a cool name, 252.2a
-
-AAPL,Apple Inc.,276.43
-NVID,Nvidida Corporation,241.591
\ No newline at end of file
From f839157b92e9cbd315d5eabab2000ff6d1802701 Mon Sep 17 00:00:00 2001
From: Tommy Aas Hjelle
Date: Wed, 27 May 2026 11:28:28 +0200
Subject: [PATCH 6/7] Delete src/main/resources/millionsbackground.png
---
src/main/resources/millionsbackground.png | Bin 101174 -> 0 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 src/main/resources/millionsbackground.png
diff --git a/src/main/resources/millionsbackground.png b/src/main/resources/millionsbackground.png
deleted file mode 100644
index bbbc4a9f6d83a4a7f867dc971de0ae06fad03c56..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 101174
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