From 6be11956e9de0e378dea6470a8b3363b03c83346 Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Sat, 28 Dec 2019 16:59:56 +0100 Subject: [PATCH] Tests --- .../cameraview/CameraViewTest.java | 25 ++++ .../metering/MeteringRegionsTest.java | 137 ++++++++++++++++++ .../otaliastudios/cameraview/CameraView.java | 1 - .../cameraview/metering/MeteringRegion.java | 5 +- .../cameraview/metering/MeteringRegions.java | 9 +- 5 files changed, 171 insertions(+), 6 deletions(-) create mode 100644 cameraview/src/androidTest/java/com/otaliastudios/cameraview/metering/MeteringRegionsTest.java diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java index 4564ad5a..cb856275 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java @@ -5,6 +5,7 @@ import android.content.Context; import android.content.res.TypedArray; import android.graphics.ImageFormat; import android.graphics.PointF; +import android.graphics.RectF; import android.location.Location; import androidx.annotation.NonNull; import androidx.test.annotation.UiThreadTest; @@ -632,6 +633,20 @@ public class CameraViewTest extends BaseTest { cameraView.startAutoFocus(200, 200); } + @Test(expected = IllegalArgumentException.class) + public void testStartAutoFocus_illegal3() { + cameraView.startAutoFocus(new RectF(-1, -1, 1, 1)); + } + + @Test(expected = IllegalArgumentException.class) + public void testStartAutoFocus_illegal4() { + cameraView.setLeft(0); + cameraView.setRight(100); + cameraView.setTop(0); + cameraView.setBottom(100); + cameraView.startAutoFocus(new RectF(-100, -100, 200, 200)); + } + @Test public void testStartAutoFocus() { cameraView.setLeft(0); @@ -642,6 +657,16 @@ public class CameraViewTest extends BaseTest { assertTrue(mockController.mFocusStarted); } + @Test + public void testStartAutoFocusRect() { + cameraView.setLeft(0); + cameraView.setRight(100); + cameraView.setTop(0); + cameraView.setBottom(100); + cameraView.startAutoFocus(new RectF(25, 25, 75, 75)); + assertTrue(mockController.mFocusStarted); + } + //endregion //region test setParameters diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/metering/MeteringRegionsTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/metering/MeteringRegionsTest.java new file mode 100644 index 00000000..5853efde --- /dev/null +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/metering/MeteringRegionsTest.java @@ -0,0 +1,137 @@ +package com.otaliastudios.cameraview.metering; + + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.PointF; +import android.graphics.Rect; +import android.graphics.RectF; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SmallTest; + +import com.otaliastudios.cameraview.BaseTest; +import com.otaliastudios.cameraview.R; +import com.otaliastudios.cameraview.markers.AutoFocusMarker; +import com.otaliastudios.cameraview.markers.AutoFocusTrigger; +import com.otaliastudios.cameraview.markers.MarkerParser; +import com.otaliastudios.cameraview.size.Size; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import java.util.List; + +import static junit.framework.TestCase.assertNotNull; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class MeteringRegionsTest extends BaseTest { + + private final Size bounds = new Size(1000, 1000); + + private void checkRegion(@NonNull MeteringRegion region, @NonNull PointF center, int weight) { + assertEquals(center.x, region.mRegion.centerX(), 0.01F); + assertEquals(center.y, region.mRegion.centerY(), 0.01F); + assertEquals(weight, region.mWeight); + } + + @Test + public void testFromPoint() { + PointF center = new PointF(500, 500); + MeteringRegions regions = MeteringRegions.fromPoint(bounds, center); + assertEquals(2, regions.mRegions.size()); + MeteringRegion first = regions.mRegions.get(0); + MeteringRegion second = regions.mRegions.get(1); + checkRegion(first, center, MeteringRegion.MAX_WEIGHT); + checkRegion(second, center, + Math.round(MeteringRegions.BLUR_FACTOR_WEIGHT * MeteringRegion.MAX_WEIGHT)); + } + + @Test + public void testFromArea() { + RectF area = new RectF(400, 400, 600, 600); + MeteringRegions regions = MeteringRegions.fromArea(bounds, area); + assertEquals(1, regions.mRegions.size()); + MeteringRegion region = regions.mRegions.get(0); + checkRegion(region, new PointF(area.centerX(), area.centerY()), MeteringRegion.MAX_WEIGHT); + } + + @Test + public void testFromArea_withBlur() { + RectF area = new RectF(400, 400, 600, 600); + MeteringRegions regions = MeteringRegions.fromArea(bounds, area, + MeteringRegion.MAX_WEIGHT, true); + assertEquals(2, regions.mRegions.size()); + MeteringRegion first = regions.mRegions.get(0); + MeteringRegion second = regions.mRegions.get(1); + PointF center = new PointF(area.centerX(), area.centerY()); + checkRegion(first, center, MeteringRegion.MAX_WEIGHT); + checkRegion(second, center, + Math.round(MeteringRegions.BLUR_FACTOR_WEIGHT * MeteringRegion.MAX_WEIGHT)); + } + + @Test + public void testTransform() { + MeteringTransform transform = mock(MeteringTransform.class); + when(transform.transformMeteringPoint(any(PointF.class))).then(new Answer() { + @Override + public PointF answer(InvocationOnMock invocation) { + PointF in = invocation.getArgument(0); + // This will swap x and y coordinates + //noinspection SuspiciousNameCombination + return new PointF(in.y, in.x); + } + }); + RectF area = new RectF(0, 0, 100, 500); // tall area + RectF expected = new RectF(0, 0, 500, 100); // wide area + MeteringRegions regions = MeteringRegions.fromArea(bounds, area); + MeteringRegions transformed = regions.transform(transform); + verify(transform, times(4)).transformMeteringPoint(any(PointF.class)); + assertEquals(1, transformed.mRegions.size()); + assertEquals(expected, transformed.mRegions.get(0).mRegion); + } + + + @Test + public void testGet() { + MeteringTransform transform = new MeteringTransform() { + @NonNull + @Override + public PointF transformMeteringPoint(@NonNull PointF point) { + return point; + } + + @NonNull + @Override + public Integer transformMeteringRegion(@NonNull RectF region, int weight) { + return weight; + } + }; + MeteringRegions regions = MeteringRegions.fromArea(bounds, + new RectF(400, 400, 600, 600), + 900, + true); + assertEquals(2, regions.mRegions.size()); + List result = regions.get(1, transform); + assertEquals(1, result.size()); + assertEquals(900, (int) result.get(0)); + } + +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index 04a498d2..2812edd1 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -72,7 +72,6 @@ import com.otaliastudios.cameraview.markers.AutoFocusMarker; import com.otaliastudios.cameraview.markers.AutoFocusTrigger; import com.otaliastudios.cameraview.markers.MarkerLayout; import com.otaliastudios.cameraview.markers.MarkerParser; -import com.otaliastudios.cameraview.metering.MeteringRegion; import com.otaliastudios.cameraview.metering.MeteringRegions; import com.otaliastudios.cameraview.overlay.OverlayLayout; import com.otaliastudios.cameraview.preview.CameraPreview; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/metering/MeteringRegion.java b/cameraview/src/main/java/com/otaliastudios/cameraview/metering/MeteringRegion.java index 95a01aa6..eb621c46 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/metering/MeteringRegion.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/metering/MeteringRegion.java @@ -7,9 +7,9 @@ import androidx.annotation.NonNull; import com.otaliastudios.cameraview.size.Size; -public class MeteringRegion implements Comparable { +class MeteringRegion implements Comparable { - public final static int MAX_WEIGHT = 1000; + final static int MAX_WEIGHT = 1000; final RectF mRegion; final int mWeight; @@ -55,6 +55,7 @@ public class MeteringRegion implements Comparable { return clip(new RectF(0, 0, bounds.getWidth(), bounds.getHeight())); } + @SuppressWarnings("WeakerAccess") @NonNull MeteringRegion clip(@NonNull RectF bounds) { RectF region = new RectF(); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/metering/MeteringRegions.java b/cameraview/src/main/java/com/otaliastudios/cameraview/metering/MeteringRegions.java index 89f12572..7adf1c64 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/metering/MeteringRegions.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/metering/MeteringRegions.java @@ -4,20 +4,23 @@ import android.graphics.PointF; import android.graphics.RectF; import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; import com.otaliastudios.cameraview.size.Size; import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; import java.util.List; public class MeteringRegions { private final static float POINT_AREA = 0.05F; - private final static float BLUR_FACTOR_WEIGHT = 0.1F; + + @VisibleForTesting + final static float BLUR_FACTOR_WEIGHT = 0.1F; private final static float BLUR_FACTOR_SIZE = 1.5F; - private final List mRegions; + @VisibleForTesting + final List mRegions; private MeteringRegions(@NonNull List regions) { mRegions = regions;