package com.xtremelabs.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 com.xtremelabs.robolectric.Robolectric; import com.xtremelabs.robolectric.WithTestDefaultsRunner; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.CoreMatchers.sameInstance; import static org.junit.Assert.assertThat; @RunWith(WithTestDefaultsRunner.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, notNullValue()); } @Test public void testUnlock() throws Exception { assertThat(shadowCamera.isLocked(), equalTo(true)); camera.unlock(); assertThat(shadowCamera.isLocked(), equalTo(false)); } @Test public void testReconnect() throws Exception { camera.unlock(); assertThat(shadowCamera.isLocked(), equalTo(false)); camera.reconnect(); assertThat(shadowCamera.isLocked(), equalTo(true)); } @Test public void testGetParameters() throws Exception { Camera.Parameters parameters = camera.getParameters(); assertThat(parameters, notNullValue()); assertThat(parameters.getSupportedPreviewFormats(), notNullValue()); assertThat(parameters.getSupportedPreviewFormats().size(), not(equalTo(0))); } @Test public void testSetParameters() throws Exception { Camera.Parameters parameters = camera.getParameters(); assertThat(parameters.getPreviewFormat(), equalTo(ImageFormat.NV21)); parameters.setPreviewFormat(ImageFormat.JPEG); camera.setParameters(parameters); assertThat(camera.getParameters().getPreviewFormat(), equalTo(ImageFormat.JPEG)); } @Test public void testSetPreviewDisplay() throws Exception { SurfaceHolder previewSurfaceHolder = new TestSurfaceHolder(); camera.setPreviewDisplay(previewSurfaceHolder); assertThat(shadowCamera.getPreviewDisplay(), sameInstance(previewSurfaceHolder)); } @Test public void testStartPreview() throws Exception { assertThat(shadowCamera.isPreviewing(), equalTo(false)); camera.startPreview(); assertThat(shadowCamera.isPreviewing(), equalTo(true)); } @Test public void testStopPreview() throws Exception { camera.startPreview(); assertThat(shadowCamera.isPreviewing(), equalTo(true)); camera.stopPreview(); assertThat(shadowCamera.isPreviewing(), equalTo(false)); } @Test public void testRelease() throws Exception { assertThat(shadowCamera.isReleased(), equalTo(false)); camera.release(); assertThat(shadowCamera.isReleased(), equalTo(true)); } @Test public void testSetPreviewCallbacks() throws Exception { TestPreviewCallback callback = new TestPreviewCallback(); assertThat(callback.camera, nullValue()); assertThat(callback.data, nullValue()); camera.setPreviewCallback(callback); shadowCamera.invokePreviewCallback("foobar".getBytes()); assertThat(callback.camera, sameInstance(camera)); assertThat(callback.data, equalTo("foobar".getBytes())); } @Test public void testSetOneShotPreviewCallbacks() throws Exception { TestPreviewCallback callback = new TestPreviewCallback(); assertThat(callback.camera, nullValue()); assertThat(callback.data, nullValue()); camera.setOneShotPreviewCallback(callback); shadowCamera.invokePreviewCallback("foobar".getBytes()); assertThat(callback.camera, sameInstance(camera)); assertThat(callback.data, equalTo("foobar".getBytes())); } @Test public void testPreviewCallbacksWithBuffers() throws Exception { TestPreviewCallback callback = new TestPreviewCallback(); assertThat(callback.camera, nullValue()); assertThat(callback.data, nullValue()); camera.setPreviewCallbackWithBuffer(callback); shadowCamera.invokePreviewCallback("foobar".getBytes()); assertThat(callback.camera, sameInstance(camera)); assertThat(callback.data, equalTo("foobar".getBytes())); } @Test public void testClearPreviewCallback() throws Exception { TestPreviewCallback callback = new TestPreviewCallback(); assertThat(callback.camera, nullValue()); assertThat(callback.data, nullValue()); camera.setPreviewCallback(callback); camera.setPreviewCallback(null); shadowCamera.invokePreviewCallback("foobar".getBytes()); assertThat(callback.camera, nullValue()); assertThat(callback.data, nullValue()); camera.setOneShotPreviewCallback(callback); camera.setOneShotPreviewCallback(null); shadowCamera.invokePreviewCallback("foobar".getBytes()); assertThat(callback.camera, nullValue()); assertThat(callback.data, nullValue()); camera.setPreviewCallbackWithBuffer(callback); camera.setPreviewCallbackWithBuffer(null); shadowCamera.invokePreviewCallback("foobar".getBytes()); assertThat(callback.camera, nullValue()); assertThat(callback.data, nullValue()); } @Test public void testCameraInfoNoCameras() throws Exception { assertThat(Camera.getNumberOfCameras(), equalTo(0)); } @Test public void testCameraInfoBackOnly() throws Exception { Camera.CameraInfo cameraQuery = new Camera.CameraInfo(); addBackCamera(); Camera.getCameraInfo(0, cameraQuery); assertThat(Camera.getNumberOfCameras(), equalTo(1)); assertThat(cameraQuery.facing, equalTo(Camera.CameraInfo.CAMERA_FACING_BACK)); assertThat(cameraQuery.orientation, equalTo(0)); } @Test public void testCameraInfoBackAndFront() throws Exception { Camera.CameraInfo cameraQuery = new Camera.CameraInfo(); addBackCamera(); addFrontCamera(); assertThat( Camera.getNumberOfCameras(), equalTo(2) ); Camera.getCameraInfo(0, cameraQuery); assertThat( cameraQuery.facing, equalTo(Camera.CameraInfo.CAMERA_FACING_BACK) ); assertThat( cameraQuery.orientation, equalTo(0) ); Camera.getCameraInfo(1, cameraQuery); assertThat( cameraQuery.facing, equalTo(Camera.CameraInfo.CAMERA_FACING_FRONT) ); assertThat( cameraQuery.orientation, equalTo(90) ); } private void addBackCamera() { Camera.CameraInfo frontCamera = new Camera.CameraInfo(); frontCamera.facing = Camera.CameraInfo.CAMERA_FACING_BACK; frontCamera.orientation = 0; ShadowCamera.addCameraInfo(0, frontCamera); } private void addFrontCamera() { Camera.CameraInfo backCamera = new Camera.CameraInfo(); backCamera.facing = Camera.CameraInfo.CAMERA_FACING_FRONT; backCamera.orientation = 90; ShadowCamera.addCameraInfo(1, backCamera); } private 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 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) { } } }