/*
* Copyright 2015 Goldman Sachs.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.gs.collections.impl.block.factory;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.gs.collections.api.block.function.Function;
import com.gs.collections.api.block.predicate.Predicate;
import com.gs.collections.api.collection.MutableCollection;
import com.gs.collections.api.list.MutableList;
import com.gs.collections.api.tuple.Pair;
import com.gs.collections.api.tuple.Twin;
import com.gs.collections.impl.factory.Lists;
import com.gs.collections.impl.factory.Sets;
import com.gs.collections.impl.list.Interval;
import com.gs.collections.impl.list.mutable.FastList;
import com.gs.collections.impl.test.Verify;
import com.gs.collections.impl.tuple.Tuples;
import com.gs.collections.impl.utility.ListIterate;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class PredicatesTest
{
private Employee alice;
private Employee bob;
private Employee charlie;
private Employee diane;
private MutableList<Employee> employees;
@Before
public void setUp()
{
this.alice = new Employee(new Address(State.ARIZONA));
this.alice.addDependent(new Dependent(DependentType.SPOUSE));
this.alice.addDependent(new Dependent(DependentType.CHILD));
this.alice.addDependent(new Dependent(DependentType.CHILD));
this.alice.addDependent(new Dependent(DependentType.PARENT));
this.bob = new Employee(new Address(State.ALASKA));
this.bob.addDependent(new Dependent(DependentType.SPOUSE));
this.bob.addDependent(new Dependent(DependentType.CHILD));
this.charlie = new Employee(new Address(State.ARIZONA));
this.charlie.addDependent(new Dependent(DependentType.SPOUSE));
this.charlie.addDependent(new Dependent(DependentType.CHILD));
this.charlie.addDependent(new Dependent(DependentType.CHILD));
this.diane = new Employee(new Address(State.ALASKA));
this.diane.addDependent(new Dependent(DependentType.SPOUSE));
this.diane.addDependent(new Dependent(DependentType.PARENT));
this.diane.addDependent(new Dependent(DependentType.PARENT));
this.diane.addDependent(new Dependent(DependentType.GRANDPARENT));
this.employees = FastList.newListWith(this.alice, this.bob, this.charlie, this.diane);
}
@Test
public void throwing()
{
Verify.assertThrowsWithCause(
RuntimeException.class,
IOException.class,
() -> Predicates.throwing(e -> {
throw new IOException();
}).accept(null));
}
@Test
public void bind()
{
MutableList<Integer> list = Lists.mutable.of(1, 2, 3);
Predicate<Integer> predicate = Predicates.bind((element, parameter) -> (element + parameter) % 2 == 0, 1);
Verify.assertListsEqual(Lists.mutable.of(1, 3), list.select(predicate));
assertToString(predicate);
}
@Test
public void alwaysTrue()
{
assertAccepts(Predicates.alwaysTrue(), (Object) null);
assertToString(Predicates.alwaysTrue());
}
@Test
public void alwaysFalse()
{
assertRejects(Predicates.alwaysFalse(), (Object) null);
assertToString(Predicates.alwaysFalse());
}
@Test
public void instanceNot()
{
assertRejects(Predicates.alwaysTrue().not(), (Object) null);
assertToString(Predicates.alwaysTrue().not());
}
@Test
public void synchronizedEach()
{
Predicate<Object> predicate = Predicates.synchronizedEach(Predicates.alwaysTrue());
assertAccepts(predicate, new Object());
}
@Test
public void adapt()
{
assertAccepts(Predicates.adapt(Predicates.alwaysTrue()), new Object());
assertToString(Predicates.adapt(Predicates.alwaysTrue()));
}
@Test
public void staticOr()
{
assertAccepts(Predicates.or(Predicates.alwaysTrue(), Predicates.alwaysFalse()), new Object());
assertRejects(Predicates.or(Predicates.alwaysFalse(), Predicates.alwaysFalse()), new Object());
assertAccepts(Predicates.or(Predicates.alwaysTrue(), Predicates.alwaysTrue()), new Object());
assertToString(Predicates.or(Predicates.alwaysTrue(), Predicates.alwaysTrue()));
}
@Test
public void instanceOr()
{
assertAccepts(Predicates.alwaysTrue().or(Predicates.alwaysFalse()), new Object());
assertRejects(Predicates.alwaysFalse().or(Predicates.alwaysFalse()), new Object());
assertAccepts(Predicates.alwaysTrue().or(Predicates.alwaysTrue()), new Object());
assertToString(Predicates.alwaysTrue().or(Predicates.alwaysTrue()));
}
@Test
public void collectionOr()
{
MutableList<Predicate<Object>> predicates =
Lists.fixedSize.<Predicate<Object>>of(Predicates.alwaysTrue(), Predicates.alwaysFalse(), null);
assertAccepts(Predicates.or(predicates), new Object());
MutableList<Predicate<Object>> falsePredicates =
Lists.fixedSize.<Predicate<Object>>of(Predicates.alwaysFalse(), Predicates.alwaysFalse());
assertRejects(Predicates.or(falsePredicates), new Object());
MutableList<Predicate<Object>> truePredicates =
Lists.fixedSize.<Predicate<Object>>of(Predicates.alwaysTrue(), Predicates.alwaysTrue());
assertAccepts(Predicates.or(truePredicates), new Object());
assertToString(Predicates.or(truePredicates));
}
@Test
public void varArgOr()
{
assertAccepts(Predicates.or(Predicates.alwaysTrue(), Predicates.alwaysFalse(), null), new Object());
assertRejects(Predicates.or(Predicates.alwaysFalse(), Predicates.alwaysFalse(), Predicates.alwaysFalse()), new Object());
assertAccepts(Predicates.or(Predicates.alwaysTrue(), Predicates.alwaysTrue(), Predicates.alwaysTrue()), new Object());
assertToString(Predicates.or(Predicates.alwaysTrue(), Predicates.alwaysTrue(), Predicates.alwaysTrue()));
}
@Test
public void staticAnd()
{
assertAccepts(Predicates.and(Predicates.alwaysTrue(), Predicates.alwaysTrue()), new Object());
assertRejects(Predicates.and(Predicates.alwaysTrue(), Predicates.alwaysFalse()), new Object());
assertRejects(Predicates.and(Predicates.alwaysFalse(), Predicates.alwaysFalse()), new Object());
assertToString(Predicates.and(Predicates.alwaysTrue(), Predicates.alwaysTrue()));
}
@Test
public void instanceAnd()
{
assertAccepts(Predicates.alwaysTrue().and(Predicates.alwaysTrue()), new Object());
assertRejects(Predicates.alwaysTrue().and(Predicates.alwaysFalse()), new Object());
assertRejects(Predicates.alwaysFalse().and(Predicates.alwaysFalse()), new Object());
assertToString(Predicates.alwaysTrue().and(Predicates.alwaysTrue()));
}
@Test
public void collectionAnd()
{
MutableList<Predicate<Object>> predicates =
Lists.fixedSize.<Predicate<Object>>of(Predicates.alwaysTrue(), Predicates.alwaysTrue());
assertAccepts(Predicates.and(predicates), new Object());
MutableList<Predicate<Object>> tfPredicates =
Lists.fixedSize.<Predicate<Object>>of(Predicates.alwaysTrue(), Predicates.alwaysFalse());
assertRejects(Predicates.and(tfPredicates), new Object());
MutableList<Predicate<Object>> falsePredicates =
Lists.fixedSize.<Predicate<Object>>of(Predicates.alwaysFalse(), Predicates.alwaysFalse());
assertRejects(Predicates.and(falsePredicates), new Object());
assertToString(Predicates.and(predicates));
}
@Test
public void varArgAnd()
{
assertAccepts(Predicates.and(Predicates.alwaysTrue(), Predicates.alwaysTrue()), new Object());
assertRejects(Predicates.and(Predicates.alwaysTrue(), Predicates.alwaysTrue(), Predicates.alwaysFalse()), new Object());
assertRejects(Predicates.and(Predicates.alwaysFalse(), Predicates.alwaysFalse(), Predicates.alwaysFalse()), new Object());
assertToString(Predicates.and(Predicates.alwaysTrue(), Predicates.alwaysTrue(), null));
}
@Test
public void equal()
{
assertAccepts(Integer.valueOf(1)::equals, 1);
assertRejects(Integer.valueOf(1)::equals, 2);
assertAccepts("test"::equals, "test");
assertRejects("test"::equals, "production");
}
@Test
public void notEqual()
{
assertRejects(Predicates.notEqual(1), 1);
assertAccepts(Predicates.notEqual(1), 2);
assertRejects(Predicates.notEqual("test"), "test");
assertAccepts(Predicates.notEqual("test"), "production");
assertAccepts(Predicates.notEqual(null), "test");
assertToString(Predicates.notEqual(1));
}
@Test
public void not()
{
Predicate<Object> notTrue = Predicates.not(Predicates.alwaysTrue());
assertRejects(notTrue, new Object());
assertToString(notTrue);
Predicate<Object> notFalse = Predicates.not(Predicates.alwaysFalse());
assertAccepts(notFalse, new Object());
assertToString(notFalse);
}
@Test
public void testNull()
{
assertAccepts(Predicates.isNull(), (Object) null);
assertRejects(Predicates.isNull(), new Object());
assertToString(Predicates.isNull());
}
@Test
public void notNull()
{
assertAccepts(Predicates.notNull(), new Object());
assertRejects(Predicates.notNull(), (Object) null);
assertToString(Predicates.notNull());
}
@Test
public void neither()
{
assertRejects(Predicates.neither(Predicates.alwaysTrue(), Predicates.alwaysTrue()), new Object());
assertRejects(Predicates.neither(Predicates.alwaysTrue(), Predicates.alwaysFalse()), new Object());
assertAccepts(Predicates.neither(Predicates.alwaysFalse(), Predicates.alwaysFalse()), new Object());
assertToString(Predicates.neither(Predicates.alwaysFalse(), Predicates.alwaysFalse()));
}
@Test
public void collectionNoneOf()
{
MutableList<Predicate<Object>> trueNorTrue = Lists.fixedSize.<Predicate<Object>>of(
Predicates.alwaysTrue(),
Predicates.alwaysTrue(),
Predicates.alwaysTrue());
assertRejects(Predicates.noneOf(trueNorTrue), new Object());
MutableList<Predicate<Object>> trueNorFalse = Lists.fixedSize.<Predicate<Object>>of(
Predicates.alwaysTrue(),
Predicates.alwaysTrue(),
Predicates.alwaysFalse());
assertRejects(Predicates.noneOf(trueNorFalse), new Object());
MutableList<Predicate<Object>> falseNorFalse = Lists.fixedSize.<Predicate<Object>>of(
Predicates.alwaysFalse(),
Predicates.alwaysFalse(),
Predicates.alwaysFalse());
assertAccepts(Predicates.noneOf(falseNorFalse), new Object());
assertToString(Predicates.noneOf(falseNorFalse));
}
@Test
public void noneOf()
{
assertRejects(Predicates.noneOf(Predicates.alwaysTrue(), Predicates.alwaysTrue(), Predicates.alwaysTrue()), new Object());
assertRejects(Predicates.noneOf(Predicates.alwaysTrue(), Predicates.alwaysTrue(), Predicates.alwaysFalse()), new Object());
assertAccepts(Predicates.noneOf(Predicates.alwaysFalse(), Predicates.alwaysFalse(), Predicates.alwaysFalse()), new Object());
assertToString(Predicates.noneOf(Predicates.alwaysFalse(), Predicates.alwaysFalse(), Predicates.alwaysFalse()));
}
@Test
public void sameAs()
{
Object object = new Object();
Predicate<Object> sameAs = Predicates.sameAs(object);
assertAccepts(sameAs, object);
assertRejects(sameAs, new Object());
assertToString(sameAs);
}
@Test
public void notSameAs()
{
Object object = new Object();
Predicate<Object> notSameAs = Predicates.notSameAs(object);
assertRejects(notSameAs, object);
assertAccepts(notSameAs, new Object());
assertToString(notSameAs);
}
@Test
public void instanceOf()
{
Assert.assertTrue(Predicates.instanceOf(Integer.class).accept(1));
Assert.assertFalse(Predicates.instanceOf(Integer.class).accept(1.0));
assertToString(Predicates.instanceOf(Integer.class));
}
@Test
public void assignableFrom()
{
assertAccepts(Predicates.assignableFrom(Number.class), 1);
assertAccepts(Predicates.assignableFrom(Integer.class), 1);
assertRejects(Predicates.assignableFrom(List.class), 1);
assertToString(Predicates.assignableFrom(Number.class));
}
@Test
public void notInstanceOf()
{
Assert.assertFalse(Predicates.notInstanceOf(Integer.class).accept(1));
Assert.assertTrue(Predicates.notInstanceOf(Integer.class).accept(1.0));
assertToString(Predicates.notInstanceOf(Integer.class));
}
@Test
public void ifTrue()
{
assertIf(Predicates.ifTrue(List::isEmpty), true);
}
@Test
public void ifFalse()
{
assertIf(Predicates.ifFalse(List::isEmpty), false);
}
private static void assertIf(Predicate<List<Object>> predicate, boolean bool)
{
Assert.assertEquals(bool, predicate.accept(Lists.fixedSize.of()));
Assert.assertEquals(!bool, predicate.accept(FastList.newListWith((Object) null)));
assertToString(predicate);
}
@Test
public void ifTrueWithClassAndFunctionName()
{
Twin<Boolean> target = Tuples.twin(true, false);
assertAccepts(Predicates.ifTrue(Functions.<Boolean>firstOfPair()), target);
assertRejects(Predicates.ifTrue(Functions.<Boolean>secondOfPair()), target);
}
@Test
public void ifFalseWithClassAndFunctionName()
{
Twin<Boolean> target = Tuples.twin(true, false);
assertRejects(Predicates.ifFalse(Functions.<Boolean>firstOfPair()), target);
assertAccepts(Predicates.ifFalse(Functions.<Boolean>secondOfPair()), target);
}
@Test
public void attributeEqual()
{
Predicate<String> predicate = Predicates.attributeEqual(String::valueOf, "1");
assertAccepts(predicate, "1");
assertRejects(predicate, "0");
assertToString(predicate);
}
@Test
public void attributeNotEqual()
{
Predicate<String> predicate = Predicates.attributeNotEqual(String::valueOf, "1");
assertAccepts(predicate, "0");
assertRejects(predicate, "1");
assertToString(predicate);
}
@Test
public void attributeLessThan()
{
Predicate<String> predicate = Predicates.attributeLessThan(String::valueOf, "1");
assertRejects(predicate, "1");
assertAccepts(predicate, "0");
assertToString(predicate);
}
@Test
public void attributeGreaterThan()
{
Predicate<String> predicate = Predicates.attributeGreaterThan(String::valueOf, "0");
assertAccepts(predicate, "1");
assertRejects(predicate, "0");
assertToString(predicate);
}
@Test
public void attributeGreaterThanOrEqualTo()
{
Predicate<String> predicate = Predicates.attributeGreaterThanOrEqualTo(String::valueOf, "1");
assertAccepts(predicate, "1", "2");
assertRejects(predicate, "0");
assertToString(predicate);
}
@Test
public void attributeLessThanOrEqualTo()
{
Predicate<String> predicate = Predicates.attributeLessThanOrEqualTo(String::valueOf, "1");
assertAccepts(predicate, "1", "0");
assertRejects(predicate, "2");
assertToString(predicate);
}
@Test
public void attributeAnySatisfy()
{
Function<Address, String> stateAbbreviation = address -> address.getState().getAbbreviation();
Predicates<Address> inArizona = Predicates.attributeEqual(stateAbbreviation, "AZ");
MutableCollection<Employee> azResidents = this.employees.select(Predicates.attributeAnySatisfy(employee -> employee.addresses, inArizona));
Assert.assertEquals(FastList.newListWith(this.alice, this.charlie), azResidents);
Predicates<Address> inAlaska = Predicates.attributeEqual(stateAbbreviation, "AK");
MutableCollection<Employee> akResidents = this.employees.select(Predicates.attributeAnySatisfy(employee -> employee.addresses, inAlaska));
Assert.assertEquals(FastList.newListWith(this.bob, this.diane), akResidents);
assertToString(inArizona);
}
@Test
public void attributeAllSatisfy()
{
MutableCollection<Employee> noExtendedDependents = this.employees.select(Predicates.attributeAllSatisfy(Employee.TO_DEPENEDENTS, Dependent.IS_IMMEDIATE));
Assert.assertEquals(FastList.newListWith(this.bob, this.charlie), noExtendedDependents);
}
@Test
public void attributeNoneSatisfy()
{
Function<Address, String> stateAbbreviation = address -> address.getState().getAbbreviation();
Predicates<Address> inAlabama = Predicates.attributeEqual(stateAbbreviation, "AL");
MutableCollection<Employee> notAlResidents = this.employees.select(Predicates.attributeNoneSatisfy(employee -> employee.addresses, inAlabama));
Assert.assertEquals(FastList.newListWith(this.alice, this.bob, this.charlie, this.diane), notAlResidents);
}
@Test
public void allSatisfy()
{
Predicate<Iterable<Object>> allIntegers = Predicates.allSatisfy(Predicates.instanceOf(Integer.class));
assertAccepts(allIntegers, FastList.newListWith(1, 2, 3));
assertRejects(allIntegers, FastList.newListWith(Boolean.TRUE, Boolean.FALSE));
}
@Test
public void anySatisfy()
{
Predicates<Iterable<Object>> anyIntegers = Predicates.anySatisfy(Predicates.instanceOf(Integer.class));
assertAccepts(anyIntegers, FastList.newListWith(1, 2, 3));
assertRejects(anyIntegers, FastList.newListWith(Boolean.TRUE, Boolean.FALSE));
}
@Test
public void noneSatisfy()
{
Predicates<Iterable<Object>> anyIntegers = Predicates.noneSatisfy(Predicates.instanceOf(Integer.class));
assertRejects(anyIntegers, FastList.newListWith(1, 2, 3));
assertAccepts(anyIntegers, FastList.newListWith(Boolean.TRUE, Boolean.FALSE));
}
@Test
public void attributeIsNull()
{
assertAccepts(Predicates.attributeIsNull(Functions.getPassThru()), (Object) null);
assertRejects(Predicates.attributeIsNull(Functions.getPassThru()), new Object());
}
@Test
public void attributeIsNullWithFunctionName()
{
Twin<Integer> target = Tuples.twin(null, 1);
assertAccepts(Predicates.attributeIsNull(Functions.<Integer>firstOfPair()), target);
assertRejects(Predicates.attributeIsNull(Functions.<Integer>secondOfPair()), target);
}
@Test
public void attributeNotNullWithFunction()
{
assertRejects(Predicates.attributeNotNull(Functions.getPassThru()), (Object) null);
assertAccepts(Predicates.attributeNotNull(Functions.getPassThru()), new Object());
}
@Test
public void in_SetIterable()
{
Predicate<Object> predicate = Predicates.in(Sets.immutable.with(1, 2, 3));
assertAccepts(predicate, 1, 2, 3);
assertRejects(predicate, 0, 4, null);
}
@Test
public void notIn_SetIterable()
{
Predicate<Object> predicate = Predicates.notIn(Sets.immutable.with(1, 2, 3));
assertAccepts(predicate, 0, 4, null);
assertRejects(predicate, 1, 2, 3);
}
@Test
public void in_Set()
{
Set<Integer> set = new HashSet<>(Arrays.asList(1, 2, 3));
Predicate<Object> predicate = Predicates.in(set);
assertAccepts(predicate, 1, 2, 3);
assertRejects(predicate, 0, 4, null);
assertToString(predicate);
Assert.assertTrue(predicate.toString().contains(set.toString()));
}
@Test
public void notIn_Set()
{
Set<Integer> set = new HashSet<>(Arrays.asList(1, 2, 3));
Predicate<Object> predicate = Predicates.notIn(set);
assertAccepts(predicate, 0, 4, null);
assertRejects(predicate, 1, 2, 3);
assertToString(predicate);
Assert.assertTrue(predicate.toString().contains(set.toString()));
}
@Test
public void in_Collection()
{
Predicate<Object> predicate = Predicates.in(Lists.mutable.with(1, 2, 3));
assertAccepts(predicate, 1, 2, 3);
assertRejects(predicate, 0, 4, null);
}
@Test
public void notIn_Collection()
{
Predicate<Object> predicate = Predicates.notIn(Lists.mutable.with(1, 2, 3));
assertAccepts(predicate, 0, 4, null);
assertRejects(predicate, 1, 2, 3);
}
@Test
public void in()
{
MutableList<String> list1 = Lists.fixedSize.of("1", "3");
Predicate<Object> inList = Predicates.in(list1);
assertAccepts(inList, "1");
assertRejects(inList, "2");
assertAccepts(Predicates.in(list1.toArray()), "1");
assertRejects(Predicates.in(list1.toArray()), "2");
Object[] array = Lists.mutable.of("1", "2", "3", "4", "5", "6", "7", "8", "9", "10").toArray();
Predicates<Object> predicate = Predicates.in(array);
assertAccepts(predicate, "1");
assertRejects(predicate, "0");
Assert.assertEquals(FastList.newListWith("1"), ListIterate.select(Lists.fixedSize.of("1", "2"), inList));
assertToString(inList);
Assert.assertTrue(inList.toString().contains(list1.toString()));
assertToString(predicate);
}
@Test
public void inInterval()
{
assertAccepts(Predicates.in(Interval.oneTo(3)), 2);
assertToString(Predicates.in(Interval.oneTo(3)));
}
@Test
public void attributeIn()
{
MutableList<String> upperList = Lists.fixedSize.of("A", "B");
Predicate<String> in = Predicates.attributeIn(StringFunctions.toUpperCase(), upperList);
assertAccepts(in, "a");
assertRejects(in, "c");
Assert.assertEquals(FastList.newListWith("a"), ListIterate.select(Lists.fixedSize.of("a", "c"), in));
assertToString(in);
}
@Test
public void notIn()
{
MutableList<String> odds = Lists.fixedSize.of("1", "3");
Predicate<Object> predicate1 = Predicates.notIn(odds);
assertAccepts(predicate1, "2");
assertRejects(predicate1, "1");
assertAccepts(Predicates.notIn(odds.toArray()), "2");
assertRejects(Predicates.notIn(odds.toArray()), "1");
MutableList<String> list = Lists.mutable.of("1", "2", "3", "4", "5", "6", "7", "8", "9", "10");
assertAccepts(Predicates.notIn(list), "0");
assertRejects(Predicates.notIn(list), "1");
Predicates<Object> predicate2 = Predicates.notIn(list.toArray());
assertAccepts(predicate2, "0");
assertRejects(predicate2, "1");
Assert.assertEquals(FastList.newListWith("2"), ListIterate.select(Lists.fixedSize.of("1", "2"), predicate1));
assertToString(predicate1);
assertToString(predicate2);
Assert.assertTrue(predicate1.toString().contains(odds.toString()));
}
@Test
public void notInInterval()
{
assertAccepts(Predicates.notIn(Interval.oneTo(3)), 4);
assertToString(Predicates.notIn(Interval.oneTo(3)));
}
@Test
public void attributeNotIn()
{
MutableList<String> lowerList = Lists.fixedSize.of("a", "b");
Predicate<String> out = Predicates.attributeNotIn(StringFunctions.toLowerCase(), lowerList);
assertAccepts(out, "C");
assertRejects(out, "A");
Assert.assertEquals(FastList.newListWith("A"), ListIterate.reject(Lists.fixedSize.of("A", "C"), out));
assertToString(out);
}
@Test
public void lessThan()
{
Predicate<Integer> lessThan = Predicates.lessThan(0);
assertAccepts(lessThan, -1);
assertRejects(lessThan, 0, 1);
assertToString(lessThan);
}
@Test
public void attributeBetweenExclusive()
{
Predicate<Pair<Integer, ?>> predicate = Predicates.attributeBetweenExclusive(Functions.<Integer>firstOfPair(), 9, 11);
assertAccepts(predicate, Tuples.twin(10, 0));
assertRejects(predicate, Tuples.twin(8, 0), Tuples.twin(9, 0), Tuples.twin(11, 0), Tuples.twin(12, 0));
}
@Test
public void attributeBetweenInclusiveFrom()
{
Predicate<Pair<Integer, ?>> predicate = Predicates.attributeBetweenInclusiveFrom(Functions.<Integer>firstOfPair(), 9, 11);
assertAccepts(predicate, Tuples.twin(9, 0), Tuples.twin(10, 0));
assertRejects(predicate, Tuples.twin(8, 0), Tuples.twin(11, 0), Tuples.twin(12, 0));
}
@Test
public void attributeBetweenInclusiveTo()
{
Predicate<Pair<Integer, ?>> predicate = Predicates.attributeBetweenInclusiveTo(Functions.<Integer>firstOfPair(), 9, 11);
assertAccepts(predicate, Tuples.twin(10, 0), Tuples.twin(11, 0));
assertRejects(predicate, Tuples.twin(8, 0), Tuples.twin(9, 0), Tuples.twin(12, 0));
}
@Test
public void attributeBetweenInclusive()
{
Predicate<Pair<Integer, ?>> predicate = Predicates.attributeBetweenInclusive(Functions.<Integer>firstOfPair(), 9, 11);
assertAccepts(predicate, Tuples.twin(9, 0), Tuples.twin(10, 0), Tuples.twin(11, 0));
assertRejects(predicate, Tuples.twin(8, 0), Tuples.twin(12, 0));
}
@Test
public void lessThanOrEqualTo()
{
assertAccepts(Predicates.lessThanOrEqualTo(0), 0, -1);
assertRejects(Predicates.lessThanOrEqualTo(0), 1);
assertToString(Predicates.lessThanOrEqualTo(0));
}
@Test
public void greaterThan()
{
assertAccepts(Predicates.greaterThan(0), 1);
assertRejects(Predicates.greaterThan(0), 0, -1);
assertToString(Predicates.greaterThan(0));
}
@Test
public void greaterThanOrEqualTo()
{
assertAccepts(Predicates.greaterThanOrEqualTo(0), 0, 1);
assertRejects(Predicates.greaterThanOrEqualTo(0), -1);
assertToString(Predicates.greaterThanOrEqualTo(0));
}
private static void assertToString(Predicate<?> predicate)
{
String toString = predicate.toString();
Assert.assertTrue(toString.startsWith("Predicates"));
}
private static <T> void assertAccepts(Predicate<? super T> predicate, T... elements)
{
for (T element : elements)
{
Assert.assertTrue(predicate.accept(element));
}
}
private static <T> void assertRejects(Predicate<? super T> predicate, T... elements)
{
for (T element : elements)
{
Assert.assertFalse(predicate.accept(element));
}
}
@Test
public void betweenInclusiveNumber()
{
assertBetweenInclusive(Predicates.betweenInclusive(1, 3));
assertBetweenInclusive(Predicates.attributeBetweenInclusive(Functions.getIntegerPassThru(), 1, 3));
}
private static void assertBetweenInclusive(Predicate<Integer> oneToThree)
{
assertRejects(oneToThree, 0, 4);
assertAccepts(oneToThree, 1, 2, 3);
}
@Test
public void betweenInclusiveString()
{
assertStringBetweenInclusive(Predicates.betweenInclusive("1", "3"));
assertStringBetweenInclusive(Predicates.<String, String>attributeBetweenInclusive(String::valueOf, "1", "3"));
}
private static void assertStringBetweenInclusive(Predicate<String> oneToThree)
{
assertRejects(oneToThree, "0", "4");
assertAccepts(oneToThree, "1", "2", "3");
}
@Test
public void betweenInclusiveFromNumber()
{
assertBetweenInclusiveFrom(Predicates.betweenInclusiveFrom(1, 3));
assertBetweenInclusiveFrom(Predicates.attributeBetweenInclusiveFrom(Functions.getIntegerPassThru(), 1, 3));
}
private static void assertBetweenInclusiveFrom(Predicate<Integer> oneToThree)
{
assertRejects(oneToThree, 0, 3, 4);
assertAccepts(oneToThree, 1, 2);
}
@Test
public void betweenInclusiveFromString()
{
assertStringBetweenInclusiveFrom(Predicates.betweenInclusiveFrom("1", "3"));
assertStringBetweenInclusiveFrom(Predicates.<String, String>attributeBetweenInclusiveFrom(String::valueOf, "1", "3"));
}
private static void assertStringBetweenInclusiveFrom(Predicate<String> oneToThree)
{
assertRejects(oneToThree, "0", "3", "4");
assertAccepts(oneToThree, "1", "2");
}
@Test
public void betweenInclusiveToNumber()
{
assertBetweenInclusiveTo(Predicates.betweenInclusiveTo(1, 3));
assertBetweenInclusiveTo(Predicates.attributeBetweenInclusiveTo(Functions.getIntegerPassThru(), 1, 3));
}
private static void assertBetweenInclusiveTo(Predicate<Integer> oneToThree)
{
assertRejects(oneToThree, 0, 1, 4);
assertAccepts(oneToThree, 2, 3);
}
@Test
public void betweenInclusiveToString()
{
assertStringBetweenInclusiveTo(Predicates.betweenInclusiveTo("1", "3"));
assertStringBetweenInclusiveTo(Predicates.<String, String>attributeBetweenInclusiveTo(String::valueOf, "1", "3"));
}
private static void assertStringBetweenInclusiveTo(Predicate<String> oneToThree)
{
assertRejects(oneToThree, "0", "1", "4");
assertAccepts(oneToThree, "2", "3");
}
@Test
public void betweenExclusiveNumber()
{
assertBetweenExclusive(Predicates.betweenExclusive(1, 3));
assertBetweenExclusive(Predicates.attributeBetweenExclusive(Functions.getIntegerPassThru(), 1, 3));
}
private static void assertBetweenExclusive(Predicate<Integer> oneToThree)
{
assertRejects(oneToThree, 0, 1, 3, 4);
assertAccepts(oneToThree, 2);
}
@Test
public void betweenExclusiveString()
{
assertStringBetweenExclusive(Predicates.betweenExclusive("1", "3"));
assertStringBetweenExclusive(Predicates.<String, String>attributeBetweenExclusive(String::valueOf, "1", "3"));
}
private static void assertStringBetweenExclusive(Predicate<String> oneToThree)
{
assertRejects(oneToThree, "0", "1", "3", "4");
assertAccepts(oneToThree, "2");
}
@Test
public void attributeNotNull()
{
Twin<String> testCandidate = Tuples.twin("Hello", null);
assertAccepts(Predicates.attributeNotNull(Functions.<String>firstOfPair()), testCandidate);
assertRejects(Predicates.attributeNotNull(Functions.<String>secondOfPair()), testCandidate);
assertToString(Predicates.attributeNotNull(Functions.<String>firstOfPair()));
}
@Test
public void subClass()
{
Predicates<Class<?>> subClass = Predicates.subClass(Number.class);
Assert.assertTrue(subClass.accept(Integer.class));
Assert.assertFalse(subClass.accept(Object.class));
Assert.assertTrue(subClass.accept(Number.class));
}
@Test
public void superClass()
{
Predicates<Class<?>> superClass = Predicates.superClass(Number.class);
Assert.assertFalse(superClass.accept(Integer.class));
Assert.assertTrue(superClass.accept(Object.class));
Assert.assertTrue(superClass.accept(Number.class));
}
public static final class Employee
{
public static final Function<Employee, MutableList<Address>> TO_ADDRESSES = new Function<Employee, MutableList<Address>>()
{
public MutableList<Address> valueOf(Employee employee)
{
return employee.addresses;
}
};
public static final Function<Employee, MutableList<Dependent>> TO_DEPENEDENTS = employee -> employee.dependents;
private final MutableList<Address> addresses;
private final MutableList<Dependent> dependents = Lists.mutable.of();
private Employee(Address addr)
{
this.addresses = FastList.newListWith(addr);
}
private void addDependent(Dependent dependent)
{
this.dependents.add(dependent);
}
}
public static final class Address
{
private final State state;
private Address(State state)
{
this.state = state;
}
public State getState()
{
return this.state;
}
}
public enum State
{
ARIZONA("AZ"),
ALASKA("AK"),
ALABAMA("AL");
private final String abbreviation;
State(String abbreviation)
{
this.abbreviation = abbreviation;
}
public String getAbbreviation()
{
return this.abbreviation;
}
}
public static final class Dependent
{
public static final Predicate<Dependent> IS_IMMEDIATE = Dependent::isImmediate;
private final DependentType type;
private Dependent(DependentType type)
{
this.type = type;
}
public boolean isImmediate()
{
return this.type.isImmediate();
}
}
public enum DependentType
{
SPOUSE
{
@Override
public boolean isImmediate()
{
return true;
}
},
CHILD
{
@Override
public boolean isImmediate()
{
return true;
}
},
PARENT
{
@Override
public boolean isImmediate()
{
return false;
}
},
GRANDPARENT
{
@Override
public boolean isImmediate()
{
return false;
}
};
public abstract boolean isImmediate();
}
}