From 0ab6069e6a42848592e9e66df535e97e046dc3ab Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Mon, 16 Oct 2017 22:33:23 +0200 Subject: [PATCH 1/2] Refactor RxJava --- .../rxjava/ComputeFunction.java | 2 +- .../rxjava/ConnectableObservableImpl.java | 2 +- .../rxjava/ObservableImpl.java | 12 +-- .../rxjava/ResourceManagement.java | 2 +- .../rxjava/SingleImpl.java | 2 +- .../rxjava/SubjectImpl.java | 12 +-- .../com/baeldung/rxjava/jdbc/Connector.java | 6 +- .../rxjava/operator/ToCleanString.java | 2 +- .../rxjava/operator/ToLength.java | 2 +- .../com/baeldung/rxjava/ObservableTest.java | 2 +- .../rxjava/RxJavaCustomOperatorUnitTest.java | 4 +- ...ulersTest.java => SchedulersLiveTest.java} | 2 +- .../java/com/baeldung/rxjava/SubjectTest.java | 1 - .../jdbc/BasicQueryTypesIntegrationTest.java | 12 +-- .../vavr/PatternMatchingUnitTest.java | 102 +----------------- 15 files changed, 32 insertions(+), 133 deletions(-) rename rxjava/src/main/java/com/{baelding => baeldung}/rxjava/ComputeFunction.java (97%) rename rxjava/src/main/java/com/{baelding => baeldung}/rxjava/ConnectableObservableImpl.java (94%) rename rxjava/src/main/java/com/{baelding => baeldung}/rxjava/ObservableImpl.java (87%) rename rxjava/src/main/java/com/{baelding => baeldung}/rxjava/ResourceManagement.java (95%) rename rxjava/src/main/java/com/{baelding => baeldung}/rxjava/SingleImpl.java (92%) rename rxjava/src/main/java/com/{baelding => baeldung}/rxjava/SubjectImpl.java (85%) rename rxjava/src/main/java/com/{baelding => baeldung}/rxjava/operator/ToCleanString.java (96%) rename rxjava/src/main/java/com/{baelding => baeldung}/rxjava/operator/ToLength.java (90%) rename rxjava/src/test/java/com/baeldung/rxjava/{SchedulersTest.java => SchedulersLiveTest.java} (99%) diff --git a/rxjava/src/main/java/com/baelding/rxjava/ComputeFunction.java b/rxjava/src/main/java/com/baeldung/rxjava/ComputeFunction.java similarity index 97% rename from rxjava/src/main/java/com/baelding/rxjava/ComputeFunction.java rename to rxjava/src/main/java/com/baeldung/rxjava/ComputeFunction.java index 924862ab371a..7f9787a9d5ed 100644 --- a/rxjava/src/main/java/com/baelding/rxjava/ComputeFunction.java +++ b/rxjava/src/main/java/com/baeldung/rxjava/ComputeFunction.java @@ -1,4 +1,4 @@ -package com.baelding.rxjava; +package com.baeldung.rxjava; import rx.Observable; diff --git a/rxjava/src/main/java/com/baelding/rxjava/ConnectableObservableImpl.java b/rxjava/src/main/java/com/baeldung/rxjava/ConnectableObservableImpl.java similarity index 94% rename from rxjava/src/main/java/com/baelding/rxjava/ConnectableObservableImpl.java rename to rxjava/src/main/java/com/baeldung/rxjava/ConnectableObservableImpl.java index 005487dae873..a3e20a33f00c 100644 --- a/rxjava/src/main/java/com/baelding/rxjava/ConnectableObservableImpl.java +++ b/rxjava/src/main/java/com/baeldung/rxjava/ConnectableObservableImpl.java @@ -1,4 +1,4 @@ -package com.baelding.rxjava; +package com.baeldung.rxjava; import rx.Observable; import rx.observables.ConnectableObservable; diff --git a/rxjava/src/main/java/com/baelding/rxjava/ObservableImpl.java b/rxjava/src/main/java/com/baeldung/rxjava/ObservableImpl.java similarity index 87% rename from rxjava/src/main/java/com/baelding/rxjava/ObservableImpl.java rename to rxjava/src/main/java/com/baeldung/rxjava/ObservableImpl.java index 9ab0d0e1e6d8..305aba63818c 100644 --- a/rxjava/src/main/java/com/baelding/rxjava/ObservableImpl.java +++ b/rxjava/src/main/java/com/baeldung/rxjava/ObservableImpl.java @@ -1,4 +1,4 @@ -package com.baelding.rxjava; +package com.baeldung.rxjava; import rx.Observable; import rx.observables.BlockingObservable; @@ -8,13 +8,13 @@ public class ObservableImpl { - static Integer[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + private static Integer[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - static String[] letters = {"a", "b", "c", "d", "e", "f", "g", "h", "i"}; - static String[] titles = {"title"}; - public static List titleList = Arrays.asList(titles); + private static String[] letters = {"a", "b", "c", "d", "e", "f", "g", "h", "i"}; + private static String[] titles = {"title"}; + private static List titleList = Arrays.asList(titles); - public static Observable getTitle() { + static Observable getTitle() { return Observable.from(titleList); } diff --git a/rxjava/src/main/java/com/baelding/rxjava/ResourceManagement.java b/rxjava/src/main/java/com/baeldung/rxjava/ResourceManagement.java similarity index 95% rename from rxjava/src/main/java/com/baelding/rxjava/ResourceManagement.java rename to rxjava/src/main/java/com/baeldung/rxjava/ResourceManagement.java index 44bbd7eddafd..272442098f5b 100644 --- a/rxjava/src/main/java/com/baelding/rxjava/ResourceManagement.java +++ b/rxjava/src/main/java/com/baeldung/rxjava/ResourceManagement.java @@ -1,4 +1,4 @@ -package com.baelding.rxjava; +package com.baeldung.rxjava; import rx.Observable; diff --git a/rxjava/src/main/java/com/baelding/rxjava/SingleImpl.java b/rxjava/src/main/java/com/baeldung/rxjava/SingleImpl.java similarity index 92% rename from rxjava/src/main/java/com/baelding/rxjava/SingleImpl.java rename to rxjava/src/main/java/com/baeldung/rxjava/SingleImpl.java index f625ab6b443f..f0fda5d4dfd7 100644 --- a/rxjava/src/main/java/com/baelding/rxjava/SingleImpl.java +++ b/rxjava/src/main/java/com/baeldung/rxjava/SingleImpl.java @@ -1,4 +1,4 @@ -package com.baelding.rxjava; +package com.baeldung.rxjava; import rx.Observable; import rx.Single; diff --git a/rxjava/src/main/java/com/baelding/rxjava/SubjectImpl.java b/rxjava/src/main/java/com/baeldung/rxjava/SubjectImpl.java similarity index 85% rename from rxjava/src/main/java/com/baelding/rxjava/SubjectImpl.java rename to rxjava/src/main/java/com/baeldung/rxjava/SubjectImpl.java index aac9b4454a5f..ceef3ab5f305 100644 --- a/rxjava/src/main/java/com/baelding/rxjava/SubjectImpl.java +++ b/rxjava/src/main/java/com/baeldung/rxjava/SubjectImpl.java @@ -1,14 +1,14 @@ -package com.baelding.rxjava; +package com.baeldung.rxjava; import rx.Observer; import rx.subjects.PublishSubject; public class SubjectImpl { - public static Integer subscriber1 = 0; - public static Integer subscriber2 = 0; + static Integer subscriber1 = 0; + static Integer subscriber2 = 0; - public static Integer subjectMethod() { + private static Integer subjectMethod() { PublishSubject subject = PublishSubject.create(); subject.subscribe(getFirstObserver()); @@ -25,7 +25,7 @@ public static Integer subjectMethod() { } - public static Observer getFirstObserver() { + static Observer getFirstObserver() { return new Observer() { @Override @@ -46,7 +46,7 @@ public void onCompleted() { }; } - public static Observer getSecondObserver() { + static Observer getSecondObserver() { return new Observer() { @Override diff --git a/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Connector.java b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Connector.java index b7416e471ad8..25cd0bde83a3 100644 --- a/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Connector.java +++ b/rxjava/src/main/java/com/baeldung/rxjava/jdbc/Connector.java @@ -5,9 +5,9 @@ class Connector { - static final String DB_CONNECTION = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"; - static final String DB_USER = ""; - static final String DB_PASSWORD = ""; + private static final String DB_CONNECTION = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"; + private static final String DB_USER = ""; + private static final String DB_PASSWORD = ""; static final ConnectionProvider connectionProvider = new ConnectionProviderFromUrl(DB_CONNECTION, DB_USER, DB_PASSWORD); } diff --git a/rxjava/src/main/java/com/baelding/rxjava/operator/ToCleanString.java b/rxjava/src/main/java/com/baeldung/rxjava/operator/ToCleanString.java similarity index 96% rename from rxjava/src/main/java/com/baelding/rxjava/operator/ToCleanString.java rename to rxjava/src/main/java/com/baeldung/rxjava/operator/ToCleanString.java index 32db92c8fe96..708f7e9b8646 100644 --- a/rxjava/src/main/java/com/baelding/rxjava/operator/ToCleanString.java +++ b/rxjava/src/main/java/com/baeldung/rxjava/operator/ToCleanString.java @@ -1,4 +1,4 @@ -package com.baelding.rxjava.operator; +package com.baeldung.rxjava.operator; import rx.Observable.Operator; import rx.Subscriber; diff --git a/rxjava/src/main/java/com/baelding/rxjava/operator/ToLength.java b/rxjava/src/main/java/com/baeldung/rxjava/operator/ToLength.java similarity index 90% rename from rxjava/src/main/java/com/baelding/rxjava/operator/ToLength.java rename to rxjava/src/main/java/com/baeldung/rxjava/operator/ToLength.java index 006d59de3602..70ba8b8ca9fb 100644 --- a/rxjava/src/main/java/com/baelding/rxjava/operator/ToLength.java +++ b/rxjava/src/main/java/com/baeldung/rxjava/operator/ToLength.java @@ -1,4 +1,4 @@ -package com.baelding.rxjava.operator; +package com.baeldung.rxjava.operator; import rx.Observable; import rx.Observable.Transformer; diff --git a/rxjava/src/test/java/com/baeldung/rxjava/ObservableTest.java b/rxjava/src/test/java/com/baeldung/rxjava/ObservableTest.java index 3d3bb021d2ec..beb2cbeed361 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/ObservableTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/ObservableTest.java @@ -3,7 +3,7 @@ import org.junit.Test; import rx.Observable; -import static com.baelding.rxjava.ObservableImpl.getTitle; +import static com.baeldung.rxjava.ObservableImpl.getTitle; import static junit.framework.Assert.assertTrue; public class ObservableTest { diff --git a/rxjava/src/test/java/com/baeldung/rxjava/RxJavaCustomOperatorUnitTest.java b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaCustomOperatorUnitTest.java index bba891da88ef..414d951b8652 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/RxJavaCustomOperatorUnitTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaCustomOperatorUnitTest.java @@ -10,8 +10,8 @@ import java.util.Arrays; import java.util.List; -import static com.baelding.rxjava.operator.ToCleanString.toCleanString; -import static com.baelding.rxjava.operator.ToLength.toLength; +import static com.baeldung.rxjava.operator.ToCleanString.toCleanString; +import static com.baeldung.rxjava.operator.ToLength.toLength; import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.notNullValue; diff --git a/rxjava/src/test/java/com/baeldung/rxjava/SchedulersTest.java b/rxjava/src/test/java/com/baeldung/rxjava/SchedulersLiveTest.java similarity index 99% rename from rxjava/src/test/java/com/baeldung/rxjava/SchedulersTest.java rename to rxjava/src/test/java/com/baeldung/rxjava/SchedulersLiveTest.java index 05b86e52b944..712f07324c16 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/SchedulersTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/SchedulersLiveTest.java @@ -21,7 +21,7 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; -public class SchedulersTest { +public class SchedulersLiveTest { private String result = ""; private String result1 = ""; private String result2 = ""; diff --git a/rxjava/src/test/java/com/baeldung/rxjava/SubjectTest.java b/rxjava/src/test/java/com/baeldung/rxjava/SubjectTest.java index 210ceaa636ff..628b1e5476b5 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/SubjectTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/SubjectTest.java @@ -1,6 +1,5 @@ package com.baeldung.rxjava; -import com.baelding.rxjava.SubjectImpl; import org.junit.Test; import rx.subjects.PublishSubject; diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesIntegrationTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesIntegrationTest.java index c2fb2c32e3ec..5f445234d726 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesIntegrationTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesIntegrationTest.java @@ -18,25 +18,25 @@ public class BasicQueryTypesIntegrationTest { private ConnectionProvider connectionProvider = Connector.connectionProvider; private Database db = Database.from(connectionProvider); - private Observable create, insert1, insert2, insert3, update, delete = null; + private Observable create; @Test public void whenCreateTableAndInsertRecords_thenCorrect() { create = db.update("CREATE TABLE IF NOT EXISTS EMPLOYEE(id int primary key, name varchar(255))") .count(); - insert1 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(1, 'John')") + Observable insert1 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(1, 'John')") .dependsOn(create) .count(); - update = db.update("UPDATE EMPLOYEE SET name = 'Alan' WHERE id = 1") + Observable update = db.update("UPDATE EMPLOYEE SET name = 'Alan' WHERE id = 1") .dependsOn(create) .count(); - insert2 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(2, 'Sarah')") + Observable insert2 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(2, 'Sarah')") .dependsOn(create) .count(); - insert3 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(3, 'Mike')") + Observable insert3 = db.update("INSERT INTO EMPLOYEE(id, name) VALUES(3, 'Mike')") .dependsOn(create) .count(); - delete = db.update("DELETE FROM EMPLOYEE WHERE id = 2") + Observable delete = db.update("DELETE FROM EMPLOYEE WHERE id = 2") .dependsOn(create) .count(); List names = db.select("select name from EMPLOYEE where id < ?") diff --git a/vavr/src/test/java/com/baeldung/vavr/PatternMatchingUnitTest.java b/vavr/src/test/java/com/baeldung/vavr/PatternMatchingUnitTest.java index 1c7d70a9a4a7..c8d3741fe2c4 100644 --- a/vavr/src/test/java/com/baeldung/vavr/PatternMatchingUnitTest.java +++ b/vavr/src/test/java/com/baeldung/vavr/PatternMatchingUnitTest.java @@ -1,116 +1,16 @@ package com.baeldung.vavr; -import io.vavr.MatchError; -import io.vavr.control.Option; import org.junit.Test; import static io.vavr.API.$; import static io.vavr.API.Case; import static io.vavr.API.Match; -import static io.vavr.API.run; -import static io.vavr.Predicates.allOf; -import static io.vavr.Predicates.anyOf; -import static io.vavr.Predicates.instanceOf; -import static io.vavr.Predicates.is; -import static io.vavr.Predicates.isIn; -import static io.vavr.Predicates.isNotNull; -import static io.vavr.Predicates.isNull; -import static io.vavr.Predicates.noneOf; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; public class PatternMatchingUnitTest { @Test public void whenMatchesDefault_thenCorrect() { - int input = 5; - String output = Match(input).of(Case($(1), "one"), Case($(2), "two"), Case($(3), "three"), Case($(), "unknown")); - assertEquals("unknown", output); - } - - @Test(expected = MatchError.class) - public void givenNoMatchAndNoDefault_whenThrows_thenCorrect() { - int input = 5; - Match(input).of(Case($(1), "one"), Case($(2), "two")); - } - - @Test - public void whenMatchWorksWithOption_thenCorrect() { - int i = 10; - Option s = Match(i).option(Case($(0), "zero")); - assertTrue(s.isEmpty()); - assertEquals("None", s.toString()); - } - - @Test - public void whenMatchWorksWithPredicate_thenCorrect() { - int i = 3; - String s = Match(i).of(Case($(is(1)), "one"), Case($(is(2)), "two"), Case($(is(3)), "three"), Case($(), "?")); - assertEquals("three", s); - } - - @Test - public void givenInput_whenMatchesClass_thenCorrect() { - Object obj = 5; - String s = Match(obj).of(Case($(instanceOf(String.class)), "string matched"), Case($(), "not string")); - assertEquals("not string", s); - } - - @Test - public void givenInput_whenMatchesNull_thenCorrect() { - Object obj = 5; - String s = Match(obj).of(Case($(isNull()), "no value"), Case($(isNotNull()), "value found")); - assertEquals("value found", s); - } - - @Test - public void givenInput_whenContainsWorks_thenCorrect() { - int i = 5; - String s = Match(i).of(Case($(isIn(2, 4, 6, 8)), "Even Single Digit"), Case($(isIn(1, 3, 5, 7, 9)), "Odd Single Digit"), Case($(), "Out of range")); - assertEquals("Odd Single Digit", s); - } - - @Test - public void givenInput_whenMatchAllWorks_thenCorrect() { - Integer i = null; - String s = Match(i).of(Case($(allOf(isNotNull(), isIn(1, 2, 3, null))), "Number found"), Case($(), "Not found")); - assertEquals("Not found", s); - } - - @Test - public void givenInput_whenMatchesAnyOfWorks_thenCorrect() { - Integer year = 1990; - String s = Match(year).of(Case($(anyOf(isIn(1990, 1991, 1992), is(1986))), "Age match"), Case($(), "No age match")); - assertEquals("Age match", s); - } - - @Test - public void givenInput_whenMatchesNoneOfWorks_thenCorrect() { - Integer year = 1990; - String s = Match(year).of(Case($(noneOf(isIn(1990, 1991, 1992), is(1986))), "Age match"), Case($(), "No age match")); - assertEquals("No age match", s); - } - - @Test - public void whenMatchWorksWithPredicate_thenCorrect2() { - int i = 5; - String s = Match(i).of(Case($(isIn(2, 4, 6, 8)), "Even Single Digit"), Case($(isIn(1, 3, 5, 7, 9)), "Odd Single Digit"), Case($(), "Out of range")); - assertEquals("Odd Single Digit", s); - } - - @Test - public void whenMatchCreatesSideEffects_thenCorrect() { - int i = 4; - Match(i).of(Case($(isIn(2, 4, 6, 8)), o -> run(this::displayEven)), Case($(isIn(1, 3, 5, 7, 9)), o -> run(this::displayOdd)), Case($(), o -> run(() -> { - throw new IllegalArgumentException(String.valueOf(i)); - }))); - } - - private void displayEven() { - System.out.println("Input is even"); - } - - private void displayOdd() { - System.out.println("Input is odd"); + "".trim() } } From 55d4d05cb7316787eb8249cf5c339ab0f68f4818 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Tue, 17 Oct 2017 00:05:40 +0200 Subject: [PATCH 2/2] Merge fix --- .../algorithms/bubblesort/BubbleSort.java | 23 ++-- .../vavr/PatternMatchingUnitTest.java | 102 +++++++++++++++++- 2 files changed, 111 insertions(+), 14 deletions(-) diff --git a/algorithms/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java b/algorithms/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java index aa5e0851534f..f5080efa4071 100644 --- a/algorithms/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/bubblesort/BubbleSort.java @@ -4,22 +4,20 @@ public class BubbleSort { - public void bubbleSort(Integer[] arr) { + void bubbleSort(Integer[] arr) { int n = arr.length; IntStream.range(0, n - 1) - .forEach(i -> { - IntStream.range(i + 1, n - i) - .forEach(j -> { - if (arr[j - 1] > arr[j]) { - int temp = arr[j]; - arr[j] = arr[j - 1]; - arr[j - 1] = temp; - } - }); - }); + .flatMap(i -> IntStream.range(i + 1, n - i)) + .forEach(j -> { + if (arr[j - 1] > arr[j]) { + int temp = arr[j]; + arr[j] = arr[j - 1]; + arr[j - 1] = temp; + } + }); } - public void optimizedBubbleSort(Integer[] arr) { + void optimizedBubbleSort(Integer[] arr) { int i = 0, n = arr.length; boolean swapNeeded = true; while (i < n - 1 && swapNeeded) { @@ -37,5 +35,4 @@ public void optimizedBubbleSort(Integer[] arr) { i++; } } - } diff --git a/vavr/src/test/java/com/baeldung/vavr/PatternMatchingUnitTest.java b/vavr/src/test/java/com/baeldung/vavr/PatternMatchingUnitTest.java index c8d3741fe2c4..1c7d70a9a4a7 100644 --- a/vavr/src/test/java/com/baeldung/vavr/PatternMatchingUnitTest.java +++ b/vavr/src/test/java/com/baeldung/vavr/PatternMatchingUnitTest.java @@ -1,16 +1,116 @@ package com.baeldung.vavr; +import io.vavr.MatchError; +import io.vavr.control.Option; import org.junit.Test; import static io.vavr.API.$; import static io.vavr.API.Case; import static io.vavr.API.Match; +import static io.vavr.API.run; +import static io.vavr.Predicates.allOf; +import static io.vavr.Predicates.anyOf; +import static io.vavr.Predicates.instanceOf; +import static io.vavr.Predicates.is; +import static io.vavr.Predicates.isIn; +import static io.vavr.Predicates.isNotNull; +import static io.vavr.Predicates.isNull; +import static io.vavr.Predicates.noneOf; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; public class PatternMatchingUnitTest { @Test public void whenMatchesDefault_thenCorrect() { + int input = 5; + String output = Match(input).of(Case($(1), "one"), Case($(2), "two"), Case($(3), "three"), Case($(), "unknown")); - "".trim() + assertEquals("unknown", output); + } + + @Test(expected = MatchError.class) + public void givenNoMatchAndNoDefault_whenThrows_thenCorrect() { + int input = 5; + Match(input).of(Case($(1), "one"), Case($(2), "two")); + } + + @Test + public void whenMatchWorksWithOption_thenCorrect() { + int i = 10; + Option s = Match(i).option(Case($(0), "zero")); + assertTrue(s.isEmpty()); + assertEquals("None", s.toString()); + } + + @Test + public void whenMatchWorksWithPredicate_thenCorrect() { + int i = 3; + String s = Match(i).of(Case($(is(1)), "one"), Case($(is(2)), "two"), Case($(is(3)), "three"), Case($(), "?")); + assertEquals("three", s); + } + + @Test + public void givenInput_whenMatchesClass_thenCorrect() { + Object obj = 5; + String s = Match(obj).of(Case($(instanceOf(String.class)), "string matched"), Case($(), "not string")); + assertEquals("not string", s); + } + + @Test + public void givenInput_whenMatchesNull_thenCorrect() { + Object obj = 5; + String s = Match(obj).of(Case($(isNull()), "no value"), Case($(isNotNull()), "value found")); + assertEquals("value found", s); + } + + @Test + public void givenInput_whenContainsWorks_thenCorrect() { + int i = 5; + String s = Match(i).of(Case($(isIn(2, 4, 6, 8)), "Even Single Digit"), Case($(isIn(1, 3, 5, 7, 9)), "Odd Single Digit"), Case($(), "Out of range")); + assertEquals("Odd Single Digit", s); + } + + @Test + public void givenInput_whenMatchAllWorks_thenCorrect() { + Integer i = null; + String s = Match(i).of(Case($(allOf(isNotNull(), isIn(1, 2, 3, null))), "Number found"), Case($(), "Not found")); + assertEquals("Not found", s); + } + + @Test + public void givenInput_whenMatchesAnyOfWorks_thenCorrect() { + Integer year = 1990; + String s = Match(year).of(Case($(anyOf(isIn(1990, 1991, 1992), is(1986))), "Age match"), Case($(), "No age match")); + assertEquals("Age match", s); + } + + @Test + public void givenInput_whenMatchesNoneOfWorks_thenCorrect() { + Integer year = 1990; + String s = Match(year).of(Case($(noneOf(isIn(1990, 1991, 1992), is(1986))), "Age match"), Case($(), "No age match")); + assertEquals("No age match", s); + } + + @Test + public void whenMatchWorksWithPredicate_thenCorrect2() { + int i = 5; + String s = Match(i).of(Case($(isIn(2, 4, 6, 8)), "Even Single Digit"), Case($(isIn(1, 3, 5, 7, 9)), "Odd Single Digit"), Case($(), "Out of range")); + assertEquals("Odd Single Digit", s); + } + + @Test + public void whenMatchCreatesSideEffects_thenCorrect() { + int i = 4; + Match(i).of(Case($(isIn(2, 4, 6, 8)), o -> run(this::displayEven)), Case($(isIn(1, 3, 5, 7, 9)), o -> run(this::displayOdd)), Case($(), o -> run(() -> { + throw new IllegalArgumentException(String.valueOf(i)); + }))); + } + + private void displayEven() { + System.out.println("Input is even"); + } + + private void displayOdd() { + System.out.println("Input is odd"); } }