blob: 0c82425aa30a21412bb27aa3ced5c96df168bc5b [file] [log] [blame]
package org.robolectric.shadows;
import android.graphics.Canvas;
import android.graphics.ImageFormat;
import android.graphics.Rect;
import android.hardware.Camera;
import android.view.Surface;
import android.view.SurfaceHolder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.TestRunners;
import static org.fest.assertions.api.Assertions.assertThat;
import static org.fest.assertions.api.Fail.fail;
@RunWith(TestRunners.WithDefaults.class)
public class CameraTest {
private Camera camera;
private ShadowCamera shadowCamera;
@Before
public void setUp() throws Exception {
camera = Camera.open();
shadowCamera = Robolectric.shadowOf(camera);
}
@After
public void tearDown() throws Exception {
ShadowCamera.clearCameraInfo();
}
@Test
public void testOpen() throws Exception {
assertThat(camera).isNotNull();
assertThat(ShadowCamera.getLastOpenedCameraId()).isEqualTo(0);
}
@Test
public void testOpenWithId() throws Exception {
camera = Camera.open(12);
assertThat(camera).isNotNull();
assertThat(ShadowCamera.getLastOpenedCameraId()).isEqualTo(12);
}
@Test
public void testUnlock() throws Exception {
assertThat(shadowCamera.isLocked()).isTrue();
camera.unlock();
assertThat(shadowCamera.isLocked()).isFalse();
}
@Test
public void testReconnect() throws Exception {
camera.unlock();
assertThat(shadowCamera.isLocked()).isFalse();
camera.reconnect();
assertThat(shadowCamera.isLocked()).isTrue();
}
@Test
public void testGetParameters() throws Exception {
Camera.Parameters parameters = camera.getParameters();
assertThat(parameters).isNotNull();
assertThat(parameters.getSupportedPreviewFormats()).isNotNull();
assertThat(parameters.getSupportedPreviewFormats().size()).isNotEqualTo(0);
}
@Test
public void testSetParameters() throws Exception {
Camera.Parameters parameters = camera.getParameters();
assertThat(parameters.getPreviewFormat()).isEqualTo(ImageFormat.NV21);
parameters.setPreviewFormat(ImageFormat.JPEG);
camera.setParameters(parameters);
assertThat(camera.getParameters().getPreviewFormat()).isEqualTo(ImageFormat.JPEG);
}
@Test
public void testSetPreviewDisplay() throws Exception {
SurfaceHolder previewSurfaceHolder = new TestSurfaceHolder();
camera.setPreviewDisplay(previewSurfaceHolder);
assertThat(shadowCamera.getPreviewDisplay()).isSameAs(previewSurfaceHolder);
}
@Test
public void testStartPreview() throws Exception {
assertThat(shadowCamera.isPreviewing()).isFalse();
camera.startPreview();
assertThat(shadowCamera.isPreviewing()).isTrue();
}
@Test
public void testStopPreview() throws Exception {
camera.startPreview();
assertThat(shadowCamera.isPreviewing()).isTrue();
camera.stopPreview();
assertThat(shadowCamera.isPreviewing()).isFalse();
}
@Test
public void testRelease() throws Exception {
assertThat(shadowCamera.isReleased()).isFalse();
camera.release();
assertThat(shadowCamera.isReleased()).isTrue();
}
@Test
public void testSetPreviewCallbacks() throws Exception {
TestPreviewCallback callback = new TestPreviewCallback();
assertThat(callback.camera).isNull();
assertThat(callback.data).isNull();
camera.setPreviewCallback(callback);
shadowCamera.invokePreviewCallback("foobar".getBytes());
assertThat(callback.camera).isSameAs(camera);
assertThat(callback.data).isEqualTo("foobar".getBytes());
}
@Test
public void testSetOneShotPreviewCallbacks() throws Exception {
TestPreviewCallback callback = new TestPreviewCallback();
assertThat(callback.camera).isNull();
assertThat(callback.data).isNull();
camera.setOneShotPreviewCallback(callback);
shadowCamera.invokePreviewCallback("foobar".getBytes());
assertThat(callback.camera).isSameAs(camera);
assertThat(callback.data).isEqualTo("foobar".getBytes());
}
@Test
public void testPreviewCallbacksWithBuffers() throws Exception {
TestPreviewCallback callback = new TestPreviewCallback();
assertThat(callback.camera).isNull();
assertThat(callback.data).isNull();
camera.setPreviewCallbackWithBuffer(callback);
shadowCamera.invokePreviewCallback("foobar".getBytes());
assertThat(callback.camera).isSameAs(camera);
assertThat(callback.data).isEqualTo("foobar".getBytes());
}
@Test
public void testClearPreviewCallback() throws Exception {
TestPreviewCallback callback = new TestPreviewCallback();
assertThat(callback.camera).isNull();
assertThat(callback.data).isNull();
camera.setPreviewCallback(callback);
camera.setPreviewCallback(null);
shadowCamera.invokePreviewCallback("foobar".getBytes());
assertThat(callback.camera).isNull();
assertThat(callback.data).isNull();
camera.setOneShotPreviewCallback(callback);
camera.setOneShotPreviewCallback(null);
shadowCamera.invokePreviewCallback("foobar".getBytes());
assertThat(callback.camera).isNull();
assertThat(callback.data).isNull();
camera.setPreviewCallbackWithBuffer(callback);
camera.setPreviewCallbackWithBuffer(null);
shadowCamera.invokePreviewCallback("foobar".getBytes());
assertThat(callback.camera).isNull();
assertThat(callback.data).isNull();
}
@Test
public void testDisplayOrientation() {
camera.setDisplayOrientation(180);
assertThat(shadowCamera.getDisplayOrientation()).isEqualTo(180);
}
@Test
public void testSetDisplayOrientationUpdatesCameraInfos() {
addBackCamera();
addFrontCamera();
camera = Camera.open(1);
camera.setDisplayOrientation(180);
Camera.CameraInfo cameraQuery = new Camera.CameraInfo();
Camera.getCameraInfo(ShadowCamera.getLastOpenedCameraId(), cameraQuery);
assertThat(cameraQuery.orientation).isEqualTo(180);
}
@Test
public void testAutoFocus() {
assertThat(shadowCamera.hasRequestedAutoFocus()).isEqualTo(false);
TestAutoFocusCallback callback = new TestAutoFocusCallback();
camera.autoFocus(callback);
assertThat(shadowCamera.hasRequestedAutoFocus()).isEqualTo(true);
shadowCamera.invokeAutoFocusCallback(true, camera);
assertThat(callback.success).isEqualTo(true);
assertThat(callback.camera).isEqualTo(camera);
}
@Test
public void testInvokeAutoFocusCallbackMissing() {
try {
shadowCamera.invokeAutoFocusCallback(true, camera);
fail("expected an IllegalStateException");
} catch (IllegalStateException e) {
// expected
}
}
@Test
public void testCameraInfoNoCameras() throws Exception {
assertThat(Camera.getNumberOfCameras()).isEqualTo(0);
}
@Test
public void testCameraInfoBackOnly() throws Exception {
Camera.CameraInfo cameraQuery = new Camera.CameraInfo();
addBackCamera();
Camera.getCameraInfo(0, cameraQuery);
assertThat(Camera.getNumberOfCameras()).isEqualTo(1);
assertThat(cameraQuery.facing).isEqualTo(Camera.CameraInfo.CAMERA_FACING_BACK);
assertThat(cameraQuery.orientation).isEqualTo(0);
}
@Test
public void testCameraInfoBackAndFront() throws Exception {
Camera.CameraInfo cameraQuery = new Camera.CameraInfo();
addBackCamera();
addFrontCamera();
assertThat(Camera.getNumberOfCameras()).isEqualTo(2);
Camera.getCameraInfo(0, cameraQuery);
assertThat(cameraQuery.facing).isEqualTo(Camera.CameraInfo.CAMERA_FACING_BACK);
assertThat(cameraQuery.orientation).isEqualTo(0);
Camera.getCameraInfo(1, cameraQuery);
assertThat(cameraQuery.facing).isEqualTo(Camera.CameraInfo.CAMERA_FACING_FRONT);
assertThat(cameraQuery.orientation).isEqualTo(90);
}
private void addBackCamera() {
Camera.CameraInfo backCamera = new Camera.CameraInfo();
backCamera.facing = Camera.CameraInfo.CAMERA_FACING_BACK;
backCamera.orientation = 0;
ShadowCamera.addCameraInfo(0, backCamera);
}
private void addFrontCamera() {
Camera.CameraInfo frontCamera = new Camera.CameraInfo();
frontCamera.facing = Camera.CameraInfo.CAMERA_FACING_FRONT;
frontCamera.orientation = 90;
ShadowCamera.addCameraInfo(1, frontCamera);
}
private static class TestPreviewCallback implements Camera.PreviewCallback {
public Camera camera = null;
public byte[] data = null;
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
this.data = data;
this.camera = camera;
}
}
private static class TestAutoFocusCallback implements Camera.AutoFocusCallback {
public boolean success;
public Camera camera;
public void onAutoFocus(boolean success, Camera camera) {
this.success = success;
this.camera = camera;
}
}
private static class TestSurfaceHolder implements SurfaceHolder {
@Override
public void addCallback(Callback callback) {
}
@Override
public Surface getSurface() {
return null;
}
@Override
public Rect getSurfaceFrame() {
return null;
}
@Override
public boolean isCreating() {
return false;
}
@Override
public Canvas lockCanvas() {
return null;
}
@Override
public Canvas lockCanvas(Rect dirty) {
return null;
}
@Override
public void removeCallback(Callback callback) {
}
@Override
public void setFixedSize(int width, int height) {
}
@Override
public void setFormat(int format) {
}
@Override
public void setKeepScreenOn(boolean screenOn) {
}
@Override
public void setSizeFromLayout() {
}
@Override
public void setType(int type) {
}
@Override
public void unlockCanvasAndPost(Canvas canvas) {
}
}
}