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