diff --git a/05/gradle.properties b/05/gradle.properties index c73810285a5952b812c24247d9afc7d8b316d4fd..098fbca8f66b1190fe9b6b71e1dd6be6d6f7b9a5 100644 --- a/05/gradle.properties +++ b/05/gradle.properties @@ -1,3 +1,4 @@ junitVersion=5.7.1 log4j2Version=2.14.1 -commons_lang3_version=3.12.0 \ No newline at end of file +commons_lang3_version=3.12.0 +org.gradle.java.home=/usr/lib/jvm/java-11-openjdk \ No newline at end of file diff --git a/05/src/main/java/ohm/softa/a05/collections/SimpleFilter.java b/05/src/main/java/ohm/softa/a05/collections/SimpleFilter.java index fb68e7e733530a2c3d40f946f96f90da0e1d92cb..458cc45bc9ef04ff5edd3f772307c98e54a2291f 100644 --- a/05/src/main/java/ohm/softa/a05/collections/SimpleFilter.java +++ b/05/src/main/java/ohm/softa/a05/collections/SimpleFilter.java @@ -8,7 +8,7 @@ package ohm.softa.a05.collections; public interface SimpleFilter<T> { /** - * Determines if a item matches a condition + * Determines if an item matches a condition * * @param item Object to evaluate * @return true if the referenced object should be included. diff --git a/05/src/main/java/ohm/softa/a05/collections/SimpleListImpl.java b/05/src/main/java/ohm/softa/a05/collections/SimpleListImpl.java index cf1316d7aae3c1c37a2a14de67297c3a09e56da9..62bd773f7aecd953aad28de5d76caba95980bf90 100644 --- a/05/src/main/java/ohm/softa/a05/collections/SimpleListImpl.java +++ b/05/src/main/java/ohm/softa/a05/collections/SimpleListImpl.java @@ -59,7 +59,7 @@ public class SimpleListImpl<T> implements SimpleList<T> { /** * Helper class which implements the Iterator<TE> interface - * Has to be non static because otherwise it could not access the head of the list + * Has to be non-static because otherwise it could not access the head of the list */ private class SimpleIterator implements Iterator<T> { diff --git a/05/src/main/java/ohm/softa/a05/model/Flower.java b/05/src/main/java/ohm/softa/a05/model/Flower.java new file mode 100644 index 0000000000000000000000000000000000000000..8fc7a9230329503d32cab957943a4d1ae7180aea --- /dev/null +++ b/05/src/main/java/ohm/softa/a05/model/Flower.java @@ -0,0 +1,46 @@ +package ohm.softa.a05.model; + +import java.util.Objects; + +public class Flower extends Plant { + private final PlantColor color; + public Flower(double height, String family, String name, PlantColor color) { + super(height, family, name); + if (color == PlantColor.GREEN) throw new IllegalArgumentException(); + this.color = color; + } + + // we don't care about the rest + public Flower(PlantColor color) { + this(1.71, "foo", "bar", color); + } + + @Override + public PlantColor getColor() { + return color; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + Flower flower = (Flower) o; + return color == flower.color; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), color); + } + + @Override + public String toString() { + return "Flower{" + + "color=" + color + + ", height=" + height + + ", family='" + family + '\'' + + ", name='" + name + '\'' + + '}'; + } +} diff --git a/05/src/main/java/ohm/softa/a05/model/Plant.java b/05/src/main/java/ohm/softa/a05/model/Plant.java new file mode 100644 index 0000000000000000000000000000000000000000..f3501b2c4e82a8e361677bdaa651bd17253ce08c --- /dev/null +++ b/05/src/main/java/ohm/softa/a05/model/Plant.java @@ -0,0 +1,56 @@ +package ohm.softa.a05.model; + +import java.util.Objects; + +abstract public class Plant implements Comparable<Plant> { + public Plant(double height, String family, String name) { + this.height = height; + this.family = family; + this.name = name; + } + + public double getHeight() { + return height; + } + + public String getFamily() { + return family; + } + + public String getName() { + return name; + } + + abstract public PlantColor getColor(); + + final protected double height; + final protected String family; + final protected String name; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Plant plant = (Plant) o; + return Double.compare(plant.height, height) == 0 && Objects.equals(family, plant.family) && Objects.equals(name, plant.name); + } + + @Override + public int hashCode() { + return Objects.hash(height, family, name); + } + + @Override + public int compareTo(Plant plant) { + return Double.compare(this.getHeight(), plant.getHeight()); + } + + @Override + public String toString() { + return "Plant{" + + "height=" + height + + ", family='" + family + '\'' + + ", name='" + name + '\'' + + '}'; + } +} diff --git a/05/src/main/java/ohm/softa/a05/model/PlantBed.java b/05/src/main/java/ohm/softa/a05/model/PlantBed.java new file mode 100644 index 0000000000000000000000000000000000000000..8c5964036bb11e55c63644eda6114c58dae6b7f2 --- /dev/null +++ b/05/src/main/java/ohm/softa/a05/model/PlantBed.java @@ -0,0 +1,47 @@ +package ohm.softa.a05.model; + +import ohm.softa.a05.collections.SimpleList; +import ohm.softa.a05.collections.SimpleListImpl; + +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +public class PlantBed<T extends Plant> { + + private SimpleList<T> plants; + + public PlantBed() { + plants = new SimpleListImpl<>(); + } + + public PlantBed(SimpleList<T> list) { + plants = list; + } + + public void add(T plant) { + plants.add(plant); + } + + public void remove(T plant) { + this.plants = this.plants + .filter(p -> p != plant); + } + + public int size() { + return plants.size(); + } + + public SimpleList<T> getPlantsByColor(PlantColor color) { + return plants.filter(p -> p.getColor() == color); + } + + @Override + public String toString() { + return "PlantBed{" + + "size=" + size() + + ", plants=[" + StreamSupport + .stream(plants.map(Plant::toString).spliterator(), true) + .collect(Collectors.joining(", ")) + + "]}"; + } +} diff --git a/05/src/main/java/ohm/softa/a05/model/PlantColor.java b/05/src/main/java/ohm/softa/a05/model/PlantColor.java new file mode 100644 index 0000000000000000000000000000000000000000..edd254ac4bcc1c178f39a4cedb40f5f739f4f286 --- /dev/null +++ b/05/src/main/java/ohm/softa/a05/model/PlantColor.java @@ -0,0 +1,9 @@ +package ohm.softa.a05.model; + +public enum PlantColor { + GREEN, + YELLOW, + RED, + BLUE, + ORANGE +} diff --git a/05/src/main/java/ohm/softa/a05/model/Shrub.java b/05/src/main/java/ohm/softa/a05/model/Shrub.java new file mode 100644 index 0000000000000000000000000000000000000000..0217362b1f41bb657300c2832327b989120d0e2d --- /dev/null +++ b/05/src/main/java/ohm/softa/a05/model/Shrub.java @@ -0,0 +1,25 @@ +package ohm.softa.a05.model; + +public class Shrub extends Plant { + @SuppressWarnings({"NeverUsed", "unused"}) + public Shrub(double height, String family, String name) { + super(height, family, name); + } + + public Shrub() { + super(2.83, "head", "tail"); + } + @Override + public PlantColor getColor() { + return PlantColor.GREEN; + } + + @Override + public String toString() { + return "Shrub{" + + "height=" + height + + ", family='" + family + '\'' + + ", name='" + name + '\'' + + '}'; + } +} diff --git a/05/src/main/java/ohm/softa/a05/utils/PlantBetUtilities.java b/05/src/main/java/ohm/softa/a05/utils/PlantBetUtilities.java new file mode 100644 index 0000000000000000000000000000000000000000..133dd2ef9122858b327b05283e3dd79434568d31 --- /dev/null +++ b/05/src/main/java/ohm/softa/a05/utils/PlantBetUtilities.java @@ -0,0 +1,12 @@ +package ohm.softa.a05.utils; + +import ohm.softa.a05.model.Plant; +import ohm.softa.a05.model.PlantBed; +import ohm.softa.a05.model.PlantColor; + +public abstract class PlantBetUtilities { + + public static <T extends Plant> void repot(PlantBed<T> takenFrom, PlantColor color, PlantBed<? super T> putInto) { + takenFrom.getPlantsByColor(color).forEach(p -> {takenFrom.remove(p); putInto.add(p);}); + } +} diff --git a/05/src/test/java/ohm/softa/a05/tests/collections/SimpleListTests.java b/05/src/test/java/ohm/softa/a05/tests/collections/SimpleListTests.java index a25c5b369864a1a776e17ef470b8159cad007ed0..9126f6249f6184f3c207f2fe1d3b70526d66f4f1 100644 --- a/05/src/test/java/ohm/softa/a05/tests/collections/SimpleListTests.java +++ b/05/src/test/java/ohm/softa/a05/tests/collections/SimpleListTests.java @@ -53,12 +53,7 @@ class SimpleListTests { @Test void testFilterAnonymousClass(){ logger.info("Testing the filter possibilities by filtering for all elements greater 2"); - SimpleList<Integer> result = testList.filter(new SimpleFilter<Integer>() { - @Override - public boolean include(Integer item) { - return item > 2; - } - }); + SimpleList<Integer> result = testList.filter(item -> item > 2); for(Integer i : result){ assertTrue(i > 2); @@ -70,7 +65,7 @@ class SimpleListTests { logger.info("Testing the filter possibilities by filtering for all elements which are dividable by 2"); SimpleList<Integer> result = testList.filter(o -> o % 2 == 0); for(Integer i : result){ - assertTrue(i % 2 == 0); + assertEquals(i % 2, 0); } } diff --git a/05/src/test/java/ohm/softa/a05/tests/models/FlowerTests.java b/05/src/test/java/ohm/softa/a05/tests/models/FlowerTests.java new file mode 100644 index 0000000000000000000000000000000000000000..ceb3132739897714c58b7d5b1319bd670da29b89 --- /dev/null +++ b/05/src/test/java/ohm/softa/a05/tests/models/FlowerTests.java @@ -0,0 +1,48 @@ +package ohm.softa.a05.tests.models; + +import ohm.softa.a05.model.Flower; +import ohm.softa.a05.model.PlantColor; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.Random; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.*; + +public class FlowerTests { + + private static Random rnd; + + @BeforeAll + static void init() { + rnd = new Random(); + } + + @Test + void testColor() { + assertEquals(new Flower(PlantColor.BLUE), new Flower(PlantColor.BLUE)); + assertNotEquals(new Flower(PlantColor.YELLOW), new Flower(PlantColor.ORANGE)); + + assertDoesNotThrow(() -> new Flower(PlantColor.RED)); + assertThrows(Throwable.class, () -> new Flower(PlantColor.GREEN)); + } + + @Test + void testCompare() { + var values = + rnd.doubles() + .limit(10) + .mapToObj((d) -> + new Flower(d, "foo", "bar", PlantColor.RED)).collect(Collectors.toList()); + + values.forEach((left) -> + values.forEach((right) -> + assertEquals(left.compareTo(right), + Double.compare( + left.getHeight(), + right.getHeight())))); + + + } +} diff --git a/05/src/test/java/ohm/softa/a05/tests/models/PlantBedTests.java b/05/src/test/java/ohm/softa/a05/tests/models/PlantBedTests.java new file mode 100644 index 0000000000000000000000000000000000000000..429b083524d7bad1558e2698981bdfeb3d2f4ddd --- /dev/null +++ b/05/src/test/java/ohm/softa/a05/tests/models/PlantBedTests.java @@ -0,0 +1,66 @@ +package ohm.softa.a05.tests.models; + +import ohm.softa.a05.model.*; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PlantBedTests { + private PlantBed<Plant> empty_bed, full_bed; + private Plant p1, p2, p3; + + @BeforeEach + void setUp() { + empty_bed = new PlantBed<>(); + full_bed = new PlantBed<>(); + p1 = new Flower(PlantColor.RED); + p2 = new Shrub(); + p3 = new Flower(3.78, "hello", "world", PlantColor.BLUE); + full_bed.add(p1); + full_bed.add(p2); + full_bed.add(p3); + } + + @SuppressWarnings("EmptyMethod") + @AfterEach + void tearDown() { + } + @Test + void addRemoveSize() { + assertEquals(empty_bed.size(), 0); + empty_bed.add(p1); + assertEquals(empty_bed.size(), 1); + empty_bed.add(p2); + assertEquals(empty_bed.size(), 2); + empty_bed.add(p3); + empty_bed.add(p1); + assertEquals(empty_bed.size(), 4); + empty_bed.remove(p2); + assertEquals(empty_bed.size(), 3); + empty_bed.remove(p1); + assertEquals(empty_bed.size(), 1); + empty_bed.remove(p3); + assertEquals(empty_bed.size(), 0); + } + @Test + void getPlantsByColor() { + assertEquals(full_bed.size(), 3); + var filtered_bed = new PlantBed<>( + full_bed + .getPlantsByColor(PlantColor.BLUE) + .filter(p -> p.getColor() == PlantColor.BLUE)); + assertEquals(filtered_bed.size(), 1); + assertEquals(filtered_bed.toString(), "PlantBed{size=1, " + + "plants=[Flower{color=BLUE, " + + "height=3.78, " + + "family='hello', " + + "name='world'}]}"); + } + + @Test + void _toString() { + assertEquals(full_bed.toString(), "PlantBed{size=3, plants=[Flower{color=RED, height=1.71, family='foo', name='bar'}, Shrub{height=2.83, family='head', name='tail'}, Flower{color=BLUE, height=3.78, family='hello', name='world'}]}"); + } +} \ No newline at end of file diff --git a/05/src/test/java/ohm/softa/a05/tests/models/ShrubTests.java b/05/src/test/java/ohm/softa/a05/tests/models/ShrubTests.java new file mode 100644 index 0000000000000000000000000000000000000000..9015c74583f62dc51de58049869a04bfe972e76e --- /dev/null +++ b/05/src/test/java/ohm/softa/a05/tests/models/ShrubTests.java @@ -0,0 +1,14 @@ +package ohm.softa.a05.tests.models; + +import ohm.softa.a05.model.PlantColor; +import ohm.softa.a05.model.Shrub; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ShrubTests { + @Test + void testColor() { + assertEquals(new Shrub().getColor(), PlantColor.GREEN); + } +} diff --git a/05/src/test/java/ohm/softa/a05/utils/PlantBetUtilitiesTests.java b/05/src/test/java/ohm/softa/a05/utils/PlantBetUtilitiesTests.java new file mode 100644 index 0000000000000000000000000000000000000000..c382221c8325372f5f8a3cc023976d5207076c73 --- /dev/null +++ b/05/src/test/java/ohm/softa/a05/utils/PlantBetUtilitiesTests.java @@ -0,0 +1,29 @@ +package ohm.softa.a05.utils; + +import ohm.softa.a05.model.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PlantBetUtilitiesTests { + + @Test + void repot() { + var bet = new PlantBed<>(); + bet.add(new Flower(PlantColor.YELLOW)); + bet.add(new Shrub(0.9, "gooooooooood", "morning vietnam")); + bet.add(new Shrub()); + assertEquals(bet.size(), 3); + + var bet2 = new PlantBed<>(); + assertEquals(bet2.size(), 0); + + PlantBetUtilities.repot(bet, PlantColor.GREEN, bet2); + assertEquals(bet.size(), 1); + assertEquals(bet2.size(), 2); + + assertEquals(bet.toString(), "PlantBed{size=1, plants=[Flower{color=YELLOW, height=1.71, family='foo', name='bar'}]}"); + assertEquals(bet2.toString(), "PlantBed{size=2, plants=[Shrub{height=0.9, family='gooooooooood', name='morning vietnam'}, Shrub{height=2.83, family='head', name='tail'}]}"); + + } +} \ No newline at end of file diff --git a/playground/.idea/gradle.xml b/playground/.idea/gradle.xml index 14746e76663d64283939c97c4c25a1bea7131fa3..2a65317ef840e02bf2375483aba5bdca996fc1b3 100644 --- a/playground/.idea/gradle.xml +++ b/playground/.idea/gradle.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> + <component name="GradleMigrationSettings" migrationVersion="1" /> <component name="GradleSettings"> <option name="linkedExternalProjectsSettings"> <GradleProjectSettings>