Merge pull request #26 from kemitix/short-curcuiting-logic

Enable short-circuiting logic
This commit is contained in:
Paul Campbell 2018-03-13 22:02:10 +00:00 committed by GitHub
commit abbc5b5325
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 329 additions and 183 deletions

View file

@ -3,49 +3,64 @@ final String mvn = "mvn --batch-mode --update-snapshots"
pipeline { pipeline {
agent any agent any
stages { stages {
stage('Environment') {
steps {
sh 'set'
}
}
stage('no SNAPSHOT in master') { stage('no SNAPSHOT in master') {
// checks that the pom version is not a snapshot when the current branch is master // checks that the pom version is not a snapshot when the current or target branch is master
// TODO: also check for SNAPSHOT when is a pull request with master as the target branch
when { when {
expression { expression {
(env.GIT_BRANCH == 'master') && (env.GIT_BRANCH == 'master' || env.CHANGE_TARGET == 'master') &&
(readMavenPom(file: 'pom.xml').version).contains("SNAPSHOT") } (readMavenPom(file: 'pom.xml').version).contains("SNAPSHOT")
}
} }
steps { steps {
error("Build failed because SNAPSHOT version") error("Build failed because SNAPSHOT version")
} }
} }
stage('Static Code Analysis') { stage('Static Code Analysis') {
when { expression { findFiles(glob: '**/src/main/java/**/*.java').length > 0 } }
steps { steps {
withMaven(maven: 'maven 3.5.2', jdk: 'JDK 1.8') { withMaven(maven: 'maven', jdk: 'JDK LTS') {
sh "${mvn} compile checkstyle:checkstyle pmd:pmd" sh "${mvn} compile"
} sh "${mvn} checkstyle:checkstyle"
sh "${mvn} pmd:pmd"
pmd canComputeNew: false, defaultEncoding: '', healthy: '', pattern: '', unHealthy: '' pmd canComputeNew: false, defaultEncoding: '', healthy: '', pattern: '', unHealthy: ''
} }
} }
stage('Build') { }
parallel { stage('SonarQube (develop only)') {
stage('Java 8') { when { expression { env.GIT_BRANCH == 'develop' && env.GIT_URL.startsWith('https://') } }
steps { steps {
withMaven(maven: 'maven 3.5.2', jdk: 'JDK 1.8') { withSonarQubeEnv('sonarqube') {
sh "${mvn} clean install" withMaven(maven: 'maven', jdk: 'JDK LTS') {
sh "${mvn} org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.0.905:sonar"
} }
} }
} }
stage('Java 9') { }
stage('Build Java Next') {
steps { steps {
withMaven(maven: 'maven 3.5.2', jdk: 'JDK 9') { 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" sh "${mvn} clean install"
} }
} }
} }
}
}
stage('Test Results') { stage('Test Results') {
when { expression { findFiles(glob: '**/target/surefire-reports/*.xml').length > 0 } }
steps { steps {
junit '**/target/surefire-reports/*.xml' junit '**/target/surefire-reports/*.xml'
jacoco exclusionPattern: '**/*{Test|IT|Main|Application|Immutable}.class' jacoco exclusionPattern: '**/*{Test|IT|Main|Application|Immutable}.class'
withMaven(maven: 'maven 3.5.2', jdk: 'JDK 1.8') { withMaven(maven: 'maven', jdk: 'JDK LTS') {
sh "${mvn} com.gavinmogan:codacy-maven-plugin:coverage " + sh "${mvn} com.gavinmogan:codacy-maven-plugin:coverage " +
"-DcoverageReportFile=target/site/jacoco/jacoco.xml " + "-DcoverageReportFile=target/site/jacoco/jacoco.xml " +
"-DprojectToken=`$JENKINS_HOME/codacy/token` " + "-DprojectToken=`$JENKINS_HOME/codacy/token` " +
@ -55,14 +70,15 @@ pipeline {
} }
} }
stage('Archiving') { stage('Archiving') {
when { expression { findFiles(glob: '**/target/*.jar').length > 0 } }
steps { steps {
archiveArtifacts '**/target/*.jar' archiveArtifacts '**/target/*.jar'
} }
} }
stage('Deploy') { stage('Deploy') {
when { expression { (env.GIT_BRANCH == 'master') } } when { expression { (env.GIT_BRANCH == 'master' && env.GIT_URL.startsWith('https://')) } }
steps { steps {
withMaven(maven: 'maven 3.5.2', jdk: 'JDK 1.8') { withMaven(maven: 'maven', jdk: 'JDK LTS') {
sh "${mvn} deploy --activate-profiles release -DskipTests=true" sh "${mvn} deploy --activate-profiles release -DskipTests=true"
} }
} }

View file

@ -59,7 +59,7 @@ if (isTrue() && isAlsoTrue()) {
[[source,java]] [[source,java]]
---- ----
Condition.where(isTrue()) Condition.where(isTrue())
.and(isAlsoTrue()) .and(() -> isAlsoTrue())
.then(() -> doSomething()) .then(() -> doSomething())
.otherwise(() -> doSomethingElse()); .otherwise(() -> doSomethingElse());
---- ----
@ -78,7 +78,7 @@ if (isTrue() || alternativeIsTrue()) {
[[source,java]] [[source,java]]
---- ----
Condition.where(isTrue()) Condition.where(isTrue())
.or(alternativeIsTrue()) .or(() -> alternativeIsTrue())
.then(() -> doSomething()) .then(() -> doSomething())
.otherwise(() -> doSomethingElse()); .otherwise(() -> doSomethingElse());
---- ----
@ -115,7 +115,7 @@ if (isTrue() || !isFalse()) {
[[source,java]] [[source,java]]
---- ----
Condition.where(isTrue()) Condition.where(isTrue())
.andNot(isFalse()) .andNot(() -> isFalse())
.then(() -> doSomething()) .then(() -> doSomething())
.otherwise(() -> doSomethingElse()); .otherwise(() -> doSomethingElse());
---- ----
@ -134,7 +134,7 @@ if (isFalse() || !isAlsoFalse()) {
[[source,java]] [[source,java]]
---- ----
Condition.where(isFalse()) Condition.where(isFalse())
.orNot(isAlsoFalse()) .orNot(() -> isAlsoFalse())
.then(() -> doSomething()) .then(() -> doSomething())
.otherwise(() -> doSomethingElse()); .otherwise(() -> doSomethingElse());
---- ----
@ -154,7 +154,7 @@ if (isFalse()) {
---- ----
Condition.where(isFalse()) Condition.where(isFalse())
.then(() -> doSomething()) .then(() -> doSomething())
.otherwise(isTrue()) .otherwise(() -> isTrue())
.then(() -> doSomethingElse()); .then(() -> doSomethingElse());
---- ----
@ -174,7 +174,7 @@ if (isTrue()) {
---- ----
Condition.where(isTrue()) Condition.where(isTrue())
.then(() -> doSomething()) .then(() -> doSomething())
.and(isAlsoTrue()) .and(() -> isAlsoTrue())
.then(() -> doSomethingElse()); .then(() -> doSomethingElse());
---- ----
@ -213,7 +213,8 @@ final Optional<String> result = Value.where(isTrue(), () -> TRUE);
[[source,java]] [[source,java]]
---- ----
final String result = Value.<String>where(isTrue()).then(() -> TRUE) final String result = Value.<String>where(isTrue())
.then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
---- ----
@ -231,7 +232,8 @@ if (!isTrue()) {
[[source,java]] [[source,java]]
---- ----
final String result = Value.<String>whereNot(isTrue()).then(() -> TRUE) final String result = Value.<String>whereNot(isTrue())
.then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
---- ----
@ -249,7 +251,8 @@ if (isTrue() && alternativeIsTrue()) {
[[source,java]] [[source,java]]
---- ----
final String result = Value.<String>where(isTrue()).and(alternativeIsTrue()) final String result = Value.<String>where(isTrue())
.and(() -> alternativeIsTrue())
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
---- ----
@ -268,7 +271,8 @@ if (isTrue() && !alternativeIsFalse()) {
[[source,java]] [[source,java]]
---- ----
final String result = Value.<String>where(isTrue()).andNot(alternativeIsFalse()) final String result = Value.<String>where(isTrue())
.andNot(() -> alternativeIsFalse())
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
---- ----
@ -287,7 +291,8 @@ if (isTrue() || alternativeIsTrue()) {
[[source,java]] [[source,java]]
---- ----
final String result = Value.<String>where(isTrue()).or(alternativeIsTrue()) final String result = Value.<String>where(isTrue())
.or(() -> alternativeIsTrue())
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
---- ----
@ -306,7 +311,27 @@ if (isTrue() || !isFalse()) {
[[source,java]] [[source,java]]
---- ----
final String result = Value.<String>where(isTrue()).orNot(isFalse()) final String result = Value.<String>where(isTrue())
.orNot(() -> isFalse())
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
---- ----
### if-then
[[source,java]]
-----
Optional<String> result;
if (isTrue()) {
result = Optional.of(TRUE);
} else {
result = Optional.empty();
}
-----
[[source,java]]
-----
final Optional<String> result = Value.<String>where(isTrue())
.then(() -> TRUE)
.optional();
-----

View file

@ -16,9 +16,7 @@
<assertj.version>3.9.1</assertj.version> <assertj.version>3.9.1</assertj.version>
<coveralls-maven-plugin.version>4.3.0</coveralls-maven-plugin.version> <coveralls-maven-plugin.version>4.3.0</coveralls-maven-plugin.version>
<tiles-maven-plugin.version>2.10</tiles-maven-plugin.version> <tiles-maven-plugin.version>2.10</tiles-maven-plugin.version>
<kemitix-tiles.version>0.7.1</kemitix-tiles.version> <kemitix-tiles.version>0.8.1</kemitix-tiles.version>
<maven-surefire-plugin.version>2.20.1</maven-surefire-plugin.version>
<maven-failsafe-plugin.version>2.20.1</maven-failsafe-plugin.version>
<lombok.version>1.16.20</lombok.version> <lombok.version>1.16.20</lombok.version>
</properties> </properties>

View file

@ -21,6 +21,8 @@
package net.kemitix.conditional; package net.kemitix.conditional;
import java.util.function.Supplier;
/** /**
* If-then-else in a functional-style. * If-then-else in a functional-style.
* *
@ -35,9 +37,11 @@ public interface Condition {
* *
* @return the Condition * @return the Condition
*/ */
@SuppressWarnings("avoidinlineconditionals")
static Condition where(final boolean clause) { 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 * @return the Condition
*/ */
Condition and(boolean clause); Condition and(Supplier<Boolean> clause);
/** /**
* Logically AND combine the current {@code Condition} with boolean opposite of the clause. * Logically AND combine the current {@code Condition} with boolean opposite of the clause.
@ -67,8 +71,8 @@ public interface Condition {
* *
* @return the Condition * @return the Condition
*/ */
default Condition andNot(final boolean clause) { default Condition andNot(final Supplier<Boolean> clause) {
return and(!clause); return and(() -> !clause.get());
} }
/** /**
@ -79,7 +83,7 @@ public interface Condition {
* @return the Condition * @return the Condition
*/ */
@SuppressWarnings("PMD.ShortMethodName") @SuppressWarnings("PMD.ShortMethodName")
Condition or(boolean clause); Condition or(Supplier<Boolean> clause);
/** /**
* Logically OR combine the current {@code Condition} with the boolean opposite of the clause. * Logically OR combine the current {@code Condition} with the boolean opposite of the clause.
@ -88,8 +92,8 @@ public interface Condition {
* *
* @return the Condition * @return the Condition
*/ */
default Condition orNot(final boolean clause) { default Condition orNot(final Supplier<Boolean> clause) {
return or(!clause); return or(() -> !clause.get());
} }
/** /**
@ -115,8 +119,8 @@ public interface Condition {
* *
* @return the Condition * @return the Condition
*/ */
default Condition otherwise(final boolean clause) { default Condition otherwise(final Supplier<Boolean> clause) {
return where(clause); return where(clause.get());
} }
} }

View file

@ -21,6 +21,8 @@
package net.kemitix.conditional; package net.kemitix.conditional;
import java.util.function.Supplier;
/** /**
* A {@code Condition} that has evaluated to {@code false}. * A {@code Condition} that has evaluated to {@code false}.
* *
@ -31,14 +33,14 @@ final class FalseCondition implements Condition {
public static final Condition FALSE = new net.kemitix.conditional.FalseCondition(); public static final Condition FALSE = new net.kemitix.conditional.FalseCondition();
@Override @Override
public Condition and(final boolean clause) { public Condition and(final Supplier<Boolean> clause) {
return FALSE; return FALSE;
} }
@Override @Override
@SuppressWarnings("PMD.ShortMethodName") @SuppressWarnings("PMD.ShortMethodName")
public Condition or(final boolean secondClause) { public Condition or(final Supplier<Boolean> secondClause) {
return Condition.where(secondClause); return Condition.where(secondClause.get());
} }
@Override @Override

View file

@ -21,6 +21,7 @@
package net.kemitix.conditional; package net.kemitix.conditional;
import java.util.Optional;
import java.util.function.Supplier; import java.util.function.Supplier;
/** /**
@ -32,34 +33,41 @@ import java.util.function.Supplier;
*/ */
class FalseValueClause<T> implements Value.ValueClause<T> { class FalseValueClause<T> implements Value.ValueClause<T> {
protected static final Value.ValueClause FALSE = new FalseValueClause(); protected static final Value.ValueClause<?> FALSE = new FalseValueClause<>();
@Override @Override
public ValueSupplier<T> then(final Supplier<T> trueSupplier) { public ValueSupplier<T> then(final Supplier<T> trueSupplier) {
return new FalseValueSupplier(); return new FalseValueSupplier<>();
} }
@Override @Override
public Value.ValueClause<T> and(final boolean clause) { public Value.ValueClause<T> and(final Supplier<Boolean> clause) {
return this; return this;
} }
@Override @Override
@SuppressWarnings("PMD.ShortMethodName") @SuppressWarnings("PMD.ShortMethodName")
public Value.ValueClause<T> or(final boolean clause) { public Value.ValueClause<T> or(final Supplier<Boolean> clause) {
return Value.where(clause); return Value.where(clause.get());
} }
/** /**
* An intermediate result of the {@link Value} where the clause has evaluated to false. * An intermediate result of the {@link Value} where the clause has evaluated to false.
*
* @param <T> the type of the value
*/ */
private class FalseValueSupplier implements ValueSupplier<T> { private static final class FalseValueSupplier<T> implements ValueSupplier<T> {
@Override @Override
public T otherwise(final Supplier<T> falseSupplier) { public T otherwise(final Supplier<T> falseSupplier) {
return falseSupplier.get(); return falseSupplier.get();
} }
@Override
public Optional<T> optional() {
return Optional.empty();
}
} }
} }

View file

@ -21,6 +21,8 @@
package net.kemitix.conditional; package net.kemitix.conditional;
import java.util.function.Supplier;
/** /**
* A {@code Condition} that has evaluated to {@code true}. * A {@code Condition} that has evaluated to {@code true}.
* *
@ -31,13 +33,13 @@ final class TrueCondition implements Condition {
public static final Condition TRUE = new net.kemitix.conditional.TrueCondition(); public static final Condition TRUE = new net.kemitix.conditional.TrueCondition();
@Override @Override
public Condition and(final boolean clause) { public Condition and(final Supplier<Boolean> clause) {
return Condition.where(clause); return Condition.where(clause.get());
} }
@Override @Override
@SuppressWarnings("PMD.ShortMethodName") @SuppressWarnings("PMD.ShortMethodName")
public Condition or(final boolean secondClause) { public Condition or(final Supplier<Boolean> secondClause) {
return TRUE; return TRUE;
} }

View file

@ -23,6 +23,7 @@ package net.kemitix.conditional;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import java.util.Optional;
import java.util.function.Supplier; import java.util.function.Supplier;
/** /**
@ -34,37 +35,45 @@ import java.util.function.Supplier;
*/ */
class TrueValueClause<T> implements Value.ValueClause<T> { class TrueValueClause<T> implements Value.ValueClause<T> {
protected static final Value.ValueClause TRUE = new TrueValueClause(); protected static final Value.ValueClause<?> TRUE = new TrueValueClause<>();
@Override @Override
public ValueSupplier<T> then(final Supplier<T> trueSupplier) { public ValueSupplier<T> then(final Supplier<T> trueSupplier) {
return new TrueValueSupplier(trueSupplier); return new TrueValueSupplier<>(trueSupplier);
} }
@Override @Override
public Value.ValueClause<T> and(final boolean clause) { public Value.ValueClause<T> and(final Supplier<Boolean> clause) {
return Value.where(clause); return Value.where(clause.get());
} }
@Override @Override
@SuppressWarnings("PMD.ShortMethodName") @SuppressWarnings("PMD.ShortMethodName")
public Value.ValueClause<T> or(final boolean clause) { public Value.ValueClause<T> or(final Supplier<Boolean> clause) {
return this; return this;
} }
/** /**
* An intermediate result of the {@link Value} where the clause has evaluated to true. * An intermediate result of the {@link Value} where the clause has evaluated to true.
*
* @param <T> the type of the value
*/ */
@RequiredArgsConstructor @RequiredArgsConstructor
private class TrueValueSupplier implements ValueSupplier<T> { private static final class TrueValueSupplier<T> implements ValueSupplier<T> {
private final transient Supplier<T> valueSupplier; @SuppressWarnings("PMD.BeanMembersShouldSerialize")
private final Supplier<T> valueSupplier;
@Override @Override
public T otherwise(final Supplier<T> falseSupplier) { public T otherwise(final Supplier<T> falseSupplier) {
return valueSupplier.get(); return valueSupplier.get();
} }
@Override
public Optional<T> optional() {
return Optional.ofNullable(valueSupplier.get());
}
} }
} }

View file

@ -43,9 +43,9 @@ public interface Value {
*/ */
@SuppressWarnings("PMD.LawOfDemeter") @SuppressWarnings("PMD.LawOfDemeter")
static <T> T where( static <T> T where(
boolean clause, final boolean clause,
Supplier<T> trueSupplier, final Supplier<T> trueSupplier,
Supplier<T> falseSupplier final Supplier<T> falseSupplier
) { ) {
return Value.<T>where(clause).then(trueSupplier) return Value.<T>where(clause).then(trueSupplier)
.otherwise(falseSupplier); .otherwise(falseSupplier);
@ -61,8 +61,8 @@ public interface Value {
* @return an Optional either containing the value from the trueSupplier or empty * @return an Optional either containing the value from the trueSupplier or empty
*/ */
static <T> Optional<T> where( static <T> Optional<T> where(
boolean clause, final boolean clause,
Supplier<T> trueSupplier final Supplier<T> trueSupplier
) { ) {
return Optional.ofNullable(Value.where(clause, trueSupplier, () -> null)); return Optional.ofNullable(Value.where(clause, trueSupplier, () -> null));
} }
@ -75,9 +75,12 @@ public interface Value {
* *
* @return a true or false value clause * @return a true or false value clause
*/ */
@SuppressWarnings({"unchecked", "avoidinlineconditionals"}) @SuppressWarnings("unchecked")
static <T> ValueClause<T> where(final boolean clause) { static <T> ValueClause<T> where(final boolean clause) {
return (ValueClause<T>) (clause ? TrueValueClause.TRUE : FalseValueClause.FALSE); if (clause) {
return (ValueClause<T>) TrueValueClause.TRUE;
}
return (ValueClause<T>) FalseValueClause.FALSE;
} }
/** /**
@ -88,7 +91,7 @@ public interface Value {
* *
* @return a true or false value clause * @return a true or false value clause
*/ */
static <T> ValueClause<T> whereNot(boolean clause) { static <T> ValueClause<T> whereNot(final boolean clause) {
return where(!clause); return where(!clause);
} }
@ -115,7 +118,7 @@ public interface Value {
* *
* @return a true or false value clause * @return a true or false value clause
*/ */
ValueClause<T> and(boolean clause); ValueClause<T> and(Supplier<Boolean> clause);
/** /**
* Logically OR combine the current {@link ValueClause} with clause. * Logically OR combine the current {@link ValueClause} with clause.
@ -125,7 +128,7 @@ public interface Value {
* @return a true or false value clause * @return a true or false value clause
*/ */
@SuppressWarnings("PMD.ShortMethodName") @SuppressWarnings("PMD.ShortMethodName")
ValueClause<T> or(boolean clause); ValueClause<T> or(Supplier<Boolean> clause);
/** /**
* Logically AND combine the current {@link ValueClause} with boolean opposite of the clause. * Logically AND combine the current {@link ValueClause} with boolean opposite of the clause.
@ -134,8 +137,8 @@ public interface Value {
* *
* @return a true or false value clause * @return a true or false value clause
*/ */
default ValueClause<T> andNot(final boolean clause) { default ValueClause<T> andNot(final Supplier<Boolean> clause) {
return and(!clause); return and(() -> !clause.get());
} }
/** /**
@ -145,8 +148,8 @@ public interface Value {
* *
* @return a true or false value clause * @return a true or false value clause
*/ */
default ValueClause<T> orNot(boolean clause) { default ValueClause<T> orNot(final Supplier<Boolean> clause) {
return or(!clause); return or(() -> !clause.get());
} }
/** /**
@ -165,6 +168,12 @@ public interface Value {
*/ */
T otherwise(Supplier<T> falseSupplier); T otherwise(Supplier<T> 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<T> optional();
} }
} }

View file

@ -3,6 +3,8 @@ package net.kemitix.conditional;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import java.util.concurrent.atomic.AtomicInteger;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
/** /**
@ -77,7 +79,7 @@ public class ConditionalTest {
//when //when
Condition.where(true) Condition.where(true)
.then(thenResponse) .then(thenResponse)
.and(true) .and(() -> true)
.then(otherwiseResponse); .then(otherwiseResponse);
//then //then
assertThatBothResponsesRun(); assertThatBothResponsesRun();
@ -138,7 +140,7 @@ public class ConditionalTest {
public void whereTrueAndNotFalseThenRuns() { public void whereTrueAndNotFalseThenRuns() {
//when //when
Condition.where(true) Condition.where(true)
.andNot(false) .andNot(() -> false)
.then(thenResponse); .then(thenResponse);
//then //then
assertThatTheThenResponseRuns(); assertThatTheThenResponseRuns();
@ -148,7 +150,7 @@ public class ConditionalTest {
public void whereTrueAndNotTrueThenOtherwiseRuns() { public void whereTrueAndNotTrueThenOtherwiseRuns() {
//when //when
Condition.where(true) Condition.where(true)
.andNot(true) .andNot(() -> true)
.then(thenResponse) .then(thenResponse)
.otherwise(otherwiseResponse); .otherwise(otherwiseResponse);
//then //then
@ -159,7 +161,7 @@ public class ConditionalTest {
public void whereFalseOrNotFalseThenRuns() { public void whereFalseOrNotFalseThenRuns() {
//when //when
Condition.where(false) Condition.where(false)
.orNot(false) .orNot(() -> false)
.then(thenResponse); .then(thenResponse);
//then //then
assertThatTheThenResponseRuns(); assertThatTheThenResponseRuns();
@ -169,7 +171,7 @@ public class ConditionalTest {
public void whereFalseOrNotTrueThenOtherwiseRuns() { public void whereFalseOrNotTrueThenOtherwiseRuns() {
//when //when
Condition.where(false) Condition.where(false)
.orNot(true) .orNot(() -> true)
.then(thenResponse) .then(thenResponse)
.otherwise(otherwiseResponse); .otherwise(otherwiseResponse);
//then //then
@ -181,7 +183,7 @@ public class ConditionalTest {
//when //when
Condition.where(false) Condition.where(false)
.then(thenResponse) .then(thenResponse)
.otherwise(true) .otherwise(() -> true)
.then(otherwiseResponse); .then(otherwiseResponse);
//then //then
assertThatTheOtherwiseResponseRuns(); assertThatTheOtherwiseResponseRuns();
@ -192,7 +194,7 @@ public class ConditionalTest {
//when //when
Condition.where(false) Condition.where(false)
.then(thenResponse) .then(thenResponse)
.otherwise(false) .otherwise(() -> false)
.then(otherwiseResponse); .then(otherwiseResponse);
//then //then
assertThatNoResponseRuns(); assertThatNoResponseRuns();
@ -269,7 +271,7 @@ public class ConditionalTest {
final boolean secondClause final boolean secondClause
) { ) {
Condition.where(firstClause) Condition.where(firstClause)
.and(secondClause) .and(() -> secondClause)
.then(thenResponse) .then(thenResponse)
.otherwise(otherwiseResponse); .otherwise(otherwiseResponse);
} }
@ -279,8 +281,34 @@ public class ConditionalTest {
final boolean secondClause final boolean secondClause
) { ) {
Condition.where(firstClause) Condition.where(firstClause)
.or(secondClause) .or(() -> secondClause)
.then(thenResponse) .then(thenResponse)
.otherwise(otherwiseResponse); .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);
}
} }

View file

@ -4,6 +4,7 @@ import lombok.val;
import org.junit.Test; import org.junit.Test;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
@ -69,7 +70,7 @@ public class ValueTest {
@Test @Test
public void valueWhereTrueAndTrueIsTrue() { public void valueWhereTrueAndTrueIsTrue() {
//when //when
val result = Value.<String>where(true).and(true) val result = Value.<String>where(true).and(() -> true)
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
//then //then
@ -79,7 +80,7 @@ public class ValueTest {
@Test @Test
public void valueWhereTrueAndFalseIsFalse() { public void valueWhereTrueAndFalseIsFalse() {
//when //when
val result = Value.<String>where(true).and(false) val result = Value.<String>where(true).and(() -> false)
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
//then //then
@ -89,7 +90,7 @@ public class ValueTest {
@Test @Test
public void valueWhereFalseAndTrueIsFalse() { public void valueWhereFalseAndTrueIsFalse() {
//when //when
val result = Value.<String>where(false).and(true) val result = Value.<String>where(false).and(() -> true)
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
//then //then
@ -99,7 +100,7 @@ public class ValueTest {
@Test @Test
public void valueWhereFalseAndFalseIsFalse() { public void valueWhereFalseAndFalseIsFalse() {
//when //when
val result = Value.<String>where(false).and(false) val result = Value.<String>where(false).and(() -> false)
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
//then //then
@ -109,7 +110,7 @@ public class ValueTest {
@Test @Test
public void valueWhereTrueOrTrueIsTrue() { public void valueWhereTrueOrTrueIsTrue() {
//when //when
val result = Value.<String>where(true).or(true) val result = Value.<String>where(true).or(() -> true)
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
//then //then
@ -119,7 +120,7 @@ public class ValueTest {
@Test @Test
public void valueWhereTrueOrFalseIsTrue() { public void valueWhereTrueOrFalseIsTrue() {
//when //when
val result = Value.<String>where(true).or(false) val result = Value.<String>where(true).or(() -> false)
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
//then //then
@ -129,7 +130,7 @@ public class ValueTest {
@Test @Test
public void valueWhereFalseOrTrueIsTrue() { public void valueWhereFalseOrTrueIsTrue() {
//when //when
val result = Value.<String>where(false).or(true) val result = Value.<String>where(false).or(() -> true)
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
//then //then
@ -139,7 +140,7 @@ public class ValueTest {
@Test @Test
public void valueWhereFalseOrFalseIsFalse() { public void valueWhereFalseOrFalseIsFalse() {
//when //when
val result = Value.<String>where(false).or(false) val result = Value.<String>where(false).or(() -> false)
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
//then //then
@ -167,7 +168,7 @@ public class ValueTest {
@Test @Test
public void valueWhereTrueAndNotTrueIsFalse() { public void valueWhereTrueAndNotTrueIsFalse() {
//when //when
val result = Value.<String>where(true).andNot(true) val result = Value.<String>where(true).andNot(() -> true)
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
//then //then
@ -177,7 +178,7 @@ public class ValueTest {
@Test @Test
public void valueWhereTrueAndNotFalseIsTrue() { public void valueWhereTrueAndNotFalseIsTrue() {
//when //when
val result = Value.<String>where(true).andNot(false) val result = Value.<String>where(true).andNot(() -> false)
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
//then //then
@ -187,7 +188,7 @@ public class ValueTest {
@Test @Test
public void valueWhereFalseAndNotTrueIsFalse() { public void valueWhereFalseAndNotTrueIsFalse() {
//when //when
val result = Value.<String>where(false).andNot(true) val result = Value.<String>where(false).andNot(() -> true)
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
//then //then
@ -197,7 +198,7 @@ public class ValueTest {
@Test @Test
public void valueWhereFalseAndNotFalseIsFalse() { public void valueWhereFalseAndNotFalseIsFalse() {
//when //when
val result = Value.<String>where(false).andNot(false) val result = Value.<String>where(false).andNot(() -> false)
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
//then //then
@ -207,7 +208,7 @@ public class ValueTest {
@Test @Test
public void valueWhereTrueOrNotTrueIsTrue() { public void valueWhereTrueOrNotTrueIsTrue() {
//when //when
val result = Value.<String>where(true).orNot(true) val result = Value.<String>where(true).orNot(() -> true)
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
//then //then
@ -217,7 +218,7 @@ public class ValueTest {
@Test @Test
public void valueWhereTrueOrNotFalseIsTrue() { public void valueWhereTrueOrNotFalseIsTrue() {
//when //when
val result = Value.<String>where(true).orNot(false) val result = Value.<String>where(true).orNot(() -> false)
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
//then //then
@ -227,7 +228,7 @@ public class ValueTest {
@Test @Test
public void valueWhereFalseOrNotTrueIsFalse() { public void valueWhereFalseOrNotTrueIsFalse() {
//when //when
val result = Value.<String>where(false).orNot(true) val result = Value.<String>where(false).orNot(() -> true)
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
//then //then
@ -237,10 +238,54 @@ public class ValueTest {
@Test @Test
public void valueWhereFalseOrNotFalseIsTrue() { public void valueWhereFalseOrNotFalseIsTrue() {
//when //when
val result = Value.<String>where(false).orNot(false) val result = Value.<String>where(false).orNot(() -> false)
.then(() -> TRUE) .then(() -> TRUE)
.otherwise(() -> FALSE); .otherwise(() -> FALSE);
//then //then
assertThat(result).isEqualTo(TRUE); assertThat(result).isEqualTo(TRUE);
} }
@Test
public void valueWhereTrueThenIsNotEmpty() {
//given
final Optional<Object> result = Value.where(true).then(() -> "value").optional();
//then
assertThat(result).contains("value");
}
@Test
public void valueWhereFalseThenIsEmpty() {
//given
final Optional<Object> result = Value.where(false).then(() -> "value").optional();
//when
assertThat(result).isEmpty();
}
@Test
public void shortCurcuitOr() {
//given
final AtomicInteger atomicInteger = new AtomicInteger();
//when
final Optional<String> result = Value.<String>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<String> result = Value.<String>where(false)
.and(() -> atomicInteger.compareAndSet(0, 2))
.then(() -> "Pass")
.optional();
//then
assertThat(result).isEmpty();
assertThat(atomicInteger).hasValue(0);
}
} }