/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.camera2.cameratoo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.media.Image; import android.os.Environment; import android.util.Size; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FilenameFilter; import java.io.IOException; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.Comparator; import java.util.HashSet; import java.util.Set; import com.example.android.camera2.cameratoo.CameraTooActivity; import org.junit.Test; public class CameraTooTest { private void assertComparatorEq(T lhs, T rhs, Comparator rel) { assertEquals(String.format("%s should be equal to %s", lhs, rhs), rel.compare(lhs, rhs), 0); assertEquals(String.format("%s should be equal to %s (reverse check)", lhs, rhs), rel.compare(rhs, lhs), 0); } private void assertComparatorLt(T lhs, T rhs, Comparator rel) { assertTrue(String.format("%s should be less than %s", lhs, rhs), rel.compare(lhs, rhs) < 0); assertTrue(String.format("%s should be less than %s (reverse check)", lhs, rhs), rel.compare(rhs, lhs) > 0); } @Test public void compareSizesByArea() { Size empty = new Size(0, 0), fatAndFlat = new Size(100, 0), tallAndThin = new Size(0, 100); Size smallSquare = new Size(4, 4), horizRect = new Size(8, 2), vertRect = new Size(2, 8); Size largeSquare = new Size(5, 5); Comparator rel = new CameraTooActivity.CompareSizesByArea(); assertComparatorEq(empty, fatAndFlat, rel); assertComparatorEq(empty, tallAndThin, rel); assertComparatorEq(fatAndFlat, empty, rel); assertComparatorEq(fatAndFlat, tallAndThin, rel); assertComparatorEq(tallAndThin, empty, rel); assertComparatorEq(tallAndThin, fatAndFlat, rel); assertComparatorEq(smallSquare, horizRect, rel); assertComparatorEq(smallSquare, vertRect, rel); assertComparatorEq(horizRect, smallSquare, rel); assertComparatorEq(horizRect, vertRect, rel); assertComparatorEq(vertRect, smallSquare, rel); assertComparatorEq(vertRect, horizRect, rel); assertComparatorLt(empty, smallSquare, rel); assertComparatorLt(empty, horizRect, rel); assertComparatorLt(empty, vertRect, rel); assertComparatorLt(fatAndFlat, smallSquare, rel); assertComparatorLt(fatAndFlat, horizRect, rel); assertComparatorLt(fatAndFlat, vertRect, rel); assertComparatorLt(tallAndThin, smallSquare, rel); assertComparatorLt(tallAndThin, horizRect, rel); assertComparatorLt(tallAndThin, vertRect, rel); assertComparatorLt(empty, largeSquare, rel); assertComparatorLt(fatAndFlat, largeSquare, rel); assertComparatorLt(tallAndThin, largeSquare, rel); assertComparatorLt(smallSquare, largeSquare, rel); assertComparatorLt(horizRect, largeSquare, rel); assertComparatorLt(vertRect, largeSquare, rel); } private void assertOptimalSize(Size[] options, int minWidth, int minHeight, Size expected) { Size verdict = CameraTooActivity.chooseBigEnoughSize(options, minWidth, minHeight); assertEquals(String.format("Expected optimal size %s but got %s", expected, verdict), verdict, expected); } @Test public void chooseBigEnoughSize() { Size empty = new Size(0, 0), fatAndFlat = new Size(100, 0), tallAndThin = new Size(0, 100); Size smallSquare = new Size(4, 4), horizRect = new Size(8, 2), vertRect = new Size(2, 8); Size largeSquare = new Size(5, 5); Size[] siz = { empty, fatAndFlat, tallAndThin, smallSquare, horizRect, vertRect, largeSquare }; assertOptimalSize(siz, 0, 0, empty); assertOptimalSize(siz, 1, 0, fatAndFlat); assertOptimalSize(siz, 0, 1, tallAndThin); assertOptimalSize(siz, 4, 4, smallSquare); assertOptimalSize(siz, 1, 1, smallSquare); assertOptimalSize(siz, 2, 1, smallSquare); assertOptimalSize(siz, 1, 2, smallSquare); assertOptimalSize(siz, 3, 4, smallSquare); assertOptimalSize(siz, 4, 3, smallSquare); assertOptimalSize(siz, 8, 2, horizRect); assertOptimalSize(siz, 5, 1, horizRect); assertOptimalSize(siz, 5, 2, horizRect); assertOptimalSize(siz, 2, 8, vertRect); assertOptimalSize(siz, 1, 5, vertRect); assertOptimalSize(siz, 2, 5, vertRect); assertOptimalSize(siz, 5, 5, largeSquare); assertOptimalSize(siz, 3, 5, largeSquare); assertOptimalSize(siz, 5, 3, largeSquare); } private static final FilenameFilter OUTPUT_FILE_DECIDER = new FilenameFilter() { @Override public boolean accept(File dir, String filename) { return filename.indexOf("cameratoo") == 0 && filename.indexOf(".jpg") == filename.length() - ".jpg".length(); }}; private static Set newlyAddedElements(Set before, Set after) { Set result = new HashSet(after); result.removeAll(before); return result; } @Test public void capturedImageSaver() throws FileNotFoundException, IOException { ByteBuffer buf = ByteBuffer.allocate(25); for(int index = 0; index < buf.capacity(); ++index) buf.put(index, (byte) index); Image.Plane plane = mock(Image.Plane.class); when(plane.getBuffer()).thenReturn(buf); when(plane.getPixelStride()).thenReturn(1); when(plane.getRowStride()).thenReturn(5); Image.Plane[] onlyPlaneThatMatters = { plane }; Image image = mock(Image.class); when(image.getPlanes()).thenReturn(onlyPlaneThatMatters); when(image.getWidth()).thenReturn(5); when(image.getHeight()).thenReturn(5); File picturesFolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); Set preListing = new HashSet(Arrays.asList(picturesFolder.listFiles(OUTPUT_FILE_DECIDER))); CameraTooActivity.CapturedImageSaver saver = new CameraTooActivity.CapturedImageSaver(image); saver.run(); Set postListing = new HashSet(Arrays.asList(picturesFolder.listFiles(OUTPUT_FILE_DECIDER))); Set newFiles = newlyAddedElements(preListing, postListing); assertEquals(newFiles.size(), 1); File picture = newFiles.iterator().next(); FileInputStream istream = new FileInputStream(picture); for(int count = 0; count < buf.capacity(); ++count) { assertEquals(istream.read(), buf.get(count)); } assertEquals(istream.read(), -1); assertTrue(picture.delete()); } }