Merge pull request #50 from schrom01/feature_json-gardenplan_M2
This commit is contained in:
commit
a43a23427c
|
@ -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,12 +89,13 @@ 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) -> {});
|
||||
|
|
|
@ -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 ]",
|
||||
|
|
|
@ -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,9 +38,23 @@ 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);
|
||||
|
@ -53,6 +65,17 @@ 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() {
|
||||
|
|
|
@ -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 @@
|
|||
[
|
||||
]
|
Loading…
Reference in New Issue