diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/BaseTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/BaseTest.java index f7b53309..081a6fd5 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/BaseTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/BaseTest.java @@ -8,11 +8,9 @@ import android.os.Handler; import android.os.Looper; import android.os.PowerManager; +import androidx.annotation.NonNull; import androidx.test.platform.app.InstrumentationRegistry; -import android.util.Log; -import android.view.View; - import com.otaliastudios.cameraview.internal.utils.Op; 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.POWER_SERVICE; -import static org.mockito.Matchers.any; import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; 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 @BeforeClass - @SuppressWarnings("MissingPermission") - public static void wakeUp() { + public static void beforeClass_wakeUp() { CameraLogger.setLogLevel(CameraLogger.LEVEL_VERBOSE); // 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.disableKeyguard(); // 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 | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "CameraViewLock"); @@ -56,8 +51,9 @@ public class BaseTest { } @AfterClass - @SuppressWarnings("MissingPermission") - public static void releaseWakeUp() { + public static void afterClass_releaseWakeUp() { + CameraLogger.setLogLevel(CameraLogger.LEVEL_ERROR); + wakeLock.release(); keyguardLock.reenableKeyguard(); } @@ -66,61 +62,48 @@ public class BaseTest { * This will make mockito report the error when it should. * Mockito reports failure on the next mockito invocation, which is terrible * since it might be on the next test or even never happen. - * - * Calling this */ @After - public void syncMockito() { + public void after_checkMockito() { Object object = Mockito.mock(Object.class); + //noinspection ResultOfMethodCallIgnored object.toString(); } - public static void ui(Runnable runnable) { - InstrumentationRegistry.getInstrumentation().runOnMainSync(runnable); - } - - public static void uiAsync(Runnable runnable) { - new Handler(Looper.getMainLooper()).post(runnable); - } - - public static Context context() { + @NonNull + protected static Context getContext() { return InstrumentationRegistry.getInstrumentation().getContext(); } - public static void uiRequestLayout(final View view) { - ui(new Runnable() { - @Override - public void run() { - view.requestLayout(); - } - }); + protected static void uiSync(Runnable runnable) { + InstrumentationRegistry.getInstrumentation().runOnMainSync(runnable); } - public static void idle() { - InstrumentationRegistry.getInstrumentation().waitForIdleSync(); + @SuppressWarnings("unused") + protected static void uiAsync(Runnable runnable) { + new Handler(Looper.getMainLooper()).post(runnable); } - public static void sleep(long time) { - try { - Thread.sleep(time); - } catch (InterruptedException e) { - e.printStackTrace(); - } + @SuppressWarnings("unused") + protected static void waitUiIdle() { + InstrumentationRegistry.getInstrumentation().waitForIdleSync(); } - public static void grantPermissions() { + protected static void grantAllPermissions() { grantPermission("android.permission.CAMERA"); grantPermission("android.permission.RECORD_AUDIO"); 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; - String command = "pm grant " + context().getPackageName() + " " + permission; + String command = "pm grant " + getContext().getPackageName() + " " + permission; InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand(command); } - public static Stubber doCountDown(final CountDownLatch latch) { + @NonNull + protected static Stubber doCountDown(final CountDownLatch latch) { return doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) { @@ -130,22 +113,24 @@ public class BaseTest { }); } - public static Stubber doEndTask(final Op op, final T response) { + @NonNull + protected static Stubber doEndOp(final Op op, final T response) { return doAnswer(new Answer() { @Override - public Object answer(InvocationOnMock invocation) throws Throwable { + public Object answer(InvocationOnMock invocation) { op.end(response); return null; } }); } - public static Stubber doEndTask(final Op op, final int withReturnArgument) { + @NonNull + protected static Stubber doEndOp(final Op op, final int withReturnArgument) { return doAnswer(new Answer() { @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - Object o = invocation.getArguments()[withReturnArgument]; + public Object answer(InvocationOnMock invocation) { //noinspection unchecked + T o = (T) invocation.getArguments()[withReturnArgument]; op.end(o); return null; } diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraLoggerTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraLoggerTest.java index c8ef7b4c..e26c0bff 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraLoggerTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraLoggerTest.java @@ -10,8 +10,6 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @@ -26,11 +24,13 @@ public class CameraLoggerTest extends BaseTest { @Before public void setUp() { CameraLogger.setLogLevel(CameraLogger.LEVEL_VERBOSE); + CameraLogger.unregisterLogger(CameraLogger.sAndroidLogger); // Avoid writing into Logs during these tests logger = CameraLogger.create(loggerTag); } @After public void tearDown() { + CameraLogger.registerLogger(CameraLogger.sAndroidLogger); logger = null; } @@ -110,15 +110,9 @@ public class CameraLoggerTest extends BaseTest { CameraLogger.registerLogger(mock); final Op op = new Op<>(); - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - Object[] args = invocation.getArguments(); - Throwable throwable = (Throwable) args[3]; - op.end(throwable); - return null; - } - }).when(mock).log(anyInt(), anyString(), anyString(), any(Throwable.class)); + doEndOp(op, 3) + .when(mock) + .log(anyInt(), anyString(), anyString(), any(Throwable.class)); op.listen(); logger.e("Got no error."); diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraUtilsTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraUtilsTest.java index 4e5e2417..b7477105 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraUtilsTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraUtilsTest.java @@ -56,7 +56,7 @@ public class CameraUtilsTest extends BaseTest { }; // Run on ui because it involves handlers. - ui(new Runnable() { + uiSync(new Runnable() { @Override public void run() { if (maxWidth > 0 && maxHeight > 0) { diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewCallbacksTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewCallbacksTest.java index 917fc9e7..935ec3d5 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewCallbacksTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewCallbacksTest.java @@ -29,19 +29,14 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; 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 org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyFloat; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; @@ -54,6 +49,8 @@ import static org.mockito.Mockito.verify; @MediumTest public class CameraViewCallbacksTest extends BaseTest { + private final static long DELAY = 500; + private CameraView camera; private CameraListener listener; private FrameProcessor processor; @@ -63,10 +60,10 @@ public class CameraViewCallbacksTest extends BaseTest { @Before public void setUp() { - ui(new Runnable() { + uiSync(new Runnable() { @Override public void run() { - Context context = context(); + Context context = getContext(); listener = mock(CameraListener.class); processor = mock(FrameProcessor.class); camera = new CameraView(context) { @@ -106,108 +103,101 @@ public class CameraViewCallbacksTest extends BaseTest { 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 public void testDontDispatchIfRemoved() { camera.removeCameraListener(listener); - completeTask().when(listener).onCameraOpened(null); - camera.mCameraCallbacks.dispatchOnCameraOpened(null); + CameraOptions options = mock(CameraOptions.class); + doEndOp(op, true).when(listener).onCameraOpened(options); + camera.mCameraCallbacks.dispatchOnCameraOpened(options); - assertNull(op.await(500)); - verify(listener, never()).onCameraOpened(null); + assertNull(op.await(DELAY)); + verify(listener, never()).onCameraOpened(options); } @Test public void testDontDispatchIfCleared() { camera.clearCameraListeners(); - completeTask().when(listener).onCameraOpened(null); - camera.mCameraCallbacks.dispatchOnCameraOpened(null); + CameraOptions options = mock(CameraOptions.class); + doEndOp(op, true).when(listener).onCameraOpened(options); + camera.mCameraCallbacks.dispatchOnCameraOpened(options); - assertNull(op.await(500)); - verify(listener, never()).onCameraOpened(null); + assertNull(op.await(DELAY)); + verify(listener, never()).onCameraOpened(options); } @Test public void testDispatchOnCameraOpened() { - completeTask().when(listener).onCameraOpened(null); - camera.mCameraCallbacks.dispatchOnCameraOpened(null); + CameraOptions options = mock(CameraOptions.class); + doEndOp(op, true).when(listener).onCameraOpened(options); + camera.mCameraCallbacks.dispatchOnCameraOpened(options); - assertNotNull(op.await(500)); - verify(listener, times(1)).onCameraOpened(null); + assertNotNull(op.await(DELAY)); + verify(listener, times(1)).onCameraOpened(options); } @Test public void testDispatchOnCameraClosed() { - completeTask().when(listener).onCameraClosed(); + doEndOp(op, true).when(listener).onCameraClosed(); camera.mCameraCallbacks.dispatchOnCameraClosed(); - assertNotNull(op.await(500)); + assertNotNull(op.await(DELAY)); verify(listener, times(1)).onCameraClosed(); } @Test public void testDispatchOnVideoRecordingStart() { - completeTask().when(listener).onVideoRecordingStart(); + doEndOp(op, true).when(listener).onVideoRecordingStart(); camera.mCameraCallbacks.dispatchOnVideoRecordingStart(); - assertNotNull(op.await(500)); + assertNotNull(op.await(DELAY)); verify(listener, times(1)).onVideoRecordingStart(); } @Test public void testDispatchOnVideoRecordingEnd() { - completeTask().when(listener).onVideoRecordingEnd(); + doEndOp(op, true).when(listener).onVideoRecordingEnd(); camera.mCameraCallbacks.dispatchOnVideoRecordingEnd(); - assertNotNull(op.await(500)); + assertNotNull(op.await(DELAY)); verify(listener, times(1)).onVideoRecordingEnd(); } @Test public void testDispatchOnVideoTaken() { 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); - assertNotNull(op.await(500)); + assertNotNull(op.await(DELAY)); verify(listener, times(1)).onVideoTaken(any(VideoResult.class)); } @Test public void testDispatchOnPictureTaken() { 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); - assertNotNull(op.await(500)); + assertNotNull(op.await(DELAY)); verify(listener, times(1)).onPictureTaken(any(PictureResult.class)); } @Test 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); - assertNotNull(op.await(500)); + assertNotNull(op.await(DELAY)); verify(listener, times(1)).onZoomChanged(eq(0f), eq(new float[]{0, 1}), nullable(PointF[].class)); } @Test public void testDispatchOnExposureCorrectionChanged() { - completeTask().when(listener).onExposureCorrectionChanged(0f, null, null); - camera.mCameraCallbacks.dispatchOnExposureCorrectionChanged(0f, null, null); + float[] bounds = new float[]{}; + doEndOp(op, true).when(listener).onExposureCorrectionChanged(0f, bounds, null); + camera.mCameraCallbacks.dispatchOnExposureCorrectionChanged(0f, bounds, null); - assertNotNull(op.await(500)); - verify(listener, times(1)).onExposureCorrectionChanged(0f, null, null); + assertNotNull(op.await(DELAY)); + verify(listener, times(1)).onExposureCorrectionChanged(0f, bounds, null); } @Test @@ -221,10 +211,10 @@ public class CameraViewCallbacksTest extends BaseTest { camera.mMarkerLayout = markerLayout; PointF point = new PointF(); - completeTask().when(listener).onAutoFocusStart(point); + doEndOp(op, true).when(listener).onAutoFocusStart(point); camera.mCameraCallbacks.dispatchOnFocusStart(Gesture.TAP, point); - assertNotNull(op.await(500)); + assertNotNull(op.await(DELAY)); verify(listener, times(1)).onAutoFocusStart(point); verify(marker, times(1)).onAutoFocusStart(AutoFocusTrigger.GESTURE, point); 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(); boolean success = true; - completeTask().when(listener).onAutoFocusEnd(success, point); + doEndOp(op, true).when(listener).onAutoFocusEnd(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(marker, times(1)).onAutoFocusEnd(AutoFocusTrigger.GESTURE, success, point); @@ -252,9 +242,9 @@ public class CameraViewCallbacksTest extends BaseTest { @Test public void testOrientationCallbacks() { - completeTask().when(listener).onOrientationChanged(anyInt()); + doEndOp(op, true).when(listener).onOrientationChanged(anyInt()); camera.mCameraCallbacks.onDeviceOrientationChanged(90); - assertNotNull(op.await(500)); + assertNotNull(op.await(DELAY)); verify(listener, times(1)).onOrientationChanged(anyInt()); } @@ -263,20 +253,20 @@ public class CameraViewCallbacksTest extends BaseTest { @Test public void testCameraError() { CameraException error = new CameraException(new RuntimeException("Error")); - completeTask().when(listener).onCameraError(error); + doEndOp(op, true).when(listener).onCameraError(error); camera.mCameraCallbacks.dispatchError(error); - assertNotNull(op.await(500)); + assertNotNull(op.await(DELAY)); verify(listener, times(1)).onCameraError(error); } @Test public void testProcessFrame() { Frame mock = mock(Frame.class); - completeTask().when(processor).process(mock); + doEndOp(op, true).when(processor).process(mock); camera.mCameraCallbacks.dispatchFrame(mock); - assertNotNull(op.await(500)); + assertNotNull(op.await(DELAY)); verify(processor, times(1)).process(mock); } } diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java index 63fdaf05..86b63c22 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java @@ -10,7 +10,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.MediumTest; import android.util.AttributeSet; -import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -52,9 +51,6 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; 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.*; @@ -74,10 +70,10 @@ public class CameraViewTest extends BaseTest { @Before public void setUp() { - ui(new Runnable() { + uiSync(new Runnable() { @Override public void run() { - Context context = context(); + Context context = getContext(); cameraView = new CameraView(context) { @NonNull @@ -151,8 +147,8 @@ public class CameraViewTest extends BaseTest { @Test public void testDefaults() { // CameraEngine - TypedArray empty = context().obtainStyledAttributes(new int[]{}); - ControlParser controls = new ControlParser(context(), empty); + TypedArray empty = getContext().obtainStyledAttributes(new int[]{}); + ControlParser controls = new ControlParser(getContext(), empty); assertEquals(cameraView.getFlash(), controls.getFlash()); assertEquals(cameraView.getFacing(), controls.getFacing()); assertEquals(cameraView.getGrid(), controls.getGrid()); @@ -236,7 +232,7 @@ public class CameraViewTest extends BaseTest { mockController.setMockCameraOptions(o); mockController.setMockEngineState(true); MotionEvent event = MotionEvent.obtain(0L, 0L, 0, 0f, 0f, 0); - ui(new Runnable() { + uiSync(new Runnable() { @Override public void run() { cameraView.mTapGestureFinder = new TapGestureFinder(cameraView.mCameraCallbacks) { @@ -258,7 +254,7 @@ public class CameraViewTest extends BaseTest { mockController.setMockCameraOptions(o); mockController.setMockEngineState(true); MotionEvent event = MotionEvent.obtain(0L, 0L, 0, 0f, 0f, 0); - ui(new Runnable() { + uiSync(new Runnable() { @Override public void run() { cameraView.mTapGestureFinder = new TapGestureFinder(cameraView.mCameraCallbacks) { @@ -285,7 +281,7 @@ public class CameraViewTest extends BaseTest { mockController.mZoomChanged = false; MotionEvent event = MotionEvent.obtain(0L, 0L, 0, 0f, 0f, 0); final FactorHolder factor = new FactorHolder(); - ui(new Runnable() { + uiSync(new Runnable() { @Override public void run() { cameraView.mPinchGestureFinder = new PinchGestureFinder(cameraView.mCameraCallbacks) { @@ -326,7 +322,7 @@ public class CameraViewTest extends BaseTest { mockController.mExposureCorrectionChanged = false; MotionEvent event = MotionEvent.obtain(0L, 0L, 0, 0f, 0f, 0); final FactorHolder factor = new FactorHolder(); - ui(new Runnable() { + uiSync(new Runnable() { @Override public void run() { cameraView.mScrollGestureFinder = new ScrollGestureFinder(cameraView.mCameraCallbacks) { @@ -685,7 +681,6 @@ public class CameraViewTest extends BaseTest { //region Lists of listeners and processors - @SuppressWarnings("UseBulkOperation") @Test public void testCameraListenerList() { assertTrue(cameraView.mListeners.isEmpty()); @@ -713,7 +708,6 @@ public class CameraViewTest extends BaseTest { } } - @SuppressWarnings({"NullableProblems", "UseBulkOperation"}) @Test public void testFrameProcessorsList() { assertTrue(cameraView.mFrameProcessors.isEmpty()); @@ -775,13 +769,7 @@ public class CameraViewTest extends BaseTest { final PointF point = new PointF(0, 0); final PointF[] points = new PointF[]{ point }; final Op op = new Op<>(true); - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) throws Throwable { - op.end(true); - return null; - } - }).when(markerLayout).onEvent(MarkerLayout.TYPE_AUTOFOCUS, points); + doEndOp(op, true).when(markerLayout).onEvent(MarkerLayout.TYPE_AUTOFOCUS, points); cameraView.mCameraCallbacks.dispatchOnFocusStart(Gesture.TAP, point); assertNotNull(op.await(100)); } @@ -793,7 +781,7 @@ public class CameraViewTest extends BaseTest { @Test public void testOverlays_generateLayoutParams() { 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); assertTrue(overlay.getLayoutParams() instanceof OverlayLayout.LayoutParams); verify(cameraView.mOverlayLayout, times(1)).isOverlay(any(AttributeSet.class)); @@ -804,7 +792,7 @@ public class CameraViewTest extends BaseTest { @Test public void testOverlays_dontGenerateLayoutParams() { 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); assertFalse(overlay.getLayoutParams() instanceof OverlayLayout.LayoutParams); verify(cameraView.mOverlayLayout, times(1)).isOverlay(any(AttributeSet.class)); @@ -814,7 +802,7 @@ public class CameraViewTest extends BaseTest { @Test public void testOverlays_addOverlayView() { cameraView.mOverlayLayout = spy(cameraView.mOverlayLayout); - View overlay = new View(context()); + View overlay = new View(getContext()); OverlayLayout.LayoutParams params = new OverlayLayout.LayoutParams(10, 10); int count = cameraView.getChildCount(); cameraView.addView(overlay, 0, params); @@ -826,7 +814,7 @@ public class CameraViewTest extends BaseTest { @Test public void testOverlays_dontAddOverlayView() { cameraView.mOverlayLayout = spy(cameraView.mOverlayLayout); - View overlay = new View(context()); + View overlay = new View(getContext()); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(10, 10); int count = cameraView.getChildCount(); cameraView.addView(overlay, 0, params); diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java index 75fe577e..5971d98d 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java @@ -77,7 +77,7 @@ public abstract class CameraIntegrationTest extends BaseTest { @BeforeClass public static void grant() { - grantPermissions(); + grantAllPermissions(); } @NonNull @@ -88,7 +88,7 @@ public abstract class CameraIntegrationTest extends BaseTest { LOG.e("Test started. Setting up camera."); WorkerHandler.destroy(); - ui(new Runnable() { + uiSync(new Runnable() { @Override public void run() { camera = new CameraView(rule.getActivity()) { @@ -139,12 +139,13 @@ public abstract class CameraIntegrationTest extends BaseTest { private CameraOptions openSync(boolean expectSuccess) { camera.open(); final Op 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); if (expectSuccess) { assertNotNull("Can open", result); // Extra wait for the bind state. // TODO fix this and other while {} in this class in a more elegant way. + //noinspection StatementWithEmptyBody while (controller.getBindState() != CameraEngine.STATE_STARTED) {} } else { assertNull("Should not open", result); @@ -155,7 +156,7 @@ public abstract class CameraIntegrationTest extends BaseTest { private void closeSync(boolean expectSuccess) { camera.close(); final Op close = new Op<>(true); - doEndTask(close, true).when(listener).onCameraClosed(); + doEndOp(close, true).when(listener).onCameraClosed(); Boolean result = close.await(DELAY); if (expectSuccess) { assertNotNull("Can close", result); @@ -173,8 +174,8 @@ public abstract class CameraIntegrationTest extends BaseTest { // Op for onVideoTaken. final Op video = new Op<>(true); - doEndTask(video, 0).when(listener).onVideoTaken(any(VideoResult.class)); - doEndTask(video, null).when(listener).onCameraError(argThat(new ArgumentMatcher() { + doEndOp(video, 0).when(listener).onVideoTaken(any(VideoResult.class)); + doEndOp(video, null).when(listener).onCameraError(argThat(new ArgumentMatcher() { @Override public boolean matches(CameraException argument) { return argument.getReason() == CameraException.REASON_VIDEO_FAILED; @@ -195,8 +196,8 @@ public abstract class CameraIntegrationTest extends BaseTest { @Nullable private PictureResult waitForPictureResult(boolean expectSuccess) { final Op pic = new Op<>(true); - doEndTask(pic, 0).when(listener).onPictureTaken(any(PictureResult.class)); - doEndTask(pic, null).when(listener).onCameraError(argThat(new ArgumentMatcher() { + doEndOp(pic, 0).when(listener).onPictureTaken(any(PictureResult.class)); + doEndOp(pic, null).when(listener).onCameraError(argThat(new ArgumentMatcher() { @Override public boolean matches(CameraException argument) { return argument.getReason() == CameraException.REASON_PICTURE_FAILED; @@ -217,14 +218,14 @@ public abstract class CameraIntegrationTest extends BaseTest { private void takeVideoSync(boolean expectSuccess, int duration) { final Op op = new Op<>(true); - doEndTask(op, true).when(listener).onVideoRecordingStart(); - doEndTask(op, false).when(listener).onCameraError(argThat(new ArgumentMatcher() { + doEndOp(op, true).when(listener).onVideoRecordingStart(); + doEndOp(op, false).when(listener).onCameraError(argThat(new ArgumentMatcher() { @Override public boolean matches(CameraException argument) { 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) { camera.takeVideo(file, duration); } else { @@ -239,21 +240,21 @@ public abstract class CameraIntegrationTest extends BaseTest { } } - @SuppressWarnings("unused") + @SuppressWarnings({"unused", "SameParameterValue"}) private void takeVideoSnapshotSync(boolean expectSuccess) { takeVideoSnapshotSync(expectSuccess,0); } private void takeVideoSnapshotSync(boolean expectSuccess, int duration) { final Op op = new Op<>(true); - doEndTask(op, true).when(listener).onVideoRecordingStart(); - doEndTask(op, false).when(listener).onCameraError(argThat(new ArgumentMatcher() { + doEndOp(op, true).when(listener).onVideoRecordingStart(); + doEndOp(op, false).when(listener).onCameraError(argThat(new ArgumentMatcher() { @Override public boolean matches(CameraException argument) { 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) { camera.takeVideoSnapshot(file, duration); } else { @@ -581,7 +582,7 @@ public abstract class CameraIntegrationTest extends BaseTest { CameraOptions o = openSync(true); final Op 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); PointF point = focus.await(300); @@ -598,7 +599,7 @@ public abstract class CameraIntegrationTest extends BaseTest { CameraOptions o = openSync(true); final Op 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); // 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") @Test - public void testCapturePicture_size() throws Exception { + public void testCapturePicture_size() { openSync(true); // PictureSize can still be null after opened. // TODO be more elegant @@ -688,7 +689,7 @@ public abstract class CameraIntegrationTest extends BaseTest { @SuppressWarnings("StatementWithEmptyBody") @Test - public void testCaptureSnapshot_size() throws Exception { + public void testCaptureSnapshot_size() { openSync(true); // SnapshotSize can still be null after opened. // TODO be more elegant diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MockCameraEngine.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MockCameraEngine.java index 3c2be982..9b3d4566 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MockCameraEngine.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MockCameraEngine.java @@ -9,22 +9,18 @@ import com.google.android.gms.tasks.Tasks; import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.PictureResult; import com.otaliastudios.cameraview.VideoResult; -import com.otaliastudios.cameraview.controls.Audio; import com.otaliastudios.cameraview.controls.Facing; import com.otaliastudios.cameraview.controls.Flash; import com.otaliastudios.cameraview.frame.FrameManager; import com.otaliastudios.cameraview.gesture.Gesture; import com.otaliastudios.cameraview.controls.Hdr; -import com.otaliastudios.cameraview.controls.Mode; import com.otaliastudios.cameraview.controls.WhiteBalance; import com.otaliastudios.cameraview.size.AspectRatio; import com.otaliastudios.cameraview.size.Size; -import com.otaliastudios.cameraview.size.SizeSelector; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import java.io.File; import java.util.ArrayList; import java.util.List; diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/GestureFinderTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/GestureFinderTest.java index 0ffe626b..f7c04d43 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/GestureFinderTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/GestureFinderTest.java @@ -40,7 +40,7 @@ public abstract class GestureFinderTest extends BaseTes @Before public void setUp() { - ui(new Runnable() { + uiSync(new Runnable() { @Override public void run() { TestActivity a = rule.getActivity(); diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/PinchGestureFinderTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/PinchGestureFinderTest.java index c109f3b6..73659390 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/PinchGestureFinderTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/PinchGestureFinderTest.java @@ -1,8 +1,6 @@ package com.otaliastudios.cameraview.gesture; -import android.content.Context; - import androidx.annotation.NonNull; import androidx.test.espresso.ViewAction; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -11,10 +9,8 @@ import androidx.test.filters.SmallTest; import org.junit.Test; import org.junit.runner.RunWith; -import static androidx.test.espresso.matcher.ViewMatchers.withId; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @RunWith(AndroidJUnit4.class) diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/ScrollGestureFinderTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/ScrollGestureFinderTest.java index 3c05c84f..a7d6bb17 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/ScrollGestureFinderTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/gesture/ScrollGestureFinderTest.java @@ -1,8 +1,6 @@ package com.otaliastudios.cameraview.gesture; -import android.content.Context; - import androidx.annotation.NonNull; import androidx.test.espresso.ViewAction; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -11,13 +9,10 @@ import androidx.test.filters.SmallTest; import org.junit.Test; 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.swipeLeft; import static androidx.test.espresso.action.ViewActions.swipeRight; 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.assertNull; import static org.junit.Assert.assertTrue; @@ -33,7 +28,7 @@ public class ScrollGestureFinderTest extends GestureFinderTest { @Test public void testDefaults() { - assertNull(finder.getGesture()); + assertNull(finder.mType); assertEquals(finder.getPoints().length, 1); assertEquals(finder.getPoints()[0].x, 0, 0); assertEquals(finder.getPoints()[0].y, 0, 0); diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/GridLinesLayoutTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/GridLinesLayoutTest.java index 955b970f..5323d66f 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/GridLinesLayoutTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/GridLinesLayoutTest.java @@ -27,7 +27,7 @@ public class GridLinesLayoutTest extends BaseTest { @Before public void setUp() { - ui(new Runnable() { + uiSync(new Runnable() { @Override public void run() { TestActivity a = rule.getActivity(); diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/utils/CropHelperTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/utils/CropHelperTest.java index 27108f83..da016339 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/utils/CropHelperTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/utils/CropHelperTest.java @@ -4,7 +4,6 @@ package com.otaliastudios.cameraview.internal.utils; import android.graphics.Rect; import com.otaliastudios.cameraview.BaseTest; -import com.otaliastudios.cameraview.internal.utils.CropHelper; import com.otaliastudios.cameraview.size.AspectRatio; import com.otaliastudios.cameraview.size.Size; @@ -15,11 +14,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.mock; @RunWith(AndroidJUnit4.class) @SmallTest diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/utils/OrientationHelperTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/utils/OrientationHelperTest.java index 558f62be..011176cb 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/utils/OrientationHelperTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/utils/OrientationHelperTest.java @@ -6,7 +6,6 @@ import androidx.test.filters.SmallTest; import android.view.OrientationEventListener; import com.otaliastudios.cameraview.BaseTest; -import com.otaliastudios.cameraview.internal.utils.OrientationHelper; import org.junit.After; import org.junit.Before; @@ -25,11 +24,11 @@ public class OrientationHelperTest extends BaseTest { @Before public void setUp() { - ui(new Runnable() { + uiSync(new Runnable() { @Override public void run() { 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.getDeviceOrientation(), -1); - helper.enable(context()); + helper.enable(getContext()); assertNotNull(helper.mListener); assertNotEquals(helper.getDisplayOffset(), -1); // Don't know about device orientation. // Ensure nothing bad if called twice. - helper.enable(context()); + helper.enable(getContext()); assertNotNull(helper.mListener); 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 // 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); assertEquals(helper.getDeviceOrientation(), 0); helper.mListener.onOrientationChanged(10); diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/markers/MarkerLayoutTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/markers/MarkerLayoutTest.java index 451a2bf9..a1dd8367 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/markers/MarkerLayoutTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/markers/MarkerLayoutTest.java @@ -11,7 +11,6 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.runner.manipulation.Filter; import org.mockito.Mockito; import androidx.test.annotation.UiThreadTest; @@ -29,7 +28,7 @@ public class MarkerLayoutTest extends BaseTest { @Before public void setUp() { - ui(new Runnable() { + uiSync(new Runnable() { @Override public void run() { TestActivity a = rule.getActivity(); diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/overlay/OverlayLayoutTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/overlay/OverlayLayoutTest.java index 729385d3..02bc368a 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/overlay/OverlayLayoutTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/overlay/OverlayLayoutTest.java @@ -1,17 +1,12 @@ package com.otaliastudios.cameraview.overlay; -import android.content.res.Resources; -import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.graphics.Canvas; import android.util.AttributeSet; import android.util.Xml; -import android.view.Gravity; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.FrameLayout; import androidx.annotation.NonNull; import androidx.test.annotation.UiThreadTest; @@ -19,35 +14,17 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.otaliastudios.cameraview.BaseTest; -import com.otaliastudios.cameraview.R; import org.junit.After; import org.junit.Before; import org.junit.Test; 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.assertNotEquals; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.argThat; 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.reset; import static org.mockito.Mockito.spy; @@ -63,7 +40,7 @@ public class OverlayLayoutTest extends BaseTest { @Before public void setUp() { - overlayLayout = spy(new OverlayLayout(context())); + overlayLayout = spy(new OverlayLayout(getContext())); } @After @@ -97,7 +74,7 @@ public class OverlayLayoutTest extends BaseTest { @NonNull private AttributeSet getAttributeSet(int layout) throws Exception { // 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 while (parser.next() != XmlResourceParser.START_TAG) {} return Xml.asAttributeSet(parser); @@ -132,7 +109,7 @@ public class OverlayLayoutTest extends BaseTest { public void testDrawChild() { Canvas canvas = new Canvas(); OverlayLayout.LayoutParams params = new OverlayLayout.LayoutParams(10, 10); - View child = new View(context()); + View child = new View(getContext()); child.setLayoutParams(params); when(overlayLayout.doDrawChild(canvas, child, 0)).thenReturn(true); @@ -169,7 +146,7 @@ public class OverlayLayoutTest extends BaseTest { @Test public void testDrawOn() { Canvas canvas = spy(new Canvas()); - View child = new View(context()); + View child = new View(getContext()); OverlayLayout.LayoutParams params = new OverlayLayout.LayoutParams(10, 10); params.drawOnPreview = true; params.drawOnPictureSnapshot = true; diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/picture/PictureRecorderTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/picture/PictureRecorderTest.java index 43d49511..464cf471 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/picture/PictureRecorderTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/picture/PictureRecorderTest.java @@ -3,7 +3,6 @@ package com.otaliastudios.cameraview.picture; import com.otaliastudios.cameraview.BaseTest; import com.otaliastudios.cameraview.PictureResult; -import com.otaliastudios.cameraview.picture.PictureRecorder; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/preview/CameraPreviewTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/preview/CameraPreviewTest.java index 2f8be439..c1838bb3 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/preview/CameraPreviewTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/preview/CameraPreviewTest.java @@ -32,7 +32,6 @@ public abstract class CameraPreviewTest extends BaseTest { @Rule public ActivityTestRule rule = new ActivityTestRule<>(TestActivity.class); - @SuppressWarnings("WeakerAccess") protected CameraPreview preview; @SuppressWarnings("WeakerAccess") protected Size surfaceSize; @@ -46,7 +45,7 @@ public abstract class CameraPreviewTest extends BaseTest { available = new Op<>(true); destroyed = new Op<>(true); - ui(new Runnable() { + uiSync(new Runnable() { @Override public void run() { TestActivity a = rule.getActivity(); @@ -82,7 +81,7 @@ public abstract class CameraPreviewTest extends BaseTest { // Trigger a destroy. protected void ensureDestroyed() { - ui(new Runnable() { + uiSync(new Runnable() { @Override public void run() { rule.getActivity().getContentView().removeView(preview.getRootView()); diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/preview/SurfaceCameraPreviewTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/preview/SurfaceCameraPreviewTest.java index d76f9a87..8b92e042 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/preview/SurfaceCameraPreviewTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/preview/SurfaceCameraPreviewTest.java @@ -7,10 +7,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; 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; @RunWith(AndroidJUnit4.class) diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/preview/TextureCameraPreviewTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/preview/TextureCameraPreviewTest.java index 3433cac1..e5678e43 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/preview/TextureCameraPreviewTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/preview/TextureCameraPreviewTest.java @@ -7,10 +7,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; 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; @RunWith(AndroidJUnit4.class) diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/video/VideoRecorderTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/video/VideoRecorderTest.java index c3930c70..73175225 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/video/VideoRecorderTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/video/VideoRecorderTest.java @@ -13,9 +13,6 @@ import org.mockito.Mockito; import java.lang.reflect.Constructor; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; - @RunWith(AndroidJUnit4.class) @SmallTest diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraLogger.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraLogger.java index 04cb979a..6c2c61c4 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraLogger.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraLogger.java @@ -56,22 +56,23 @@ public final class CameraLogger { @VisibleForTesting static String lastTag; private static int sLevel; - private static List sLoggers; + private static List sLoggers = new ArrayList<>(); + + @VisibleForTesting static Logger sAndroidLogger = new Logger() { + @Override + public void log(int level, @NonNull String tag, @NonNull String message, @Nullable Throwable throwable) { + switch (level) { + case LEVEL_VERBOSE: Log.v(tag, message, throwable); break; + case LEVEL_INFO: Log.i(tag, message, throwable); break; + case LEVEL_WARNING: Log.w(tag, message, throwable); break; + case LEVEL_ERROR: Log.e(tag, message, throwable); break; + } + } + }; static { setLogLevel(LEVEL_ERROR); - sLoggers = new ArrayList<>(); - sLoggers.add(new Logger() { - @Override - public void log(int level, @NonNull String tag, @NonNull String message, @Nullable Throwable throwable) { - switch (level) { - case LEVEL_VERBOSE: Log.v(tag, message, throwable); break; - case LEVEL_INFO: Log.i(tag, message, throwable); break; - case LEVEL_WARNING: Log.w(tag, message, throwable); break; - case LEVEL_ERROR: Log.e(tag, message, throwable); break; - } - } - }); + sLoggers.add(sAndroidLogger); } /** diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraOptions.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraOptions.java index c10abfc8..25f90bff 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraOptions.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraOptions.java @@ -6,10 +6,8 @@ import android.hardware.Camera; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraManager; -import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.params.StreamConfigurationMap; import android.media.CamcorderProfile; -import android.media.ImageReader; import android.media.MediaRecorder; import android.os.Build; import android.util.Range; @@ -63,8 +61,6 @@ public class CameraOptions { private boolean autoFocusSupported; - // Camera1Engine constructor. - @SuppressWarnings("deprecation") public CameraOptions(@NonNull Camera.Parameters params, boolean flipSizes) { List strings; Mapper mapper = Mapper.get(Engine.CAMERA1); @@ -151,7 +147,6 @@ public class CameraOptions { // Camera2Engine constructor. @RequiresApi(Build.VERSION_CODES.LOLLIPOP) - @SuppressWarnings("deprecation") public CameraOptions(@NonNull CameraManager manager, @NonNull String cameraId, boolean flipSizes) throws CameraAccessException { Mapper mapper = Mapper.get(Engine.CAMERA2); CameraCharacteristics cameraCharacteristics = manager.getCameraCharacteristics(cameraId); @@ -323,7 +318,6 @@ public class CameraOptions { * * @return a collection of supported values. */ - @SuppressWarnings("WeakerAccess") @NonNull public Collection getSupportedPictureSizes() { return Collections.unmodifiableSet(supportedPictureSizes); @@ -347,7 +341,6 @@ public class CameraOptions { * * @return a collection of supported values. */ - @SuppressWarnings("WeakerAccess") @NonNull public Collection getSupportedVideoSizes() { return Collections.unmodifiableSet(supportedVideoSizes); @@ -373,7 +366,6 @@ public class CameraOptions { * @see Facing#FRONT * @return a collection of supported values. */ - @SuppressWarnings("WeakerAccess") @NonNull public Collection getSupportedFacing() { return Collections.unmodifiableSet(supportedFacing); @@ -389,7 +381,6 @@ public class CameraOptions { * @see Flash#TORCH * @return a collection of supported values. */ - @SuppressWarnings("WeakerAccess") @NonNull public Collection getSupportedFlash() { return Collections.unmodifiableSet(supportedFlash); @@ -406,7 +397,6 @@ public class CameraOptions { * @see WhiteBalance#CLOUDY * @return a collection of supported values. */ - @SuppressWarnings("WeakerAccess") @NonNull public Collection getSupportedWhiteBalance() { return Collections.unmodifiableSet(supportedWhiteBalance); @@ -432,7 +422,6 @@ public class CameraOptions { * * @return whether zoom is supported. */ - @SuppressWarnings("WeakerAccess") public boolean isZoomSupported() { return zoomSupported; } @@ -444,7 +433,6 @@ public class CameraOptions { * * @return whether auto focus is supported. */ - @SuppressWarnings("WeakerAccess") public boolean isAutoFocusSupported() { return autoFocusSupported; } @@ -458,7 +446,6 @@ public class CameraOptions { * @see #getExposureCorrectionMaxValue() * @return whether exposure correction is supported. */ - @SuppressWarnings("WeakerAccess") public boolean isExposureCorrectionSupported() { return exposureCorrectionSupported; } @@ -470,7 +457,6 @@ public class CameraOptions { * * @return min EV value */ - @SuppressWarnings("WeakerAccess") public float getExposureCorrectionMinValue() { return exposureCorrectionMinValue; } @@ -482,7 +468,6 @@ public class CameraOptions { * * @return max EV value */ - @SuppressWarnings("WeakerAccess") public float getExposureCorrectionMaxValue() { return exposureCorrectionMaxValue; } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/gesture/GestureFinder.java b/cameraview/src/main/java/com/otaliastudios/cameraview/gesture/GestureFinder.java index 4cd15c02..05cf1e7b 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/gesture/GestureFinder.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/gesture/GestureFinder.java @@ -3,6 +3,8 @@ package com.otaliastudios.cameraview.gesture; import android.content.Context; import android.graphics.PointF; import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; + import android.view.MotionEvent; /** @@ -22,7 +24,7 @@ public abstract class GestureFinder { private final static int GRANULARITY = 50; private boolean mActive; - private Gesture mType; + @VisibleForTesting Gesture mType; private PointF[] mPoints; private Controller mController; diff --git a/cameraview/src/test/java/com/otaliastudios/cameraview/internal/utils/PoolTest.java b/cameraview/src/test/java/com/otaliastudios/cameraview/internal/utils/PoolTest.java new file mode 100644 index 00000000..90fb874c --- /dev/null +++ b/cameraview/src/test/java/com/otaliastudios/cameraview/internal/utils/PoolTest.java @@ -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 pool; + private int instances = 0; + + @Before + public void setUp() { + pool = new Pool<>(MAX_SIZE, new Pool.Factory() { + @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 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 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); + } +}