Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1b096035a7 | ||
|
|
0074d43364 | ||
|
|
c6952aba55 | ||
|
|
807a9017ad | ||
|
|
c134025408 | ||
|
|
1e95e0ff30 | ||
|
|
76197a19df | ||
|
|
5f7d690875 | ||
|
|
96dc0ad827 |
@@ -3,15 +3,15 @@ package ch.zhaw.gartenverwaltung;
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.AfterInject;
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.Inject;
|
||||
import ch.zhaw.gartenverwaltung.io.PlantList;
|
||||
import ch.zhaw.gartenverwaltung.io.TaskList;
|
||||
import ch.zhaw.gartenverwaltung.models.Garden;
|
||||
import ch.zhaw.gartenverwaltung.io.HardinessZoneNotSetException;
|
||||
import ch.zhaw.gartenverwaltung.models.GardenSchedule;
|
||||
import ch.zhaw.gartenverwaltung.types.Crop;
|
||||
import ch.zhaw.gartenverwaltung.types.Plant;
|
||||
import ch.zhaw.gartenverwaltung.types.Task;
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.property.ListProperty;
|
||||
import javafx.beans.property.SimpleListProperty;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.event.EventHandler;
|
||||
import javafx.fxml.FXML;
|
||||
@@ -51,9 +51,15 @@ public class MyScheduleController {
|
||||
@FXML
|
||||
private ListView<Crop> scheduledPlants_listview;
|
||||
|
||||
@FXML
|
||||
private void showAllTasks(ActionEvent actionEvent) throws IOException {
|
||||
gardenSchedule.getTasksUpcomingWeek();
|
||||
scheduledPlants_listview.getSelectionModel().clearSelection();
|
||||
}
|
||||
|
||||
@AfterInject
|
||||
@SuppressWarnings("unused")
|
||||
public void init() {
|
||||
public void init() throws IOException {
|
||||
setCellFactoryCropListView();
|
||||
setCellFactoryTaskListView();
|
||||
scheduledPlants_listview.itemsProperty().bind(garden.getPlantedCrops());
|
||||
@@ -61,6 +67,19 @@ public class MyScheduleController {
|
||||
week_listView.itemsProperty().bind(taskListProperty);
|
||||
lookForSelectedListEntries();
|
||||
information_label.setText("");
|
||||
|
||||
gardenSchedule.getTasksUpcomingWeek();
|
||||
TaskList.TaskListObserver taskListObserver = newTaskList -> {
|
||||
Platform.runLater(() -> {
|
||||
try {
|
||||
gardenSchedule.getTasksUpcomingWeek();
|
||||
scheduledPlants_listview.getSelectionModel().clearSelection();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
});
|
||||
};
|
||||
gardenSchedule.setTaskListObserver(taskListObserver);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -81,6 +100,8 @@ public class MyScheduleController {
|
||||
* set cellFactory for the crops.
|
||||
*/
|
||||
private void setCellFactoryCropListView() {
|
||||
MultipleSelectionModel<Crop> selectionModel = scheduledPlants_listview.getSelectionModel();
|
||||
selectionModel.setSelectionMode(SelectionMode.MULTIPLE);
|
||||
scheduledPlants_listview.setCellFactory(param -> new ListCell<>() {
|
||||
@Override
|
||||
protected void updateItem(Crop crop, boolean empty) {
|
||||
@@ -133,8 +154,6 @@ public class MyScheduleController {
|
||||
} else {
|
||||
gardenSchedule.getTasksUpcomingWeek();
|
||||
}
|
||||
//taskListProperty.clear();
|
||||
//taskListProperty.addAll(taskLists);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -202,5 +221,4 @@ public class MyScheduleController {
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -32,16 +32,6 @@ public class GardenSchedule {
|
||||
public GardenSchedule(TaskList taskList, PlantList plantList) throws IOException {
|
||||
this.taskList = taskList;
|
||||
this.plantList = plantList;
|
||||
TaskList.TaskListObserver taskListObserver = newTaskList -> {
|
||||
Platform.runLater(() -> {
|
||||
try {
|
||||
getTasksUpcomingWeek();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
});
|
||||
};
|
||||
setTaskListObserver(taskListObserver);
|
||||
}
|
||||
|
||||
public ListProperty<List<Task>> getWeeklyTaskListProperty() {
|
||||
@@ -176,14 +166,12 @@ public class GardenSchedule {
|
||||
dayTaskList.add(new ArrayList<>());
|
||||
final int finalI = i;
|
||||
weekTasks.forEach(task -> {
|
||||
if (task.getNextExecution() == null) {
|
||||
task.isDone();
|
||||
} else {
|
||||
if(task.getNextExecution() != null) {
|
||||
LocalDate checkDate = task.getNextExecution();
|
||||
|
||||
do {
|
||||
if (date.equals(checkDate) && !date.isAfter(task.getEndDate().orElse(LocalDate.MIN))) {
|
||||
if (date.equals(task.getNextExecution()) || (date.equals(checkDate) && !date.isAfter(task.getEndDate().orElse(LocalDate.MIN)))) {
|
||||
dayTaskList.get(finalI).add(task);
|
||||
break;
|
||||
}
|
||||
checkDate = checkDate.plusDays(task.getInterval().orElse(0));
|
||||
} while (!(task.getInterval().orElse(0) == 0) && checkDate.isBefore(LocalDate.now().plusDays(listLength)));
|
||||
|
||||
@@ -107,7 +107,7 @@ public class Task {
|
||||
* @return Whether the Task is within the given range
|
||||
*/
|
||||
public boolean isInTimePeriod(LocalDate searchStartDate, LocalDate searchEndDate) {
|
||||
return endDate.isAfter(searchStartDate) && startDate.isBefore(searchEndDate) || (nextExecution != null && nextExecution.isBefore(searchEndDate) && nextExecution.isAfter(searchStartDate));
|
||||
return (endDate.isAfter(searchStartDate) && startDate.isBefore(searchEndDate)) || ((nextExecution != null && nextExecution.isBefore(searchEndDate.plusDays(1)) && nextExecution.isAfter(searchStartDate.minusDays(1))));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.control.ListView?>
|
||||
<?import javafx.scene.layout.AnchorPane?>
|
||||
@@ -19,11 +20,12 @@
|
||||
</Label>
|
||||
<HBox maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="541.0" prefWidth="867.0" spacing="10.0" VBox.vgrow="ALWAYS">
|
||||
<children>
|
||||
<ListView fx:id="scheduledPlants_listview" maxWidth="1.7976931348623157E308" prefHeight="522.0" prefWidth="271.0" HBox.hgrow="NEVER">
|
||||
<HBox.margin>
|
||||
<Insets />
|
||||
</HBox.margin>
|
||||
</ListView>
|
||||
<VBox prefHeight="497.0" prefWidth="237.0" spacing="10.0" HBox.hgrow="NEVER">
|
||||
<children>
|
||||
<ListView fx:id="scheduledPlants_listview" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="522.0" prefWidth="271.0" VBox.vgrow="ALWAYS" />
|
||||
<Button maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#showAllTasks" styleClass="button-class" text="Show All Tasks" VBox.vgrow="NEVER" />
|
||||
</children>
|
||||
</VBox>
|
||||
<VBox maxWidth="1.7976931348623157E308" prefHeight="537.0" prefWidth="650.0" spacing="10.0" HBox.hgrow="ALWAYS">
|
||||
<children>
|
||||
<ListView fx:id="week_listView" maxWidth="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" VBox.vgrow="ALWAYS">
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 3.2 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 16 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 1.4 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 42 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 34 KiB |
@@ -1,7 +1,12 @@
|
||||
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 javafx.application.Platform;
|
||||
import org.junit.jupiter.api.*;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.ArgumentMatchers;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
@@ -13,6 +18,7 @@ import java.nio.file.Path;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
@@ -27,6 +33,22 @@ public class JsonTaskListTest {
|
||||
private final URL dbDataSource = this.getClass().getResource("test-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
|
||||
void connectToDb() throws URISyntaxException, IOException {
|
||||
assertNotNull(testFile);
|
||||
@@ -35,6 +57,10 @@ public class JsonTaskListTest {
|
||||
testDatabase = new JsonTaskList(dbDataSource);
|
||||
}
|
||||
|
||||
private void reloadDb() {
|
||||
testDatabase = new JsonTaskList(dbDataSource);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Check if results are retrieved completely")
|
||||
void getTasks() {
|
||||
@@ -47,7 +73,8 @@ public class JsonTaskListTest {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
Assertions.assertEquals(3, taskList.size());
|
||||
List<Long> ids = taskList.stream().map(t -> t.getId().orElse(0L)).toList();
|
||||
Assertions.assertEquals(Arrays.asList(1L, 2L, 5L), ids);
|
||||
|
||||
}
|
||||
|
||||
@@ -65,7 +92,8 @@ public class JsonTaskListTest {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
Assertions.assertEquals(4, taskList.size());
|
||||
List<Long> ids = taskList.stream().map(t -> t.getId().orElse(0L)).toList();
|
||||
Assertions.assertEquals(Arrays.asList(1L, 2L, 5L, 9L), ids);
|
||||
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
@@ -83,7 +111,8 @@ public class JsonTaskListTest {
|
||||
taskList = testDatabase.getTaskList(LocalDate.parse("2022-04-30", formatter),
|
||||
LocalDate.parse("2022-05-31", formatter));
|
||||
|
||||
Assertions.assertEquals(2, taskList.size());
|
||||
List<Long> ids = taskList.stream().map(t -> t.getId().orElse(0L)).toList();
|
||||
Assertions.assertEquals(Arrays.asList(1L, 5L), ids);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
@@ -100,8 +129,8 @@ public class JsonTaskListTest {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
Assertions.assertEquals(6, taskList.size());
|
||||
|
||||
List<Long> ids = taskList.stream().map(t -> t.getId().orElse(0L)).toList();
|
||||
Assertions.assertEquals(Arrays.asList(1L, 2L, 3L, 4L, 5L, 6L), ids);
|
||||
}
|
||||
|
||||
|
||||
@@ -116,10 +145,20 @@ public class JsonTaskListTest {
|
||||
}
|
||||
|
||||
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
|
||||
void testDefaultConstructor(){
|
||||
void testDefaultConstructor() {
|
||||
JsonTaskList db = new JsonTaskList();
|
||||
try {
|
||||
assertNotNull(db.getTaskForCrop(0));
|
||||
@@ -138,6 +177,43 @@ public class JsonTaskListTest {
|
||||
} catch (IOException 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -34,12 +34,17 @@ class GardenScheduleTest {
|
||||
|
||||
@BeforeAll
|
||||
static void setUpAll() {
|
||||
try{
|
||||
Platform.startup(()->{});
|
||||
}catch (IllegalStateException ise){
|
||||
//ignore double launches
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
static void tearDownAll() {
|
||||
Platform.exit();
|
||||
//Dont do: Platform.exit();
|
||||
}
|
||||
|
||||
@BeforeEach
|
||||
@@ -234,5 +239,8 @@ class GardenScheduleTest {
|
||||
testTaskList.getTaskList(LocalDate.MIN,LocalDate.MAX).get(0);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void testPlantNotFoundException() throws HardinessZoneNotSetException, IOException {
|
||||
assertThrowsExactly(PlantNotFoundException.class, () -> { model.planTasksForCrop(new Crop(0, exampleStartDate)); });
|
||||
}
|
||||
}
|
||||
@@ -64,5 +64,27 @@
|
||||
"endDate" : "2022-09-01",
|
||||
"interval" : 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
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user