Refactor tests, add PoolTest

pull/506/head
Mattia Iavarone 6 years ago
parent e6daaeca03
commit 44d6d6541c
  1. 79
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/BaseTest.java
  2. 16
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraLoggerTest.java
  3. 2
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraUtilsTest.java
  4. 102
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewCallbacksTest.java
  5. 38
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java
  6. 39
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java
  7. 4
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MockCameraEngine.java
  8. 2
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/GestureFinderTest.java
  9. 4
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/PinchGestureFinderTest.java
  10. 7
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/ScrollGestureFinderTest.java
  11. 4
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/TapGestureFinderTest.java
  12. 2
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/GridLinesLayoutTest.java
  13. 4
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/utils/CropHelperTest.java
  14. 11
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/utils/OrientationHelperTest.java
  15. 3
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/markers/MarkerLayoutTest.java
  16. 31
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/overlay/OverlayLayoutTest.java
  17. 1
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/picture/PictureRecorderTest.java
  18. 5
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/preview/CameraPreviewTest.java
  19. 4
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/preview/SurfaceCameraPreviewTest.java
  20. 4
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/preview/TextureCameraPreviewTest.java
  21. 3
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/video/VideoRecorderTest.java
  22. 13
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraLogger.java
  23. 15
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraOptions.java
  24. 4
      cameraview/src/main/java/com/otaliastudios/cameraview/gesture/GestureFinder.java
  25. 168
      cameraview/src/test/java/com/otaliastudios/cameraview/internal/utils/PoolTest.java

