diff --git a/.travis.yml b/.travis.yml index 0d1d54a..ea42614 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ cache: directories: - "$HOME/.m2" install: true -script: "./mvnw clean install" +script: "./mvnw -B -U clean install" after_success: - sh .travis-support/coveralls.sh - bash <(curl -s https://codecov.io/bash) diff --git a/CHANGELOG b/CHANGELOG index accb642..bdec8c3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,12 @@ CHANGELOG ========= +0.4.0 +----- + +* Building with Jenkins +* Upgrade `kemitix-parent` to 5.0.3 + 0.3.0 ----- diff --git a/Jenkinsfile.groovy b/Jenkinsfile.groovy new file mode 100644 index 0000000..9207dae --- /dev/null +++ b/Jenkinsfile.groovy @@ -0,0 +1,87 @@ +final String mvn = "mvn --batch-mode --update-snapshots" + +pipeline { + agent any + stages { + stage('Environment') { + steps { + sh 'set' + } + } + stage('no SNAPSHOT in master') { + // checks that the pom version is not a snapshot when the current or target branch is master + when { + expression { + (env.GIT_BRANCH == 'master' || env.CHANGE_TARGET == 'master') && + (readMavenPom(file: 'pom.xml').version).contains("SNAPSHOT") + } + } + steps { + error("Build failed because SNAPSHOT version") + } + } + stage('Static Code Analysis') { + when { expression { findFiles(glob: '**/src/main/java/**/*.java').length > 0 } } + steps { + withMaven(maven: 'maven', jdk: 'JDK LTS') { + sh "${mvn} compile" + sh "${mvn} checkstyle:checkstyle" + sh "${mvn} pmd:pmd" + pmd canComputeNew: false, defaultEncoding: '', healthy: '', pattern: '', unHealthy: '' + } + } + } + stage('SonarQube (develop only)') { + when { expression { env.GIT_BRANCH == 'develop' && env.GIT_URL.startsWith('https://') } } + steps { + withSonarQubeEnv('sonarqube') { + withMaven(maven: 'maven', jdk: 'JDK LTS') { + sh "${mvn} org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.0.905:sonar" + } + } + } + } + stage('Build Java Next') { + steps { + withMaven(maven: 'maven', jdk: 'JDK Next') { + sh "${mvn} clean install -Djava.version=9" + } + } + } + stage('Build Java LTS') { + steps { + withMaven(maven: 'maven', jdk: 'JDK LTS') { + sh "${mvn} clean install" + } + } + } + stage('Test Results') { + when { expression { findFiles(glob: '**/target/surefire-reports/*.xml').length > 0 } } + steps { + junit '**/target/surefire-reports/*.xml' + jacoco exclusionPattern: '**/*{Test|IT|Main|Application|Immutable}.class' + withMaven(maven: 'maven', jdk: 'JDK LTS') { + sh "${mvn} com.gavinmogan:codacy-maven-plugin:coverage " + + "-DcoverageReportFile=target/site/jacoco/jacoco.xml " + + "-DprojectToken=`$JENKINS_HOME/codacy/token` " + + "-DapiToken=`$JENKINS_HOME/codacy/apitoken` " + + "-Dcommit=`git rev-parse HEAD`" + } + } + } + stage('Archiving') { + when { expression { findFiles(glob: '**/target/*.jar').length > 0 } } + steps { + archiveArtifacts '**/target/*.jar' + } + } + stage('Deploy') { + when { expression { (env.GIT_BRANCH == 'master' && env.GIT_URL.startsWith('https://')) } } + steps { + withMaven(maven: 'maven', jdk: 'JDK LTS') { + sh "${mvn} deploy --activate-profiles release -DskipTests=true" + } + } + } + } +} diff --git a/README.adoc b/README.adoc index d4bebd6..5eadee4 100644 --- a/README.adoc +++ b/README.adoc @@ -59,7 +59,7 @@ if (isTrue() && isAlsoTrue()) { [[source,java]] ---- Condition.where(isTrue()) - .and(isAlsoTrue()) + .and(() -> isAlsoTrue()) .then(() -> doSomething()) .otherwise(() -> doSomethingElse()); ---- @@ -78,7 +78,7 @@ if (isTrue() || alternativeIsTrue()) { [[source,java]] ---- Condition.where(isTrue()) - .or(alternativeIsTrue()) + .or(() -> alternativeIsTrue()) .then(() -> doSomething()) .otherwise(() -> doSomethingElse()); ---- @@ -115,7 +115,7 @@ if (isTrue() || !isFalse()) { [[source,java]] ---- Condition.where(isTrue()) - .andNot(isFalse()) + .andNot(() -> isFalse()) .then(() -> doSomething()) .otherwise(() -> doSomethingElse()); ---- @@ -134,7 +134,7 @@ if (isFalse() || !isAlsoFalse()) { [[source,java]] ---- Condition.where(isFalse()) - .orNot(isAlsoFalse()) + .orNot(() -> isAlsoFalse()) .then(() -> doSomething()) .otherwise(() -> doSomethingElse()); ---- @@ -154,7 +154,7 @@ if (isFalse()) { ---- Condition.where(isFalse()) .then(() -> doSomething()) - .otherwise(isTrue()) + .otherwise(() -> isTrue()) .then(() -> doSomethingElse()); ---- @@ -174,7 +174,7 @@ if (isTrue()) { ---- Condition.where(isTrue()) .then(() -> doSomething()) - .and(isAlsoTrue()) + .and(() -> isAlsoTrue()) .then(() -> doSomethingElse()); ---- @@ -213,8 +213,9 @@ final Optional result = Value.where(isTrue(), () -> TRUE); [[source,java]] ---- -final String result = Value.where(isTrue()).then(() -> TRUE) - .otherwise(() -> FALSE); +final String result = Value.where(isTrue()) + .then(() -> TRUE) + .otherwise(() -> FALSE); ---- ### if-not-then-else @@ -231,8 +232,9 @@ if (!isTrue()) { [[source,java]] ---- -final String result = Value.whereNot(isTrue()).then(() -> TRUE) - .otherwise(() -> FALSE); +final String result = Value.whereNot(isTrue()) + .then(() -> TRUE) + .otherwise(() -> FALSE); ---- ### if-and-then-else @@ -249,9 +251,10 @@ if (isTrue() && alternativeIsTrue()) { [[source,java]] ---- -final String result = Value.where(isTrue()).and(alternativeIsTrue()) - .then(() -> TRUE) - .otherwise(() -> FALSE); +final String result = Value.where(isTrue()) + .and(() -> alternativeIsTrue()) + .then(() -> TRUE) + .otherwise(() -> FALSE); ---- ### if-and-not-then-else @@ -268,9 +271,10 @@ if (isTrue() && !alternativeIsFalse()) { [[source,java]] ---- -final String result = Value.where(isTrue()).andNot(alternativeIsFalse()) - .then(() -> TRUE) - .otherwise(() -> FALSE); +final String result = Value.where(isTrue()) + .andNot(() -> alternativeIsFalse()) + .then(() -> TRUE) + .otherwise(() -> FALSE); ---- ### if-or-then-else @@ -287,9 +291,10 @@ if (isTrue() || alternativeIsTrue()) { [[source,java]] ---- -final String result = Value.where(isTrue()).or(alternativeIsTrue()) - .then(() -> TRUE) - .otherwise(() -> FALSE); +final String result = Value.where(isTrue()) + .or(() -> alternativeIsTrue()) + .then(() -> TRUE) + .otherwise(() -> FALSE); ---- ### if-or-not-then-else @@ -306,7 +311,27 @@ if (isTrue() || !isFalse()) { [[source,java]] ---- -final String result = Value.where(isTrue()).orNot(isFalse()) - .then(() -> TRUE) - .otherwise(() -> FALSE); +final String result = Value.where(isTrue()) + .orNot(() -> isFalse()) + .then(() -> TRUE) + .otherwise(() -> FALSE); ---- + +### if-then + +[[source,java]] +----- +Optional result; +if (isTrue()) { + result = Optional.of(TRUE); +} else { + result = Optional.empty(); +} +----- + +[[source,java]] +----- +final Optional result = Value.where(isTrue()) + .then(() -> TRUE) + .optional(); +----- diff --git a/circle.yml b/circle.yml deleted file mode 100644 index 280d970..0000000 --- a/circle.yml +++ /dev/null @@ -1,3 +0,0 @@ -test: - override: - - ./mvnw clean install diff --git a/lombok.config b/lombok.config new file mode 100644 index 0000000..00ebb3e --- /dev/null +++ b/lombok.config @@ -0,0 +1 @@ +lombok.addGeneratedAnnotation=false diff --git a/pom.xml b/pom.xml index c45fd52..bdeef58 100644 --- a/pom.xml +++ b/pom.xml @@ -4,28 +4,38 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - 3.2.0 - 5-complexity + 1.8 + 4.0.1 + 5-complexity 1 1 0 100 100 4.12 - 3.8.0 + 3.9.1 4.3.0 + 2.10 + 0.8.1 + 1.16.20 - net.kemitix + net.kemitix kemitix-parent - 3.2.0 + 5.1.0 conditional - 0.3.0 + 0.4.0 + + org.projectlombok + lombok + ${lombok.version} + true + junit junit @@ -43,25 +53,17 @@ - net.kemitix - kemitix-checkstyle-ruleset-maven-plugin - ${kemitix-checkstyle-ruleset.version} + io.repaint.maven + tiles-maven-plugin + ${tiles-maven-plugin.version} + true - ${kemitix-checkstyle-ruleset.level} + + net.kemitix.tiles:all:${kemitix-tiles.version} + net.kemitix.tiles:pmd-strict:${kemitix-tiles.version} + net.kemitix.checkstyle:tile:${kemitix-checkstyle.version} + - - - validate - - check - - - - - - org.eluder.coveralls - coveralls-maven-plugin - ${coveralls-maven-plugin.version} diff --git a/src/main/java/net/kemitix/conditional/Action.java b/src/main/java/net/kemitix/conditional/Action.java new file mode 100644 index 0000000..67508e5 --- /dev/null +++ b/src/main/java/net/kemitix/conditional/Action.java @@ -0,0 +1,36 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2017 Paul Campbell + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software + * and associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies + * or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package net.kemitix.conditional; + +/** + * An action to perform in a clause when a {@link Condition} is met. + * + * @author Paul Campbell (pcampbell@kemitix.net) + */ +@FunctionalInterface +public interface Action { + + /** + * The action to perform. + */ + void perform(); +} diff --git a/src/main/java/net/kemitix/conditional/Condition.java b/src/main/java/net/kemitix/conditional/Condition.java index 7129574..c87a74f 100644 --- a/src/main/java/net/kemitix/conditional/Condition.java +++ b/src/main/java/net/kemitix/conditional/Condition.java @@ -21,6 +21,8 @@ package net.kemitix.conditional; +import java.util.function.Supplier; + /** * If-then-else in a functional-style. * @@ -35,9 +37,11 @@ public interface Condition { * * @return the Condition */ - @SuppressWarnings("avoidinlineconditionals") static Condition where(final boolean clause) { - return clause ? TrueCondition.TRUE : FalseCondition.FALSE; + if (clause) { + return TrueCondition.TRUE; + } + return FalseCondition.FALSE; } /** @@ -58,7 +62,7 @@ public interface Condition { * * @return the Condition */ - Condition and(boolean clause); + Condition and(Supplier clause); /** * Logically AND combine the current {@code Condition} with boolean opposite of the clause. @@ -67,8 +71,8 @@ public interface Condition { * * @return the Condition */ - default Condition andNot(final boolean clause) { - return and(!clause); + default Condition andNot(final Supplier clause) { + return and(() -> !clause.get()); } /** @@ -78,7 +82,8 @@ public interface Condition { * * @return the Condition */ - Condition or(boolean clause); + @SuppressWarnings("PMD.ShortMethodName") + Condition or(Supplier clause); /** * Logically OR combine the current {@code Condition} with the boolean opposite of the clause. @@ -87,8 +92,8 @@ public interface Condition { * * @return the Condition */ - default Condition orNot(final boolean clause) { - return or(!clause); + default Condition orNot(final Supplier clause) { + return or(() -> !clause.get()); } /** @@ -98,14 +103,14 @@ public interface Condition { * * @return the Condition */ - Condition then(Runnable response); + Condition then(Action response); /** * Perform this response if the {@code Condition} is {@code false}. * * @param response the response to perform */ - void otherwise(Runnable response); + void otherwise(Action response); /** * Create a new {@code Condition} for the clause as a continuation to an existing {@code Condition}. @@ -114,8 +119,8 @@ public interface Condition { * * @return the Condition */ - default Condition otherwise(final boolean clause) { - return where(clause); + default Condition otherwise(final Supplier clause) { + return where(clause.get()); } } diff --git a/src/main/java/net/kemitix/conditional/FalseCondition.java b/src/main/java/net/kemitix/conditional/FalseCondition.java index 165a649..3ffdbd2 100644 --- a/src/main/java/net/kemitix/conditional/FalseCondition.java +++ b/src/main/java/net/kemitix/conditional/FalseCondition.java @@ -21,6 +21,8 @@ package net.kemitix.conditional; +import java.util.function.Supplier; + /** * A {@code Condition} that has evaluated to {@code false}. * @@ -28,26 +30,27 @@ package net.kemitix.conditional; */ final class FalseCondition implements Condition { - protected static final Condition FALSE = new net.kemitix.conditional.FalseCondition(); + public static final Condition FALSE = new net.kemitix.conditional.FalseCondition(); @Override - public Condition and(final boolean clause) { + public Condition and(final Supplier clause) { return FALSE; } @Override - public Condition or(final boolean secondClause) { - return Condition.where(secondClause); + @SuppressWarnings("PMD.ShortMethodName") + public Condition or(final Supplier secondClause) { + return Condition.where(secondClause.get()); } @Override - public Condition then(final Runnable response) { + public Condition then(final Action response) { return FALSE; } @Override - public void otherwise(final Runnable response) { - response.run(); + public void otherwise(final Action response) { + response.perform(); } } diff --git a/src/main/java/net/kemitix/conditional/FalseValueClause.java b/src/main/java/net/kemitix/conditional/FalseValueClause.java index e0143e0..f4283c3 100644 --- a/src/main/java/net/kemitix/conditional/FalseValueClause.java +++ b/src/main/java/net/kemitix/conditional/FalseValueClause.java @@ -21,6 +21,7 @@ package net.kemitix.conditional; +import java.util.Optional; import java.util.function.Supplier; /** @@ -32,33 +33,41 @@ import java.util.function.Supplier; */ class FalseValueClause implements Value.ValueClause { - protected static final Value.ValueClause FALSE = new FalseValueClause(); + protected static final Value.ValueClause FALSE = new FalseValueClause<>(); @Override public ValueSupplier then(final Supplier trueSupplier) { - return new FalseValueSupplier(); + return new FalseValueSupplier<>(); } @Override - public Value.ValueClause and(final boolean clause) { + public Value.ValueClause and(final Supplier clause) { return this; } @Override - public Value.ValueClause or(final boolean clause) { - return Value.where(clause); + @SuppressWarnings("PMD.ShortMethodName") + public Value.ValueClause or(final Supplier clause) { + return Value.where(clause.get()); } /** * An intermediate result of the {@link Value} where the clause has evaluated to false. + * + * @param the type of the value */ - private class FalseValueSupplier implements ValueSupplier { + private static final class FalseValueSupplier implements ValueSupplier { @Override public T otherwise(final Supplier falseSupplier) { return falseSupplier.get(); } + @Override + public Optional optional() { + return Optional.empty(); + } + } } diff --git a/src/main/java/net/kemitix/conditional/TrueCondition.java b/src/main/java/net/kemitix/conditional/TrueCondition.java index d2132d1..0691433 100644 --- a/src/main/java/net/kemitix/conditional/TrueCondition.java +++ b/src/main/java/net/kemitix/conditional/TrueCondition.java @@ -21,6 +21,8 @@ package net.kemitix.conditional; +import java.util.function.Supplier; + /** * A {@code Condition} that has evaluated to {@code true}. * @@ -28,26 +30,27 @@ package net.kemitix.conditional; */ final class TrueCondition implements Condition { - protected static final Condition TRUE = new net.kemitix.conditional.TrueCondition(); + public static final Condition TRUE = new net.kemitix.conditional.TrueCondition(); @Override - public Condition and(final boolean clause) { - return Condition.where(clause); + public Condition and(final Supplier clause) { + return Condition.where(clause.get()); } @Override - public Condition or(final boolean secondClause) { + @SuppressWarnings("PMD.ShortMethodName") + public Condition or(final Supplier secondClause) { return TRUE; } @Override - public Condition then(final Runnable response) { - response.run(); + public Condition then(final Action response) { + response.perform(); return TRUE; } @Override - public void otherwise(final Runnable response) { + public void otherwise(final Action response) { // do nothing } diff --git a/src/main/java/net/kemitix/conditional/TrueValueClause.java b/src/main/java/net/kemitix/conditional/TrueValueClause.java index c98f2be..46903c5 100644 --- a/src/main/java/net/kemitix/conditional/TrueValueClause.java +++ b/src/main/java/net/kemitix/conditional/TrueValueClause.java @@ -23,6 +23,7 @@ package net.kemitix.conditional; import lombok.RequiredArgsConstructor; +import java.util.Optional; import java.util.function.Supplier; /** @@ -34,29 +35,33 @@ import java.util.function.Supplier; */ class TrueValueClause implements Value.ValueClause { - protected static final Value.ValueClause TRUE = new TrueValueClause(); + protected static final Value.ValueClause TRUE = new TrueValueClause<>(); @Override public ValueSupplier then(final Supplier trueSupplier) { - return new TrueValueSupplier(trueSupplier); + return new TrueValueSupplier<>(trueSupplier); } @Override - public Value.ValueClause and(final boolean clause) { - return Value.where(clause); + public Value.ValueClause and(final Supplier clause) { + return Value.where(clause.get()); } @Override - public Value.ValueClause or(final boolean clause) { + @SuppressWarnings("PMD.ShortMethodName") + public Value.ValueClause or(final Supplier clause) { return this; } /** * An intermediate result of the {@link Value} where the clause has evaluated to true. + * + * @param the type of the value */ @RequiredArgsConstructor - private class TrueValueSupplier implements ValueSupplier { + private static final class TrueValueSupplier implements ValueSupplier { + @SuppressWarnings("PMD.BeanMembersShouldSerialize") private final Supplier valueSupplier; @Override @@ -64,6 +69,11 @@ class TrueValueClause implements Value.ValueClause { return valueSupplier.get(); } + @Override + public Optional optional() { + return Optional.ofNullable(valueSupplier.get()); + } + } } diff --git a/src/main/java/net/kemitix/conditional/Value.java b/src/main/java/net/kemitix/conditional/Value.java index 6345564..c07737a 100644 --- a/src/main/java/net/kemitix/conditional/Value.java +++ b/src/main/java/net/kemitix/conditional/Value.java @@ -41,10 +41,11 @@ public interface Value { * * @return the value from either the trueSupplier or the falseSupplier */ + @SuppressWarnings("PMD.LawOfDemeter") static T where( - boolean clause, - Supplier trueSupplier, - Supplier falseSupplier + final boolean clause, + final Supplier trueSupplier, + final Supplier falseSupplier ) { return Value.where(clause).then(trueSupplier) .otherwise(falseSupplier); @@ -60,8 +61,8 @@ public interface Value { * @return an Optional either containing the value from the trueSupplier or empty */ static Optional where( - boolean clause, - Supplier trueSupplier + final boolean clause, + final Supplier trueSupplier ) { return Optional.ofNullable(Value.where(clause, trueSupplier, () -> null)); } @@ -74,9 +75,12 @@ public interface Value { * * @return a true or false value clause */ - @SuppressWarnings({"unchecked", "avoidinlineconditionals"}) + @SuppressWarnings("unchecked") static ValueClause where(final boolean clause) { - return (ValueClause) (clause ? TrueValueClause.TRUE : FalseValueClause.FALSE); + if (clause) { + return (ValueClause) TrueValueClause.TRUE; + } + return (ValueClause) FalseValueClause.FALSE; } /** @@ -87,7 +91,7 @@ public interface Value { * * @return a true or false value clause */ - static ValueClause whereNot(boolean clause) { + static ValueClause whereNot(final boolean clause) { return where(!clause); } @@ -114,7 +118,7 @@ public interface Value { * * @return a true or false value clause */ - ValueClause and(boolean clause); + ValueClause and(Supplier clause); /** * Logically OR combine the current {@link ValueClause} with clause. @@ -123,7 +127,8 @@ public interface Value { * * @return a true or false value clause */ - ValueClause or(boolean clause); + @SuppressWarnings("PMD.ShortMethodName") + ValueClause or(Supplier clause); /** * Logically AND combine the current {@link ValueClause} with boolean opposite of the clause. @@ -132,8 +137,8 @@ public interface Value { * * @return a true or false value clause */ - default ValueClause andNot(final boolean clause) { - return and(!clause); + default ValueClause andNot(final Supplier clause) { + return and(() -> !clause.get()); } /** @@ -143,8 +148,8 @@ public interface Value { * * @return a true or false value clause */ - default ValueClause orNot(boolean clause) { - return or(!clause); + default ValueClause orNot(final Supplier clause) { + return or(() -> !clause.get()); } /** @@ -163,6 +168,12 @@ public interface Value { */ T otherwise(Supplier falseSupplier); + /** + * Returns the value in an Optional if the {@link ValueClause} is true, or an empty Optional if it is false. + * + * @return an Optional, possibly containing the value + */ + Optional optional(); } } diff --git a/src/test/java/net/kemitix/conditional/ConditionalTest.java b/src/test/java/net/kemitix/conditional/ConditionalTest.java index 0093cd4..5124b7f 100644 --- a/src/test/java/net/kemitix/conditional/ConditionalTest.java +++ b/src/test/java/net/kemitix/conditional/ConditionalTest.java @@ -3,6 +3,8 @@ package net.kemitix.conditional; import org.junit.Before; import org.junit.Test; +import java.util.concurrent.atomic.AtomicInteger; + import static org.assertj.core.api.Assertions.assertThat; /** @@ -10,9 +12,9 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class ConditionalTest { - private Runnable thenResponse; + private Action thenResponse; - private Runnable otherwiseResponse; + private Action otherwiseResponse; private boolean thenFlag; @@ -76,9 +78,9 @@ public class ConditionalTest { public void whereTrueThenDoSomethingAndThenDoSomethingElse() { //when Condition.where(true) - .then(thenResponse) - .and(true) - .then(otherwiseResponse); + .then(thenResponse) + .and(() -> true) + .then(otherwiseResponse); //then assertThatBothResponsesRun(); } @@ -119,7 +121,7 @@ public class ConditionalTest { public void whereNotFalseThenRuns() { //when Condition.whereNot(false) - .then(thenResponse); + .then(thenResponse); //then assertThatTheThenResponseRuns(); } @@ -128,8 +130,8 @@ public class ConditionalTest { public void whereNotTrueThenOtherwiseRuns() { //when Condition.whereNot(true) - .then(thenResponse) - .otherwise(otherwiseResponse); + .then(thenResponse) + .otherwise(otherwiseResponse); //then assertThatTheOtherwiseResponseRuns(); } @@ -138,8 +140,8 @@ public class ConditionalTest { public void whereTrueAndNotFalseThenRuns() { //when Condition.where(true) - .andNot(false) - .then(thenResponse); + .andNot(() -> false) + .then(thenResponse); //then assertThatTheThenResponseRuns(); } @@ -148,9 +150,9 @@ public class ConditionalTest { public void whereTrueAndNotTrueThenOtherwiseRuns() { //when Condition.where(true) - .andNot(true) - .then(thenResponse) - .otherwise(otherwiseResponse); + .andNot(() -> true) + .then(thenResponse) + .otherwise(otherwiseResponse); //then assertThatTheOtherwiseResponseRuns(); } @@ -159,8 +161,8 @@ public class ConditionalTest { public void whereFalseOrNotFalseThenRuns() { //when Condition.where(false) - .orNot(false) - .then(thenResponse); + .orNot(() -> false) + .then(thenResponse); //then assertThatTheThenResponseRuns(); } @@ -169,9 +171,9 @@ public class ConditionalTest { public void whereFalseOrNotTrueThenOtherwiseRuns() { //when Condition.where(false) - .orNot(true) - .then(thenResponse) - .otherwise(otherwiseResponse); + .orNot(() -> true) + .then(thenResponse) + .otherwise(otherwiseResponse); //then assertThatTheOtherwiseResponseRuns(); } @@ -180,9 +182,9 @@ public class ConditionalTest { public void whereFalseElseTrueThenOtherwiseRuns() { //when Condition.where(false) - .then(thenResponse) - .otherwise(true) - .then(otherwiseResponse); + .then(thenResponse) + .otherwise(() -> true) + .then(otherwiseResponse); //then assertThatTheOtherwiseResponseRuns(); } @@ -191,9 +193,9 @@ public class ConditionalTest { public void whereFalseElseFalseThenNothingRuns() { //when Condition.where(false) - .then(thenResponse) - .otherwise(false) - .then(otherwiseResponse); + .then(thenResponse) + .otherwise(() -> false) + .then(otherwiseResponse); //then assertThatNoResponseRuns(); } @@ -202,8 +204,8 @@ public class ConditionalTest { public void whereTrueChainedThensBothRuns() { //when Condition.where(true) - .then(thenResponse) - .then(otherwiseResponse); + .then(thenResponse) + .then(otherwiseResponse); //then assertThatBothResponsesRun(); } @@ -212,8 +214,8 @@ public class ConditionalTest { public void whereFalseChainedThensNothingRuns() { //when Condition.where(false) - .then(thenResponse) - .then(otherwiseResponse); + .then(thenResponse) + .then(otherwiseResponse); //then assertThatNoResponseRuns(); } @@ -235,22 +237,22 @@ public class ConditionalTest { private void assertThatTheOtherwiseResponseRan() { assertThat(otherwiseFlag).as("otherwise response runs") - .isTrue(); + .isTrue(); } private void assertThatTheThenResponseRan() { assertThat(thenFlag).as("then response runs") - .isTrue(); + .isTrue(); } private void assertThatTheOtherwiseResponseDidNotRun() { assertThat(otherwiseFlag).as("otherwise response does not run") - .isFalse(); + .isFalse(); } private void assertThatTheThenResponseDidNotRun() { assertThat(thenFlag).as("then response does not run") - .isFalse(); + .isFalse(); } private void assertThatNoResponseRuns() { @@ -260,27 +262,53 @@ public class ConditionalTest { private void when(final boolean clause) { Condition.where(clause) - .then(thenResponse) - .otherwise(otherwiseResponse); + .then(thenResponse) + .otherwise(otherwiseResponse); } private void when( final boolean firstClause, final boolean secondClause - ) { + ) { Condition.where(firstClause) - .and(secondClause) - .then(thenResponse) - .otherwise(otherwiseResponse); + .and(() -> secondClause) + .then(thenResponse) + .otherwise(otherwiseResponse); } private void whenOr( final boolean firstClause, final boolean secondClause - ) { + ) { Condition.where(firstClause) - .or(secondClause) - .then(thenResponse) - .otherwise(otherwiseResponse); + .or(() -> secondClause) + .then(thenResponse) + .otherwise(otherwiseResponse); + } + + @Test + public void shortCurcuitOr() { + //given + final AtomicInteger atomicInteger = new AtomicInteger(); + //when + Condition.where(true) + .or(() -> atomicInteger.compareAndSet(0, 2)) + .then(thenResponse); + //then + assertThatTheThenResponseRan(); + assertThat(atomicInteger).hasValue(0); + } + + @Test + public void shortCurcuitAnd() { + //given + final AtomicInteger atomicInteger = new AtomicInteger(); + //when + Condition.where(false) + .and(() -> atomicInteger.compareAndSet(0, 2)) + .then(thenResponse); + //then + assertThatTheThenResponseDidNotRun(); + assertThat(atomicInteger).hasValue(0); } } diff --git a/src/test/java/net/kemitix/conditional/ValueTest.java b/src/test/java/net/kemitix/conditional/ValueTest.java index d76011b..3c72c6e 100644 --- a/src/test/java/net/kemitix/conditional/ValueTest.java +++ b/src/test/java/net/kemitix/conditional/ValueTest.java @@ -4,6 +4,7 @@ import lombok.val; import org.junit.Test; import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; import static org.assertj.core.api.Assertions.assertThat; @@ -52,7 +53,7 @@ public class ValueTest { public void valueWhereClauseIsTrue() { //when val result = Value.where(true).then(() -> TRUE) - .otherwise(() -> FALSE); + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(TRUE); } @@ -61,7 +62,7 @@ public class ValueTest { public void valueWhereClauseIsFalse() { //when val result = Value.where(false).then(() -> TRUE) - .otherwise(() -> FALSE); + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(FALSE); } @@ -69,9 +70,9 @@ public class ValueTest { @Test public void valueWhereTrueAndTrueIsTrue() { //when - val result = Value.where(true).and(true) - .then(() -> TRUE) - .otherwise(() -> FALSE); + val result = Value.where(true).and(() -> true) + .then(() -> TRUE) + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(TRUE); } @@ -79,9 +80,9 @@ public class ValueTest { @Test public void valueWhereTrueAndFalseIsFalse() { //when - val result = Value.where(true).and(false) - .then(() -> TRUE) - .otherwise(() -> FALSE); + val result = Value.where(true).and(() -> false) + .then(() -> TRUE) + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(FALSE); } @@ -89,9 +90,9 @@ public class ValueTest { @Test public void valueWhereFalseAndTrueIsFalse() { //when - val result = Value.where(false).and(true) - .then(() -> TRUE) - .otherwise(() -> FALSE); + val result = Value.where(false).and(() -> true) + .then(() -> TRUE) + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(FALSE); } @@ -99,9 +100,9 @@ public class ValueTest { @Test public void valueWhereFalseAndFalseIsFalse() { //when - val result = Value.where(false).and(false) - .then(() -> TRUE) - .otherwise(() -> FALSE); + val result = Value.where(false).and(() -> false) + .then(() -> TRUE) + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(FALSE); } @@ -109,9 +110,9 @@ public class ValueTest { @Test public void valueWhereTrueOrTrueIsTrue() { //when - val result = Value.where(true).or(true) - .then(() -> TRUE) - .otherwise(() -> FALSE); + val result = Value.where(true).or(() -> true) + .then(() -> TRUE) + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(TRUE); } @@ -119,9 +120,9 @@ public class ValueTest { @Test public void valueWhereTrueOrFalseIsTrue() { //when - val result = Value.where(true).or(false) - .then(() -> TRUE) - .otherwise(() -> FALSE); + val result = Value.where(true).or(() -> false) + .then(() -> TRUE) + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(TRUE); } @@ -129,9 +130,9 @@ public class ValueTest { @Test public void valueWhereFalseOrTrueIsTrue() { //when - val result = Value.where(false).or(true) - .then(() -> TRUE) - .otherwise(() -> FALSE); + val result = Value.where(false).or(() -> true) + .then(() -> TRUE) + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(TRUE); } @@ -139,9 +140,9 @@ public class ValueTest { @Test public void valueWhereFalseOrFalseIsFalse() { //when - val result = Value.where(false).or(false) - .then(() -> TRUE) - .otherwise(() -> FALSE); + val result = Value.where(false).or(() -> false) + .then(() -> TRUE) + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(FALSE); } @@ -150,7 +151,7 @@ public class ValueTest { public void valueWhereNotTrueIsFalse() { //when val result = Value.whereNot(true).then(() -> TRUE) - .otherwise(() -> FALSE); + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(FALSE); } @@ -159,7 +160,7 @@ public class ValueTest { public void valueWhereNotFalseIsTrue() { //when val result = Value.whereNot(false).then(() -> TRUE) - .otherwise(() -> FALSE); + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(TRUE); } @@ -167,9 +168,9 @@ public class ValueTest { @Test public void valueWhereTrueAndNotTrueIsFalse() { //when - val result = Value.where(true).andNot(true) - .then(() -> TRUE) - .otherwise(() -> FALSE); + val result = Value.where(true).andNot(() -> true) + .then(() -> TRUE) + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(FALSE); } @@ -177,9 +178,9 @@ public class ValueTest { @Test public void valueWhereTrueAndNotFalseIsTrue() { //when - val result = Value.where(true).andNot(false) - .then(() -> TRUE) - .otherwise(() -> FALSE); + val result = Value.where(true).andNot(() -> false) + .then(() -> TRUE) + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(TRUE); } @@ -187,9 +188,9 @@ public class ValueTest { @Test public void valueWhereFalseAndNotTrueIsFalse() { //when - val result = Value.where(false).andNot(true) - .then(() -> TRUE) - .otherwise(() -> FALSE); + val result = Value.where(false).andNot(() -> true) + .then(() -> TRUE) + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(FALSE); } @@ -197,9 +198,9 @@ public class ValueTest { @Test public void valueWhereFalseAndNotFalseIsFalse() { //when - val result = Value.where(false).andNot(false) - .then(() -> TRUE) - .otherwise(() -> FALSE); + val result = Value.where(false).andNot(() -> false) + .then(() -> TRUE) + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(FALSE); } @@ -207,9 +208,9 @@ public class ValueTest { @Test public void valueWhereTrueOrNotTrueIsTrue() { //when - val result = Value.where(true).orNot(true) - .then(() -> TRUE) - .otherwise(() -> FALSE); + val result = Value.where(true).orNot(() -> true) + .then(() -> TRUE) + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(TRUE); } @@ -217,9 +218,9 @@ public class ValueTest { @Test public void valueWhereTrueOrNotFalseIsTrue() { //when - val result = Value.where(true).orNot(false) - .then(() -> TRUE) - .otherwise(() -> FALSE); + val result = Value.where(true).orNot(() -> false) + .then(() -> TRUE) + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(TRUE); } @@ -227,9 +228,9 @@ public class ValueTest { @Test public void valueWhereFalseOrNotTrueIsFalse() { //when - val result = Value.where(false).orNot(true) - .then(() -> TRUE) - .otherwise(() -> FALSE); + val result = Value.where(false).orNot(() -> true) + .then(() -> TRUE) + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(FALSE); } @@ -237,10 +238,54 @@ public class ValueTest { @Test public void valueWhereFalseOrNotFalseIsTrue() { //when - val result = Value.where(false).orNot(false) - .then(() -> TRUE) - .otherwise(() -> FALSE); + val result = Value.where(false).orNot(() -> false) + .then(() -> TRUE) + .otherwise(() -> FALSE); //then assertThat(result).isEqualTo(TRUE); } + + @Test + public void valueWhereTrueThenIsNotEmpty() { + //given + final Optional result = Value.where(true).then(() -> "value").optional(); + //then + assertThat(result).contains("value"); + } + + @Test + public void valueWhereFalseThenIsEmpty() { + //given + final Optional result = Value.where(false).then(() -> "value").optional(); + //when + assertThat(result).isEmpty(); + } + + @Test + public void shortCurcuitOr() { + //given + final AtomicInteger atomicInteger = new AtomicInteger(); + //when + final Optional result = Value.where(true) + .or(() -> atomicInteger.compareAndSet(0, 2)) + .then(() -> "Pass") + .optional(); + //then + assertThat(result).contains("Pass"); + assertThat(atomicInteger).hasValue(0); + } + + @Test + public void shortCurcuitAnd() { + //given + final AtomicInteger atomicInteger = new AtomicInteger(); + //when + final Optional result = Value.where(false) + .and(() -> atomicInteger.compareAndSet(0, 2)) + .then(() -> "Pass") + .optional(); + //then + assertThat(result).isEmpty(); + assertThat(atomicInteger).hasValue(0); + } } diff --git a/wercker.yml b/wercker.yml deleted file mode 100644 index b152705..0000000 --- a/wercker.yml +++ /dev/null @@ -1,6 +0,0 @@ -box: maven:3.5.0-jdk-8 - -build: - steps: - - xenoterracide/maven: - goals: clean install