blob: 83a73eb2e128cf8040baeb3a05c3516770b0676f [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* 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 libcore.java.util.function;
import junit.framework.TestCase;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Predicate;
public class PredicateTest extends TestCase {
public void testAnd() throws Exception {
Object arg = new Object();
AtomicBoolean alwaysTrueInvoked = new AtomicBoolean(false);
AtomicBoolean alwaysTrue2Invoked = new AtomicBoolean(false);
AtomicBoolean alwaysFalseInvoked = new AtomicBoolean(false);
AtomicBoolean alwaysFalse2Invoked = new AtomicBoolean(false);
AtomicBoolean[] invocationState = {
alwaysTrueInvoked, alwaysTrue2Invoked, alwaysFalseInvoked, alwaysFalse2Invoked };
Predicate<Object> alwaysTrue =
x -> { alwaysTrueInvoked.set(true); assertSame(x, arg); return true; };
Predicate<Object> alwaysTrue2 =
x -> { alwaysTrue2Invoked.set(true); assertSame(x, arg); return true; };
Predicate<Object> alwaysFalse =
x -> { alwaysFalseInvoked.set(true); assertSame(x, arg); return false; };
Predicate<Object> alwaysFalse2 =
x -> { alwaysFalse2Invoked.set(true); assertSame(x, arg); return false; };
// true && true
resetToFalse(invocationState);
assertTrue(alwaysTrue.and(alwaysTrue2).test(arg));
assertTrue(alwaysTrueInvoked.get() && alwaysTrue2Invoked.get());
// true && false
resetToFalse(invocationState);
assertFalse(alwaysTrue.and(alwaysFalse).test(arg));
assertTrue(alwaysTrueInvoked.get() && alwaysFalseInvoked.get());
// false && false
resetToFalse(invocationState);
assertFalse(alwaysFalse.and(alwaysFalse2).test(arg));
assertTrue(alwaysFalseInvoked.get() && !alwaysFalse2Invoked.get());
// false && true
resetToFalse(invocationState);
assertFalse(alwaysFalse.and(alwaysTrue).test(arg));
assertTrue(alwaysFalseInvoked.get() && !alwaysTrueInvoked.get());
}
public void testAnd_null() throws Exception {
Object arg = new Object();
Predicate<Object> alwaysTrue = x -> { assertSame(arg, x); return true; };
try {
alwaysTrue.and(null);
fail();
} catch (NullPointerException expected) {}
}
public void testNegate() throws Exception {
Predicate<Object> alwaysTrue = x -> true;
assertFalse(alwaysTrue.negate().test(null));
Predicate<Object> alwaysFalse = x -> false;
assertTrue(alwaysFalse.negate().test(null));
}
public void testOr() throws Exception {
Object arg = new Object();
AtomicBoolean alwaysTrueInvoked = new AtomicBoolean(false);
AtomicBoolean alwaysTrue2Invoked = new AtomicBoolean(false);
AtomicBoolean alwaysFalseInvoked = new AtomicBoolean(false);
AtomicBoolean alwaysFalse2Invoked = new AtomicBoolean(false);
AtomicBoolean[] invocationState = {
alwaysTrueInvoked, alwaysTrue2Invoked, alwaysFalseInvoked, alwaysFalse2Invoked };
Predicate<Object> alwaysTrue =
x -> { alwaysTrueInvoked.set(true); assertSame(x, arg); return true; };
Predicate<Object> alwaysTrue2 =
x -> { alwaysTrue2Invoked.set(true); assertSame(x, arg); return true; };
Predicate<Object> alwaysFalse =
x -> { alwaysFalseInvoked.set(true); assertSame(x, arg); return false; };
Predicate<Object> alwaysFalse2 =
x -> { alwaysFalse2Invoked.set(true); assertSame(x, arg); return false; };
// true || true
resetToFalse(invocationState);
assertTrue(alwaysTrue.or(alwaysTrue2).test(arg));
assertTrue(alwaysTrueInvoked.get() && !alwaysTrue2Invoked.get());
// true || false
resetToFalse(invocationState);
assertTrue(alwaysTrue.or(alwaysFalse).test(arg));
assertTrue(alwaysTrueInvoked.get() && !alwaysFalseInvoked.get());
// false || false
resetToFalse(invocationState);
assertFalse(alwaysFalse.or(alwaysFalse2).test(arg));
assertTrue(alwaysFalseInvoked.get() && alwaysFalse2Invoked.get());
// false || true
resetToFalse(invocationState);
assertTrue(alwaysFalse.or(alwaysTrue).test(arg));
assertTrue(alwaysFalseInvoked.get() && alwaysTrueInvoked.get());
}
public void testOr_null() throws Exception {
Predicate<Object> alwaysTrue = x -> true;
try {
alwaysTrue.or(null);
fail();
} catch (NullPointerException expected) {}
}
private static void resetToFalse(AtomicBoolean... toResets) {
for (AtomicBoolean toReset : toResets) {
toReset.set(false);
}
}
}