Compare commits

..
7 changed files with 85 additions and 150 deletions
@@ -25,11 +25,12 @@ public class BackgroundTasks extends TimerTask {
private void movePastTasks() throws IOException { private void movePastTasks() throws IOException {
List<Task> taskList = this.taskList.getTaskList(LocalDate.MIN, LocalDate.now().minusDays(1)); List<Task> taskList = this.taskList.getTaskList(LocalDate.MIN, LocalDate.now().minusDays(1));
taskList.forEach(task -> { for (Task task : taskList) {
if (!task.isDone()) { if (!task.isDone()) {
task.setNextExecution(LocalDate.now()); task.setNextExecution(LocalDate.now());
this.taskList.saveTask(task);
} }
}); }
} }
public BackgroundTasks(TaskList taskList, CropList cropList, PlantList plantList) { public BackgroundTasks(TaskList taskList, CropList cropList, PlantList plantList) {
@@ -9,8 +9,12 @@ import ch.zhaw.gartenverwaltung.types.*;
import java.io.IOException; import java.io.IOException;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import static java.util.stream.Collectors.toList;
/** /**
* The WeatherGardenTaskPlanner creates Tasks based on weather events and the rain amount from the last days * The WeatherGardenTaskPlanner creates Tasks based on weather events and the rain amount from the last days
* *
@@ -43,8 +47,7 @@ public class WeatherGradenTaskPlanner {
private void getSevereWeatherEvents() throws IOException { private void getSevereWeatherEvents() throws IOException {
SevereWeather actualWeather = weatherService.causeSevereWeather(1); SevereWeather actualWeather = weatherService.causeSevereWeather(1);
if (SevereWeather.HAIL.equals(actualWeather)) { if (SevereWeather.HAIL.equals(actualWeather)) {
//ToDo creates hail task all 3 seconds, pls fix createPreHailTask();
//createPreHailTask();
} else if (SevereWeather.FROST.equals(actualWeather)) { } else if (SevereWeather.FROST.equals(actualWeather)) {
createPreFrostTask(); createPreFrostTask();
} else if (SevereWeather.SNOW.equals(actualWeather)) { } else if (SevereWeather.SNOW.equals(actualWeather)) {
@@ -63,11 +66,27 @@ public class WeatherGradenTaskPlanner {
*/ */
private void createPreHailTask() throws IOException { private void createPreHailTask() throws IOException {
Task preHailTask = new Task("Hail", List<Crop> actualCrops = cropList.getCrops();
"During a summer Thunderstorm it could hail heavily. THe Hail could damage the crops. To prevent damage cover the plants with a strong tarpaulin",
dateSevereWeather.minusDays(1L),dateSevereWeather.plusDays(1L),1L);
taskList.saveTask(preHailTask);
for (Crop crop : actualCrops) {
Task preHailTask = new Task("Hail",
"During a summer Thunderstorm it could hail heavily. THe Hail could damage the crops. To prevent damage cover the plants with a strong tarpaulin",
dateSevereWeather,dateSevereWeather.plusDays(1L),crop.getCropId().orElse(-1L));
List<Task> actualCropTaskList = taskList.getTaskForCrop(crop.getCropId().orElse(-1L));
List<Task> hailTasklist = actualCropTaskList.stream().filter(task -> task.getName().equals("Hail")).toList();
List<Task> hailTaskListAtDate = new ArrayList<>();
for (Task task : hailTasklist) {
if (task.getStartDate() == (preHailTask.getStartDate())) {
hailTaskListAtDate.add(task);
}
}
if(hailTaskListAtDate.isEmpty() && hailTasklist.isEmpty()){
taskList.saveTask(preHailTask);
}
}
} }
/** /**
@@ -75,10 +94,26 @@ public class WeatherGradenTaskPlanner {
* @throws IOException If the database cannot be accessed * @throws IOException If the database cannot be accessed
*/ */
private void createPreFrostTask() throws IOException { private void createPreFrostTask() throws IOException {
Task preFrostTask = new Task("Frost", List<Crop> actualCrops = cropList.getCrops();
"The temperatur falls below zero degrees, cover especially the root with wool", for (Crop crop : actualCrops) {
dateSevereWeather.minusDays(1L),dateSevereWeather.plusDays(1L),1L);
taskList.saveTask(preFrostTask); Task preFrostTask = new Task("Frost",
"The temperatur falls below zero degrees, cover especially the root with wool",
dateSevereWeather,dateSevereWeather.plusDays(1L),crop.getCropId().orElse(-1L));
List<Task> actualCropTaskList = taskList.getTaskForCrop(crop.getCropId().orElse(-1L));
List<Task> frostTasklist = actualCropTaskList.stream().filter(task -> task.getName().equals("Frost")).toList();
List<Task> frostTaskListAtDate = new ArrayList<>();
for (Task task : frostTasklist) {
if (task.getStartDate() == preFrostTask.getStartDate()) {
frostTaskListAtDate.add(task);
}
}
if(frostTaskListAtDate.isEmpty() && frostTasklist.isEmpty()){
taskList.saveTask(preFrostTask);
}
}
} }
/** /**
@@ -86,10 +121,27 @@ public class WeatherGradenTaskPlanner {
* @throws IOException If the database cannot be accessed * @throws IOException If the database cannot be accessed
*/ */
private void createPreSnowTask() throws IOException { private void createPreSnowTask() throws IOException {
Task preSnowTask = new Task("Snow", List<Crop> actualCrops = cropList.getCrops();
"The weather brings little snowfall. Cover your crops", for (Crop crop : actualCrops) {
dateSevereWeather.minusDays(1L),dateSevereWeather.plusDays(1L),1L);
taskList.saveTask(preSnowTask); Task preSnowTask = new Task("Snow",
"The weather brings little snowfall. Cover your crops",
dateSevereWeather, dateSevereWeather.plusDays(1L), crop.getCropId().orElse(-1L));
List<Task> actualCropTaskList = taskList.getTaskForCrop(crop.getCropId().orElse(-1L));
List<Task> snowTasklist = actualCropTaskList.stream().filter(task -> task.getName().equals("Snow")).toList();
List<Task> snowTaskListAtDate = new ArrayList<>();
for (Task task : snowTasklist) {
if (task.getStartDate() == preSnowTask.getStartDate()) {
snowTaskListAtDate.add(task);
}
}
if(snowTaskListAtDate .isEmpty() && snowTasklist.isEmpty()){
taskList.saveTask(preSnowTask);
}
}
} }
/** /**
@@ -63,6 +63,7 @@ public class Task {
this.startDate = startDate; this.startDate = startDate;
nextExecution = startDate; nextExecution = startDate;
this.endDate = endDate; this.endDate = endDate;
this.cropId = cropId;
} }
/** /**
@@ -52,7 +52,7 @@ public class WeatherGardenTaskPlannerTest {
exampleTask.setNextExecution(LocalDate.now().plusDays(1L)); exampleTask.setNextExecution(LocalDate.now().plusDays(1L));
exampleWeatherTask = new Task("Hail", exampleWeatherTask = new Task("Hail",
"During a summer Thunderstorm it could hail heavily. THe Hail could damage the crops. To prevent damage cover the plants with a strong tarpaulin", "During a summer Thunderstorm it could hail heavily. THe Hail could damage the crops. To prevent damage cover the plants with a strong tarpaulin",
LocalDate.now().minusDays(1L),LocalDate.now().plusDays(1L),3L); LocalDate.now(),LocalDate.now().plusDays(1L),3L);
taskList = new JsonTaskList(testFile); taskList = new JsonTaskList(testFile);
@@ -1,12 +1,7 @@
package ch.zhaw.gartenverwaltung.io; package ch.zhaw.gartenverwaltung.io;
import ch.zhaw.gartenverwaltung.models.GardenSchedule;
import ch.zhaw.gartenverwaltung.models.PlantNotFoundException;
import ch.zhaw.gartenverwaltung.types.Crop;
import ch.zhaw.gartenverwaltung.types.Task; import ch.zhaw.gartenverwaltung.types.Task;
import javafx.application.Platform;
import org.junit.jupiter.api.*; import org.junit.jupiter.api.*;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatchers; import org.mockito.ArgumentMatchers;
import org.mockito.Mockito; import org.mockito.Mockito;
@@ -18,7 +13,6 @@ import java.nio.file.Path;
import java.nio.file.StandardCopyOption; import java.nio.file.StandardCopyOption;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List; import java.util.List;
import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -33,22 +27,6 @@ public class JsonTaskListTest {
private final URL dbDataSource = 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"); private final URL testFile = this.getClass().getResource("template-taskdb.json");
@BeforeAll
static void setUpAll() {
try{
Platform.startup(()->{});
}catch (IllegalStateException ise){
//ignore double launches
}
}
@AfterAll
static void tearDownAll() {
//Dont do: Platform.exit();
}
@BeforeEach @BeforeEach
void connectToDb() throws URISyntaxException, IOException { void connectToDb() throws URISyntaxException, IOException {
assertNotNull(testFile); assertNotNull(testFile);
@@ -57,10 +35,6 @@ public class JsonTaskListTest {
testDatabase = new JsonTaskList(dbDataSource); testDatabase = new JsonTaskList(dbDataSource);
} }
private void reloadDb() {
testDatabase = new JsonTaskList(dbDataSource);
}
@Test @Test
@DisplayName("Check if results are retrieved completely") @DisplayName("Check if results are retrieved completely")
void getTasks() { void getTasks() {
@@ -73,8 +47,7 @@ public class JsonTaskListTest {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
List<Long> ids = taskList.stream().map(t -> t.getId().orElse(0L)).toList(); Assertions.assertEquals(3, taskList.size());
Assertions.assertEquals(Arrays.asList(1L, 2L, 5L), ids);
} }
@@ -92,8 +65,7 @@ public class JsonTaskListTest {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
List<Long> ids = taskList.stream().map(t -> t.getId().orElse(0L)).toList(); Assertions.assertEquals(4, taskList.size());
Assertions.assertEquals(Arrays.asList(1L, 2L, 5L, 9L), ids);
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
@@ -111,8 +83,7 @@ public class JsonTaskListTest {
taskList = testDatabase.getTaskList(LocalDate.parse("2022-04-30", formatter), taskList = testDatabase.getTaskList(LocalDate.parse("2022-04-30", formatter),
LocalDate.parse("2022-05-31", formatter)); LocalDate.parse("2022-05-31", formatter));
List<Long> ids = taskList.stream().map(t -> t.getId().orElse(0L)).toList(); Assertions.assertEquals(2, taskList.size());
Assertions.assertEquals(Arrays.asList(1L, 5L), ids);
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@@ -129,8 +100,8 @@ public class JsonTaskListTest {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
List<Long> ids = taskList.stream().map(t -> t.getId().orElse(0L)).toList(); Assertions.assertEquals(6, taskList.size());
Assertions.assertEquals(Arrays.asList(1L, 2L, 3L, 4L, 5L, 6L), ids);
} }
@@ -145,20 +116,10 @@ public class JsonTaskListTest {
} }
Assertions.assertEquals(0, taskList.size()); Assertions.assertEquals(0, taskList.size());
try {
taskList = testDatabase.getTaskForCrop(1);
} catch (IOException e) {
throw new RuntimeException(e);
}
List<Long> ids = (taskList.stream().map( task -> task.getId().orElse(0L)).toList());
Assertions.assertEquals(Arrays.asList(7L, 8L), ids);
} }
@Test @Test
void testDefaultConstructor() { void testDefaultConstructor(){
JsonTaskList db = new JsonTaskList(); JsonTaskList db = new JsonTaskList();
try { try {
assertNotNull(db.getTaskForCrop(0)); assertNotNull(db.getTaskForCrop(0));
@@ -177,43 +138,6 @@ public class JsonTaskListTest {
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
verify(mockObs, times(1)).onChange(ArgumentMatchers.anyList());
ArgumentCaptor<List<Task>> captor = ArgumentCaptor.forClass(List.class);
verify(mockObs, times(1)).onChange(captor.capture());
List<Long> ids = captor.getValue().stream().map(t -> t.getId().orElse(0L)).toList();
Assertions.assertEquals(Arrays.asList(7L, 8L), ids);
}
@Test
@Tag("IntegrationTest")
void testComplete() {
JsonPlantList plantList = new JsonPlantList();
try {
testDatabase.removeTasksForCrop(0);
testDatabase.removeTasksForCrop(1);
} catch (IOException e) {
throw new RuntimeException(e);
}
GardenSchedule gardenSchedule = null;
try {
gardenSchedule = new GardenSchedule(testDatabase, plantList);
} catch (IOException e) {
throw new RuntimeException(e);
}
Crop crop = new Crop(3L, LocalDate.parse("2022-12-01", formatter));
try {
gardenSchedule.planTasksForCrop(crop);
reloadDb();
List<Task> tasks = gardenSchedule.getTaskList();
List<String> tasknames = (tasks.stream().map( task -> task.getName().substring(0,3).toLowerCase()).toList());
Assertions.assertEquals(Arrays.asList("ger","wat","hil","har"), tasknames);
} catch (IOException | PlantNotFoundException | HardinessZoneNotSetException e) {
throw new RuntimeException(e);
}
} }
} }
@@ -3,9 +3,6 @@ package ch.zhaw.gartenverwaltung.models;
import ch.zhaw.gartenverwaltung.io.*; import ch.zhaw.gartenverwaltung.io.*;
import ch.zhaw.gartenverwaltung.models.GardenSchedule; import ch.zhaw.gartenverwaltung.models.GardenSchedule;
import ch.zhaw.gartenverwaltung.types.*; import ch.zhaw.gartenverwaltung.types.*;
import javafx.application.Platform;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@@ -32,21 +29,6 @@ class GardenScheduleTest {
List<TaskTemplate> exampleTaskTemplateList; List<TaskTemplate> exampleTaskTemplateList;
GardenSchedule model; GardenSchedule model;
@BeforeAll
static void setUpAll() {
try{
Platform.startup(()->{});
}catch (IllegalStateException ise){
//ignore double launches
}
}
@AfterAll
static void tearDownAll() {
//Dont do: Platform.exit();
}
@BeforeEach @BeforeEach
void setUp() throws IOException, HardinessZoneNotSetException { void setUp() throws IOException, HardinessZoneNotSetException {
createExampleTaskList(); createExampleTaskList();
@@ -239,8 +221,5 @@ class GardenScheduleTest {
testTaskList.getTaskList(LocalDate.MIN,LocalDate.MAX).get(0); testTaskList.getTaskList(LocalDate.MIN,LocalDate.MAX).get(0);
} }
@Test
void testPlantNotFoundException() throws HardinessZoneNotSetException, IOException {
assertThrowsExactly(PlantNotFoundException.class, () -> { model.planTasksForCrop(new Crop(0, exampleStartDate)); });
}
} }
@@ -26,8 +26,8 @@
"name" : "fertilize plant", "name" : "fertilize plant",
"description": "The fertilizer has to be mixed with water. Then fertilize the plants soil with the mixture", "description": "The fertilizer has to be mixed with water. Then fertilize the plants soil with the mixture",
"startDate" : "2022-06-01", "startDate" : "2022-06-01",
"nextExecution": "2022-06-01", "nextExecution": "2022-05-01",
"nextNotification": "2022-06-01", "nextNotification": "2022-05-01",
"endDate" : "2022-08-01", "endDate" : "2022-08-01",
"interval" : 28, "interval" : 28,
"cropId" : 0 "cropId" : 0
@@ -37,8 +37,8 @@
"name" : "covering plant", "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", "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", "startDate" : "2022-07-01",
"nextExecution": "2022-07-01", "nextExecution": "2022-05-01",
"nextNotification": "2022-07-01", "nextNotification": "2022-05-01",
"endDate" : "2022-07-01", "endDate" : "2022-07-01",
"interval" : 0, "interval" : 0,
"cropId" : 0 "cropId" : 0
@@ -59,32 +59,10 @@
"name" : "harvest plant", "name" : "harvest plant",
"description": "Pull the ripe vegetables out from the soil. Clean them with clear, fresh water. ", "description": "Pull the ripe vegetables out from the soil. Clean them with clear, fresh water. ",
"startDate" : "2022-09-01", "startDate" : "2022-09-01",
"nextExecution": "2022-09-01", "nextExecution": "2022-05-01",
"nextNotification": "2022-09-01", "nextNotification": "2022-05-01",
"endDate" : "2022-09-01", "endDate" : "2022-09-01",
"interval" : 0, "interval" : 0,
"cropId" : 0 "cropId" : 0
},
{
"id" : 7,
"name" : "sow plant",
"description": "Plant the seeds, crops in de bed.",
"startDate" : "2022-11-01",
"nextExecution": "2022-11-01",
"nextNotification": "2022-11-01",
"endDate" : "2022-11-01",
"interval" : 0,
"cropId" : 1
},
{
"id" : 8,
"name" : "harvest plant",
"description": "Pull the ripe vegetables out from the soil. Clean them with clear, fresh water. ",
"startDate" : "2022-12-01",
"nextExecution": "2022-12-01",
"nextNotification": "2022-12-01",
"endDate" : "2022-12-01",
"interval" : 0,
"cropId" : 1
} }
] ]