diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/overlay/OverlayDrawerTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/overlay/OverlayDrawerTest.java new file mode 100644 index 00000000..de620f05 --- /dev/null +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/overlay/OverlayDrawerTest.java @@ -0,0 +1,120 @@ +package com.otaliastudios.cameraview.overlay; + + +import android.content.res.XmlResourceParser; +import android.graphics.Canvas; +import android.util.AttributeSet; +import android.util.Xml; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.test.annotation.UiThreadTest; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SmallTest; + +import com.otaliastudios.cameraview.BaseTest; +import com.otaliastudios.cameraview.internal.egl.EglBaseSurface; +import com.otaliastudios.cameraview.internal.egl.EglCore; +import com.otaliastudios.cameraview.internal.egl.EglViewport; +import com.otaliastudios.cameraview.size.Size; + +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +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.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class OverlayDrawerTest extends BaseTest { + + private final static int WIDTH = 100; + private final static int HEIGHT = 100; + + private EglCore eglCore; + private EglBaseSurface eglSurface; + + @Before + public void setUp() { + eglCore = new EglCore(null, EglCore.FLAG_RECORDABLE); + eglSurface = new EglBaseSurface(eglCore); + eglSurface.createOffscreenSurface(WIDTH, HEIGHT); + eglSurface.makeCurrent(); + } + + @After + public void tearDown() { + eglSurface.releaseEglSurface(); + eglSurface = null; + eglCore.release(); + eglCore = null; + } + + @Test + public void testDraw() { + Overlay overlay = mock(Overlay.class); + OverlayDrawer drawer = new OverlayDrawer(overlay, new Size(WIDTH, HEIGHT)); + drawer.draw(Overlay.Target.PICTURE_SNAPSHOT); + verify(overlay, times(1)).drawOn( + eq(Overlay.Target.PICTURE_SNAPSHOT), + any(Canvas.class)); + } + + @Test + public void testGetTransform() { + // We'll check that the transform is not all zeros, which is highly unlikely + // (the default transform should be the identity matrix) + OverlayDrawer drawer = new OverlayDrawer(mock(Overlay.class), new Size(WIDTH, HEIGHT)); + drawer.draw(Overlay.Target.PICTURE_SNAPSHOT); + assertThat(drawer.getTransform(), new BaseMatcher() { + public void describeTo(Description description) { } + public boolean matches(Object item) { + float[] array = (float[]) item; + for (float value : array) { + if (value != 0.0F) return true; + } + return false; + } + }); + } + + @Test + public void testRender() { + OverlayDrawer drawer = new OverlayDrawer(mock(Overlay.class), new Size(WIDTH, HEIGHT)); + drawer.mViewport = spy(drawer.mViewport); + drawer.draw(Overlay.Target.PICTURE_SNAPSHOT); + drawer.render(); + verify(drawer.mViewport, times(1)).drawFrame( + drawer.mTextureId, + drawer.getTransform() + ); + } + + @Test + public void testRelease() { + OverlayDrawer drawer = new OverlayDrawer(mock(Overlay.class), new Size(WIDTH, HEIGHT)); + EglViewport viewport = spy(drawer.mViewport); + drawer.mViewport = viewport; + drawer.release(); + verify(viewport, times(1)).release(); + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/overlay/OverlayDrawer.java b/cameraview/src/main/java/com/otaliastudios/cameraview/overlay/OverlayDrawer.java index 7707df2f..ab9b1c2a 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/overlay/OverlayDrawer.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/overlay/OverlayDrawer.java @@ -9,6 +9,7 @@ import android.opengl.GLES20; import android.view.Surface; import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; import com.otaliastudios.cameraview.CameraLogger; import com.otaliastudios.cameraview.internal.Issue514Workaround; @@ -39,11 +40,11 @@ public class OverlayDrawer { private static final CameraLogger LOG = CameraLogger.create(TAG); private Overlay mOverlay; - private int mTextureId; + @VisibleForTesting int mTextureId; private SurfaceTexture mSurfaceTexture; private Surface mSurface; private float[] mTransform = new float[16]; - private EglViewport mViewport; + @VisibleForTesting EglViewport mViewport; private Issue514Workaround mIssue514Workaround; private final Object mIssue514WorkaroundLock = new Object();