174956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay/* 274956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * Copyright (C) 2016 The Android Open Source Project 374956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * 474956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * Licensed under the Apache License, Version 2.0 (the "License"); 574956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * you may not use this file except in compliance with the License. 674956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * You may obtain a copy of the License at 774956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * 874956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * http://www.apache.org/licenses/LICENSE-2.0 974956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * 1074956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * Unless required by applicable law or agreed to in writing, software 1174956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * distributed under the License is distributed on an "AS IS" BASIS, 1274956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1374956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * See the License for the specific language governing permissions and 1474956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay * limitations under the License. 1574956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay */ 1674956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay 1774956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKaypackage com.android.documentsui.testing; 1874956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay 1974956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKayimport static org.junit.Assert.assertEquals; 2038a725195b7a215cafb343ace23a63f7d38c712dAustin Kolanderimport static org.junit.Assert.assertFalse; 211597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKayimport static org.junit.Assert.assertTrue; 2274956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay 236737577c70cb873fde70a53f25be6e15b630c037Steve McKayimport java.util.concurrent.CompletableFuture; 246737577c70cb873fde70a53f25be6e15b630c037Steve McKayimport java.util.concurrent.ExecutionException; 256737577c70cb873fde70a53f25be6e15b630c037Steve McKayimport java.util.concurrent.TimeUnit; 266737577c70cb873fde70a53f25be6e15b630c037Steve McKayimport java.util.concurrent.TimeoutException; 2774956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKayimport java.util.function.Predicate; 2874956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay 2974956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKayimport javax.annotation.Nullable; 3074956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay 3174956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay/** 32990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay * Test {@link Predicate} that can be used to spy on, control responses from, 33990f76ea83a249cd8fc3c797e40626b94cd7945cSteve McKay * and make assertions against values tested. 3474956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay */ 3574956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKaypublic class TestPredicate<T> implements Predicate<T> { 3674956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay 376737577c70cb873fde70a53f25be6e15b630c037Steve McKay private final CompletableFuture<T> mFuture = new CompletableFuture<>(); 386737577c70cb873fde70a53f25be6e15b630c037Steve McKay private @Nullable T mLastValue; 396737577c70cb873fde70a53f25be6e15b630c037Steve McKay private boolean mNextReturnValue; 406737577c70cb873fde70a53f25be6e15b630c037Steve McKay private boolean mCalled; 4174956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay 4274956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay @Override 4374956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay public boolean test(T t) { 446737577c70cb873fde70a53f25be6e15b630c037Steve McKay mCalled = true; 456737577c70cb873fde70a53f25be6e15b630c037Steve McKay mLastValue = t; 466737577c70cb873fde70a53f25be6e15b630c037Steve McKay mFuture.complete(t); 476737577c70cb873fde70a53f25be6e15b630c037Steve McKay return mNextReturnValue; 4874956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay } 4974956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay 5074956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay public void assertLastArgument(@Nullable T expected) { 516737577c70cb873fde70a53f25be6e15b630c037Steve McKay assertEquals(expected, mLastValue); 5274956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay } 5374956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay 541597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay public void assertCalled() { 556737577c70cb873fde70a53f25be6e15b630c037Steve McKay assertTrue(mCalled); 561597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay } 571597e94cd38aff853f5773ebdf3bb9dcb7a8091dSteve McKay 5838a725195b7a215cafb343ace23a63f7d38c712dAustin Kolander public void assertNotCalled() { 5938a725195b7a215cafb343ace23a63f7d38c712dAustin Kolander assertFalse(mCalled); 6038a725195b7a215cafb343ace23a63f7d38c712dAustin Kolander } 6138a725195b7a215cafb343ace23a63f7d38c712dAustin Kolander 6274956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay public void nextReturn(boolean value) { 636737577c70cb873fde70a53f25be6e15b630c037Steve McKay mNextReturnValue = value; 646737577c70cb873fde70a53f25be6e15b630c037Steve McKay } 656737577c70cb873fde70a53f25be6e15b630c037Steve McKay 666737577c70cb873fde70a53f25be6e15b630c037Steve McKay public @Nullable T waitForCall(int timeout, TimeUnit unit) 676737577c70cb873fde70a53f25be6e15b630c037Steve McKay throws InterruptedException, ExecutionException, TimeoutException { 686737577c70cb873fde70a53f25be6e15b630c037Steve McKay return mFuture.get(timeout, unit); 6974956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay } 7045ac5fe9a9f21e6a73809cc575aa462690d0c058Austin Kolander 7145ac5fe9a9f21e6a73809cc575aa462690d0c058Austin Kolander public @Nullable T getLastValue() { 7245ac5fe9a9f21e6a73809cc575aa462690d0c058Austin Kolander return mLastValue; 7345ac5fe9a9f21e6a73809cc575aa462690d0c058Austin Kolander } 7474956af50b13b5ffde252a13547c960ba3e9c5b4Steve McKay} 75