From bfe3fcfb79fb6f52d14c25fb53da81230dff12cf Mon Sep 17 00:00:00 2001 From: David Guler Date: Sun, 20 Nov 2022 08:53:56 +0100 Subject: [PATCH 01/10] fix: pre-copying test files By some accursed class loading magic, files in the test-resources with the same name as one in the main resources were read/written in the main resources, causing some problems. Renamed all of the test files to fix this. --- .../gartenverwaltung/io/JsonCropList.java | 1 + .../gartenverwaltung/io/JsonPlantList.java | 9 +- .../gartenverwaltung/io/JsonTaskList.java | 9 +- .../gartenverwaltung/io/JsonCropListTest.java | 4 +- .../io/JsonPlantListTest.java | 7 +- .../gartenverwaltung/io/JsonTaskListTest.java | 28 +- .../models/GardenPlanModelTest.java | 4 +- .../ch/zhaw/gartenverwaltung/io/plantdb.json | 257 ------------------ .../gartenverwaltung/io/template-taskdb.json} | 12 +- .../io/template-user-crops.json | 20 ++ .../gartenverwaltung/io/test-plantdb.json} | 7 +- .../zhaw/gartenverwaltung/io/test-taskdb.json | 54 ---- .../gartenverwaltung/io/test-user-crops.json | 18 -- .../zhaw/gartenverwaltung/io/user-crops.json | 2 - 14 files changed, 72 insertions(+), 360 deletions(-) delete mode 100644 src/test/resources/ch/zhaw/gartenverwaltung/io/plantdb.json rename src/test/resources/{ch.zhaw.gartenverwaltung.gardenplan/taskdb.json => ch/zhaw/gartenverwaltung/io/template-taskdb.json} (88%) create mode 100644 src/test/resources/ch/zhaw/gartenverwaltung/io/template-user-crops.json rename src/test/resources/{ch.zhaw.gartenverwaltung.gardenplan/plantdb.json => ch/zhaw/gartenverwaltung/io/test-plantdb.json} (93%) delete mode 100644 src/test/resources/ch/zhaw/gartenverwaltung/io/user-crops.json diff --git a/src/main/java/ch/zhaw/gartenverwaltung/io/JsonCropList.java b/src/main/java/ch/zhaw/gartenverwaltung/io/JsonCropList.java index f9ddc3e..c7fd0ea 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/io/JsonCropList.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/io/JsonCropList.java @@ -53,6 +53,7 @@ public class JsonCropList implements CropList { public JsonCropList(URL dataSource) { this.dataSource = dataSource; } + /** * {@inheritDoc} */ diff --git a/src/main/java/ch/zhaw/gartenverwaltung/io/JsonPlantList.java b/src/main/java/ch/zhaw/gartenverwaltung/io/JsonPlantList.java index 6132477..7b76f70 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/io/JsonPlantList.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/io/JsonPlantList.java @@ -25,7 +25,7 @@ import java.util.Optional; * The reads are cached to minimize file-io operations. */ public class JsonPlantList implements PlantList { - private final URL dataSource = getClass().getResource("plantdb.json"); + private final URL dataSource; private HardinessZone currentZone; private Map plantMap = Collections.emptyMap(); @@ -44,6 +44,13 @@ public class JsonPlantList implements PlantList { imageModule.addDeserializer(Image.class, new PlantImageDeserializer()); } + public JsonPlantList() { + this.dataSource = getClass().getResource("plantdb.json"); + } + public JsonPlantList(URL dataSource) { + this.dataSource = dataSource; + } + /** * If no data is currently loaded, or the specified zone differs * from the {@link #currentZone}, data is loaded from {@link #dataSource}. diff --git a/src/main/java/ch/zhaw/gartenverwaltung/io/JsonTaskList.java b/src/main/java/ch/zhaw/gartenverwaltung/io/JsonTaskList.java index bda9aa8..404489e 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/io/JsonTaskList.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/io/JsonTaskList.java @@ -25,7 +25,7 @@ import java.util.Map; */ public class JsonTaskList implements TaskList { IdProvider idProvider; - private final URL dataSource = getClass().getResource("taskdb.json"); + private final URL dataSource; private final static String INVALID_DATASOURCE_MSG = "Invalid datasource specified!"; private Map taskMap = Collections.emptyMap(); @@ -43,6 +43,13 @@ public class JsonTaskList implements TaskList { timeModule.addSerializer(LocalDate.class, dateSerializer); } + public JsonTaskList() { + this.dataSource = getClass().getResource("taskdb.json"); + } + public JsonTaskList(URL dataSource) { + this.dataSource = dataSource; + } + /** * If no data is currently loaded, data is loaded from {@link #dataSource}. * In any case, the values of {@link #taskMap} are returned. diff --git a/src/test/java/ch/zhaw/gartenverwaltung/io/JsonCropListTest.java b/src/test/java/ch/zhaw/gartenverwaltung/io/JsonCropListTest.java index 44291b6..87763a8 100644 --- a/src/test/java/ch/zhaw/gartenverwaltung/io/JsonCropListTest.java +++ b/src/test/java/ch/zhaw/gartenverwaltung/io/JsonCropListTest.java @@ -28,8 +28,8 @@ public class JsonCropListTest { /** * Files to isolate the test-units */ - private final URL dbDataSource = this.getClass().getResource("user-crops.json"); - private final URL testFile = this.getClass().getResource("test-user-crops.json"); + private final URL dbDataSource = this.getClass().getResource("test-user-crops.json"); + private final URL testFile = this.getClass().getResource("template-user-crops.json"); @BeforeEach void connectToDb() throws URISyntaxException, IOException { diff --git a/src/test/java/ch/zhaw/gartenverwaltung/io/JsonPlantListTest.java b/src/test/java/ch/zhaw/gartenverwaltung/io/JsonPlantListTest.java index 7c62c0c..b28c486 100644 --- a/src/test/java/ch/zhaw/gartenverwaltung/io/JsonPlantListTest.java +++ b/src/test/java/ch/zhaw/gartenverwaltung/io/JsonPlantListTest.java @@ -8,17 +8,22 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.io.IOException; +import java.net.URL; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import static org.junit.jupiter.api.Assertions.assertNotNull; + public class JsonPlantListTest { + private final URL testFile = this.getClass().getResource("test-plantdb.json"); PlantList testDatabase; @BeforeEach void connectToDb() { - testDatabase = new JsonPlantList(); + assertNotNull(testFile); + testDatabase = new JsonPlantList(testFile); } diff --git a/src/test/java/ch/zhaw/gartenverwaltung/io/JsonTaskListTest.java b/src/test/java/ch/zhaw/gartenverwaltung/io/JsonTaskListTest.java index 9f585d4..cd77b01 100644 --- a/src/test/java/ch/zhaw/gartenverwaltung/io/JsonTaskListTest.java +++ b/src/test/java/ch/zhaw/gartenverwaltung/io/JsonTaskListTest.java @@ -18,27 +18,27 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; public class JsonTaskListTest { TaskList testDatabase; - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - private final URL dbDataSource = this.getClass().getResource("taskdb.json"); - private final URL testFile = this.getClass().getResource("test-taskdb.json"); + private final URL dbDataSource = this.getClass().getResource("test-taskdb.json"); + private final URL testFile = this.getClass().getResource("template-taskdb.json"); @BeforeEach void connectToDb() throws URISyntaxException, IOException { assertNotNull(testFile); assertNotNull(dbDataSource); Files.copy(Path.of(testFile.toURI()), Path.of(dbDataSource.toURI()), StandardCopyOption.REPLACE_EXISTING); - testDatabase = new JsonTaskList(); + testDatabase = new JsonTaskList(dbDataSource); } @Test @DisplayName("Check if results are retrieved completely") void getTasks() { - List taskList = null; + List taskList; try { - taskList = testDatabase.getTaskList(LocalDate.parse("30.04.2022", formatter), - LocalDate.parse("31.05.2022", formatter)); + taskList = testDatabase.getTaskList(LocalDate.parse("2022-04-30", formatter), + LocalDate.parse("2022-05-31", formatter)); } catch (IOException e) { throw new RuntimeException(e); } @@ -54,7 +54,7 @@ public class JsonTaskListTest { Task task = new Task("Testtask", "This is a test Task.", LocalDate.parse("01.05.2022", formatter), 1); try { testDatabase.saveTask(task); - List taskList = null; + List taskList; try { taskList = testDatabase.getTaskList(LocalDate.parse("30.04.2022", formatter), LocalDate.parse("31.05.2022", formatter)); @@ -72,13 +72,13 @@ public class JsonTaskListTest { @Test @DisplayName("Remove task.") void removeTask() { - Task task = new Task("Dummy", "Dummy", LocalDate.parse("31.05.2022", formatter), 1).withId(2); + Task task = new Task("Dummy", "Dummy", LocalDate.parse("2022-05-31", formatter), 1).withId(2); try { testDatabase.removeTask(task); - List taskList = null; + List taskList; - taskList = testDatabase.getTaskList(LocalDate.parse("30.04.2022", formatter), - LocalDate.parse("31.05.2022", formatter)); + taskList = testDatabase.getTaskList(LocalDate.parse("2022-04-30", formatter), + LocalDate.parse("2022-05-31", formatter)); Assertions.assertEquals(2, taskList.size()); } catch (IOException e) { @@ -90,7 +90,7 @@ public class JsonTaskListTest { @Test void getTaskForCrop() { - List taskList = null; + List taskList; try { taskList = testDatabase.getTaskForCrop(0); } catch (IOException e) { @@ -104,7 +104,7 @@ public class JsonTaskListTest { @Disabled("Disabled until removing works") @Test void removeTasksForCrop() { - List taskList = null; + List taskList; try { testDatabase.removeTasksForCrop(0); taskList = testDatabase.getTaskForCrop(0); diff --git a/src/test/java/ch/zhaw/gartenverwaltung/models/GardenPlanModelTest.java b/src/test/java/ch/zhaw/gartenverwaltung/models/GardenPlanModelTest.java index e70026b..7c5bad6 100644 --- a/src/test/java/ch/zhaw/gartenverwaltung/models/GardenPlanModelTest.java +++ b/src/test/java/ch/zhaw/gartenverwaltung/models/GardenPlanModelTest.java @@ -22,8 +22,8 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.*; public class GardenPlanModelTest { - private final URL dbDataSource = JsonCropList.class.getResource("user-crops.json"); - private final URL testFile = JsonCropList.class.getResource("test-user-crops.json"); + private final URL dbDataSource = JsonCropListTest.class.getResource("test-user-crops.json"); + private final URL testFile = JsonCropListTest.class.getResource("template-user-crops.json"); CropList cropList; List exampleCrops; diff --git a/src/test/resources/ch/zhaw/gartenverwaltung/io/plantdb.json b/src/test/resources/ch/zhaw/gartenverwaltung/io/plantdb.json deleted file mode 100644 index 5a23d09..0000000 --- a/src/test/resources/ch/zhaw/gartenverwaltung/io/plantdb.json +++ /dev/null @@ -1,257 +0,0 @@ -[ - { - "id": 0, - "name": "Potato", - "description": "The potato is a tuber, round or oval, with small white roots called 'eyes', that are growth buds. The size varies depending on the variety; the colour of the skin can be white, yellow or even purple.", - "light": 6, - "spacing": "35", - "soil": "sandy", - "image": "potato.jpg", - "pests": [ - { - "name": "Rot", - "description": "Rot, any of several plant diseases, caused by any of hundreds of species of soil-borne bacteria, fungi, and funguslike organisms (Oomycota). Rot diseases are characterized by plant decomposition and putrefaction. The decay may be hard, dry, spongy, watery, mushy, or slimy and may affect any plant part.", - "measures": "Less water." - } - ], - "lifecycle": [ - { - "startDate": "03-10", - "endDate": "04-10", - "type": "SOW", - "zone": "ZONE_8A", - "group": 0, - "wateringCycle": { - "litersPerSqM": 0, - "interval": null, - "notes": [] - }, - "taskTemplates": [ - { - "name": "Germinate", - "relativeStartDate": -14, - "relativeEndDate": null, - "description": "\"Take an egg carton and fill it with soil. Put the seedling deep enaugh so its half covered with soil. Keep it in 10-15 * Celsius with lots of light.\"", - "interval": null, - "isOptional": false - } - ] - }, - { - "startDate": "04-10", - "endDate": "07-10", - "type": "PLANT", - "zone": "ZONE_8A", - "group": 0, - "wateringCycle": { - "litersPerSqM": 25, - "interval": 7, - "notes": [] - }, - "taskTemplates": [ - { - "name": "hilling", - "relativeStartDate": 0, - "relativeEndDate": null, - "description": "\"When the plants are 20 cm tall, begin hilling the potatoes by gently mounding the soil from the center of your rows around the stems of the plant. Mound up the soil around the plant until just the top few leaves show above the soil. Two weeks later, hill up the soil again when the plants grow another 20 cm.\"", - "interval": 21, - "isOptional": false - } - ] - }, - { - "startDate": "06-10", - "endDate": "08-10", - "type": "HARVEST", - "zone": "ZONE_8A", - "group": 0, - "wateringCycle": { - "litersPerSqM": 0, - "interval": null, - "notes": [] - }, - "taskTemplates": [ - { - "name": "Harvest", - "relativeStartDate": 0, - "relativeEndDate": null, - "description": "Once the foliage has wilted and dried completely, harvest on a dry day. Store in a dark and cool location.", - "interval": null, - "isOptional": false - } - ] - } - ] - }, - { - "id": 1, - "name": "Early Carrot", - "description": "Carrot, (Daucus carota), herbaceous, generally biennial plant of the Apiaceae family that produces an edible taproot. Among common varieties root shapes range from globular to long, with lower ends blunt to pointed. Besides the orange-coloured roots, white-, yellow-, and purple-fleshed varieties are known.", - "image": "carrot.jpg", - "lifecycle": [ - { - "startDate": "02-20", - "endDate": "03-10", - "zone": "ZONE_8A", - "type": "SOW", - "wateringCycle": { - "litersPerSqM": 15, - "interval": 3, - "notes": [] - }, - "taskTemplates": [ - { - "name": "hilling", - "relativeStartDate": 0, - "relativeEndDate": 0, - "description": "Mound up the soil around the plant until just the top few leaves show above the soil. ", - "interval": null, - "isOptional": false - } - ] - }, - { - "startDate": "03-10", - "endDate": "05-10", - "zone": "ZONE_8A", - "type": "PLANT", - "wateringCycle": { - "litersPerSqM": 25, - "interval": 3, - "notes": [ - "Be careful not to pour water over the leaves, as this will lead to sunburn." - ] - }, - "taskTemplates": [ - { - "name": "hilling", - "relativeStartDate": 0, - "relativeEndDate": null, - "description": "Mound up the soil around the plant until just the top few leaves show above the soil. ", - "interval": 15, - "isOptional": true - } - ] - }, - { - "startDate": "05-10", - "endDate": "05-20", - "zone": "ZONE_8A", - "type": "HARVEST", - "wateringCycle": { - "litersPerSqM": 0, - "interval": null, - "notes": [] - }, - "taskTemplates": [ - { - "name": "Harvesting", - "relativeStartDate": 0, - "relativeEndDate": 14, - "description": "When the leaves turn to a yellowish brown. Do not harvest earlier. The plant will show when it's ready.", - "interval": null, - "isOptional": false - } - ] - } - ], - "soil": "sandy to loamy, loose soil, free of stones", - "spacing": "5,35,2.5", - "pests": [ - { - "name": "Rot", - "description": "rot, any of several plant diseases, caused by any of hundreds of species of soil-borne bacteria, fungi, and funguslike organisms (Oomycota). Rot diseases are characterized by plant decomposition and putrefaction. The decay may be hard, dry, spongy, watery, mushy, or slimy and may affect any plant part.", - "measures": "less water" - } - ] - }, - { - "id": 2, - "name": "Summertime Onion", - "description": "Onion, (Allium cepa), herbaceous biennial plant in the amaryllis family (Amaryllidaceae) grown for its edible bulb. The onion is likely native to southwestern Asia but is now grown throughout the world, chiefly in the temperate zones. Onions are low in nutrients but are valued for their flavour and are used widely in cooking. They add flavour to such dishes as stews, roasts, soups, and salads and are also served as a cooked vegetable.", - "image": "onion.jpg", - "lifecycle": [ - { - "startDate": "03-15", - "endDate": "04-10", - "type": "SOW", - "zone": "ZONE_8A", - "group": 0, - "wateringCycle": { - "litersPerSqM": 15, - "interval": 4, - "notes": [ - - ] - }, - "taskTemplates": [ - { - "name": "hilling", - "relativeStartDate": 0, - "relativeEndDate": 0, - "description": "Mound up the soil around the plant until just the top few leaves show above the soil. ", - "interval": null, - "isOptional": false - } - ] - }, - { - "startDate": "04-10", - "endDate": "07-10", - "type": "PLANT", - "zone": "ZONE_8A", - "group": 0, - "wateringCycle": { - "litersPerSqM": 25, - "interval": 3, - "notes": [ - "" - ] - }, - "taskTemplates": [ - { - "name": "hilling", - "relativeStartDate": 0, - "relativeEndDate": null, - "description": "Mound up the soil around the plant until just the top few leaves show above the soil. ", - "interval": 15, - "isOptional": true - } - ] - }, - { - "startDate": "07-10", - "endDate": "09-20", - "type": "HARVEST", - "zone": "ZONE_8A", - "group": 0, - "wateringCycle": { - "litersPerSqM": 0, - "interval": null, - "notes": [ - - ] - }, - "taskTemplates": [ - { - "name": "Harvesting", - "relativeStartDate": 0, - "relativeEndDate": 14, - "description": "When ready for harvest, the leaves on your onion plants will start to flop over. This happens at the \"neck\" of the onion and it signals that the plant has stopped growing and is ready for storage. Onions should be harvested soon thereafter", - "interval": null, - "isOptional": false - } - ] - } - ], - "soil": "sandy to loamy, loose soil, free of stones", - "spacing": "15,30,2", - "pests": [ - { - "name": "Rot", - "description": "rot, any of several plant diseases, caused by any of hundreds of species of soil-borne bacteria, fungi, and funguslike organisms (Oomycota). Rot diseases are characterized by plant decomposition and putrefaction. The decay may be hard, dry, spongy, watery, mushy, or slimy and may affect any plant part.", - "measures": "less water" - } - ] - } -] diff --git a/src/test/resources/ch.zhaw.gartenverwaltung.gardenplan/taskdb.json b/src/test/resources/ch/zhaw/gartenverwaltung/io/template-taskdb.json similarity index 88% rename from src/test/resources/ch.zhaw.gartenverwaltung.gardenplan/taskdb.json rename to src/test/resources/ch/zhaw/gartenverwaltung/io/template-taskdb.json index ff69563..7728bb0 100644 --- a/src/test/resources/ch.zhaw.gartenverwaltung.gardenplan/taskdb.json +++ b/src/test/resources/ch/zhaw/gartenverwaltung/io/template-taskdb.json @@ -1,11 +1,11 @@ [ { - "id" : 1, - "name" : "sow plant", - "description": "Plant the seeds, crops in de bed.", - "startDate" : "2022-05-01", - "endDate" : "2022-05-01", - "interval" : 0, + "id" : 1, + "name" : "sow plant", + "description": "Plant the seeds, crops in de bed.", + "startDate" : "2022-05-01", + "endDate" : "2022-05-01", + "interval" : 0, "cropId" : 0 }, { diff --git a/src/test/resources/ch/zhaw/gartenverwaltung/io/template-user-crops.json b/src/test/resources/ch/zhaw/gartenverwaltung/io/template-user-crops.json new file mode 100644 index 0000000..ebd1d2d --- /dev/null +++ b/src/test/resources/ch/zhaw/gartenverwaltung/io/template-user-crops.json @@ -0,0 +1,20 @@ +[ + { + "cropId": 0, + "plantId": 1, + "startDate": "2023-02-25", + "area": 0.5 + }, + { + "cropId": 1, + "plantId": 1, + "startDate": "2023-03-01", + "area": 0.5 + }, + { + "cropId": 2, + "plantId": 0, + "startDate": "2023-03-25", + "area": 1.5 + } +] \ No newline at end of file diff --git a/src/test/resources/ch.zhaw.gartenverwaltung.gardenplan/plantdb.json b/src/test/resources/ch/zhaw/gartenverwaltung/io/test-plantdb.json similarity index 93% rename from src/test/resources/ch.zhaw.gartenverwaltung.gardenplan/plantdb.json rename to src/test/resources/ch/zhaw/gartenverwaltung/io/test-plantdb.json index 5a23d09..5440e42 100644 --- a/src/test/resources/ch.zhaw.gartenverwaltung.gardenplan/plantdb.json +++ b/src/test/resources/ch/zhaw/gartenverwaltung/io/test-plantdb.json @@ -31,7 +31,7 @@ "name": "Germinate", "relativeStartDate": -14, "relativeEndDate": null, - "description": "\"Take an egg carton and fill it with soil. Put the seedling deep enaugh so its half covered with soil. Keep it in 10-15 * Celsius with lots of light.\"", + "description": "Take an egg carton and fill it with soil. Put the seedling deep enough so its half covered with soil. Keep it in 10-15 * Celsius with lots of light.", "interval": null, "isOptional": false } @@ -53,7 +53,7 @@ "name": "hilling", "relativeStartDate": 0, "relativeEndDate": null, - "description": "\"When the plants are 20 cm tall, begin hilling the potatoes by gently mounding the soil from the center of your rows around the stems of the plant. Mound up the soil around the plant until just the top few leaves show above the soil. Two weeks later, hill up the soil again when the plants grow another 20 cm.\"", + "description": "When the plants are 20 cm tall, begin hilling the potatoes by gently mounding the soil from the center of your rows around the stems of the plant. Mound up the soil around the plant until just the top few leaves show above the soil. Two weeks later, hill up the soil again when the plants grow another 20 cm.", "interval": 21, "isOptional": false } @@ -94,6 +94,7 @@ "endDate": "03-10", "zone": "ZONE_8A", "type": "SOW", + "group": 0, "wateringCycle": { "litersPerSqM": 15, "interval": 3, @@ -115,6 +116,7 @@ "endDate": "05-10", "zone": "ZONE_8A", "type": "PLANT", + "group": 0, "wateringCycle": { "litersPerSqM": 25, "interval": 3, @@ -138,6 +140,7 @@ "endDate": "05-20", "zone": "ZONE_8A", "type": "HARVEST", + "group": 0, "wateringCycle": { "litersPerSqM": 0, "interval": null, diff --git a/src/test/resources/ch/zhaw/gartenverwaltung/io/test-taskdb.json b/src/test/resources/ch/zhaw/gartenverwaltung/io/test-taskdb.json index 7728bb0..32960f8 100644 --- a/src/test/resources/ch/zhaw/gartenverwaltung/io/test-taskdb.json +++ b/src/test/resources/ch/zhaw/gartenverwaltung/io/test-taskdb.json @@ -1,56 +1,2 @@ [ - { - "id" : 1, - "name" : "sow plant", - "description": "Plant the seeds, crops in de bed.", - "startDate" : "2022-05-01", - "endDate" : "2022-05-01", - "interval" : 0, - "cropId" : 0 - }, - { - "id" : 2, - "name" : "water plant", - "description": "water the plant, so that the soil is wet around the plant.", - "startDate" : "2022-05-01", - "endDate" : "2022-09-01", - "interval" : 2, - "cropId" : 0 - }, - { - "id" : 3, - "name" : "fertilize plant", - "description": "The fertilizer has to be mixed with water. Then fertilize the plants soil with the mixture", - "startDate" : "2022-06-01", - "endDate" : "2022-08-01", - "interval" : 28, - "cropId" : 0 - }, - { - "id" : 4, - "name" : "covering plant", - "description": "Take a big enough coverage for the plants. Cover the whole plant with a bit space between the plant and the coverage", - "startDate" : "2022-07-01", - "endDate" : "2022-07-01", - "interval" : 0, - "cropId" : 0 - }, - { - "id" : 5, - "name" : "look after plant", - "description": "Look for pest or illness at the leaves of the plant. Check the soil around the plant, if the roots are enough covered with soil", - "startDate" : "2022-05-01", - "endDate" : "2022-09-01", - "interval" : 5, - "cropId" : 0 - }, - { - "id" : 6, - "name" : "harvest plant", - "description": "Pull the ripe vegetables out from the soil. Clean them with clear, fresh water. ", - "startDate" : "2022-09-01", - "endDate" : "2022-09-01", - "interval" : 0, - "cropId" : 0 - } ] \ No newline at end of file diff --git a/src/test/resources/ch/zhaw/gartenverwaltung/io/test-user-crops.json b/src/test/resources/ch/zhaw/gartenverwaltung/io/test-user-crops.json index ebd1d2d..32960f8 100644 --- a/src/test/resources/ch/zhaw/gartenverwaltung/io/test-user-crops.json +++ b/src/test/resources/ch/zhaw/gartenverwaltung/io/test-user-crops.json @@ -1,20 +1,2 @@ [ - { - "cropId": 0, - "plantId": 1, - "startDate": "2023-02-25", - "area": 0.5 - }, - { - "cropId": 1, - "plantId": 1, - "startDate": "2023-03-01", - "area": 0.5 - }, - { - "cropId": 2, - "plantId": 0, - "startDate": "2023-03-25", - "area": 1.5 - } ] \ No newline at end of file diff --git a/src/test/resources/ch/zhaw/gartenverwaltung/io/user-crops.json b/src/test/resources/ch/zhaw/gartenverwaltung/io/user-crops.json deleted file mode 100644 index 32960f8..0000000 --- a/src/test/resources/ch/zhaw/gartenverwaltung/io/user-crops.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] \ No newline at end of file From e96280cd0c3b0d722abaa52ca9a08e8fc5019a78 Mon Sep 17 00:00:00 2001 From: giavaphi Date: Sun, 20 Nov 2022 17:39:18 +0100 Subject: [PATCH 02/10] overhaul gui icons + settings --- .../CropDetailController.java | 20 ++++++ .../gartenverwaltung/MainFXMLController.java | 63 ++++++++++++++++-- .../gartenverwaltung/MyGardenController.java | 23 ++++++- .../ch/zhaw/gartenverwaltung/Settings.java | 15 +++++ .../gartenverwaltung/SettingsController.java | 40 +++++++++++ .../ch/zhaw/gartenverwaltung/CropDetail.fxml | 8 +-- .../ch/zhaw/gartenverwaltung/Home.fxml | 2 +- .../ch/zhaw/gartenverwaltung/MainFXML.fxml | 5 +- .../ch/zhaw/gartenverwaltung/Plants.fxml | 2 +- .../ch/zhaw/gartenverwaltung/Settings.fxml | 37 ++++++++++ .../zhaw/gartenverwaltung/icons/addIcon.png | Bin 0 -> 9058 bytes .../zhaw/gartenverwaltung/icons/areaIcon.png | Bin 0 -> 67278 bytes .../gartenverwaltung/icons/deleteIcon.png | Bin 0 -> 16015 bytes .../gartenverwaltung/icons/detailsIcon.png | Bin 0 -> 4470 bytes .../zhaw/gartenverwaltung/icons/editIcon.png | Bin 0 -> 6425 bytes .../zhaw/gartenverwaltung/icons/homeIcon.png | Bin 0 -> 21630 bytes .../gartenverwaltung/icons/locationIcon.png | Bin 0 -> 28966 bytes .../gartenverwaltung/icons/settingsIcon.png | Bin 0 -> 31441 bytes 18 files changed, 198 insertions(+), 17 deletions(-) create mode 100644 src/main/java/ch/zhaw/gartenverwaltung/SettingsController.java create mode 100644 src/main/resources/ch/zhaw/gartenverwaltung/Settings.fxml create mode 100644 src/main/resources/ch/zhaw/gartenverwaltung/icons/addIcon.png create mode 100644 src/main/resources/ch/zhaw/gartenverwaltung/icons/areaIcon.png create mode 100644 src/main/resources/ch/zhaw/gartenverwaltung/icons/deleteIcon.png create mode 100644 src/main/resources/ch/zhaw/gartenverwaltung/icons/detailsIcon.png create mode 100644 src/main/resources/ch/zhaw/gartenverwaltung/icons/editIcon.png create mode 100644 src/main/resources/ch/zhaw/gartenverwaltung/icons/homeIcon.png create mode 100644 src/main/resources/ch/zhaw/gartenverwaltung/icons/locationIcon.png create mode 100644 src/main/resources/ch/zhaw/gartenverwaltung/icons/settingsIcon.png diff --git a/src/main/java/ch/zhaw/gartenverwaltung/CropDetailController.java b/src/main/java/ch/zhaw/gartenverwaltung/CropDetailController.java index 7051bfa..85fb66d 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/CropDetailController.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/CropDetailController.java @@ -14,6 +14,7 @@ import javafx.fxml.FXML; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.Label; +import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; @@ -72,6 +73,9 @@ public class CropDetailController { @FXML private Label spacing_label; + @FXML + private Button editTaskList_button; + @FXML void editTaskList() { @@ -114,6 +118,9 @@ public class CropDetailController { } catch (HardinessZoneNotSetException | IOException e) { throw new PlantNotFoundException(); } + setIconToButton(editTaskList_button, "editIcon.png"); + setIconToButton(area_button, "areaIcon.png"); + setIconToButton(location_button, "locationIcon.png"); } private void createTaskLists(Crop crop) { @@ -149,4 +156,17 @@ public class CropDetailController { pests_vbox.getChildren().addAll(label, hBox); } } + + /** + * adds icon to button + * @param button the button which get the icon + * @param iconFileName file name of icon + */ + private void setIconToButton(Button button, String iconFileName) { + Image img = new Image(String.valueOf(getClass().getResource("icons/" + iconFileName))); + ImageView imageView = new ImageView(img); + imageView.setFitHeight(20); + imageView.setPreserveRatio(true); + button.setGraphic(imageView); + } } diff --git a/src/main/java/ch/zhaw/gartenverwaltung/MainFXMLController.java b/src/main/java/ch/zhaw/gartenverwaltung/MainFXMLController.java index fca8b69..6970451 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/MainFXMLController.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/MainFXMLController.java @@ -4,9 +4,12 @@ import ch.zhaw.gartenverwaltung.bootstrap.AfterInject; import ch.zhaw.gartenverwaltung.bootstrap.AppLoader; import ch.zhaw.gartenverwaltung.bootstrap.ChangeViewEvent; import ch.zhaw.gartenverwaltung.bootstrap.Inject; +import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.FXML; -import javafx.scene.control.Button; +import javafx.scene.control.*; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.Pane; @@ -33,7 +36,10 @@ public class MainFXMLController { private Button mySchedule_button; @FXML - private Button plants_button; + private Button settings_button; + + @FXML + private Button tutorial_button; @FXML void goToHome() { @@ -54,9 +60,31 @@ public class MainFXMLController { } @FXML - void goToPlants() { - showPaneAsMainView("Plants.fxml"); - styleChangeButton(plants_button); + public void openSettings(ActionEvent actionEvent) throws IOException { + Dialog dialog = new Dialog<>(); + dialog.setTitle("Settings"); + dialog.setHeaderText("Settings"); + dialog.setResizable(false); + + DialogPane dialogPane = dialog.getDialogPane(); + + ButtonType saveSettings = new ButtonType("Save", ButtonBar.ButtonData.OK_DONE); + dialogPane.getButtonTypes().addAll(saveSettings, ButtonType.CANCEL); + + if (appLoader.loadPaneToDialog("Settings.fxml", dialogPane) instanceof SettingsController controller) { + + dialog.showAndWait() + .ifPresent(button -> { + if (button.equals(saveSettings)) { + controller.saveSettings(); + } + }); + } + } + + public void goToTutorial(ActionEvent actionEvent) { + //showPaneAsMainView("Tutorial.fxml"); + styleChangeButton(tutorial_button); } /** @@ -100,11 +128,32 @@ public class MainFXMLController { public void init() { try { preloadPanes(); - showPaneAsMainView("Home.fxml"); - styleChangeButton(home_button); + showPaneAsMainView("MyGarden.fxml"); + styleChangeButton(myGarden_button); } catch (IOException e) { LOG.log(Level.SEVERE, "Failed to load FXML-Pane!", e); } + setIconToButton(home_button, "homeIcon.png"); + setIconToButton(settings_button, "settingsIcon.png"); + Settings.getInstance().getShowTutorialProperty().addListener((observable, oldValue, newValue) -> { + tutorial_button.setVisible(newValue); + }); + tutorial_button.setVisible(Settings.getInstance().getShowTutorial()); } + + /** + * adds icon to button + * @param button the button which get the icon + * @param iconFileName file name of icon + */ + private void setIconToButton(Button button, String iconFileName) { + Image img = new Image(String.valueOf(getClass().getResource("icons/" + iconFileName))); + ImageView imageView = new ImageView(img); + imageView.setFitHeight(20); + imageView.setPreserveRatio(true); + button.setGraphic(imageView); + } + + } diff --git a/src/main/java/ch/zhaw/gartenverwaltung/MyGardenController.java b/src/main/java/ch/zhaw/gartenverwaltung/MyGardenController.java index e54e608..3de534f 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/MyGardenController.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/MyGardenController.java @@ -17,6 +17,7 @@ import javafx.scene.control.Alert; import javafx.scene.control.Button; import javafx.scene.control.ButtonType; import javafx.scene.control.Label; +import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.HBox; @@ -43,6 +44,8 @@ public class MyGardenController { public AnchorPane myGardenRoot; @FXML private VBox myPlants_vbox; + @FXML + private Button addPlant_button; @AfterInject @SuppressWarnings("unused") @@ -59,6 +62,7 @@ public class MyGardenController { } catch (HardinessZoneNotSetException | IOException e) { LOG.log(Level.SEVERE, "Could not update view of croplist!", e); } + setIconToButton(addPlant_button, "addIcon.png"); } @FXML @@ -91,8 +95,10 @@ public class MyGardenController { label.setMaxWidth(2000); HBox.setHgrow(label, Priority.ALWAYS); - Button details = new Button("Details"); - Button delete = new Button("delete"); + Button details = new Button(""); + Button delete = new Button(""); + setIconToButton(details, "detailsIcon.png"); + setIconToButton(delete, "deleteIcon.png"); details.setOnAction(getGoToCropDetailEvent(crop)); delete.setOnAction(getDeleteCropEvent(crop)); @@ -100,6 +106,19 @@ public class MyGardenController { return hBox; } + /** + * adds icon to button + * @param button the button which get the icon + * @param iconFileName file name of icon + */ + private void setIconToButton(Button button, String iconFileName) { + Image img = new Image(String.valueOf(getClass().getResource("icons/" + iconFileName))); + ImageView imageView = new ImageView(img); + imageView.setFitHeight(20); + imageView.setPreserveRatio(true); + button.setGraphic(imageView); + } + private EventHandler getGoToCropDetailEvent(Crop crop) { return (event) -> { try { diff --git a/src/main/java/ch/zhaw/gartenverwaltung/Settings.java b/src/main/java/ch/zhaw/gartenverwaltung/Settings.java index 792f5c0..c15454c 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/Settings.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/Settings.java @@ -1,10 +1,13 @@ package ch.zhaw.gartenverwaltung; import ch.zhaw.gartenverwaltung.types.HardinessZone; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; public class Settings { private HardinessZone currentHardinessZone = HardinessZone.ZONE_8A; private static Settings instance; + private final BooleanProperty showTutorial = new SimpleBooleanProperty(false); static { instance = new Settings(); @@ -23,4 +26,16 @@ public class Settings { public void setCurrentHardinessZone(HardinessZone currentHardinessZone) { this.currentHardinessZone = currentHardinessZone; } + + public void setShowTutorial (boolean showTutorial) { + this.showTutorial.setValue(showTutorial); + } + + public BooleanProperty getShowTutorialProperty() { + return this.showTutorial; + } + + public boolean getShowTutorial() { + return this.showTutorial.get(); + } } diff --git a/src/main/java/ch/zhaw/gartenverwaltung/SettingsController.java b/src/main/java/ch/zhaw/gartenverwaltung/SettingsController.java new file mode 100644 index 0000000..9a8158f --- /dev/null +++ b/src/main/java/ch/zhaw/gartenverwaltung/SettingsController.java @@ -0,0 +1,40 @@ +package ch.zhaw.gartenverwaltung; + +import ch.zhaw.gartenverwaltung.types.HardinessZone; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.CheckBox; +import javafx.scene.control.ComboBox; + +import java.net.URL; +import java.util.ResourceBundle; + +public class SettingsController implements Initializable { + Settings settings = Settings.getInstance(); + + @FXML + private ComboBox selectHardinessZone_comboBox; + + @FXML + private CheckBox showTutorial_checkBox; + + /** + * save selected values to {@link Settings} + */ + public void saveSettings() { + settings.setShowTutorial(showTutorial_checkBox.isSelected()); + settings.setCurrentHardinessZone(selectHardinessZone_comboBox.getValue()); + } + + /** + * save default values form {@link Settings} + * @param location location + * @param resources resources + */ + @Override + public void initialize(URL location, ResourceBundle resources) { + showTutorial_checkBox.setSelected(settings.getShowTutorial()); + selectHardinessZone_comboBox.getItems().addAll(HardinessZone.values()); + selectHardinessZone_comboBox.setValue(settings.getCurrentHardinessZone()); + } +} diff --git a/src/main/resources/ch/zhaw/gartenverwaltung/CropDetail.fxml b/src/main/resources/ch/zhaw/gartenverwaltung/CropDetail.fxml index ed3a476..160c0a7 100644 --- a/src/main/resources/ch/zhaw/gartenverwaltung/CropDetail.fxml +++ b/src/main/resources/ch/zhaw/gartenverwaltung/CropDetail.fxml @@ -80,7 +80,7 @@ -