Compare commits
14
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb0c50a715 | ||
|
|
83bc011870 | ||
|
|
ce93531ab8 | ||
|
|
7a6a0eb66f | ||
|
|
3afeb8a22d | ||
|
|
88f9bf7990 | ||
|
|
5f35d99839 | ||
|
|
82eab6d5cd | ||
|
|
5411ac69ae | ||
|
|
146c43d5d9 | ||
|
|
160880d4f5 | ||
|
|
5b039eb762 | ||
|
|
c83b8695ab | ||
|
|
f22ef61d3c |
@@ -19,7 +19,7 @@ public class MainFXMLController implements Initializable {
|
||||
/**
|
||||
* Caching the panes
|
||||
*/
|
||||
private final Map<String, Node> panes = new HashMap<>();
|
||||
private final Map<String, AnchorPane> panes = new HashMap<>();
|
||||
|
||||
@FXML
|
||||
private Button home_button;
|
||||
@@ -68,20 +68,22 @@ public class MainFXMLController implements Initializable {
|
||||
* @throws IOException exception when file does not exist
|
||||
*/
|
||||
public void loadPane(String fxmlFile) throws IOException {
|
||||
//ToDo HGrow and VGrow of new node
|
||||
Node node = panes.get(fxmlFile);
|
||||
System.out.println(node);
|
||||
if (node == null) {
|
||||
|
||||
AnchorPane anchorPane = panes.get(fxmlFile);
|
||||
if (anchorPane == null) {
|
||||
FXMLLoader loader = new FXMLLoader(Objects.requireNonNull(HelloApplication.class.getResource(fxmlFile)));
|
||||
node = loader.load();
|
||||
panes.put(fxmlFile, node);
|
||||
anchorPane = loader.load();
|
||||
panes.put(fxmlFile, anchorPane);
|
||||
|
||||
if(fxmlFile.equals("MyPlants.fxml")) {
|
||||
MyPlantsController myPlantsController = loader.getController();
|
||||
myPlantsController.getMainController(this);
|
||||
}
|
||||
}
|
||||
mainPane.getChildren().setAll(node);
|
||||
mainPane.getChildren().setAll(anchorPane);
|
||||
anchorPane.prefWidthProperty().bind(mainPane.widthProperty());
|
||||
anchorPane.prefHeightProperty().bind(mainPane.heightProperty());
|
||||
|
||||
}
|
||||
|
||||
private void styleChangeButton(Button button) {
|
||||
|
||||
@@ -4,6 +4,7 @@ import ch.zhaw.gartenverwaltung.io.HardinessZoneNotSetException;
|
||||
import ch.zhaw.gartenverwaltung.plantList.PlantListModel;
|
||||
import ch.zhaw.gartenverwaltung.types.HardinessZone;
|
||||
import ch.zhaw.gartenverwaltung.types.Plant;
|
||||
import ch.zhaw.gartenverwaltung.types.Seasons;
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.property.ListProperty;
|
||||
import javafx.beans.property.SimpleListProperty;
|
||||
@@ -13,8 +14,10 @@ import javafx.collections.FXCollections;
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.Initializable;
|
||||
import javafx.geometry.Insets;
|
||||
import javafx.geometry.Bounds;
|
||||
import javafx.scene.control.*;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.scene.image.ImageView;
|
||||
import javafx.scene.input.KeyEvent;
|
||||
import javafx.scene.layout.VBox;
|
||||
@@ -30,10 +33,11 @@ public class PlantsController implements Initializable {
|
||||
private final HardinessZone DEFAULT_HARDINESS_ZONE = HardinessZone.ZONE_8A;
|
||||
|
||||
// TODO: move to model
|
||||
|
||||
private final ListProperty<Plant> plantListProperty = new SimpleListProperty<>(FXCollections.observableArrayList());
|
||||
|
||||
@FXML
|
||||
private CheckBox autum_filter;
|
||||
private VBox seasons;
|
||||
|
||||
@FXML
|
||||
private VBox climate_zones;
|
||||
@@ -53,81 +57,44 @@ public class PlantsController implements Initializable {
|
||||
@FXML
|
||||
private TextField search_plants;
|
||||
|
||||
@FXML
|
||||
private CheckBox sommer_filter;
|
||||
|
||||
@FXML
|
||||
private CheckBox spring_filter;
|
||||
|
||||
@FXML
|
||||
private CheckBox winter_filter;
|
||||
|
||||
@FXML
|
||||
void filterAutum(ActionEvent event) {
|
||||
//ToDo
|
||||
|
||||
}
|
||||
|
||||
@FXML
|
||||
void filterSommer(ActionEvent event) {
|
||||
//ToDo
|
||||
|
||||
}
|
||||
|
||||
@FXML
|
||||
void filterSpring(ActionEvent event) {
|
||||
//ToDo
|
||||
|
||||
}
|
||||
|
||||
@FXML
|
||||
void filterWinter(ActionEvent event) {
|
||||
//ToDo
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* saves the current selected plant in new JSON database
|
||||
* @param event event
|
||||
*/
|
||||
@FXML
|
||||
void saveToMyPlant(ActionEvent event) {
|
||||
//ToDo model save selectedPlant to mySelectedPlant(IO)
|
||||
}
|
||||
|
||||
@FXML
|
||||
void searchForPlant(KeyEvent event) {
|
||||
viewFilteredListBySearch(search_plants.getText());
|
||||
}
|
||||
|
||||
/**
|
||||
* fill list view with current hardiness zone
|
||||
* set default values
|
||||
* create filter of season and hardiness zone
|
||||
* create event listener for selected list entry and search by query
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public void initialize(URL url, ResourceBundle resourceBundle) {
|
||||
setListCellFactory();
|
||||
try {
|
||||
plantListProperty.addAll(plantListModel.getPlantList(DEFAULT_HARDINESS_ZONE));
|
||||
} catch (HardinessZoneNotSetException | IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
fillPlantListWithHardinessZone();
|
||||
list_plants.itemsProperty().bind(plantListProperty);
|
||||
list_plants.getSelectionModel().selectedItemProperty()
|
||||
.addListener((observable, oldPlant, newPlant) -> {
|
||||
if (newPlant != null) {
|
||||
img_plant.setImage(newPlant.image());
|
||||
}
|
||||
});
|
||||
|
||||
description_plant.setText("");
|
||||
saveToMyPlant_button.setDisable(true);
|
||||
|
||||
createFilterSeasons();
|
||||
createFilterHardinessZone();
|
||||
lookForSelectedListEntry();
|
||||
try {
|
||||
viewFilteredListBySearch();
|
||||
} catch (HardinessZoneNotSetException | IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void centerImage() {
|
||||
|
||||
//img_plant.setX(0.3);
|
||||
//img_plant.setX(-100);
|
||||
}
|
||||
/**
|
||||
* set text of list view to plant name
|
||||
*/
|
||||
private void setListCellFactory() {
|
||||
list_plants.setCellFactory(param -> new ListCell<Plant>() {
|
||||
@Override
|
||||
@@ -144,62 +111,138 @@ public class PlantsController implements Initializable {
|
||||
}
|
||||
|
||||
/**
|
||||
* update the ListView according to the plant list provided
|
||||
* Entry in ListView is plant name
|
||||
* @param list plantList which fill the ListView
|
||||
* get plant list according to param season and hardiness zone
|
||||
* fill list view with plant list
|
||||
* @param season enum of seasons
|
||||
* @throws HardinessZoneNotSetException throws exception
|
||||
* @throws IOException throws exception
|
||||
*/
|
||||
private void fillListViewWithData(List<Plant> list) {
|
||||
private void viewFilteredListBySeason(Seasons season) throws HardinessZoneNotSetException, IOException {
|
||||
clearListView();
|
||||
for (Plant plant : list) {
|
||||
list_plants.getItems().add(plant);
|
||||
}
|
||||
|
||||
plantListProperty.addAll(plantListModel.getFilteredPlantListBySaisonWithoutGrowthPhase(plantListModel.getCurrentZone(), season.getStartDate(), season.getEndDate()));
|
||||
}
|
||||
|
||||
private void viewFilteredListByFilters() {
|
||||
boolean springValue = spring_filter.isSelected();
|
||||
boolean sommerValue = sommer_filter.isSelected();
|
||||
boolean autumValue = autum_filter.isSelected();
|
||||
boolean winterValue = winter_filter.isSelected();
|
||||
//ToDo getFilteredPlantList with (plantListModel.getFilteredPlantList(DEFAULT_HARDINESS_ZONE, <predicate>))
|
||||
//List<Plant> plantList = new LinkedList<>();
|
||||
//fillListViewWithData(plantList);
|
||||
/**
|
||||
* get plant list filtered by search plant entry and hardiness zone
|
||||
* fill list view with plant list
|
||||
* @throws HardinessZoneNotSetException throws exception when no hardiness zone is defined
|
||||
* @throws IOException throws exception
|
||||
*/
|
||||
private void viewFilteredListBySearch() throws HardinessZoneNotSetException, IOException {
|
||||
search_plants.textProperty().addListener((observable, oldValue, newValue) -> {
|
||||
if (newValue.isEmpty()) {
|
||||
fillPlantListWithHardinessZone();
|
||||
}else {
|
||||
try {
|
||||
List<Plant> filteredPlants = plantListModel.getFilteredPlantListByString(DEFAULT_HARDINESS_ZONE, newValue);
|
||||
clearListView();
|
||||
plantListProperty.addAll(filteredPlants);
|
||||
} catch (HardinessZoneNotSetException | IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void viewFilteredListBySearch(String query) {
|
||||
//ToDo getFilteredPlantList with (plantListModel.getFilteredPlantList(DEFAULT_HARDINESS_ZONE, <predicate>))
|
||||
/**
|
||||
* get plant list of current hardiness zone
|
||||
* fill list view with plant list
|
||||
*/
|
||||
private void fillPlantListWithHardinessZone() {
|
||||
try {
|
||||
List<Plant> filteredPlants = plantListModel.getFilteredPlantListByString(DEFAULT_HARDINESS_ZONE, query);
|
||||
clearListView();
|
||||
plantListProperty.addAll(filteredPlants);
|
||||
|
||||
plantListProperty.addAll(plantListModel.getPlantList(plantListModel.getCurrentZone()));
|
||||
} catch (HardinessZoneNotSetException | IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* creates radio buttons for the hardiness zones defined in enum HardinessZone
|
||||
* defines default value as selected
|
||||
* when selected filter viewList according to hardiness zone
|
||||
*/
|
||||
private void createFilterHardinessZone() {
|
||||
//ToDo create radioList of hardinessZone in VBox climate_zones
|
||||
ToggleGroup hardinessGroup = new ToggleGroup();
|
||||
for (HardinessZone zone : HardinessZone.values()) {
|
||||
RadioButton radioButton = new RadioButton(zone.name());
|
||||
radioButton.setToggleGroup(hardinessGroup);
|
||||
radioButton.setPadding(new Insets(0,0,10,0));
|
||||
if (zone.equals(DEFAULT_HARDINESS_ZONE)) {
|
||||
radioButton.setSelected(true);
|
||||
}
|
||||
radioButton.selectedProperty().addListener(new ChangeListener<Boolean>() {
|
||||
@Override
|
||||
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
|
||||
plantListModel.setCurrentZone(zone);
|
||||
fillPlantListWithHardinessZone();
|
||||
}
|
||||
});
|
||||
climate_zones.getChildren().add(radioButton);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* observes changes in the selectedProperty of ListView and updates the description label
|
||||
* creates radio buttons for the seasons defined in enum Seasons
|
||||
* defines default value as selected
|
||||
* when selected filter viewList according to seasons
|
||||
*/
|
||||
private void createFilterSeasons() {
|
||||
ToggleGroup seasonGroup = new ToggleGroup();
|
||||
for (Seasons season : Seasons.values()) {
|
||||
RadioButton radioButton = new RadioButton(season.name());
|
||||
radioButton.setToggleGroup(seasonGroup);
|
||||
radioButton.setPadding(new Insets(0,0,10,0));
|
||||
if (season.equals(Seasons.AllSEASONS)) {
|
||||
radioButton.setSelected(true);
|
||||
}
|
||||
radioButton.selectedProperty().addListener(new ChangeListener<Boolean>() {
|
||||
@Override
|
||||
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
|
||||
if (season.equals(Seasons.AllSEASONS)) {
|
||||
fillPlantListWithHardinessZone();
|
||||
} else {
|
||||
try {
|
||||
viewFilteredListBySeason(season);
|
||||
} catch (HardinessZoneNotSetException | IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
seasons.getChildren().add(radioButton);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* observes changes in the selectedProperty of ListView and updates:
|
||||
* the description label
|
||||
* image of the plant
|
||||
*/
|
||||
private void lookForSelectedListEntry() {
|
||||
list_plants.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Plant>() {
|
||||
@Override
|
||||
public void changed(ObservableValue<? extends Plant> observable, Plant oldValue, Plant newValue) {
|
||||
//ToDo
|
||||
if(newValue != null) {
|
||||
selectedPlant = newValue;
|
||||
description_plant.setText(selectedPlant.description());
|
||||
saveToMyPlant_button.setDisable(false);
|
||||
//update img plant
|
||||
Image img;
|
||||
if(selectedPlant.image() != null) {
|
||||
img = selectedPlant.image();
|
||||
} else {
|
||||
img = new Image(String.valueOf(PlantsController.class.getResource("placeholder.png")));
|
||||
}
|
||||
img_plant.setImage(img);
|
||||
|
||||
|
||||
} else {
|
||||
selectedPlant = null;
|
||||
description_plant.setText("");
|
||||
saveToMyPlant_button.setDisable(true);
|
||||
//update img when null placeholder PNG
|
||||
Image img = new Image(String.valueOf(PlantsController.class.getResource("placeholder.png")));
|
||||
img_plant.setImage(img);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -20,7 +20,7 @@ import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
public class JsonGardenPlan implements GardenPlan {
|
||||
private final URL dataSource = getClass().getResource("user-crops.json");
|
||||
private final URL dataSource;
|
||||
|
||||
private IdProvider idProvider;
|
||||
private Map<Long, Crop> cropMap = Collections.emptyMap();
|
||||
@@ -40,7 +40,21 @@ public class JsonGardenPlan implements GardenPlan {
|
||||
}
|
||||
|
||||
/**
|
||||
* @see GardenPlan#getCrops()
|
||||
* Default constructor
|
||||
*/
|
||||
public JsonGardenPlan() {
|
||||
this.dataSource = getClass().getResource("user-crops.json");
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor to use a specified {@link URL} as a {@link #dataSource}
|
||||
* @param dataSource A {@link URL} to the file to be used as a data source
|
||||
*/
|
||||
public JsonGardenPlan(URL dataSource) {
|
||||
this.dataSource = dataSource;
|
||||
}
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public List<Crop> getCrops() throws IOException {
|
||||
@@ -51,7 +65,7 @@ public class JsonGardenPlan implements GardenPlan {
|
||||
}
|
||||
|
||||
/**
|
||||
* @see GardenPlan#getCropById(long)
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public Optional<Crop> getCropById(long id) throws IOException {
|
||||
@@ -62,7 +76,7 @@ public class JsonGardenPlan implements GardenPlan {
|
||||
}
|
||||
|
||||
/**
|
||||
* @see GardenPlan#saveCrop(Crop)
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* Saves a crop to the database.
|
||||
* If no {@link Crop#cropId} is set, one will be generated and
|
||||
@@ -79,7 +93,7 @@ public class JsonGardenPlan implements GardenPlan {
|
||||
}
|
||||
|
||||
/**
|
||||
* @see GardenPlan#removeCrop(Crop)
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public void removeCrop(Crop crop) throws IOException {
|
||||
|
||||
@@ -89,15 +89,16 @@ public class JsonPlantDatabase implements PlantDatabase {
|
||||
List<Plant> result;
|
||||
result = mapper.readerForListOf(Plant.class).readValue(dataSource);
|
||||
|
||||
for (Plant plant : result) {
|
||||
plant.inZone(currentZone);
|
||||
}
|
||||
|
||||
// Turn list into a HashMap with structure id => Plant
|
||||
plantMap = result.stream()
|
||||
// Remove plants not in the current zone
|
||||
.filter(plant -> {
|
||||
plant.inZone(currentZone);
|
||||
return !plant.lifecycle().isEmpty();
|
||||
})
|
||||
// Create Hashmap from results
|
||||
.collect(HashMap::new,
|
||||
(res, plant) -> res.put(plant.id(), plant),
|
||||
(existing, replacement) -> { });
|
||||
(existing, replacement) -> {});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -167,4 +167,17 @@ public class PlantListModel {
|
||||
public List<Plant> getFilteredPlantListByHarvestSaison(HardinessZone zone, MonthDay from, MonthDay to) throws HardinessZoneNotSetException, IOException {
|
||||
return getFilteredPlantListBySaison(GrowthPhaseType.HARVEST, zone, from, to);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param zone selected hardiness zone
|
||||
* @param from the earliest date to for the filter
|
||||
* @param to the lastest date for the filter
|
||||
* @return List of Plants with selected saison
|
||||
* @throws HardinessZoneNotSetException If no {@link HardinessZone} was specified
|
||||
* @throws IOException If the database cannot be accessed
|
||||
*/
|
||||
public List<Plant> getFilteredPlantListBySaisonWithoutGrowthPhase(HardinessZone zone, MonthDay from, MonthDay to) throws HardinessZoneNotSetException, IOException {
|
||||
return getFilteredPlantList(zone, plant -> plant.lifecycle().stream().anyMatch(growthPhase -> growthPhase.startDate().compareTo(from) >= 0 && (growthPhase.startDate().compareTo(to) <= 0)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package ch.zhaw.gartenverwaltung.types;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
public class Crop {
|
||||
@@ -41,6 +42,24 @@ public class Crop {
|
||||
public LocalDate getStartDate() { return startDate; }
|
||||
public double getArea() { return area; }
|
||||
|
||||
@Override
|
||||
public boolean equals(Object other) {
|
||||
if (this == other) return true;
|
||||
if (other instanceof Crop otherCrop) {
|
||||
return Objects.equals(this.cropId, otherCrop.cropId) &&
|
||||
plantId == otherCrop.plantId &&
|
||||
startDate != null && startDate.equals(otherCrop.startDate) &&
|
||||
area == otherCrop.area;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int startCode = startDate != null ? startDate.hashCode() : 0;
|
||||
return (int) plantId ^ (startCode << 16);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("Crop [ cropId: %d, plantId: %d, startDate: %s, area: %f ]",
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
package ch.zhaw.gartenverwaltung.types;
|
||||
|
||||
import java.time.MonthDay;
|
||||
|
||||
public enum Seasons {
|
||||
AllSEASONS("--01-01", "--12-31"),
|
||||
SPRING("--03-01", "--05-30"),
|
||||
SOMMER("--06-01", "--08-30"),
|
||||
AUTUM("--09-01", "--11-30"),
|
||||
WINTER("--12-01", "--02-28");
|
||||
|
||||
public final String startDate;
|
||||
public final String endDate;
|
||||
|
||||
Seasons(String startDate, String endDate) {
|
||||
this.startDate = startDate;
|
||||
this.endDate = endDate;
|
||||
}
|
||||
|
||||
public MonthDay getStartDate() {
|
||||
return MonthDay.parse(this.startDate);
|
||||
}
|
||||
public MonthDay getEndDate() {
|
||||
return MonthDay.parse(this.endDate);
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,6 @@
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.geometry.Rectangle2D?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.CheckBox?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.control.ListView?>
|
||||
<?import javafx.scene.control.SplitPane?>
|
||||
@@ -16,8 +15,9 @@
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.text.Font?>
|
||||
|
||||
<AnchorPane maxHeight="-Infinity" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="1000.0" prefHeight="853.0" prefWidth="1219.0"
|
||||
xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.zhaw.gartenverwaltung.PlantsController">
|
||||
<AnchorPane maxHeight="-Infinity" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="1000.0" prefHeight="853.0"
|
||||
prefWidth="1219.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1"
|
||||
fx:controller="ch.zhaw.gartenverwaltung.PlantsController">
|
||||
<children>
|
||||
<SplitPane dividerPositions="0.7377363661277062" layoutX="539.0" layoutY="266.0" prefHeight="853.0" prefWidth="1219.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<items>
|
||||
@@ -30,7 +30,7 @@
|
||||
<Font name="System Bold" size="30.0" />
|
||||
</font>
|
||||
</Label>
|
||||
<TextField fx:id="search_plants" onKeyTyped="#searchForPlant" promptText="Search for Plant Name" />
|
||||
<TextField fx:id="search_plants" promptText="Search for Plant Name" />
|
||||
<HBox alignment="CENTER_LEFT" prefHeight="480.0" prefWidth="881.0" VBox.vgrow="ALWAYS">
|
||||
<children>
|
||||
<ListView fx:id="list_plants" maxWidth="1.7976931348623157E308" prefHeight="497.0" prefWidth="580.0" HBox.hgrow="ALWAYS" />
|
||||
@@ -75,30 +75,7 @@
|
||||
<content>
|
||||
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
|
||||
<children>
|
||||
<VBox layoutX="37.0" layoutY="-19.0" prefHeight="180.66666666666666" prefWidth="310.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<children>
|
||||
<CheckBox fx:id="spring_filter" mnemonicParsing="false" onAction="#filterSpring" text="Spring">
|
||||
<padding>
|
||||
<Insets top="10.0" />
|
||||
</padding>
|
||||
</CheckBox>
|
||||
<CheckBox fx:id="sommer_filter" mnemonicParsing="false" onAction="#filterSommer" text="Sommer">
|
||||
<padding>
|
||||
<Insets top="10.0" />
|
||||
</padding>
|
||||
</CheckBox>
|
||||
<CheckBox fx:id="autum_filter" mnemonicParsing="false" onAction="#filterAutum" text="Autum">
|
||||
<padding>
|
||||
<Insets top="10.0" />
|
||||
</padding>
|
||||
</CheckBox>
|
||||
<CheckBox fx:id="winter_filter" mnemonicParsing="false" onAction="#filterWinter" text="Winter">
|
||||
<padding>
|
||||
<Insets top="10.0" />
|
||||
</padding>
|
||||
</CheckBox>
|
||||
</children>
|
||||
</VBox>
|
||||
<VBox fx:id="seasons" layoutX="37.0" layoutY="-19.0" prefHeight="180.66666666666666" prefWidth="310.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</content>
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
package ch.zhaw.gartenverwaltung.io;
|
||||
|
||||
import ch.zhaw.gartenverwaltung.types.Crop;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.nio.file.Files;
|
||||
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 java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
public class JsonGardenPlanTest {
|
||||
private GardenPlan testDatabase;
|
||||
private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
||||
/**
|
||||
* 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");
|
||||
|
||||
@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 JsonGardenPlan(dbDataSource);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
@DisplayName("Check if results are retrieved completely.")
|
||||
void getCropsNotEmpty() {
|
||||
List<Crop> testList;
|
||||
try {
|
||||
testList = testDatabase.getCrops();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
Assertions.assertEquals(3, testList.size());
|
||||
|
||||
List<Long> plantIds = testList.stream().map(Crop::getPlantId).collect(Collectors.toList());
|
||||
List<Long> expected = Arrays.asList(1L, 1L, 0L);
|
||||
Assertions.assertEquals(expected, plantIds);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Check whether single access works.")
|
||||
void getCropById() throws IOException {
|
||||
Optional<Crop> testCrop = testDatabase.getCropById(1);
|
||||
assertTrue(testCrop.isPresent());
|
||||
Assertions.assertEquals(1, testCrop.get().getPlantId());
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
@DisplayName("Check for a nonexisting crop.")
|
||||
void getCropByIdMustFail() throws IOException {
|
||||
Optional<Crop> testCrop = testDatabase.getCropById(99);
|
||||
Assertions.assertFalse(testCrop.isPresent());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Add new Crop.")
|
||||
void addNewCrop() {
|
||||
Crop crop = new Crop(3L, LocalDate.parse("2023-02-22", formatter));
|
||||
try {
|
||||
testDatabase.saveCrop(crop);
|
||||
assertTrue(crop.getCropId().isPresent());
|
||||
Optional<Crop> testCrop = testDatabase.getCropById(crop.getCropId().get());
|
||||
|
||||
assertTrue(testCrop.isPresent());
|
||||
Assertions.assertEquals(crop, testCrop.get());
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Remove crop")
|
||||
void removeCrop(){
|
||||
try {
|
||||
Optional<Crop> crop = testDatabase.getCropById(2L);
|
||||
Assertions.assertTrue(crop.isPresent());
|
||||
testDatabase.removeCrop(crop.get());
|
||||
crop = testDatabase.getCropById(2L);
|
||||
Assertions.assertFalse(crop.isPresent());
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
@@ -16,7 +15,6 @@ import java.util.stream.Collectors;
|
||||
|
||||
public class JsonPlantDatabaseTest {
|
||||
PlantDatabase testDatabase;
|
||||
SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy");
|
||||
|
||||
@BeforeEach
|
||||
void connectToDb() {
|
||||
@@ -26,7 +24,7 @@ public class JsonPlantDatabaseTest {
|
||||
|
||||
@Test
|
||||
@DisplayName("Check if results are retrieved completely")
|
||||
void getPlantList() {
|
||||
void getPlantListNotEmpty() {
|
||||
List<Plant> testList;
|
||||
try {
|
||||
testList = testDatabase.getPlantList(HardinessZone.ZONE_8A);
|
||||
@@ -40,12 +38,26 @@ public class JsonPlantDatabaseTest {
|
||||
Assertions.assertEquals(expected,names);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Check if results are retrieved correctly when empty")
|
||||
void getPlantListEmpty() {
|
||||
List<Plant> testList;
|
||||
try {
|
||||
testList = testDatabase.getPlantList(HardinessZone.ZONE_1A);
|
||||
} catch (IOException | HardinessZoneNotSetException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
Assertions.assertEquals(0, testList.size());
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Check whether single access works.")
|
||||
void getPlantById() {
|
||||
void getPlantByIdAndZone() {
|
||||
Optional<Plant> testPlant;
|
||||
try {
|
||||
testPlant = testDatabase.getPlantById(HardinessZone.ZONE_8A,1);
|
||||
testPlant = testDatabase.getPlantById(HardinessZone.ZONE_8A, 1);
|
||||
} catch (IOException | HardinessZoneNotSetException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
@@ -53,12 +65,23 @@ public class JsonPlantDatabaseTest {
|
||||
Assertions.assertEquals("Early Carrot", testPlant.get().name());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Check whether single access respects zone correctly.")
|
||||
void getPlantByIdAndWrongZone() throws HardinessZoneNotSetException, IOException {
|
||||
Optional<Plant> testPlant = testDatabase.getPlantById(HardinessZone.ZONE_1A, 1);
|
||||
Assertions.assertFalse(testPlant.isPresent());
|
||||
testPlant = testDatabase.getPlantById(HardinessZone.ZONE_8A, 1);
|
||||
Assertions.assertTrue(testPlant.isPresent());
|
||||
|
||||
Assertions.assertEquals("Early Carrot", testPlant.get().name());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Check for a nonexisting plant.")
|
||||
void getPlantByIdMustFail() {
|
||||
Optional<Plant> testPlant;
|
||||
try {
|
||||
testPlant = testDatabase.getPlantById(HardinessZone.ZONE_8A,99);
|
||||
testPlant = testDatabase.getPlantById(HardinessZone.ZONE_8A, 99);
|
||||
} catch (IOException | HardinessZoneNotSetException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,2 @@
|
||||
[
|
||||
]
|
||||
Reference in New Issue
Block a user