@ -8,11 +8,9 @@ import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.PowerManager; import android.os.PowerManager;
import androidx.annotation.NonNull;
import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.platform.app.InstrumentationRegistry;
import android.util.Log;
import android.view.View;
import com.otaliastudios.cameraview.internal.utils.Op; import com.otaliastudios.cameraview.internal.utils.Op;
import org.junit.After; import org.junit.After;
@ -27,9 +25,7 @@ import java.util.concurrent.CountDownLatch;
import static android.content.Context.KEYGUARD_SERVICE; import static android.content.Context.KEYGUARD_SERVICE;
import static android.content.Context.POWER_SERVICE; import static android.content.Context.POWER_SERVICE;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
public class BaseTest { public class BaseTest {
@ -38,17 +34,16 @@ public class BaseTest {
// https://github.com/linkedin/test-butler/blob/bc2bb4df13d0a554d2e2b0ea710795017717e710/test-butler-app/src/main/java/com/linkedin/android/testbutler/ButlerService.java#L121 // https://github.com/linkedin/test-butler/blob/bc2bb4df13d0a554d2e2b0ea710795017717e710/test-butler-app/src/main/java/com/linkedin/android/testbutler/ButlerService.java#L121
@BeforeClass @BeforeClass
@SuppressWarnings("MissingPermission") public static void beforeClass_wakeUp() {
public static void wakeUp() {
CameraLogger.setLogLevel(CameraLogger.LEVEL_VERBOSE); CameraLogger.setLogLevel(CameraLogger.LEVEL_VERBOSE);
// Acquire a keyguard lock to prevent the lock screen from randomly appearing and breaking tests // Acquire a keyguard lock to prevent the lock screen from randomly appearing and breaking tests
KeyguardManager keyguardManager = (KeyguardManager) context().getSystemService(KEYGUARD_SERVICE); KeyguardManager keyguardManager = (KeyguardManager) getContext().getSystemService(KEYGUARD_SERVICE);
keyguardLock = keyguardManager.newKeyguardLock("CameraViewLock"); keyguardLock = keyguardManager.newKeyguardLock("CameraViewLock");
keyguardLock.disableKeyguard(); keyguardLock.disableKeyguard();
// Acquire a wake lock to prevent the cpu from going to sleep and breaking tests // Acquire a wake lock to prevent the cpu from going to sleep and breaking tests
PowerManager powerManager = (PowerManager) context().getSystemService(POWER_SERVICE); PowerManager powerManager = (PowerManager) getContext().getSystemService(POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK
| PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ACQUIRE_CAUSES_WAKEUP
| PowerManager.ON_AFTER_RELEASE, "CameraViewLock"); | PowerManager.ON_AFTER_RELEASE, "CameraViewLock");
@ -56,8 +51,9 @@ public class BaseTest {
} }
@AfterClass @AfterClass
@SuppressWarnings("MissingPermission") public static void afterClass_releaseWakeUp() {
public static void releaseWakeUp() { CameraLogger.setLogLevel(CameraLogger.LEVEL_ERROR);
wakeLock.release(); wakeLock.release();
keyguardLock.reenableKeyguard(); keyguardLock.reenableKeyguard();
} }
@ -66,61 +62,48 @@ public class BaseTest {
* This will make mockito report the error when it should. * This will make mockito report the error when it should.
* Mockito reports failure on the next mockito invocation, which is terrible * Mockito reports failure on the next mockito invocation, which is terrible
* since it might be on the next test or even never happen. * since it might be on the next test or even never happen.
*
* Calling this
*/ */
@After @After
public void syncMockito() { public void after_checkMockito() {
Object object = Mockito.mock(Object.class); Object object = Mockito.mock(Object.class);
//noinspection ResultOfMethodCallIgnored
object.toString(); object.toString();
} }
public static void ui(Runnable runnable) { @NonNull
InstrumentationRegistry.getInstrumentation().runOnMainSync(runnable); protected static Context getContext() {
}
public static void uiAsync(Runnable runnable) {
new Handler(Looper.getMainLooper()).post(runnable);
}
public static Context context() {
return InstrumentationRegistry.getInstrumentation().getContext(); return InstrumentationRegistry.getInstrumentation().getContext();
} }
public static void uiRequestLayout(final View view) { protected static void uiSync(Runnable runnable) {
ui(new Runnable() { InstrumentationRegistry.getInstrumentation().runOnMainSync(runnable);
@Override
public void run() {
view.requestLayout();
}
});
} }
public static void idle() { @SuppressWarnings("unused")
InstrumentationRegistry.getInstrumentation().waitForIdleSync(); protected static void uiAsync(Runnable runnable) {
new Handler(Looper.getMainLooper()).post(runnable);
} }
public static void sleep(long time) { @SuppressWarnings("unused")
try { protected static void waitUiIdle() {
Thread.sleep(time); InstrumentationRegistry.getInstrumentation().waitForIdleSync();
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
public static void grantPermissions() { protected static void grantAllPermissions() {
grantPermission("android.permission.CAMERA"); grantPermission("android.permission.CAMERA");
grantPermission("android.permission.RECORD_AUDIO"); grantPermission("android.permission.RECORD_AUDIO");
grantPermission("android.permission.WRITE_EXTERNAL_STORAGE"); grantPermission("android.permission.WRITE_EXTERNAL_STORAGE");
} }
public static void grantPermission(String permission) { @SuppressWarnings("WeakerAccess")
protected static void grantPermission(@NonNull String permission) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return; if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return;
String command = "pm grant " + context().getPackageName() + " " + permission; String command = "pm grant " + getContext().getPackageName() + " " + permission;
InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand(command); InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand(command);
} }
public static Stubber doCountDown(final CountDownLatch latch) { @NonNull
protected static Stubber doCountDown(final CountDownLatch latch) {
return doAnswer(new Answer<Object>() { return doAnswer(new Answer<Object>() {
@Override @Override
public Object answer(InvocationOnMock invocation) { public Object answer(InvocationOnMock invocation) {
@ -130,22 +113,24 @@ public class BaseTest {
}); });
} }
public static <T> Stubber doEndTask(final Op<T> op, final T response) { @NonNull
protected static <T> Stubber doEndOp(final Op<T> op, final T response) {
return doAnswer(new Answer<Object>() { return doAnswer(new Answer<Object>() {
@Override @Override
public Object answer(InvocationOnMock invocation) throws Throwable { public Object answer(InvocationOnMock invocation) {
op.end(response); op.end(response);
return null; return null;
} }
}); });
} }
public static Stubber doEndTask(final Op op, final int withReturnArgument) { @NonNull
protected static <T> Stubber doEndOp(final Op<T> op, final int withReturnArgument) {
return doAnswer(new Answer<Object>() { return doAnswer(new Answer<Object>() {
@Override @Override
public Object answer(InvocationOnMock invocation) throws Throwable { public Object answer(InvocationOnMock invocation) {
Object o = invocation.getArguments()[withReturnArgument];
//noinspection unchecked //noinspection unchecked
T o = (T) invocation.getArguments()[withReturnArgument];
op.end(o); op.end(o);
return null; return null;
} }

@ -10,8 +10,6 @@ import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
@ -26,11 +24,13 @@ public class CameraLoggerTest extends BaseTest {
@Before @Before
public void setUp() { public void setUp() {
CameraLogger.setLogLevel(CameraLogger.LEVEL_VERBOSE); CameraLogger.setLogLevel(CameraLogger.LEVEL_VERBOSE);
CameraLogger.unregisterLogger(CameraLogger.sAndroidLogger); // Avoid writing into Logs during these tests
logger = CameraLogger.create(loggerTag); logger = CameraLogger.create(loggerTag);
} }
@After @After
public void tearDown() { public void tearDown() {
CameraLogger.registerLogger(CameraLogger.sAndroidLogger);
logger = null; logger = null;
} }
@ -110,15 +110,9 @@ public class CameraLoggerTest extends BaseTest {
CameraLogger.registerLogger(mock); CameraLogger.registerLogger(mock);
final Op<Throwable> op = new Op<>(); final Op<Throwable> op = new Op<>();
doAnswer(new Answer() { doEndOp(op, 3)
@Override .when(mock)
public Object answer(InvocationOnMock invocation) throws Throwable { .log(anyInt(), anyString(), anyString(), any(Throwable.class));
Object[] args = invocation.getArguments();
Throwable throwable = (Throwable) args[3];
op.end(throwable);
return null;
}
}).when(mock).log(anyInt(), anyString(), anyString(), any(Throwable.class));
op.listen(); op.listen();
logger.e("Got no error."); logger.e("Got no error.");

@ -56,7 +56,7 @@ public class CameraUtilsTest extends BaseTest {
}; };
// Run on ui because it involves handlers. // Run on ui because it involves handlers.
ui(new Runnable() { uiSync(new Runnable() {
@Override @Override
public void run() { public void run() {
if (maxWidth > 0 && maxHeight > 0) { if (maxWidth > 0 && maxHeight > 0) {

@ -29,19 +29,14 @@ import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.mockito.stubbing.Stubber;
import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertNotNull;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Matchers.any; import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyFloat;
import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq; import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
@ -54,6 +49,8 @@ import static org.mockito.Mockito.verify;
@MediumTest @MediumTest
public class CameraViewCallbacksTest extends BaseTest { public class CameraViewCallbacksTest extends BaseTest {
private final static long DELAY = 500;
private CameraView camera; private CameraView camera;
private CameraListener listener; private CameraListener listener;
private FrameProcessor processor; private FrameProcessor processor;
@ -63,10 +60,10 @@ public class CameraViewCallbacksTest extends BaseTest {
@Before @Before
public void setUp() { public void setUp() {
ui(new Runnable() { uiSync(new Runnable() {
@Override @Override
public void run() { public void run() {
Context context = context(); Context context = getContext();
listener = mock(CameraListener.class); listener = mock(CameraListener.class);
processor = mock(FrameProcessor.class); processor = mock(FrameProcessor.class);
camera = new CameraView(context) { camera = new CameraView(context) {
@ -106,108 +103,101 @@ public class CameraViewCallbacksTest extends BaseTest {
listener = null; listener = null;
} }
// Completes our op.
private Stubber completeTask() {
return doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
op.end(true);
return null;
}
});
}
@Test @Test
public void testDontDispatchIfRemoved() { public void testDontDispatchIfRemoved() {
camera.removeCameraListener(listener); camera.removeCameraListener(listener);
completeTask().when(listener).onCameraOpened(null); CameraOptions options = mock(CameraOptions.class);
camera.mCameraCallbacks.dispatchOnCameraOpened(null); doEndOp(op, true).when(listener).onCameraOpened(options);
camera.mCameraCallbacks.dispatchOnCameraOpened(options);
assertNull(op.await(500)); assertNull(op.await(DELAY));
verify(listener, never()).onCameraOpened(null); verify(listener, never()).onCameraOpened(options);
} }
@Test @Test
public void testDontDispatchIfCleared() { public void testDontDispatchIfCleared() {
camera.clearCameraListeners(); camera.clearCameraListeners();
completeTask().when(listener).onCameraOpened(null); CameraOptions options = mock(CameraOptions.class);
camera.mCameraCallbacks.dispatchOnCameraOpened(null); doEndOp(op, true).when(listener).onCameraOpened(options);
camera.mCameraCallbacks.dispatchOnCameraOpened(options);
assertNull(op.await(500)); assertNull(op.await(DELAY));
verify(listener, never()).onCameraOpened(null); verify(listener, never()).onCameraOpened(options);
} }
@Test @Test
public void testDispatchOnCameraOpened() { public void testDispatchOnCameraOpened() {
completeTask().when(listener).onCameraOpened(null); CameraOptions options = mock(CameraOptions.class);
camera.mCameraCallbacks.dispatchOnCameraOpened(null); doEndOp(op, true).when(listener).onCameraOpened(options);
camera.mCameraCallbacks.dispatchOnCameraOpened(options);
assertNotNull(op.await(500)); assertNotNull(op.await(DELAY));
verify(listener, times(1)).onCameraOpened(null); verify(listener, times(1)).onCameraOpened(options);
} }
@Test @Test
public void testDispatchOnCameraClosed() { public void testDispatchOnCameraClosed() {
completeTask().when(listener).onCameraClosed(); doEndOp(op, true).when(listener).onCameraClosed();
camera.mCameraCallbacks.dispatchOnCameraClosed(); camera.mCameraCallbacks.dispatchOnCameraClosed();
assertNotNull(op.await(500)); assertNotNull(op.await(DELAY));
verify(listener, times(1)).onCameraClosed(); verify(listener, times(1)).onCameraClosed();
} }
@Test @Test
public void testDispatchOnVideoRecordingStart() { public void testDispatchOnVideoRecordingStart() {
completeTask().when(listener).onVideoRecordingStart(); doEndOp(op, true).when(listener).onVideoRecordingStart();
camera.mCameraCallbacks.dispatchOnVideoRecordingStart(); camera.mCameraCallbacks.dispatchOnVideoRecordingStart();
assertNotNull(op.await(500)); assertNotNull(op.await(DELAY));
verify(listener, times(1)).onVideoRecordingStart(); verify(listener, times(1)).onVideoRecordingStart();
} }
@Test @Test
public void testDispatchOnVideoRecordingEnd() { public void testDispatchOnVideoRecordingEnd() {
completeTask().when(listener).onVideoRecordingEnd(); doEndOp(op, true).when(listener).onVideoRecordingEnd();
camera.mCameraCallbacks.dispatchOnVideoRecordingEnd(); camera.mCameraCallbacks.dispatchOnVideoRecordingEnd();
assertNotNull(op.await(500)); assertNotNull(op.await(DELAY));
verify(listener, times(1)).onVideoRecordingEnd(); verify(listener, times(1)).onVideoRecordingEnd();
} }
@Test @Test
public void testDispatchOnVideoTaken() { public void testDispatchOnVideoTaken() {
VideoResult.Stub stub = new VideoResult.Stub(); VideoResult.Stub stub = new VideoResult.Stub();
completeTask().when(listener).onVideoTaken(any(VideoResult.class)); doEndOp(op, true).when(listener).onVideoTaken(any(VideoResult.class));
camera.mCameraCallbacks.dispatchOnVideoTaken(stub); camera.mCameraCallbacks.dispatchOnVideoTaken(stub);
assertNotNull(op.await(500)); assertNotNull(op.await(DELAY));
verify(listener, times(1)).onVideoTaken(any(VideoResult.class)); verify(listener, times(1)).onVideoTaken(any(VideoResult.class));
} }
@Test @Test
public void testDispatchOnPictureTaken() { public void testDispatchOnPictureTaken() {
PictureResult.Stub stub = new PictureResult.Stub(); PictureResult.Stub stub = new PictureResult.Stub();
completeTask().when(listener).onPictureTaken(any(PictureResult.class)); doEndOp(op, true).when(listener).onPictureTaken(any(PictureResult.class));
camera.mCameraCallbacks.dispatchOnPictureTaken(stub); camera.mCameraCallbacks.dispatchOnPictureTaken(stub);
assertNotNull(op.await(500)); assertNotNull(op.await(DELAY));
verify(listener, times(1)).onPictureTaken(any(PictureResult.class)); verify(listener, times(1)).onPictureTaken(any(PictureResult.class));
} }
@Test @Test
public void testDispatchOnZoomChanged() { public void testDispatchOnZoomChanged() {
completeTask().when(listener).onZoomChanged(eq(0f), eq(new float[]{0, 1}), nullable(PointF[].class)); doEndOp(op, true).when(listener).onZoomChanged(eq(0f), eq(new float[]{0, 1}), nullable(PointF[].class));
camera.mCameraCallbacks.dispatchOnZoomChanged(0f, null); camera.mCameraCallbacks.dispatchOnZoomChanged(0f, null);
assertNotNull(op.await(500)); assertNotNull(op.await(DELAY));
verify(listener, times(1)).onZoomChanged(eq(0f), eq(new float[]{0, 1}), nullable(PointF[].class)); verify(listener, times(1)).onZoomChanged(eq(0f), eq(new float[]{0, 1}), nullable(PointF[].class));
} }
@Test @Test
public void testDispatchOnExposureCorrectionChanged() { public void testDispatchOnExposureCorrectionChanged() {
completeTask().when(listener).onExposureCorrectionChanged(0f, null, null); float[] bounds = new float[]{};
camera.mCameraCallbacks.dispatchOnExposureCorrectionChanged(0f, null, null); doEndOp(op, true).when(listener).onExposureCorrectionChanged(0f, bounds, null);
camera.mCameraCallbacks.dispatchOnExposureCorrectionChanged(0f, bounds, null);
assertNotNull(op.await(500)); assertNotNull(op.await(DELAY));
verify(listener, times(1)).onExposureCorrectionChanged(0f, null, null); verify(listener, times(1)).onExposureCorrectionChanged(0f, bounds, null);
} }
@Test @Test
@ -221,10 +211,10 @@ public class CameraViewCallbacksTest extends BaseTest {
camera.mMarkerLayout = markerLayout; camera.mMarkerLayout = markerLayout;
PointF point = new PointF(); PointF point = new PointF();
completeTask().when(listener).onAutoFocusStart(point); doEndOp(op, true).when(listener).onAutoFocusStart(point);
camera.mCameraCallbacks.dispatchOnFocusStart(Gesture.TAP, point); camera.mCameraCallbacks.dispatchOnFocusStart(Gesture.TAP, point);
assertNotNull(op.await(500)); assertNotNull(op.await(DELAY));
verify(listener, times(1)).onAutoFocusStart(point); verify(listener, times(1)).onAutoFocusStart(point);
verify(marker, times(1)).onAutoFocusStart(AutoFocusTrigger.GESTURE, point); verify(marker, times(1)).onAutoFocusStart(AutoFocusTrigger.GESTURE, point);
verify(markerLayout, times(1)).onEvent(eq(MarkerLayout.TYPE_AUTOFOCUS), any(PointF[].class)); verify(markerLayout, times(1)).onEvent(eq(MarkerLayout.TYPE_AUTOFOCUS), any(PointF[].class));
@ -240,10 +230,10 @@ public class CameraViewCallbacksTest extends BaseTest {
PointF point = new PointF(); PointF point = new PointF();
boolean success = true; boolean success = true;
completeTask().when(listener).onAutoFocusEnd(success, point); doEndOp(op, true).when(listener).onAutoFocusEnd(success, point);
camera.mCameraCallbacks.dispatchOnFocusEnd(Gesture.TAP, success, point); camera.mCameraCallbacks.dispatchOnFocusEnd(Gesture.TAP, success, point);
assertNotNull(op.await(500)); assertNotNull(op.await(DELAY));
verify(listener, times(1)).onAutoFocusEnd(success, point); verify(listener, times(1)).onAutoFocusEnd(success, point);
verify(marker, times(1)).onAutoFocusEnd(AutoFocusTrigger.GESTURE, success, point); verify(marker, times(1)).onAutoFocusEnd(AutoFocusTrigger.GESTURE, success, point);
@ -252,9 +242,9 @@ public class CameraViewCallbacksTest extends BaseTest {
@Test @Test
public void testOrientationCallbacks() { public void testOrientationCallbacks() {
completeTask().when(listener).onOrientationChanged(anyInt()); doEndOp(op, true).when(listener).onOrientationChanged(anyInt());
camera.mCameraCallbacks.onDeviceOrientationChanged(90); camera.mCameraCallbacks.onDeviceOrientationChanged(90);
assertNotNull(op.await(500)); assertNotNull(op.await(DELAY));
verify(listener, times(1)).onOrientationChanged(anyInt()); verify(listener, times(1)).onOrientationChanged(anyInt());
} }
@ -263,20 +253,20 @@ public class CameraViewCallbacksTest extends BaseTest {
@Test @Test
public void testCameraError() { public void testCameraError() {
CameraException error = new CameraException(new RuntimeException("Error")); CameraException error = new CameraException(new RuntimeException("Error"));
completeTask().when(listener).onCameraError(error); doEndOp(op, true).when(listener).onCameraError(error);
camera.mCameraCallbacks.dispatchError(error); camera.mCameraCallbacks.dispatchError(error);
assertNotNull(op.await(500)); assertNotNull(op.await(DELAY));
verify(listener, times(1)).onCameraError(error); verify(listener, times(1)).onCameraError(error);
} }
@Test @Test
public void testProcessFrame() { public void testProcessFrame() {
Frame mock = mock(Frame.class); Frame mock = mock(Frame.class);
completeTask().when(processor).process(mock); doEndOp(op, true).when(processor).process(mock);
camera.mCameraCallbacks.dispatchFrame(mock); camera.mCameraCallbacks.dispatchFrame(mock);
assertNotNull(op.await(500)); assertNotNull(op.await(DELAY));
verify(processor, times(1)).process(mock); verify(processor, times(1)).process(mock);
} }
} }

@ -10,7 +10,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest; import androidx.test.filters.MediumTest;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
@ -52,9 +51,6 @@ import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.w3c.dom.Attr;
import static org.junit.Assert.*; import static org.junit.Assert.*;
@ -74,10 +70,10 @@ public class CameraViewTest extends BaseTest {
@Before @Before
public void setUp() { public void setUp() {
ui(new Runnable() { uiSync(new Runnable() {
@Override @Override
public void run() { public void run() {
Context context = context(); Context context = getContext();
cameraView = new CameraView(context) { cameraView = new CameraView(context) {
@NonNull @NonNull
@ -151,8 +147,8 @@ public class CameraViewTest extends BaseTest {
@Test @Test
public void testDefaults() { public void testDefaults() {
// CameraEngine // CameraEngine
TypedArray empty = context().obtainStyledAttributes(new int[]{}); TypedArray empty = getContext().obtainStyledAttributes(new int[]{});
ControlParser controls = new ControlParser(context(), empty); ControlParser controls = new ControlParser(getContext(), empty);
assertEquals(cameraView.getFlash(), controls.getFlash()); assertEquals(cameraView.getFlash(), controls.getFlash());
assertEquals(cameraView.getFacing(), controls.getFacing()); assertEquals(cameraView.getFacing(), controls.getFacing());
assertEquals(cameraView.getGrid(), controls.getGrid()); assertEquals(cameraView.getGrid(), controls.getGrid());
@ -236,7 +232,7 @@ public class CameraViewTest extends BaseTest {
mockController.setMockCameraOptions(o); mockController.setMockCameraOptions(o);
mockController.setMockEngineState(true); mockController.setMockEngineState(true);
MotionEvent event = MotionEvent.obtain(0L, 0L, 0, 0f, 0f, 0); MotionEvent event = MotionEvent.obtain(0L, 0L, 0, 0f, 0f, 0);
ui(new Runnable() { uiSync(new Runnable() {
@Override @Override
public void run() { public void run() {
cameraView.mTapGestureFinder = new TapGestureFinder(cameraView.mCameraCallbacks) { cameraView.mTapGestureFinder = new TapGestureFinder(cameraView.mCameraCallbacks) {
@ -258,7 +254,7 @@ public class CameraViewTest extends BaseTest {
mockController.setMockCameraOptions(o); mockController.setMockCameraOptions(o);
mockController.setMockEngineState(true); mockController.setMockEngineState(true);
MotionEvent event = MotionEvent.obtain(0L, 0L, 0, 0f, 0f, 0); MotionEvent event = MotionEvent.obtain(0L, 0L, 0, 0f, 0f, 0);
ui(new Runnable() { uiSync(new Runnable() {
@Override @Override
public void run() { public void run() {
cameraView.mTapGestureFinder = new TapGestureFinder(cameraView.mCameraCallbacks) { cameraView.mTapGestureFinder = new TapGestureFinder(cameraView.mCameraCallbacks) {
@ -285,7 +281,7 @@ public class CameraViewTest extends BaseTest {
mockController.mZoomChanged = false; mockController.mZoomChanged = false;
MotionEvent event = MotionEvent.obtain(0L, 0L, 0, 0f, 0f, 0); MotionEvent event = MotionEvent.obtain(0L, 0L, 0, 0f, 0f, 0);
final FactorHolder factor = new FactorHolder(); final FactorHolder factor = new FactorHolder();
ui(new Runnable() { uiSync(new Runnable() {
@Override @Override
public void run() { public void run() {
cameraView.mPinchGestureFinder = new PinchGestureFinder(cameraView.mCameraCallbacks) { cameraView.mPinchGestureFinder = new PinchGestureFinder(cameraView.mCameraCallbacks) {
@ -326,7 +322,7 @@ public class CameraViewTest extends BaseTest {
mockController.mExposureCorrectionChanged = false; mockController.mExposureCorrectionChanged = false;
MotionEvent event = MotionEvent.obtain(0L, 0L, 0, 0f, 0f, 0); MotionEvent event = MotionEvent.obtain(0L, 0L, 0, 0f, 0f, 0);
final FactorHolder factor = new FactorHolder(); final FactorHolder factor = new FactorHolder();
ui(new Runnable() { uiSync(new Runnable() {
@Override @Override
public void run() { public void run() {
cameraView.mScrollGestureFinder = new ScrollGestureFinder(cameraView.mCameraCallbacks) { cameraView.mScrollGestureFinder = new ScrollGestureFinder(cameraView.mCameraCallbacks) {
@ -685,7 +681,6 @@ public class CameraViewTest extends BaseTest {
//region Lists of listeners and processors //region Lists of listeners and processors
@SuppressWarnings("UseBulkOperation")
@Test @Test
public void testCameraListenerList() { public void testCameraListenerList() {
assertTrue(cameraView.mListeners.isEmpty()); assertTrue(cameraView.mListeners.isEmpty());
@ -713,7 +708,6 @@ public class CameraViewTest extends BaseTest {
} }
} }
@SuppressWarnings({"NullableProblems", "UseBulkOperation"})
@Test @Test
public void testFrameProcessorsList() { public void testFrameProcessorsList() {
assertTrue(cameraView.mFrameProcessors.isEmpty()); assertTrue(cameraView.mFrameProcessors.isEmpty());
@ -775,13 +769,7 @@ public class CameraViewTest extends BaseTest {
final PointF point = new PointF(0, 0); final PointF point = new PointF(0, 0);
final PointF[] points = new PointF[]{ point }; final PointF[] points = new PointF[]{ point };
final Op<Boolean> op = new Op<>(true); final Op<Boolean> op = new Op<>(true);
doAnswer(new Answer() { doEndOp(op, true).when(markerLayout).onEvent(MarkerLayout.TYPE_AUTOFOCUS, points);
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
op.end(true);
return null;
}
}).when(markerLayout).onEvent(MarkerLayout.TYPE_AUTOFOCUS, points);
cameraView.mCameraCallbacks.dispatchOnFocusStart(Gesture.TAP, point); cameraView.mCameraCallbacks.dispatchOnFocusStart(Gesture.TAP, point);
assertNotNull(op.await(100)); assertNotNull(op.await(100));
} }
@ -793,7 +781,7 @@ public class CameraViewTest extends BaseTest {
@Test @Test
public void testOverlays_generateLayoutParams() { public void testOverlays_generateLayoutParams() {
cameraView.mOverlayLayout = spy(cameraView.mOverlayLayout); cameraView.mOverlayLayout = spy(cameraView.mOverlayLayout);
LayoutInflater inflater = LayoutInflater.from(context()); LayoutInflater inflater = LayoutInflater.from(getContext());
View overlay = inflater.inflate(com.otaliastudios.cameraview.test.R.layout.overlay, cameraView, false); View overlay = inflater.inflate(com.otaliastudios.cameraview.test.R.layout.overlay, cameraView, false);
assertTrue(overlay.getLayoutParams() instanceof OverlayLayout.LayoutParams); assertTrue(overlay.getLayoutParams() instanceof OverlayLayout.LayoutParams);
verify(cameraView.mOverlayLayout, times(1)).isOverlay(any(AttributeSet.class)); verify(cameraView.mOverlayLayout, times(1)).isOverlay(any(AttributeSet.class));
@ -804,7 +792,7 @@ public class CameraViewTest extends BaseTest {
@Test @Test
public void testOverlays_dontGenerateLayoutParams() { public void testOverlays_dontGenerateLayoutParams() {
cameraView.mOverlayLayout = spy(cameraView.mOverlayLayout); cameraView.mOverlayLayout = spy(cameraView.mOverlayLayout);
LayoutInflater inflater = LayoutInflater.from(context()); LayoutInflater inflater = LayoutInflater.from(getContext());
View overlay = inflater.inflate(com.otaliastudios.cameraview.test.R.layout.not_overlay, cameraView, false); View overlay = inflater.inflate(com.otaliastudios.cameraview.test.R.layout.not_overlay, cameraView, false);
assertFalse(overlay.getLayoutParams() instanceof OverlayLayout.LayoutParams); assertFalse(overlay.getLayoutParams() instanceof OverlayLayout.LayoutParams);
verify(cameraView.mOverlayLayout, times(1)).isOverlay(any(AttributeSet.class)); verify(cameraView.mOverlayLayout, times(1)).isOverlay(any(AttributeSet.class));
@ -814,7 +802,7 @@ public class CameraViewTest extends BaseTest {
@Test @Test
public void testOverlays_addOverlayView() { public void testOverlays_addOverlayView() {
cameraView.mOverlayLayout = spy(cameraView.mOverlayLayout); cameraView.mOverlayLayout = spy(cameraView.mOverlayLayout);
View overlay = new View(context()); View overlay = new View(getContext());
OverlayLayout.LayoutParams params = new OverlayLayout.LayoutParams(10, 10); OverlayLayout.LayoutParams params = new OverlayLayout.LayoutParams(10, 10);
int count = cameraView.getChildCount(); int count = cameraView.getChildCount();
cameraView.addView(overlay, 0, params); cameraView.addView(overlay, 0, params);
@ -826,7 +814,7 @@ public class CameraViewTest extends BaseTest {
@Test @Test
public void testOverlays_dontAddOverlayView() { public void testOverlays_dontAddOverlayView() {
cameraView.mOverlayLayout = spy(cameraView.mOverlayLayout); cameraView.mOverlayLayout = spy(cameraView.mOverlayLayout);
View overlay = new View(context()); View overlay = new View(getContext());
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(10, 10); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(10, 10);
int count = cameraView.getChildCount(); int count = cameraView.getChildCount();
cameraView.addView(overlay, 0, params); cameraView.addView(overlay, 0, params);

@ -77,7 +77,7 @@ public abstract class CameraIntegrationTest extends BaseTest {
@BeforeClass @BeforeClass
public static void grant() { public static void grant() {
grantPermissions(); grantAllPermissions();
} }
@NonNull @NonNull
@ -88,7 +88,7 @@ public abstract class CameraIntegrationTest extends BaseTest {
LOG.e("Test started. Setting up camera."); LOG.e("Test started. Setting up camera.");
WorkerHandler.destroy(); WorkerHandler.destroy();
ui(new Runnable() { uiSync(new Runnable() {
@Override @Override
public void run() { public void run() {
camera = new CameraView(rule.getActivity()) { camera = new CameraView(rule.getActivity()) {
@ -139,12 +139,13 @@ public abstract class CameraIntegrationTest extends BaseTest {
private CameraOptions openSync(boolean expectSuccess) { private CameraOptions openSync(boolean expectSuccess) {
camera.open(); camera.open();
final Op<CameraOptions> open = new Op<>(true); final Op<CameraOptions> open = new Op<>(true);
doEndTask(open, 0).when(listener).onCameraOpened(any(CameraOptions.class)); doEndOp(open, 0).when(listener).onCameraOpened(any(CameraOptions.class));
CameraOptions result = open.await(DELAY); CameraOptions result = open.await(DELAY);
if (expectSuccess) { if (expectSuccess) {
assertNotNull("Can open", result); assertNotNull("Can open", result);
// Extra wait for the bind state. // Extra wait for the bind state.
// TODO fix this and other while {} in this class in a more elegant way. // TODO fix this and other while {} in this class in a more elegant way.
//noinspection StatementWithEmptyBody
while (controller.getBindState() != CameraEngine.STATE_STARTED) {} while (controller.getBindState() != CameraEngine.STATE_STARTED) {}
} else { } else {
assertNull("Should not open", result); assertNull("Should not open", result);
@ -155,7 +156,7 @@ public abstract class CameraIntegrationTest extends BaseTest {
private void closeSync(boolean expectSuccess) { private void closeSync(boolean expectSuccess) {
camera.close(); camera.close();
final Op<Boolean> close = new Op<>(true); final Op<Boolean> close = new Op<>(true);
doEndTask(close, true).when(listener).onCameraClosed(); doEndOp(close, true).when(listener).onCameraClosed();
Boolean result = close.await(DELAY); Boolean result = close.await(DELAY);
if (expectSuccess) { if (expectSuccess) {
assertNotNull("Can close", result); assertNotNull("Can close", result);
@ -173,8 +174,8 @@ public abstract class CameraIntegrationTest extends BaseTest {
// Op for onVideoTaken. // Op for onVideoTaken.
final Op<VideoResult> video = new Op<>(true); final Op<VideoResult> video = new Op<>(true);
doEndTask(video, 0).when(listener).onVideoTaken(any(VideoResult.class)); doEndOp(video, 0).when(listener).onVideoTaken(any(VideoResult.class));
doEndTask(video, null).when(listener).onCameraError(argThat(new ArgumentMatcher<CameraException>() { doEndOp(video, null).when(listener).onCameraError(argThat(new ArgumentMatcher<CameraException>() {
@Override @Override
public boolean matches(CameraException argument) { public boolean matches(CameraException argument) {
return argument.getReason() == CameraException.REASON_VIDEO_FAILED; return argument.getReason() == CameraException.REASON_VIDEO_FAILED;
@ -195,8 +196,8 @@ public abstract class CameraIntegrationTest extends BaseTest {
@Nullable @Nullable
private PictureResult waitForPictureResult(boolean expectSuccess) { private PictureResult waitForPictureResult(boolean expectSuccess) {
final Op<PictureResult> pic = new Op<>(true); final Op<PictureResult> pic = new Op<>(true);
doEndTask(pic, 0).when(listener).onPictureTaken(any(PictureResult.class)); doEndOp(pic, 0).when(listener).onPictureTaken(any(PictureResult.class));
doEndTask(pic, null).when(listener).onCameraError(argThat(new ArgumentMatcher<CameraException>() { doEndOp(pic, null).when(listener).onCameraError(argThat(new ArgumentMatcher<CameraException>() {
@Override @Override
public boolean matches(CameraException argument) { public boolean matches(CameraException argument) {
return argument.getReason() == CameraException.REASON_PICTURE_FAILED; return argument.getReason() == CameraException.REASON_PICTURE_FAILED;
@ -217,14 +218,14 @@ public abstract class CameraIntegrationTest extends BaseTest {
private void takeVideoSync(boolean expectSuccess, int duration) { private void takeVideoSync(boolean expectSuccess, int duration) {
final Op<Boolean> op = new Op<>(true); final Op<Boolean> op = new Op<>(true);
doEndTask(op, true).when(listener).onVideoRecordingStart(); doEndOp(op, true).when(listener).onVideoRecordingStart();
doEndTask(op, false).when(listener).onCameraError(argThat(new ArgumentMatcher<CameraException>() { doEndOp(op, false).when(listener).onCameraError(argThat(new ArgumentMatcher<CameraException>() {
@Override @Override
public boolean matches(CameraException argument) { public boolean matches(CameraException argument) {
return argument.getReason() == CameraException.REASON_VIDEO_FAILED; return argument.getReason() == CameraException.REASON_VIDEO_FAILED;
} }
})); }));
File file = new File(context().getFilesDir(), "video.mp4"); File file = new File(getContext().getFilesDir(), "video.mp4");
if (duration > 0) { if (duration > 0) {
camera.takeVideo(file, duration); camera.takeVideo(file, duration);
} else { } else {
@ -239,21 +240,21 @@ public abstract class CameraIntegrationTest extends BaseTest {
} }
} }
@SuppressWarnings("unused") @SuppressWarnings({"unused", "SameParameterValue"})
private void takeVideoSnapshotSync(boolean expectSuccess) { private void takeVideoSnapshotSync(boolean expectSuccess) {
takeVideoSnapshotSync(expectSuccess,0); takeVideoSnapshotSync(expectSuccess,0);
} }
private void takeVideoSnapshotSync(boolean expectSuccess, int duration) { private void takeVideoSnapshotSync(boolean expectSuccess, int duration) {
final Op<Boolean> op = new Op<>(true); final Op<Boolean> op = new Op<>(true);
doEndTask(op, true).when(listener).onVideoRecordingStart(); doEndOp(op, true).when(listener).onVideoRecordingStart();
doEndTask(op, false).when(listener).onCameraError(argThat(new ArgumentMatcher<CameraException>() { doEndOp(op, false).when(listener).onCameraError(argThat(new ArgumentMatcher<CameraException>() {
@Override @Override
public boolean matches(CameraException argument) { public boolean matches(CameraException argument) {
return argument.getReason() == CameraException.REASON_VIDEO_FAILED; return argument.getReason() == CameraException.REASON_VIDEO_FAILED;
} }
})); }));
File file = new File(context().getFilesDir(), "video.mp4"); File file = new File(getContext().getFilesDir(), "video.mp4");
if (duration > 0) { if (duration > 0) {
camera.takeVideoSnapshot(file, duration); camera.takeVideoSnapshot(file, duration);
} else { } else {
@ -581,7 +582,7 @@ public abstract class CameraIntegrationTest extends BaseTest {
CameraOptions o = openSync(true); CameraOptions o = openSync(true);
final Op<PointF> focus = new Op<>(true); final Op<PointF> focus = new Op<>(true);
doEndTask(focus, 0).when(listener).onAutoFocusStart(any(PointF.class)); doEndOp(focus, 0).when(listener).onAutoFocusStart(any(PointF.class));
camera.startAutoFocus(1, 1); camera.startAutoFocus(1, 1);
PointF point = focus.await(300); PointF point = focus.await(300);
@ -598,7 +599,7 @@ public abstract class CameraIntegrationTest extends BaseTest {
CameraOptions o = openSync(true); CameraOptions o = openSync(true);
final Op<PointF> focus = new Op<>(true); final Op<PointF> focus = new Op<>(true);
doEndTask(focus, 1).when(listener).onAutoFocusEnd(anyBoolean(), any(PointF.class)); doEndOp(focus, 1).when(listener).onAutoFocusEnd(anyBoolean(), any(PointF.class));
camera.startAutoFocus(1, 1); camera.startAutoFocus(1, 1);
// Stop is not guaranteed to be called, we use a delay. So wait at least the delay time. // Stop is not guaranteed to be called, we use a delay. So wait at least the delay time.
@ -638,7 +639,7 @@ public abstract class CameraIntegrationTest extends BaseTest {
@SuppressWarnings("StatementWithEmptyBody") @SuppressWarnings("StatementWithEmptyBody")
@Test @Test
public void testCapturePicture_size() throws Exception { public void testCapturePicture_size() {
openSync(true); openSync(true);
// PictureSize can still be null after opened. // PictureSize can still be null after opened.
// TODO be more elegant // TODO be more elegant
@ -688,7 +689,7 @@ public abstract class CameraIntegrationTest extends BaseTest {
@SuppressWarnings("StatementWithEmptyBody") @SuppressWarnings("StatementWithEmptyBody")
@Test @Test
public void testCaptureSnapshot_size() throws Exception { public void testCaptureSnapshot_size() {
openSync(true); openSync(true);
// SnapshotSize can still be null after opened. // SnapshotSize can still be null after opened.
// TODO be more elegant // TODO be more elegant

@ -9,22 +9,18 @@ import com.google.android.gms.tasks.Tasks;
import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.CameraOptions;
import com.otaliastudios.cameraview.PictureResult; import com.otaliastudios.cameraview.PictureResult;
import com.otaliastudios.cameraview.VideoResult; import com.otaliastudios.cameraview.VideoResult;
import com.otaliastudios.cameraview.controls.Audio;
import com.otaliastudios.cameraview.controls.Facing; import com.otaliastudios.cameraview.controls.Facing;
import com.otaliastudios.cameraview.controls.Flash; import com.otaliastudios.cameraview.controls.Flash;
import com.otaliastudios.cameraview.frame.FrameManager; import com.otaliastudios.cameraview.frame.FrameManager;
import com.otaliastudios.cameraview.gesture.Gesture; import com.otaliastudios.cameraview.gesture.Gesture;
import com.otaliastudios.cameraview.controls.Hdr; import com.otaliastudios.cameraview.controls.Hdr;
import com.otaliastudios.cameraview.controls.Mode;
import com.otaliastudios.cameraview.controls.WhiteBalance; import com.otaliastudios.cameraview.controls.WhiteBalance;
import com.otaliastudios.cameraview.size.AspectRatio; import com.otaliastudios.cameraview.size.AspectRatio;
import com.otaliastudios.cameraview.size.Size; import com.otaliastudios.cameraview.size.Size;
import com.otaliastudios.cameraview.size.SizeSelector;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

@ -40,7 +40,7 @@ public abstract class GestureFinderTest<T extends GestureFinder> extends BaseTes
@Before @Before
public void setUp() { public void setUp() {
ui(new Runnable() { uiSync(new Runnable() {
@Override @Override
public void run() { public void run() {
TestActivity a = rule.getActivity(); TestActivity a = rule.getActivity();

@ -1,8 +1,6 @@
package com.otaliastudios.cameraview.gesture; package com.otaliastudios.cameraview.gesture;
import android.content.Context;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.test.espresso.ViewAction; import androidx.test.espresso.ViewAction;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
@ -11,10 +9,8 @@ import androidx.test.filters.SmallTest;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)

@ -1,8 +1,6 @@
package com.otaliastudios.cameraview.gesture; package com.otaliastudios.cameraview.gesture;
import android.content.Context;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.test.espresso.ViewAction; import androidx.test.espresso.ViewAction;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
@ -11,13 +9,10 @@ import androidx.test.filters.SmallTest;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.swipeDown; import static androidx.test.espresso.action.ViewActions.swipeDown;
import static androidx.test.espresso.action.ViewActions.swipeLeft; import static androidx.test.espresso.action.ViewActions.swipeLeft;
import static androidx.test.espresso.action.ViewActions.swipeRight; import static androidx.test.espresso.action.ViewActions.swipeRight;
import static androidx.test.espresso.action.ViewActions.swipeUp; import static androidx.test.espresso.action.ViewActions.swipeUp;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static junit.framework.Assert.assertNotNull;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
@ -33,7 +28,7 @@ public class ScrollGestureFinderTest extends GestureFinderTest<ScrollGestureFind
@Test @Test
public void testDefaults() { public void testDefaults() {
assertNull(finder.getGesture()); assertNull(finder.mType);
assertEquals(finder.getPoints().length, 2); assertEquals(finder.getPoints().length, 2);
assertEquals(finder.getPoints()[0].x, 0, 0); assertEquals(finder.getPoints()[0].x, 0, 0);
assertEquals(finder.getPoints()[0].y, 0, 0); assertEquals(finder.getPoints()[0].y, 0, 0);

@ -1,8 +1,6 @@
package com.otaliastudios.cameraview.gesture; package com.otaliastudios.cameraview.gesture;
import android.content.Context;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.test.espresso.action.GeneralClickAction; import androidx.test.espresso.action.GeneralClickAction;
import androidx.test.espresso.action.GeneralLocation; import androidx.test.espresso.action.GeneralLocation;
@ -32,7 +30,7 @@ public class TapGestureFinderTest extends GestureFinderTest<TapGestureFinder> {
@Test @Test
public void testDefaults() { public void testDefaults() {
assertNull(finder.getGesture()); assertNull(finder.mType);
assertEquals(finder.getPoints().length, 1); assertEquals(finder.getPoints().length, 1);
assertEquals(finder.getPoints()[0].x, 0, 0); assertEquals(finder.getPoints()[0].x, 0, 0);
assertEquals(finder.getPoints()[0].y, 0, 0); assertEquals(finder.getPoints()[0].y, 0, 0);

@ -27,7 +27,7 @@ public class GridLinesLayoutTest extends BaseTest {
@Before @Before
public void setUp() { public void setUp() {
ui(new Runnable() { uiSync(new Runnable() {
@Override @Override
public void run() { public void run() {
TestActivity a = rule.getActivity(); TestActivity a = rule.getActivity();

@ -4,7 +4,6 @@ package com.otaliastudios.cameraview.internal.utils;
import android.graphics.Rect; import android.graphics.Rect;
import com.otaliastudios.cameraview.BaseTest; import com.otaliastudios.cameraview.BaseTest;
import com.otaliastudios.cameraview.internal.utils.CropHelper;
import com.otaliastudios.cameraview.size.AspectRatio; import com.otaliastudios.cameraview.size.AspectRatio;
import com.otaliastudios.cameraview.size.Size; import com.otaliastudios.cameraview.size.Size;
@ -15,11 +14,8 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
@SmallTest @SmallTest

@ -6,7 +6,6 @@ import androidx.test.filters.SmallTest;
import android.view.OrientationEventListener; import android.view.OrientationEventListener;
import com.otaliastudios.cameraview.BaseTest; import com.otaliastudios.cameraview.BaseTest;
import com.otaliastudios.cameraview.internal.utils.OrientationHelper;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@ -25,11 +24,11 @@ public class OrientationHelperTest extends BaseTest {
@Before @Before
public void setUp() { public void setUp() {
ui(new Runnable() { uiSync(new Runnable() {
@Override @Override
public void run() { public void run() {
callback = mock(OrientationHelper.Callback.class); callback = mock(OrientationHelper.Callback.class);
helper = new OrientationHelper(context(), callback); helper = new OrientationHelper(getContext(), callback);
} }
}); });
} }
@ -46,12 +45,12 @@ public class OrientationHelperTest extends BaseTest {
assertEquals(helper.getDisplayOffset(), -1); assertEquals(helper.getDisplayOffset(), -1);
assertEquals(helper.getDeviceOrientation(), -1); assertEquals(helper.getDeviceOrientation(), -1);
helper.enable(context()); helper.enable(getContext());
assertNotNull(helper.mListener); assertNotNull(helper.mListener);
assertNotEquals(helper.getDisplayOffset(), -1); // Don't know about device orientation. assertNotEquals(helper.getDisplayOffset(), -1); // Don't know about device orientation.
// Ensure nothing bad if called twice. // Ensure nothing bad if called twice.
helper.enable(context()); helper.enable(getContext());
assertNotNull(helper.mListener); assertNotNull(helper.mListener);
assertNotEquals(helper.getDisplayOffset(), -1); assertNotEquals(helper.getDisplayOffset(), -1);
@ -66,7 +65,7 @@ public class OrientationHelperTest extends BaseTest {
// Sometimes (on some APIs) the helper will trigger an update to 0 // Sometimes (on some APIs) the helper will trigger an update to 0
// right after enabling. But that's fine for us, times(1) will be OK either way. // right after enabling. But that's fine for us, times(1) will be OK either way.
helper.enable(context()); helper.enable(getContext());
helper.mListener.onOrientationChanged(OrientationEventListener.ORIENTATION_UNKNOWN); helper.mListener.onOrientationChanged(OrientationEventListener.ORIENTATION_UNKNOWN);
assertEquals(helper.getDeviceOrientation(), 0); assertEquals(helper.getDeviceOrientation(), 0);
helper.mListener.onOrientationChanged(10); helper.mListener.onOrientationChanged(10);

@ -11,7 +11,6 @@ import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.manipulation.Filter;
import org.mockito.Mockito; import org.mockito.Mockito;
import androidx.test.annotation.UiThreadTest; import androidx.test.annotation.UiThreadTest;
@ -29,7 +28,7 @@ public class MarkerLayoutTest extends BaseTest {
@Before @Before
public void setUp() { public void setUp() {
ui(new Runnable() { uiSync(new Runnable() {
@Override @Override
public void run() { public void run() {
TestActivity a = rule.getActivity(); TestActivity a = rule.getActivity();

@ -1,17 +1,12 @@
package com.otaliastudios.cameraview.overlay; package com.otaliastudios.cameraview.overlay;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser; import android.content.res.XmlResourceParser;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.Xml; import android.util.Xml;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.FrameLayout;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.test.annotation.UiThreadTest; import androidx.test.annotation.UiThreadTest;
@ -19,35 +14,17 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import com.otaliastudios.cameraview.BaseTest; import com.otaliastudios.cameraview.BaseTest;
import com.otaliastudios.cameraview.R;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatcher;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.w3c.dom.Attr;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.notNull;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset; import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
@ -63,7 +40,7 @@ public class OverlayLayoutTest extends BaseTest {
@Before @Before
public void setUp() { public void setUp() {
overlayLayout = spy(new OverlayLayout(context())); overlayLayout = spy(new OverlayLayout(getContext()));
} }
@After @After
@ -97,7 +74,7 @@ public class OverlayLayoutTest extends BaseTest {
@NonNull @NonNull
private AttributeSet getAttributeSet(int layout) throws Exception { private AttributeSet getAttributeSet(int layout) throws Exception {
// Get the attribute set in the correct state: use a parser and move to START_TAG // Get the attribute set in the correct state: use a parser and move to START_TAG
XmlResourceParser parser = context().getResources().getLayout(layout); XmlResourceParser parser = getContext().getResources().getLayout(layout);
//noinspection StatementWithEmptyBody //noinspection StatementWithEmptyBody
while (parser.next() != XmlResourceParser.START_TAG) {} while (parser.next() != XmlResourceParser.START_TAG) {}
return Xml.asAttributeSet(parser); return Xml.asAttributeSet(parser);
@ -132,7 +109,7 @@ public class OverlayLayoutTest extends BaseTest {
public void testDrawChild() { public void testDrawChild() {
Canvas canvas = new Canvas(); Canvas canvas = new Canvas();
OverlayLayout.LayoutParams params = new OverlayLayout.LayoutParams(10, 10); OverlayLayout.LayoutParams params = new OverlayLayout.LayoutParams(10, 10);
View child = new View(context()); View child = new View(getContext());
child.setLayoutParams(params); child.setLayoutParams(params);
when(overlayLayout.doDrawChild(canvas, child, 0)).thenReturn(true); when(overlayLayout.doDrawChild(canvas, child, 0)).thenReturn(true);
@ -169,7 +146,7 @@ public class OverlayLayoutTest extends BaseTest {
@Test @Test
public void testDrawOn() { public void testDrawOn() {
Canvas canvas = spy(new Canvas()); Canvas canvas = spy(new Canvas());
View child = new View(context()); View child = new View(getContext());
OverlayLayout.LayoutParams params = new OverlayLayout.LayoutParams(10, 10); OverlayLayout.LayoutParams params = new OverlayLayout.LayoutParams(10, 10);
params.drawOnPreview = true; params.drawOnPreview = true;
params.drawOnPictureSnapshot = true; params.drawOnPictureSnapshot = true;

@ -3,7 +3,6 @@ package com.otaliastudios.cameraview.picture;
import com.otaliastudios.cameraview.BaseTest; import com.otaliastudios.cameraview.BaseTest;
import com.otaliastudios.cameraview.PictureResult; import com.otaliastudios.cameraview.PictureResult;
import com.otaliastudios.cameraview.picture.PictureRecorder;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;

@ -32,7 +32,6 @@ public abstract class CameraPreviewTest extends BaseTest {
@Rule @Rule
public ActivityTestRule<TestActivity> rule = new ActivityTestRule<>(TestActivity.class); public ActivityTestRule<TestActivity> rule = new ActivityTestRule<>(TestActivity.class);
@SuppressWarnings("WeakerAccess")
protected CameraPreview preview; protected CameraPreview preview;
@SuppressWarnings("WeakerAccess") @SuppressWarnings("WeakerAccess")
protected Size surfaceSize; protected Size surfaceSize;
@ -46,7 +45,7 @@ public abstract class CameraPreviewTest extends BaseTest {
available = new Op<>(true); available = new Op<>(true);
destroyed = new Op<>(true); destroyed = new Op<>(true);
ui(new Runnable() { uiSync(new Runnable() {
@Override @Override
public void run() { public void run() {
TestActivity a = rule.getActivity(); TestActivity a = rule.getActivity();
@ -82,7 +81,7 @@ public abstract class CameraPreviewTest extends BaseTest {
// Trigger a destroy. // Trigger a destroy.
protected void ensureDestroyed() { protected void ensureDestroyed() {
ui(new Runnable() { uiSync(new Runnable() {
@Override @Override
public void run() { public void run() {
rule.getActivity().getContentView().removeView(preview.getRootView()); rule.getActivity().getContentView().removeView(preview.getRootView());

@ -7,10 +7,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import android.view.ViewGroup; import android.view.ViewGroup;
import com.otaliastudios.cameraview.preview.CameraPreview;
import com.otaliastudios.cameraview.preview.CameraPreviewTest;
import com.otaliastudios.cameraview.preview.SurfaceCameraPreview;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)

@ -7,10 +7,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import android.view.ViewGroup; import android.view.ViewGroup;
import com.otaliastudios.cameraview.preview.CameraPreview;
import com.otaliastudios.cameraview.preview.CameraPreviewTest;
import com.otaliastudios.cameraview.preview.TextureCameraPreview;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)

@ -13,9 +13,6 @@ import org.mockito.Mockito;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
@SmallTest @SmallTest

@ -56,12 +56,9 @@ public final class CameraLogger {
@VisibleForTesting static String lastTag; @VisibleForTesting static String lastTag;
private static int sLevel; private static int sLevel;
private static List<Logger> sLoggers; private static List<Logger> sLoggers = new ArrayList<>();
static { @VisibleForTesting static Logger sAndroidLogger = new Logger() {
setLogLevel(LEVEL_ERROR);
sLoggers = new ArrayList<>();
sLoggers.add(new Logger() {
@Override @Override
public void log(int level, @NonNull String tag, @NonNull String message, @Nullable Throwable throwable) { public void log(int level, @NonNull String tag, @NonNull String message, @Nullable Throwable throwable) {
switch (level) { switch (level) {
@ -71,7 +68,11 @@ public final class CameraLogger {
case LEVEL_ERROR: Log.e(tag, message, throwable); break; case LEVEL_ERROR: Log.e(tag, message, throwable); break;
} }
} }
}); };
static {
setLogLevel(LEVEL_ERROR);
sLoggers.add(sAndroidLogger);
} }
/** /**

@ -6,10 +6,8 @@ import android.hardware.Camera;
import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager; import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.params.StreamConfigurationMap; import android.hardware.camera2.params.StreamConfigurationMap;
import android.media.CamcorderProfile; import android.media.CamcorderProfile;
import android.media.ImageReader;
import android.media.MediaRecorder; import android.media.MediaRecorder;
import android.os.Build; import android.os.Build;
import android.util.Range; import android.util.Range;
@ -63,8 +61,6 @@ public class CameraOptions {
private boolean autoFocusSupported; private boolean autoFocusSupported;
// Camera1Engine constructor.
@SuppressWarnings("deprecation")
public CameraOptions(@NonNull Camera.Parameters params, boolean flipSizes) { public CameraOptions(@NonNull Camera.Parameters params, boolean flipSizes) {
List<String> strings; List<String> strings;
Mapper mapper = Mapper.get(Engine.CAMERA1); Mapper mapper = Mapper.get(Engine.CAMERA1);
@ -151,7 +147,6 @@ public class CameraOptions {
// Camera2Engine constructor. // Camera2Engine constructor.
@RequiresApi(Build.VERSION_CODES.LOLLIPOP) @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
@SuppressWarnings("deprecation")
public CameraOptions(@NonNull CameraManager manager, @NonNull String cameraId, boolean flipSizes) throws CameraAccessException { public CameraOptions(@NonNull CameraManager manager, @NonNull String cameraId, boolean flipSizes) throws CameraAccessException {
Mapper mapper = Mapper.get(Engine.CAMERA2); Mapper mapper = Mapper.get(Engine.CAMERA2);
CameraCharacteristics cameraCharacteristics = manager.getCameraCharacteristics(cameraId); CameraCharacteristics cameraCharacteristics = manager.getCameraCharacteristics(cameraId);
@ -323,7 +318,6 @@ public class CameraOptions {
* *
* @return a collection of supported values. * @return a collection of supported values.
*/ */
@SuppressWarnings("WeakerAccess")
@NonNull @NonNull
public Collection<Size> getSupportedPictureSizes() { public Collection<Size> getSupportedPictureSizes() {
return Collections.unmodifiableSet(supportedPictureSizes); return Collections.unmodifiableSet(supportedPictureSizes);
@ -347,7 +341,6 @@ public class CameraOptions {
* *
* @return a collection of supported values. * @return a collection of supported values.
*/ */
@SuppressWarnings("WeakerAccess")
@NonNull @NonNull
public Collection<Size> getSupportedVideoSizes() { public Collection<Size> getSupportedVideoSizes() {
return Collections.unmodifiableSet(supportedVideoSizes); return Collections.unmodifiableSet(supportedVideoSizes);
@ -373,7 +366,6 @@ public class CameraOptions {
* @see Facing#FRONT * @see Facing#FRONT
* @return a collection of supported values. * @return a collection of supported values.
*/ */
@SuppressWarnings("WeakerAccess")
@NonNull @NonNull
public Collection<Facing> getSupportedFacing() { public Collection<Facing> getSupportedFacing() {
return Collections.unmodifiableSet(supportedFacing); return Collections.unmodifiableSet(supportedFacing);
@ -389,7 +381,6 @@ public class CameraOptions {
* @see Flash#TORCH * @see Flash#TORCH
* @return a collection of supported values. * @return a collection of supported values.
*/ */
@SuppressWarnings("WeakerAccess")
@NonNull @NonNull
public Collection<Flash> getSupportedFlash() { public Collection<Flash> getSupportedFlash() {
return Collections.unmodifiableSet(supportedFlash); return Collections.unmodifiableSet(supportedFlash);
@ -406,7 +397,6 @@ public class CameraOptions {
* @see WhiteBalance#CLOUDY * @see WhiteBalance#CLOUDY
* @return a collection of supported values. * @return a collection of supported values.
*/ */
@SuppressWarnings("WeakerAccess")
@NonNull @NonNull
public Collection<WhiteBalance> getSupportedWhiteBalance() { public Collection<WhiteBalance> getSupportedWhiteBalance() {
return Collections.unmodifiableSet(supportedWhiteBalance); return Collections.unmodifiableSet(supportedWhiteBalance);
@ -432,7 +422,6 @@ public class CameraOptions {
* *
* @return whether zoom is supported. * @return whether zoom is supported.
*/ */
@SuppressWarnings("WeakerAccess")
public boolean isZoomSupported() { public boolean isZoomSupported() {
return zoomSupported; return zoomSupported;
} }
@ -444,7 +433,6 @@ public class CameraOptions {
* *
* @return whether auto focus is supported. * @return whether auto focus is supported.
*/ */
@SuppressWarnings("WeakerAccess")
public boolean isAutoFocusSupported() { public boolean isAutoFocusSupported() {
return autoFocusSupported; return autoFocusSupported;
} }
@ -458,7 +446,6 @@ public class CameraOptions {
* @see #getExposureCorrectionMaxValue() * @see #getExposureCorrectionMaxValue()
* @return whether exposure correction is supported. * @return whether exposure correction is supported.
*/ */
@SuppressWarnings("WeakerAccess")
public boolean isExposureCorrectionSupported() { public boolean isExposureCorrectionSupported() {
return exposureCorrectionSupported; return exposureCorrectionSupported;
} }
@ -470,7 +457,6 @@ public class CameraOptions {
* *
* @return min EV value * @return min EV value
*/ */
@SuppressWarnings("WeakerAccess")
public float getExposureCorrectionMinValue() { public float getExposureCorrectionMinValue() {
return exposureCorrectionMinValue; return exposureCorrectionMinValue;
} }
@ -482,7 +468,6 @@ public class CameraOptions {
* *
* @return max EV value * @return max EV value
*/ */
@SuppressWarnings("WeakerAccess")
public float getExposureCorrectionMaxValue() { public float getExposureCorrectionMaxValue() {
return exposureCorrectionMaxValue; return exposureCorrectionMaxValue;
} }

@ -3,6 +3,8 @@ package com.otaliastudios.cameraview.gesture;
import android.content.Context; import android.content.Context;
import android.graphics.PointF; import android.graphics.PointF;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import android.view.MotionEvent; import android.view.MotionEvent;
/** /**
@ -22,7 +24,7 @@ public abstract class GestureFinder {
private final static int GRANULARITY = 50; private final static int GRANULARITY = 50;
private boolean mActive; private boolean mActive;
private Gesture mType; @VisibleForTesting Gesture mType;
private PointF[] mPoints; private PointF[] mPoints;
private Controller mController; private Controller mController;

@ -0,0 +1,168 @@
package com.otaliastudios.cameraview.internal.utils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static junit.framework.Assert.assertNotNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertNull;
public class PoolTest {
private final static int MAX_SIZE = 20;
private class Item {}
private Pool<Item> pool;
private int instances = 0;
@Before
public void setUp() {
pool = new Pool<>(MAX_SIZE, new Pool.Factory<Item>() {
@Override
public Item create() {
instances++;
return new Item();
}
});
}
@After
public void tearDown() {
instances = 0;
pool = null;
}
@Test
public void testInstances() {
for (int i = 0; i < MAX_SIZE; i++) {
assertEquals(instances, i);
pool.get();
}
}
@Test
public void testIsEmtpy() {
assertFalse(pool.isEmpty());
// Get all items without recycling.
Item item = null;
for (int i = 0; i < MAX_SIZE; i++) {
item = pool.get();
}
assertTrue(pool.isEmpty());
}
@Test
public void testClear() {
// Take one and recycle it
Item item = pool.get();
assertNotNull(item);
pool.recycle(item);
// Ensure it is recycled.
assertEquals(pool.recycledCount(), 1);
assertEquals(pool.activeCount(), 0);
assertEquals(pool.count(), 1);
// Now clear and ensure pool is empty.
pool.clear();
assertEquals(pool.recycledCount(), 0);
assertEquals(pool.activeCount(), 0);
assertEquals(pool.count(), 0);
}
@Test
public void testCounts() {
assertEquals(pool.recycledCount(), 0);
assertEquals(pool.activeCount(), 0);
assertEquals(pool.count(), 0);
// Take all
List<Item> items = new ArrayList<>();
for (int i = 0; i < MAX_SIZE; i++) {
items.add(pool.get());
assertEquals(pool.recycledCount(), 0);
assertEquals(pool.activeCount(), items.size());
assertEquals(pool.count(), items.size());
}
// Recycle all
int recycled = 0;
for (Item item : items) {
pool.recycle(item);
recycled++;
assertEquals(pool.recycledCount(), recycled);
assertEquals(pool.activeCount(), MAX_SIZE - recycled);
assertEquals(pool.count(), MAX_SIZE);
}
}
@Test
public void testToString() {
String string = pool.toString();
assertTrue(string.contains("count"));
assertTrue(string.contains("active"));
assertTrue(string.contains("recycled"));
assertTrue(string.contains(Pool.class.getSimpleName()));
}
@Test(expected = IllegalStateException.class)
public void testRecycle_notActive() {
Item item = new Item();
pool.recycle(item);
}
@Test(expected = IllegalStateException.class)
public void testRecycle_twice() {
Item item = pool.get();
assertNotNull(item);
pool.recycle(item);
pool.recycle(item);
}
@Test(expected = IllegalStateException.class)
public void testRecycle_whileFull() {
// Take all and recycle all
List<Item> items = new ArrayList<>();
for (int i = 0; i < MAX_SIZE; i++) {
items.add(pool.get());
}
for (Item item : items) {
pool.recycle(item);
}
// Take one and recycle again
pool.recycle(items.get(0));
}
@Test
public void testGet_fromFactory() {
pool.get();
assertEquals(1, instances);
}
@Test
public void testGet_whenFull() {
for (int i = 0; i < MAX_SIZE; i++) {
pool.get();
}
assertNull(pool.get());
}
@Test
public void testGet_recycled() {
Item item = pool.get();
assertNotNull(item);
pool.recycle(item);
Item newItem = pool.get();
assertEquals(item, newItem);
assertEquals(1, instances);
}
}
Loading…
Cancel
Save