summaryrefslogtreecommitdiff
path: root/src/test/java/au/id/zancanaro/javacheck/SetFunctorRulesTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/au/id/zancanaro/javacheck/SetFunctorRulesTest.java')
-rw-r--r--src/test/java/au/id/zancanaro/javacheck/SetFunctorRulesTest.java106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/test/java/au/id/zancanaro/javacheck/SetFunctorRulesTest.java b/src/test/java/au/id/zancanaro/javacheck/SetFunctorRulesTest.java
new file mode 100644
index 0000000..04fa674
--- /dev/null
+++ b/src/test/java/au/id/zancanaro/javacheck/SetFunctorRulesTest.java
@@ -0,0 +1,106 @@
+package au.id.zancanaro.javacheck;
+
+import au.id.zancanaro.javacheck.annotations.DataSource;
+import au.id.zancanaro.javacheck.annotations.Property;
+import au.id.zancanaro.javacheck.junit.Properties;
+import org.junit.runner.RunWith;
+
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import static au.id.zancanaro.javacheck.Generators.longInteger;
+import static au.id.zancanaro.javacheck.Generators.oneOf;
+import static org.junit.Assert.assertEquals;
+
+@RunWith(Properties.class)
+public class SetFunctorRulesTest {
+
+ @DataSource
+ public static Generator<Function<Long, Long>> integerFunction =
+ oneOf(
+ longInteger().map(SetFunctorRulesTest::plusI),
+ longInteger().map(SetFunctorRulesTest::timesI),
+ longInteger().map(SetFunctorRulesTest::constantlyI));
+
+ @Property
+ public void mappingCompositionsWithStreams(
+ Set<Long> list,
+ Function<Long, Long> f,
+ Function<Long, Long> g) {
+ Set<Long> left = list.stream()
+ .map(g)
+ .map(f)
+ .collect(Collectors.toSet());
+
+ Set<Long> right = list.stream()
+ .map(f.compose(g))
+ .collect(Collectors.toSet());
+
+ assertEquals(left, right);
+ }
+
+ @Property
+ public void mappingCompositionsWithIntermediateList(
+ Set<Long> list,
+ Function<Long, Long> f,
+ Function<Long, Long> g) {
+ Set<Long> intermediate = list.stream().map(g).collect(Collectors.toSet());
+ Set<Long> left = intermediate.stream().map(f).collect(Collectors.toSet());
+
+ Set<Long> right = list.stream()
+ .map(f.compose(g))
+ .collect(Collectors.toSet());
+
+ assertEquals(left, right);
+ }
+
+ @Property
+ public void mapIdentityIsIdentity(Set<Long> list) {
+ Set<Long> mapped = list.stream().map(x -> x).collect(Collectors.toSet());
+
+ assertEquals(list, mapped);
+ }
+
+ private static Function<Long, Long> plusI(final long i) {
+ return new Function<Long, Long>() {
+ @Override
+ public Long apply(Long integer) {
+ return i + integer;
+ }
+
+ @Override
+ public String toString() {
+ return "x -> x + " + i;
+ }
+ };
+ }
+
+ private static Function<Long, Long> timesI(final long i) {
+ return new Function<Long, Long>() {
+ @Override
+ public Long apply(Long integer) {
+ return i * integer;
+ }
+
+ @Override
+ public String toString() {
+ return "x -> x * " + i;
+ }
+ };
+ }
+
+ private static Function<Long, Long> constantlyI(final long i) {
+ return new Function<Long, Long>() {
+ @Override
+ public Long apply(Long integer) {
+ return i;
+ }
+
+ @Override
+ public String toString() {
+ return "x -> " + i;
+ }
+ };
+ }
+}