17cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller/*
27cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller * Copyright (C) 2016 The Android Open Source Project
37cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller *
47cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller * Licensed under the Apache License, Version 2.0 (the "License");
57cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller * you may not use this file except in compliance with the License.
67cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller * You may obtain a copy of the License at
77cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller *
87cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller *      http://www.apache.org/licenses/LICENSE-2.0
97cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller *
107cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller * Unless required by applicable law or agreed to in writing, software
117cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller * distributed under the License is distributed on an "AS IS" BASIS,
127cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller * See the License for the specific language governing permissions and
147cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller * limitations under the License.
157cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller */
167cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
177cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fullerpackage libcore.java.util.function;
187cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
197cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fullerimport junit.framework.TestCase;
207cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
217cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fullerimport java.util.concurrent.atomic.AtomicBoolean;
227cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fullerimport java.util.function.DoublePredicate;
237cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
247cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fullerpublic class DoublePredicateTest extends TestCase {
257cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
267cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller  public void testAnd() throws Exception {
277cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    double arg = 5.0d;
287cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
297cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    AtomicBoolean alwaysTrueInvoked = new AtomicBoolean(false);
307cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    AtomicBoolean alwaysTrue2Invoked = new AtomicBoolean(false);
317cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    AtomicBoolean alwaysFalseInvoked = new AtomicBoolean(false);
327cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    AtomicBoolean alwaysFalse2Invoked = new AtomicBoolean(false);
337cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    AtomicBoolean[] invocationState = {
347cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller        alwaysTrueInvoked, alwaysTrue2Invoked, alwaysFalseInvoked, alwaysFalse2Invoked };
357cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
367cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    DoublePredicate alwaysTrue =
377cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller        x -> { alwaysTrueInvoked.set(true); assertEquals(x, arg); return true; };
387cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    DoublePredicate alwaysTrue2 =
397cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller        x -> { alwaysTrue2Invoked.set(true); assertEquals(x, arg); return true; };
407cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    DoublePredicate alwaysFalse =
417cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller        x -> { alwaysFalseInvoked.set(true); assertEquals(x, arg); return false; };
427cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    DoublePredicate alwaysFalse2 =
437cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller        x -> { alwaysFalse2Invoked.set(true); assertEquals(x, arg); return false; };
447cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
457cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    // true && true
467cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    resetToFalse(invocationState);
477cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertTrue(alwaysTrue.and(alwaysTrue2).test(arg));
487cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertTrue(alwaysTrueInvoked.get() && alwaysTrue2Invoked.get());
497cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
507cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    // true && false
517cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    resetToFalse(invocationState);
527cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertFalse(alwaysTrue.and(alwaysFalse).test(arg));
537cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertTrue(alwaysTrueInvoked.get() && alwaysFalseInvoked.get());
547cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
557cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    // false && false
567cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    resetToFalse(invocationState);
577cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertFalse(alwaysFalse.and(alwaysFalse2).test(arg));
587cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertTrue(alwaysFalseInvoked.get() && !alwaysFalse2Invoked.get());
597cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
607cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    // false && true
617cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    resetToFalse(invocationState);
627cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertFalse(alwaysFalse.and(alwaysTrue).test(arg));
637cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertTrue(alwaysFalseInvoked.get() && !alwaysTrueInvoked.get());
647cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller  }
657cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
667cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller  public void testAnd_null() throws Exception {
677cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    DoublePredicate alwaysTrue = x -> true;
687cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    try {
697cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller      alwaysTrue.and(null);
707cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller      fail();
717cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    } catch (NullPointerException expected) {}
727cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller  }
737cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
747cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller  public void testNegate() throws Exception {
757cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    double arg = 5.0d;
767cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    DoublePredicate alwaysTrue = x -> { assertEquals(x, arg); return true; };
777cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertFalse(alwaysTrue.negate().test(arg));
787cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
797cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    DoublePredicate alwaysFalse = x -> { assertEquals(x, arg); return false; };
807cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertTrue(alwaysFalse.negate().test(arg));
817cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller  }
827cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
837cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller  public void testOr() throws Exception {
847cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    double arg = 5.0d;
857cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
867cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    AtomicBoolean alwaysTrueInvoked = new AtomicBoolean(false);
877cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    AtomicBoolean alwaysTrue2Invoked = new AtomicBoolean(false);
887cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    AtomicBoolean alwaysFalseInvoked = new AtomicBoolean(false);
897cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    AtomicBoolean alwaysFalse2Invoked = new AtomicBoolean(false);
907cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    AtomicBoolean[] invocationState = {
917cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller        alwaysTrueInvoked, alwaysTrue2Invoked, alwaysFalseInvoked, alwaysFalse2Invoked };
927cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
937cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    DoublePredicate alwaysTrue =
947cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller        x -> { alwaysTrueInvoked.set(true); assertEquals(x, arg); return true; };
957cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    DoublePredicate alwaysTrue2 =
967cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller        x -> { alwaysTrue2Invoked.set(true); assertEquals(x, arg); return true; };
977cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    DoublePredicate alwaysFalse =
987cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller        x -> { alwaysFalseInvoked.set(true); assertEquals(x, arg); return false; };
997cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    DoublePredicate alwaysFalse2 =
1007cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller        x -> { alwaysFalse2Invoked.set(true); assertEquals(x, arg); return false; };
1017cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
1027cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    // true || true
1037cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    resetToFalse(invocationState);
1047cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertTrue(alwaysTrue.or(alwaysTrue2).test(arg));
1057cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertTrue(alwaysTrueInvoked.get() && !alwaysTrue2Invoked.get());
1067cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
1077cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    // true || false
1087cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    resetToFalse(invocationState);
1097cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertTrue(alwaysTrue.or(alwaysFalse).test(arg));
1107cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertTrue(alwaysTrueInvoked.get() && !alwaysFalseInvoked.get());
1117cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
1127cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    // false || false
1137cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    resetToFalse(invocationState);
1147cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertFalse(alwaysFalse.or(alwaysFalse2).test(arg));
1157cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertTrue(alwaysFalseInvoked.get() && alwaysFalse2Invoked.get());
1167cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
1177cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    // false || true
1187cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    resetToFalse(invocationState);
1197cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertTrue(alwaysFalse.or(alwaysTrue).test(arg));
1207cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    assertTrue(alwaysFalseInvoked.get() && alwaysTrueInvoked.get());
1217cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller  }
1227cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
1237cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller  public void testOr_null() throws Exception {
1247cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    DoublePredicate alwaysTrue = x -> true;
1257cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    try {
1267cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller      alwaysTrue.or(null);
1277cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller      fail();
1287cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    } catch (NullPointerException expected) {}
1297cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller  }
1307cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller
1317cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller  private static void resetToFalse(AtomicBoolean... toResets) {
1327cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    for (AtomicBoolean toReset : toResets) {
1337cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller      toReset.set(false);
1347cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller    }
1357cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller  }
1367cf6b7d47829942a72faf8c6525e403cd9f37e48Neil Fuller}
137