Value: add initial implementation
This commit is contained in:
parent
22c23e7e4a
commit
598f69a65b
2 changed files with 284 additions and 0 deletions
56
src/main/java/net/kemitix/conditional/Value.java
Normal file
56
src/main/java/net/kemitix/conditional/Value.java
Normal file
|
@ -0,0 +1,56 @@
|
|||
package net.kemitix.conditional;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* @author Paul Campbell (pcampbell@kemitix.net).
|
||||
*/
|
||||
public class Value<T> {
|
||||
|
||||
private boolean clause;
|
||||
|
||||
private Supplier<T> trueSupplier;
|
||||
|
||||
private Value(final boolean clause) {
|
||||
this.clause = clause;
|
||||
}
|
||||
|
||||
static <T> Value<T> where(final boolean clause) {
|
||||
return new Value<>(clause);
|
||||
}
|
||||
|
||||
static <T> Value<T> whereNot(final boolean clause) {
|
||||
return where(!clause);
|
||||
}
|
||||
|
||||
Value<T> then(final Supplier<T> trueSupplier) {
|
||||
this.trueSupplier = trueSupplier;
|
||||
return this;
|
||||
}
|
||||
|
||||
T otherwise(final Supplier<T> falseSupplier) {
|
||||
if (clause) {
|
||||
return trueSupplier.get();
|
||||
}
|
||||
return falseSupplier.get();
|
||||
}
|
||||
|
||||
Value<T> and(final boolean clause) {
|
||||
this.clause = this.clause && clause;
|
||||
return this;
|
||||
}
|
||||
|
||||
Value<T> or(final boolean clause) {
|
||||
this.clause = this.clause || clause;
|
||||
return this;
|
||||
}
|
||||
|
||||
Value<T> andNot(final boolean clause) {
|
||||
return and(!clause);
|
||||
}
|
||||
|
||||
Value<T> orNot(final boolean clause) {
|
||||
return or(!clause);
|
||||
}
|
||||
|
||||
}
|
228
src/test/java/net/kemitix/conditional/ValueTest.java
Normal file
228
src/test/java/net/kemitix/conditional/ValueTest.java
Normal file
|
@ -0,0 +1,228 @@
|
|||
package net.kemitix.conditional;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* @author Paul Campbell (pcampbell@kemitix.net).
|
||||
*/
|
||||
public class ValueTest {
|
||||
|
||||
private static final String TRUE = "true";
|
||||
|
||||
private static final String FALSE = "false";
|
||||
|
||||
@Test
|
||||
public void valueWhereTrueIsTrue() {
|
||||
//when
|
||||
final String result = Value.<String>where(true).then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsTrue(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereFalseIsFalse() {
|
||||
//when
|
||||
final String result = Value.<String>where(false).then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsFalse(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereTrueAndTrueIsTrue() {
|
||||
//when
|
||||
final String result = Value.<String>where(true).and(true)
|
||||
.then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsTrue(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereTrueAndFalseIsFalse() {
|
||||
//when
|
||||
final String result = Value.<String>where(true).and(false)
|
||||
.then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsFalse(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereFalseAndTrueIsFalse() {
|
||||
//when
|
||||
final String result = Value.<String>where(false).and(true)
|
||||
.then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsFalse(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereFalseAndFalseIsFalse() {
|
||||
//when
|
||||
final String result = Value.<String>where(false).and(false)
|
||||
.then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsFalse(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereTrueOrTrueIsTrue() {
|
||||
//when
|
||||
final String result = Value.<String>where(true).or(true)
|
||||
.then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsTrue(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereTrueOrFalseIsTrue() {
|
||||
//when
|
||||
final String result = Value.<String>where(true).or(false)
|
||||
.then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsTrue(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereFalseOrTrueIsTrue() {
|
||||
//when
|
||||
final String result = Value.<String>where(false).or(true)
|
||||
.then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsTrue(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereFalseOrFalseIsFalse() {
|
||||
//when
|
||||
final String result = Value.<String>where(false).or(false)
|
||||
.then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsFalse(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereNotTrueIsFalse() {
|
||||
//when
|
||||
final String result = Value.<String>whereNot(true).then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsFalse(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereNotFalseIsTrue() {
|
||||
//when
|
||||
final String result = Value.<String>whereNot(false).then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsTrue(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereTrueAndNotTrueIsFalse() {
|
||||
//when
|
||||
final String result = Value.<String>where(true).andNot(true)
|
||||
.then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsFalse(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereTrueAndNotFalseIsTrue() {
|
||||
//when
|
||||
final String result = Value.<String>where(true).andNot(false)
|
||||
.then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsTrue(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereFalseAndNotTrueIsFalse() {
|
||||
//when
|
||||
final String result = Value.<String>where(false).andNot(true)
|
||||
.then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsFalse(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereFalseAndNotFalseIsFalse() {
|
||||
//when
|
||||
final String result = Value.<String>where(false).andNot(false)
|
||||
.then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsFalse(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereTrueOrNotTrueIsTrue() {
|
||||
//when
|
||||
final String result = Value.<String>where(true).orNot(true)
|
||||
.then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsTrue(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereTrueOrNotFalseIsTrue() {
|
||||
//when
|
||||
final String result = Value.<String>where(true).orNot(false)
|
||||
.then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsTrue(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereFalseOrNotTrueIsFalse() {
|
||||
//when
|
||||
final String result = Value.<String>where(false).orNot(true)
|
||||
.then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsFalse(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void valueWhereFalseOrNotFalseIsTrue() {
|
||||
//when
|
||||
final String result = Value.<String>where(false).orNot(false)
|
||||
.then(this::isTrue)
|
||||
.otherwise(this::isFalse);
|
||||
//then
|
||||
thenIsTrue(result);
|
||||
}
|
||||
|
||||
private String isTrue() {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
private String isFalse() {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
private void thenIsFalse(final String result) {
|
||||
assertThat(result).isEqualTo(isFalse());
|
||||
}
|
||||
|
||||
private void thenIsTrue(final String result) {
|
||||
assertThat(result).isEqualTo(TRUE);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue