commit
a9bdd03904
17 changed files with 463 additions and 201 deletions
|
@ -5,7 +5,7 @@ cache:
|
||||||
directories:
|
directories:
|
||||||
- "$HOME/.m2"
|
- "$HOME/.m2"
|
||||||
install: true
|
install: true
|
||||||
script: "./mvnw clean install"
|
script: "./mvnw -B -U clean install"
|
||||||
after_success:
|
after_success:
|
||||||
- sh .travis-support/coveralls.sh
|
- sh .travis-support/coveralls.sh
|
||||||
- bash <(curl -s https://codecov.io/bash)
|
- bash <(curl -s https://codecov.io/bash)
|
||||||
|
|
|
@ -1,6 +1,12 @@
|
||||||
CHANGELOG
|
CHANGELOG
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
0.4.0
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Building with Jenkins
|
||||||
|
* Upgrade `kemitix-parent` to 5.0.3
|
||||||
|
|
||||||
0.3.0
|
0.3.0
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
|
87
Jenkinsfile.groovy
Normal file
87
Jenkinsfile.groovy
Normal file
|
@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
69
README.adoc
69
README.adoc
|
@ -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,8 +213,9 @@ 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())
|
||||||
.otherwise(() -> FALSE);
|
.then(() -> TRUE)
|
||||||
|
.otherwise(() -> FALSE);
|
||||||
----
|
----
|
||||||
|
|
||||||
### if-not-then-else
|
### if-not-then-else
|
||||||
|
@ -231,8 +232,9 @@ if (!isTrue()) {
|
||||||
|
|
||||||
[[source,java]]
|
[[source,java]]
|
||||||
----
|
----
|
||||||
final String result = Value.<String>whereNot(isTrue()).then(() -> TRUE)
|
final String result = Value.<String>whereNot(isTrue())
|
||||||
.otherwise(() -> FALSE);
|
.then(() -> TRUE)
|
||||||
|
.otherwise(() -> FALSE);
|
||||||
----
|
----
|
||||||
|
|
||||||
### if-and-then-else
|
### if-and-then-else
|
||||||
|
@ -249,9 +251,10 @@ if (isTrue() && alternativeIsTrue()) {
|
||||||
|
|
||||||
[[source,java]]
|
[[source,java]]
|
||||||
----
|
----
|
||||||
final String result = Value.<String>where(isTrue()).and(alternativeIsTrue())
|
final String result = Value.<String>where(isTrue())
|
||||||
.then(() -> TRUE)
|
.and(() -> alternativeIsTrue())
|
||||||
.otherwise(() -> FALSE);
|
.then(() -> TRUE)
|
||||||
|
.otherwise(() -> FALSE);
|
||||||
----
|
----
|
||||||
|
|
||||||
### if-and-not-then-else
|
### if-and-not-then-else
|
||||||
|
@ -268,9 +271,10 @@ if (isTrue() && !alternativeIsFalse()) {
|
||||||
|
|
||||||
[[source,java]]
|
[[source,java]]
|
||||||
----
|
----
|
||||||
final String result = Value.<String>where(isTrue()).andNot(alternativeIsFalse())
|
final String result = Value.<String>where(isTrue())
|
||||||
.then(() -> TRUE)
|
.andNot(() -> alternativeIsFalse())
|
||||||
.otherwise(() -> FALSE);
|
.then(() -> TRUE)
|
||||||
|
.otherwise(() -> FALSE);
|
||||||
----
|
----
|
||||||
|
|
||||||
### if-or-then-else
|
### if-or-then-else
|
||||||
|
@ -287,9 +291,10 @@ if (isTrue() || alternativeIsTrue()) {
|
||||||
|
|
||||||
[[source,java]]
|
[[source,java]]
|
||||||
----
|
----
|
||||||
final String result = Value.<String>where(isTrue()).or(alternativeIsTrue())
|
final String result = Value.<String>where(isTrue())
|
||||||
.then(() -> TRUE)
|
.or(() -> alternativeIsTrue())
|
||||||
.otherwise(() -> FALSE);
|
.then(() -> TRUE)
|
||||||
|
.otherwise(() -> FALSE);
|
||||||
----
|
----
|
||||||
|
|
||||||
### if-or-not-then-else
|
### if-or-not-then-else
|
||||||
|
@ -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())
|
||||||
.then(() -> TRUE)
|
.orNot(() -> isFalse())
|
||||||
.otherwise(() -> FALSE);
|
.then(() -> TRUE)
|
||||||
|
.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();
|
||||||
|
-----
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
test:
|
|
||||||
override:
|
|
||||||
- ./mvnw clean install
|
|
1
lombok.config
Normal file
1
lombok.config
Normal file
|
@ -0,0 +1 @@
|
||||||
|
lombok.addGeneratedAnnotation=false
|
48
pom.xml
48
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">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<properties>
|
<properties>
|
||||||
<kemitix-checkstyle-ruleset.version>3.2.0</kemitix-checkstyle-ruleset.version>
|
<java.version>1.8</java.version>
|
||||||
<kemitix-checkstyle-ruleset.level>5-complexity</kemitix-checkstyle-ruleset.level>
|
<kemitix-checkstyle.version>4.0.1</kemitix-checkstyle.version>
|
||||||
|
<kemitix.checkstyle.ruleset.level>5-complexity</kemitix.checkstyle.ruleset.level>
|
||||||
<jacoco-class-line-covered-ratio>1</jacoco-class-line-covered-ratio>
|
<jacoco-class-line-covered-ratio>1</jacoco-class-line-covered-ratio>
|
||||||
<jacoco-class-instruction-covered-ratio>1</jacoco-class-instruction-covered-ratio>
|
<jacoco-class-instruction-covered-ratio>1</jacoco-class-instruction-covered-ratio>
|
||||||
<jacoco-class-missed-count-maximum>0</jacoco-class-missed-count-maximum>
|
<jacoco-class-missed-count-maximum>0</jacoco-class-missed-count-maximum>
|
||||||
<pitest.coverage>100</pitest.coverage>
|
<pitest.coverage>100</pitest.coverage>
|
||||||
<pitest.mutation>100</pitest.mutation>
|
<pitest.mutation>100</pitest.mutation>
|
||||||
<junit.version>4.12</junit.version>
|
<junit.version>4.12</junit.version>
|
||||||
<assertj.version>3.8.0</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>
|
||||||
|
<kemitix-tiles.version>0.8.1</kemitix-tiles.version>
|
||||||
|
<lombok.version>1.16.20</lombok.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>net.kemitix</groupId>
|
<groupId>net.kemitix</groupId>
|
||||||
<artifactId>kemitix-parent</artifactId>
|
<artifactId>kemitix-parent</artifactId>
|
||||||
<version>3.2.0</version>
|
<version>5.1.0</version>
|
||||||
<relativePath/>
|
<relativePath/>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>conditional</artifactId>
|
<artifactId>conditional</artifactId>
|
||||||
<version>0.3.0</version>
|
<version>0.4.0</version>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>${lombok.version}</version>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>junit</groupId>
|
<groupId>junit</groupId>
|
||||||
<artifactId>junit</artifactId>
|
<artifactId>junit</artifactId>
|
||||||
|
@ -43,25 +53,17 @@
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>net.kemitix</groupId>
|
<groupId>io.repaint.maven</groupId>
|
||||||
<artifactId>kemitix-checkstyle-ruleset-maven-plugin</artifactId>
|
<artifactId>tiles-maven-plugin</artifactId>
|
||||||
<version>${kemitix-checkstyle-ruleset.version}</version>
|
<version>${tiles-maven-plugin.version}</version>
|
||||||
|
<extensions>true</extensions>
|
||||||
<configuration>
|
<configuration>
|
||||||
<level>${kemitix-checkstyle-ruleset.level}</level>
|
<tiles>
|
||||||
|
<tile>net.kemitix.tiles:all:${kemitix-tiles.version}</tile>
|
||||||
|
<tile>net.kemitix.tiles:pmd-strict:${kemitix-tiles.version}</tile>
|
||||||
|
<tile>net.kemitix.checkstyle:tile:${kemitix-checkstyle.version}</tile>
|
||||||
|
</tiles>
|
||||||
</configuration>
|
</configuration>
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<phase>validate</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>check</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.eluder.coveralls</groupId>
|
|
||||||
<artifactId>coveralls-maven-plugin</artifactId>
|
|
||||||
<version>${coveralls-maven-plugin.version}</version>
|
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
36
src/main/java/net/kemitix/conditional/Action.java
Normal file
36
src/main/java/net/kemitix/conditional/Action.java
Normal file
|
@ -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();
|
||||||
|
}
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -78,7 +82,8 @@ public interface Condition {
|
||||||
*
|
*
|
||||||
* @return the Condition
|
* @return the Condition
|
||||||
*/
|
*/
|
||||||
Condition or(boolean clause);
|
@SuppressWarnings("PMD.ShortMethodName")
|
||||||
|
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.
|
||||||
|
@ -87,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());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -98,14 +103,14 @@ public interface Condition {
|
||||||
*
|
*
|
||||||
* @return the Condition
|
* @return the Condition
|
||||||
*/
|
*/
|
||||||
Condition then(Runnable response);
|
Condition then(Action response);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Perform this response if the {@code Condition} is {@code false}.
|
* Perform this response if the {@code Condition} is {@code false}.
|
||||||
*
|
*
|
||||||
* @param response the response to perform
|
* @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}.
|
* 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
|
* @return the Condition
|
||||||
*/
|
*/
|
||||||
default Condition otherwise(final boolean clause) {
|
default Condition otherwise(final Supplier<Boolean> clause) {
|
||||||
return where(clause);
|
return where(clause.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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}.
|
||||||
*
|
*
|
||||||
|
@ -28,26 +30,27 @@ package net.kemitix.conditional;
|
||||||
*/
|
*/
|
||||||
final class FalseCondition implements Condition {
|
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
|
@Override
|
||||||
public Condition and(final boolean clause) {
|
public Condition and(final Supplier<Boolean> clause) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Condition or(final boolean secondClause) {
|
@SuppressWarnings("PMD.ShortMethodName")
|
||||||
return Condition.where(secondClause);
|
public Condition or(final Supplier<Boolean> secondClause) {
|
||||||
|
return Condition.where(secondClause.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Condition then(final Runnable response) {
|
public Condition then(final Action response) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void otherwise(final Runnable response) {
|
public void otherwise(final Action response) {
|
||||||
response.run();
|
response.perform();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,33 +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
|
||||||
public Value.ValueClause<T> or(final boolean clause) {
|
@SuppressWarnings("PMD.ShortMethodName")
|
||||||
return Value.where(clause);
|
public Value.ValueClause<T> or(final Supplier<Boolean> 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();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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}.
|
||||||
*
|
*
|
||||||
|
@ -28,26 +30,27 @@ package net.kemitix.conditional;
|
||||||
*/
|
*/
|
||||||
final class TrueCondition implements Condition {
|
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
|
@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
|
||||||
public Condition or(final boolean secondClause) {
|
@SuppressWarnings("PMD.ShortMethodName")
|
||||||
|
public Condition or(final Supplier<Boolean> secondClause) {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Condition then(final Runnable response) {
|
public Condition then(final Action response) {
|
||||||
response.run();
|
response.perform();
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void otherwise(final Runnable response) {
|
public void otherwise(final Action response) {
|
||||||
// do nothing
|
// do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,29 +35,33 @@ 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
|
||||||
public Value.ValueClause<T> or(final boolean clause) {
|
@SuppressWarnings("PMD.ShortMethodName")
|
||||||
|
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> {
|
||||||
|
|
||||||
|
@SuppressWarnings("PMD.BeanMembersShouldSerialize")
|
||||||
private final Supplier<T> valueSupplier;
|
private final Supplier<T> valueSupplier;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -64,6 +69,11 @@ class TrueValueClause<T> implements Value.ValueClause<T> {
|
||||||
return valueSupplier.get();
|
return valueSupplier.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<T> optional() {
|
||||||
|
return Optional.ofNullable(valueSupplier.get());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,10 +41,11 @@ public interface Value {
|
||||||
*
|
*
|
||||||
* @return the value from either the trueSupplier or the falseSupplier
|
* @return the value from either the trueSupplier or the falseSupplier
|
||||||
*/
|
*/
|
||||||
|
@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);
|
||||||
|
@ -60,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));
|
||||||
}
|
}
|
||||||
|
@ -74,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -87,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,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.
|
||||||
|
@ -123,7 +127,8 @@ public interface Value {
|
||||||
*
|
*
|
||||||
* @return a true or false value clause
|
* @return a true or false value clause
|
||||||
*/
|
*/
|
||||||
ValueClause<T> or(boolean clause);
|
@SuppressWarnings("PMD.ShortMethodName")
|
||||||
|
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.
|
||||||
|
@ -132,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());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -143,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());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -163,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();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -10,9 +12,9 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||||
*/
|
*/
|
||||||
public class ConditionalTest {
|
public class ConditionalTest {
|
||||||
|
|
||||||
private Runnable thenResponse;
|
private Action thenResponse;
|
||||||
|
|
||||||
private Runnable otherwiseResponse;
|
private Action otherwiseResponse;
|
||||||
|
|
||||||
private boolean thenFlag;
|
private boolean thenFlag;
|
||||||
|
|
||||||
|
@ -76,9 +78,9 @@ public class ConditionalTest {
|
||||||
public void whereTrueThenDoSomethingAndThenDoSomethingElse() {
|
public void whereTrueThenDoSomethingAndThenDoSomethingElse() {
|
||||||
//when
|
//when
|
||||||
Condition.where(true)
|
Condition.where(true)
|
||||||
.then(thenResponse)
|
.then(thenResponse)
|
||||||
.and(true)
|
.and(() -> true)
|
||||||
.then(otherwiseResponse);
|
.then(otherwiseResponse);
|
||||||
//then
|
//then
|
||||||
assertThatBothResponsesRun();
|
assertThatBothResponsesRun();
|
||||||
}
|
}
|
||||||
|
@ -119,7 +121,7 @@ public class ConditionalTest {
|
||||||
public void whereNotFalseThenRuns() {
|
public void whereNotFalseThenRuns() {
|
||||||
//when
|
//when
|
||||||
Condition.whereNot(false)
|
Condition.whereNot(false)
|
||||||
.then(thenResponse);
|
.then(thenResponse);
|
||||||
//then
|
//then
|
||||||
assertThatTheThenResponseRuns();
|
assertThatTheThenResponseRuns();
|
||||||
}
|
}
|
||||||
|
@ -128,8 +130,8 @@ public class ConditionalTest {
|
||||||
public void whereNotTrueThenOtherwiseRuns() {
|
public void whereNotTrueThenOtherwiseRuns() {
|
||||||
//when
|
//when
|
||||||
Condition.whereNot(true)
|
Condition.whereNot(true)
|
||||||
.then(thenResponse)
|
.then(thenResponse)
|
||||||
.otherwise(otherwiseResponse);
|
.otherwise(otherwiseResponse);
|
||||||
//then
|
//then
|
||||||
assertThatTheOtherwiseResponseRuns();
|
assertThatTheOtherwiseResponseRuns();
|
||||||
}
|
}
|
||||||
|
@ -138,8 +140,8 @@ 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,9 +150,9 @@ 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
|
||||||
assertThatTheOtherwiseResponseRuns();
|
assertThatTheOtherwiseResponseRuns();
|
||||||
}
|
}
|
||||||
|
@ -159,8 +161,8 @@ 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,9 +171,9 @@ 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
|
||||||
assertThatTheOtherwiseResponseRuns();
|
assertThatTheOtherwiseResponseRuns();
|
||||||
}
|
}
|
||||||
|
@ -180,9 +182,9 @@ public class ConditionalTest {
|
||||||
public void whereFalseElseTrueThenOtherwiseRuns() {
|
public void whereFalseElseTrueThenOtherwiseRuns() {
|
||||||
//when
|
//when
|
||||||
Condition.where(false)
|
Condition.where(false)
|
||||||
.then(thenResponse)
|
.then(thenResponse)
|
||||||
.otherwise(true)
|
.otherwise(() -> true)
|
||||||
.then(otherwiseResponse);
|
.then(otherwiseResponse);
|
||||||
//then
|
//then
|
||||||
assertThatTheOtherwiseResponseRuns();
|
assertThatTheOtherwiseResponseRuns();
|
||||||
}
|
}
|
||||||
|
@ -191,9 +193,9 @@ public class ConditionalTest {
|
||||||
public void whereFalseElseFalseThenNothingRuns() {
|
public void whereFalseElseFalseThenNothingRuns() {
|
||||||
//when
|
//when
|
||||||
Condition.where(false)
|
Condition.where(false)
|
||||||
.then(thenResponse)
|
.then(thenResponse)
|
||||||
.otherwise(false)
|
.otherwise(() -> false)
|
||||||
.then(otherwiseResponse);
|
.then(otherwiseResponse);
|
||||||
//then
|
//then
|
||||||
assertThatNoResponseRuns();
|
assertThatNoResponseRuns();
|
||||||
}
|
}
|
||||||
|
@ -202,8 +204,8 @@ public class ConditionalTest {
|
||||||
public void whereTrueChainedThensBothRuns() {
|
public void whereTrueChainedThensBothRuns() {
|
||||||
//when
|
//when
|
||||||
Condition.where(true)
|
Condition.where(true)
|
||||||
.then(thenResponse)
|
.then(thenResponse)
|
||||||
.then(otherwiseResponse);
|
.then(otherwiseResponse);
|
||||||
//then
|
//then
|
||||||
assertThatBothResponsesRun();
|
assertThatBothResponsesRun();
|
||||||
}
|
}
|
||||||
|
@ -212,8 +214,8 @@ public class ConditionalTest {
|
||||||
public void whereFalseChainedThensNothingRuns() {
|
public void whereFalseChainedThensNothingRuns() {
|
||||||
//when
|
//when
|
||||||
Condition.where(false)
|
Condition.where(false)
|
||||||
.then(thenResponse)
|
.then(thenResponse)
|
||||||
.then(otherwiseResponse);
|
.then(otherwiseResponse);
|
||||||
//then
|
//then
|
||||||
assertThatNoResponseRuns();
|
assertThatNoResponseRuns();
|
||||||
}
|
}
|
||||||
|
@ -235,22 +237,22 @@ public class ConditionalTest {
|
||||||
|
|
||||||
private void assertThatTheOtherwiseResponseRan() {
|
private void assertThatTheOtherwiseResponseRan() {
|
||||||
assertThat(otherwiseFlag).as("otherwise response runs")
|
assertThat(otherwiseFlag).as("otherwise response runs")
|
||||||
.isTrue();
|
.isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertThatTheThenResponseRan() {
|
private void assertThatTheThenResponseRan() {
|
||||||
assertThat(thenFlag).as("then response runs")
|
assertThat(thenFlag).as("then response runs")
|
||||||
.isTrue();
|
.isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertThatTheOtherwiseResponseDidNotRun() {
|
private void assertThatTheOtherwiseResponseDidNotRun() {
|
||||||
assertThat(otherwiseFlag).as("otherwise response does not run")
|
assertThat(otherwiseFlag).as("otherwise response does not run")
|
||||||
.isFalse();
|
.isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertThatTheThenResponseDidNotRun() {
|
private void assertThatTheThenResponseDidNotRun() {
|
||||||
assertThat(thenFlag).as("then response does not run")
|
assertThat(thenFlag).as("then response does not run")
|
||||||
.isFalse();
|
.isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertThatNoResponseRuns() {
|
private void assertThatNoResponseRuns() {
|
||||||
|
@ -260,27 +262,53 @@ public class ConditionalTest {
|
||||||
|
|
||||||
private void when(final boolean clause) {
|
private void when(final boolean clause) {
|
||||||
Condition.where(clause)
|
Condition.where(clause)
|
||||||
.then(thenResponse)
|
.then(thenResponse)
|
||||||
.otherwise(otherwiseResponse);
|
.otherwise(otherwiseResponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void when(
|
private void when(
|
||||||
final boolean firstClause,
|
final boolean firstClause,
|
||||||
final boolean secondClause
|
final boolean secondClause
|
||||||
) {
|
) {
|
||||||
Condition.where(firstClause)
|
Condition.where(firstClause)
|
||||||
.and(secondClause)
|
.and(() -> secondClause)
|
||||||
.then(thenResponse)
|
.then(thenResponse)
|
||||||
.otherwise(otherwiseResponse);
|
.otherwise(otherwiseResponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void whenOr(
|
private void whenOr(
|
||||||
final boolean firstClause,
|
final boolean firstClause,
|
||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
@ -52,7 +53,7 @@ public class ValueTest {
|
||||||
public void valueWhereClauseIsTrue() {
|
public void valueWhereClauseIsTrue() {
|
||||||
//when
|
//when
|
||||||
val result = Value.<String>where(true).then(() -> TRUE)
|
val result = Value.<String>where(true).then(() -> TRUE)
|
||||||
.otherwise(() -> FALSE);
|
.otherwise(() -> FALSE);
|
||||||
//then
|
//then
|
||||||
assertThat(result).isEqualTo(TRUE);
|
assertThat(result).isEqualTo(TRUE);
|
||||||
}
|
}
|
||||||
|
@ -61,7 +62,7 @@ public class ValueTest {
|
||||||
public void valueWhereClauseIsFalse() {
|
public void valueWhereClauseIsFalse() {
|
||||||
//when
|
//when
|
||||||
val result = Value.<String>where(false).then(() -> TRUE)
|
val result = Value.<String>where(false).then(() -> TRUE)
|
||||||
.otherwise(() -> FALSE);
|
.otherwise(() -> FALSE);
|
||||||
//then
|
//then
|
||||||
assertThat(result).isEqualTo(FALSE);
|
assertThat(result).isEqualTo(FALSE);
|
||||||
}
|
}
|
||||||
|
@ -69,9 +70,9 @@ 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
|
||||||
assertThat(result).isEqualTo(TRUE);
|
assertThat(result).isEqualTo(TRUE);
|
||||||
}
|
}
|
||||||
|
@ -79,9 +80,9 @@ 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
|
||||||
assertThat(result).isEqualTo(FALSE);
|
assertThat(result).isEqualTo(FALSE);
|
||||||
}
|
}
|
||||||
|
@ -89,9 +90,9 @@ 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
|
||||||
assertThat(result).isEqualTo(FALSE);
|
assertThat(result).isEqualTo(FALSE);
|
||||||
}
|
}
|
||||||
|
@ -99,9 +100,9 @@ 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
|
||||||
assertThat(result).isEqualTo(FALSE);
|
assertThat(result).isEqualTo(FALSE);
|
||||||
}
|
}
|
||||||
|
@ -109,9 +110,9 @@ 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
|
||||||
assertThat(result).isEqualTo(TRUE);
|
assertThat(result).isEqualTo(TRUE);
|
||||||
}
|
}
|
||||||
|
@ -119,9 +120,9 @@ 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
|
||||||
assertThat(result).isEqualTo(TRUE);
|
assertThat(result).isEqualTo(TRUE);
|
||||||
}
|
}
|
||||||
|
@ -129,9 +130,9 @@ 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
|
||||||
assertThat(result).isEqualTo(TRUE);
|
assertThat(result).isEqualTo(TRUE);
|
||||||
}
|
}
|
||||||
|
@ -139,9 +140,9 @@ 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
|
||||||
assertThat(result).isEqualTo(FALSE);
|
assertThat(result).isEqualTo(FALSE);
|
||||||
}
|
}
|
||||||
|
@ -150,7 +151,7 @@ public class ValueTest {
|
||||||
public void valueWhereNotTrueIsFalse() {
|
public void valueWhereNotTrueIsFalse() {
|
||||||
//when
|
//when
|
||||||
val result = Value.<String>whereNot(true).then(() -> TRUE)
|
val result = Value.<String>whereNot(true).then(() -> TRUE)
|
||||||
.otherwise(() -> FALSE);
|
.otherwise(() -> FALSE);
|
||||||
//then
|
//then
|
||||||
assertThat(result).isEqualTo(FALSE);
|
assertThat(result).isEqualTo(FALSE);
|
||||||
}
|
}
|
||||||
|
@ -159,7 +160,7 @@ public class ValueTest {
|
||||||
public void valueWhereNotFalseIsTrue() {
|
public void valueWhereNotFalseIsTrue() {
|
||||||
//when
|
//when
|
||||||
val result = Value.<String>whereNot(false).then(() -> TRUE)
|
val result = Value.<String>whereNot(false).then(() -> TRUE)
|
||||||
.otherwise(() -> FALSE);
|
.otherwise(() -> FALSE);
|
||||||
//then
|
//then
|
||||||
assertThat(result).isEqualTo(TRUE);
|
assertThat(result).isEqualTo(TRUE);
|
||||||
}
|
}
|
||||||
|
@ -167,9 +168,9 @@ 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
|
||||||
assertThat(result).isEqualTo(FALSE);
|
assertThat(result).isEqualTo(FALSE);
|
||||||
}
|
}
|
||||||
|
@ -177,9 +178,9 @@ 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
|
||||||
assertThat(result).isEqualTo(TRUE);
|
assertThat(result).isEqualTo(TRUE);
|
||||||
}
|
}
|
||||||
|
@ -187,9 +188,9 @@ 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
|
||||||
assertThat(result).isEqualTo(FALSE);
|
assertThat(result).isEqualTo(FALSE);
|
||||||
}
|
}
|
||||||
|
@ -197,9 +198,9 @@ 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
|
||||||
assertThat(result).isEqualTo(FALSE);
|
assertThat(result).isEqualTo(FALSE);
|
||||||
}
|
}
|
||||||
|
@ -207,9 +208,9 @@ 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
|
||||||
assertThat(result).isEqualTo(TRUE);
|
assertThat(result).isEqualTo(TRUE);
|
||||||
}
|
}
|
||||||
|
@ -217,9 +218,9 @@ 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
|
||||||
assertThat(result).isEqualTo(TRUE);
|
assertThat(result).isEqualTo(TRUE);
|
||||||
}
|
}
|
||||||
|
@ -227,9 +228,9 @@ 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
|
||||||
assertThat(result).isEqualTo(FALSE);
|
assertThat(result).isEqualTo(FALSE);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
box: maven:3.5.0-jdk-8
|
|
||||||
|
|
||||||
build:
|
|
||||||
steps:
|
|
||||||
- xenoterracide/maven:
|
|
||||||
goals: clean install
|
|
Loading…
Reference in a new issue