18ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher/*
28ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher * Copyright (C) 2014 The Android Open Source Project
38ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher *
48ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher * Licensed under the Apache License, Version 2.0 (the "License");
58ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher * you may not use this file except in compliance with the License.
68ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher * You may obtain a copy of the License at
78ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher *
88ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher *      http://www.apache.org/licenses/LICENSE-2.0
98ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher *
108ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher * Unless required by applicable law or agreed to in writing, software
118ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher * distributed under the License is distributed on an "AS IS" BASIS,
128ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher * See the License for the specific language governing permissions and
148ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher * limitations under the License.
158ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher */
168ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
178ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucherpackage com.android.ex.camera2.utils;
188ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
198ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucherimport static org.junit.Assert.assertEquals;
208ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucherimport static org.junit.Assert.assertFalse;
218ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucherimport static org.junit.Assert.assertNotSame;
228ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucherimport static org.junit.Assert.assertTrue;
238ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucherimport static org.mockito.Mockito.mock;
248ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucherimport static org.mockito.Mockito.verify;
258ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
26984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucherimport android.graphics.Rect;
27bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvalaimport android.hardware.camera2.CameraCaptureSession.CaptureCallback;
288ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucherimport android.hardware.camera2.CameraDevice;
298ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucherimport android.hardware.camera2.CaptureRequest;
308ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucherimport android.hardware.camera2.CaptureRequest.Key;
318ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucherimport android.view.Surface;
328ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
338ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucherimport org.junit.Test;
348ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
35de48004068f8c16f9a56c60b0ed2485a67687b4bSol Boucherpublic class Camera2UtilsTest extends Camera2DeviceTester {
36bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala    private void captureListenerSplitterAllCallbacksReceived(CaptureCallback splitter,
37bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala                                                             CaptureCallback... terminals) {
388ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        splitter.onCaptureCompleted(null, null, null);
39bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala        for (CaptureCallback each : terminals) {
408ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher            verify(each).onCaptureCompleted(null, null, null);
418ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        }
428ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        splitter.onCaptureFailed(null, null, null);
43bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala        for (CaptureCallback each : terminals) {
448ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher            verify(each).onCaptureFailed(null, null, null);
458ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        }
468ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        splitter.onCaptureProgressed(null, null, null);
47bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala        for (CaptureCallback each : terminals) {
488ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher            verify(each).onCaptureProgressed(null, null, null);
498ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        }
508ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        splitter.onCaptureSequenceAborted(null, 0);
51bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala        for (CaptureCallback each : terminals) {
528ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher            verify(each).onCaptureSequenceAborted(null, 0);
538ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        }
548ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        splitter.onCaptureSequenceCompleted(null, 0, 0L);
55bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala        for (CaptureCallback each : terminals) {
568ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher            verify(each).onCaptureSequenceCompleted(null, 0, 0L);
578ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        }
58171362f843c1e7623f29db1781176f85b1f74815Eino-Ville Talvala        splitter.onCaptureStarted(null, null, 0L, 1L);
59bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala        for (CaptureCallback each : terminals) {
60171362f843c1e7623f29db1781176f85b1f74815Eino-Ville Talvala            verify(each).onCaptureStarted(null, null, 0L, 1L);
618ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        }
628ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
638ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
648ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
658ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void captureListenerSplitter() {
66bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala        CaptureCallback firstBackingListener = mock(CaptureCallback.class);
67bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala        CaptureCallback secondBackingListener = mock(CaptureCallback.class);
688ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        captureListenerSplitterAllCallbacksReceived(
69bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala                new Camera2CaptureCallbackSplitter(firstBackingListener, secondBackingListener),
708ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                firstBackingListener, secondBackingListener);
718ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
728ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
738ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
748ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void captureListenerSplitterEmpty() {
75bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala        captureListenerSplitterAllCallbacksReceived(new Camera2CaptureCallbackSplitter());
768ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
778ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
788ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
798ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void captureListenerSplitterNoNpe() {
808ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        captureListenerSplitterAllCallbacksReceived(
81bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala                new Camera2CaptureCallbackSplitter((CaptureCallback) null));
828ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
838ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
848ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
858ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void captureListenerSplitterMultipleNulls() {
868ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        captureListenerSplitterAllCallbacksReceived(
87bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala                new Camera2CaptureCallbackSplitter(null, null, null));
888ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
898ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
908ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
918ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void captureListenerSplitterValidAndNull() {
92bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala        CaptureCallback onlyRealBackingListener = mock(CaptureCallback.class);
938ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        captureListenerSplitterAllCallbacksReceived(
94bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala                new Camera2CaptureCallbackSplitter(null, onlyRealBackingListener),
958ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                onlyRealBackingListener);
968ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
978ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
988ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    private <T> void requestSettingsSetAndForget(Camera2RequestSettingsSet s, Key<T> k, T v) {
998ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        s.set(k, v);
1008ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(v, s.get(k));
1018ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
1028ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
1038ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
1048ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSet() {
1058ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
1068ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        // Try a boolean
1078ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(setUp, CaptureRequest.CONTROL_AE_LOCK, false);
1088ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(setUp, CaptureRequest.CONTROL_AE_LOCK, true);
1098ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        // Try an int
1108ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(setUp, CaptureRequest.CONTROL_AE_MODE, 1);
1118ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(setUp, CaptureRequest.CONTROL_AE_MODE, -1);
1128ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(setUp, CaptureRequest.CONTROL_AE_MODE, 0);
1138ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        // Try an int[]
1148ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(setUp, CaptureRequest.SENSOR_TEST_PATTERN_DATA, new int[] {1});
1158ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(setUp, CaptureRequest.SENSOR_TEST_PATTERN_DATA,
1168ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                new int[] {2, 2});
1178ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
1188ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
1198ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
1208ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetNullValue() {
1218ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
1228ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(setUp, CaptureRequest.SENSOR_TEST_PATTERN_DATA, new int[] {1});
1238ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(setUp, CaptureRequest.SENSOR_TEST_PATTERN_DATA, null);
1248ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(setUp, CaptureRequest.SENSOR_TEST_PATTERN_DATA,
1258ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                new int[] {2, 2});
1268ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
1278ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
1288ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
1298ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetUnsetAndContains() {
1308ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
1318ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertFalse(setUp.contains(CaptureRequest.CONTROL_AE_LOCK));
1328ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        setUp.set(CaptureRequest.CONTROL_AE_LOCK, false);
1338ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertTrue(setUp.contains(CaptureRequest.CONTROL_AE_LOCK));
1348ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        setUp.set(CaptureRequest.CONTROL_AE_LOCK, null);
1358ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertTrue(setUp.contains(CaptureRequest.CONTROL_AE_LOCK));
1368ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        setUp.unset(CaptureRequest.CONTROL_AE_LOCK);
1378ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertFalse(setUp.contains(CaptureRequest.CONTROL_AE_LOCK));
1388ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
1398ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        setUp.set(CaptureRequest.CONTROL_AE_LOCK, null);
1408ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertTrue(setUp.contains(CaptureRequest.CONTROL_AE_LOCK));
1418ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        setUp.set(CaptureRequest.CONTROL_AE_LOCK, false);
1428ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertTrue(setUp.contains(CaptureRequest.CONTROL_AE_LOCK));
1438ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        setUp.unset(CaptureRequest.CONTROL_AE_LOCK);
1448ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertFalse(setUp.contains(CaptureRequest.CONTROL_AE_LOCK));
1458ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
1468ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
1478ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
1488ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetStartsWithoutChanges() {
1498ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
1508ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(0, setUp.getRevision());
1518ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
1528ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
1538ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    private <T> void requestSettingsSetAndAssertChanged(Camera2RequestSettingsSet settings,
1548ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                                                        Key<T> key, T value,
1558ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                                                        boolean shouldHaveChanged) {
1568ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        long revision = settings.getRevision();
1578ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(shouldHaveChanged, settings.set(key, value));
1588ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(shouldHaveChanged ? revision + 1 : revision, settings.getRevision());
1598ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
1608ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
1618ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
1628ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetChangesReportedCorrectly() {
1638ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
1648ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, false, true);
1658ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, false, false);
1668ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, true, true);
1678ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
1688ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
1698ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
1708ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetDetectsNoopChanges() {
1718ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet s = new Camera2RequestSettingsSet();
1728ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        int[] one = {1}, two = {2};
1738ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
1748ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(s, CaptureRequest.SENSOR_TEST_PATTERN_DATA, one, true);
1758ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(s, CaptureRequest.SENSOR_TEST_PATTERN_DATA, one, false);
1768ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
1778ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(s, CaptureRequest.SENSOR_TEST_PATTERN_DATA, null, true);
1788ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(s, CaptureRequest.SENSOR_TEST_PATTERN_DATA, null, false);
1798ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
1808ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(s, CaptureRequest.SENSOR_TEST_PATTERN_DATA, two, true);
1818ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(s, CaptureRequest.SENSOR_TEST_PATTERN_DATA, two, false);
1828ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
1838ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
1848ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    private <T> void requestSettingsUnsetAndAssertChanged(Camera2RequestSettingsSet settings,
1858ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                                                          Key<T> key, boolean shouldHaveChanged) {
1868ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        long revision = settings.getRevision();
1878ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(shouldHaveChanged, settings.unset(key));
1888ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(shouldHaveChanged ? revision + 1 : revision, settings.getRevision());
1898ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
1908ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
1918ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
1928ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetUnsetMakesChangesAndDetectsNoops() {
1938ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
1948ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsUnsetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, false);
1958ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
1968ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, false, true);
1978ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsUnsetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, true);
1988ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
1998ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, false, true);
2008ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, false, false);
2018ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsUnsetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, true);
2028ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsUnsetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, false);
2038ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
2048ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, false, true);
2058ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, true, true);
2068ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsUnsetAndAssertChanged(setUp, CaptureRequest.CONTROL_AE_LOCK, true);
2078ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
2088ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
2098ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test(expected=NullPointerException.class)
2108ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetNullArgToCopyConstructor() {
2118ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet flop = new Camera2RequestSettingsSet(null);
2128ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
2138ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
2148ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test(expected=NullPointerException.class)
2158ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetNullArgToSetKey() {
2168ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
2178ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        setUp.set(null, null);
2188ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
2198ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
2208ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test(expected=NullPointerException.class)
2218ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetNullArgToUnset() {
2228ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
2238ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        setUp.unset(null);
2248ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
2258ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
2268ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test(expected=NullPointerException.class)
2278ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetNullArgToContains() {
2288ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
2298ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        setUp.contains(null);
2308ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
2318ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
2328ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test(expected=NullPointerException.class)
2338ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetNullArgToGet() {
2348ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
2358ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        setUp.get(null);
2368ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
2378ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
238984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher    @Test
239984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher    public void requestSettingsSetMatchesPrimitives() {
240984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
241984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertTrue(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, null));
242984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertFalse(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, false));
243984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertFalse(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, true));
244984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher
245984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        setUp.set(CaptureRequest.CONTROL_AE_LOCK, null);
246984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertTrue(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, null));
247984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertFalse(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, false));
248984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertFalse(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, true));
249984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher
250984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        setUp.set(CaptureRequest.CONTROL_AE_LOCK, false);
251984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertFalse(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, null));
252984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertTrue(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, false));
253984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertFalse(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, true));
254984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher
255984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        setUp.set(CaptureRequest.CONTROL_AE_LOCK, true);
256984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertFalse(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, null));
257984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertFalse(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, false));
258984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertTrue(setUp.matches(CaptureRequest.CONTROL_AE_LOCK, true));
259984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher    }
260984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher
261984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher    @Test
262984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher    public void requestSettingsSetMatchesReferences() {
263984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
264984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertTrue(setUp.matches(CaptureRequest.SCALER_CROP_REGION, null));
265984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertFalse(setUp.matches(CaptureRequest.SCALER_CROP_REGION, new Rect(0, 0, 0, 0)));
266984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher
267984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        setUp.set(CaptureRequest.SCALER_CROP_REGION, null);
268984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertTrue(setUp.matches(CaptureRequest.SCALER_CROP_REGION, null));
269984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertFalse(setUp.matches(CaptureRequest.SCALER_CROP_REGION, new Rect(0, 0, 0, 0)));
270984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher
271984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        setUp.set(CaptureRequest.SCALER_CROP_REGION, new Rect(0, 0, 0, 0));
272984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertFalse(setUp.matches(CaptureRequest.SCALER_CROP_REGION, null));
273984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertTrue(setUp.matches(CaptureRequest.SCALER_CROP_REGION, new Rect(0, 0, 0, 0)));
274984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher        assertFalse(setUp.matches(CaptureRequest.SCALER_CROP_REGION, new Rect(0, 0, 1, 1)));
275984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher    }
276984a086412a94ebea1bd9af8cd8bbf4afab38034Sol Boucher
2778ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test(expected=NullPointerException.class)
2788ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetNullArgToCreateRequest0() throws Exception {
2798ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
2809d8668449376fa47bc6528c7a61b04d6a0f691b3Sol Boucher        setUp.createRequest(null, CameraDevice.TEMPLATE_PREVIEW);
2818ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
2828ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
2838ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test(expected=NullPointerException.class)
2848ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetNullArgToCreateRequest2() throws Exception {
2858ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
2869d8668449376fa47bc6528c7a61b04d6a0f691b3Sol Boucher        setUp.createRequest(mCamera, CameraDevice.TEMPLATE_PREVIEW, (Surface) null);
2878ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
2888ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
2898ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test(expected=NullPointerException.class)
2908ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetNullArgToCreateRequest02() throws Exception {
2918ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
2929d8668449376fa47bc6528c7a61b04d6a0f691b3Sol Boucher        setUp.createRequest(null, CameraDevice.TEMPLATE_PREVIEW, (Surface) null);
2938ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
2948ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
2958ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
2968ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetNullArgToUnion() {
2978ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
2988ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertFalse(setUp.union(null));
2998ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(0, setUp.getRevision());
3008ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
3018ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
3028ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
3038ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetSelfArgToUnion() {
3048ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet setUp = new Camera2RequestSettingsSet();
3058ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertFalse(setUp.union(setUp));
3068ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(0, setUp.getRevision());
3078ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
3088ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
3098ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
3108ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetCopyConstructor() {
3118ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet original = new Camera2RequestSettingsSet();
3128ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet unchanged = new Camera2RequestSettingsSet(original);
3138ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
3148ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(original, CaptureRequest.CONTROL_AE_LOCK, true);
3158ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet changed = new Camera2RequestSettingsSet(original);
3168ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(true, changed.get(CaptureRequest.CONTROL_AE_LOCK));
3178ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
3188ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
3198ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
3208ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetCopyConstructorPreservesChangedStatus() {
3218ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet original = new Camera2RequestSettingsSet();
3228ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet unchanged = new Camera2RequestSettingsSet(original);
3238ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(original.getRevision(), unchanged.getRevision());
3248ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
3258ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(original, CaptureRequest.CONTROL_AE_LOCK, true, true);
3268ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet changed = new Camera2RequestSettingsSet(original);
3278ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(original.getRevision(), changed.getRevision());
3288ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertNotSame(original.getRevision(), unchanged.getRevision());
3298ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
3308ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
3318ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
3328ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetCopyConstructorPerformsDeepCopy() {
3338ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet original = new Camera2RequestSettingsSet();
3348ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(original, CaptureRequest.CONTROL_AE_LOCK, true);
3358ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
3368ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet changed = new Camera2RequestSettingsSet(original);
3378ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(changed, CaptureRequest.CONTROL_AE_LOCK, false);
3388ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(true, original.get(CaptureRequest.CONTROL_AE_LOCK));
3398ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
3408ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
3418ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
3428ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetNullMeansDefault() throws Exception {
3438ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet s = new Camera2RequestSettingsSet();
3448ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        CaptureRequest r1 = s.createRequest(mCamera, CameraDevice.TEMPLATE_PREVIEW);
3458ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals((Object) CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW,
3468ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                r1.get(CaptureRequest.CONTROL_CAPTURE_INTENT));
3478ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
3488ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(s, CaptureRequest.CONTROL_CAPTURE_INTENT,
3498ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
3508ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        CaptureRequest r2 = s.createRequest(mCamera, CameraDevice.TEMPLATE_PREVIEW);
3518ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals((Object) CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE,
3528ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                r2.get(CaptureRequest.CONTROL_CAPTURE_INTENT));
3538ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
3548ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(s, CaptureRequest.CONTROL_CAPTURE_INTENT, null);
3558ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        CaptureRequest r3 = s.createRequest(mCamera, CameraDevice.TEMPLATE_PREVIEW);
3568ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals((Object) CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW,
3578ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                r3.get(CaptureRequest.CONTROL_CAPTURE_INTENT));
3588ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
3598ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        s.unset(CaptureRequest.CONTROL_CAPTURE_INTENT);
3608ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        CaptureRequest r4 = s.createRequest(mCamera, CameraDevice.TEMPLATE_PREVIEW);
3618ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals((Object) CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW,
3628ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                r4.get(CaptureRequest.CONTROL_CAPTURE_INTENT));
3638ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
3648ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
3658ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
3668ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetNullPreservedByUnions() {
3678ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet master = new Camera2RequestSettingsSet();
3688ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(master, CaptureRequest.CONTROL_CAPTURE_INTENT,
3698ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW);
3708ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
3718ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet slave = new Camera2RequestSettingsSet();
3728ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        master.union(slave);
3738ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals((Object) CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW,
3748ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                master.get(CaptureRequest.CONTROL_CAPTURE_INTENT));
3758ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
3768ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(slave, CaptureRequest.CONTROL_CAPTURE_INTENT, null);
3778ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        master.union(slave);
3788ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(null, master.get(CaptureRequest.CONTROL_CAPTURE_INTENT));
3798ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
3808ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndForget(slave, CaptureRequest.CONTROL_CAPTURE_INTENT,
3818ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
3828ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        master.union(slave);
3838ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals((Object) CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE,
3848ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                master.get(CaptureRequest.CONTROL_CAPTURE_INTENT));
3858ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
3868ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        slave.unset(CaptureRequest.CONTROL_CAPTURE_INTENT);
3878ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        master.union(slave);
3888ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals((Object) CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE,
3898ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                master.get(CaptureRequest.CONTROL_CAPTURE_INTENT));
3908ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
3918ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
3928ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
3938ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetNullChangesRecorded() throws Exception {
3948ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet s = new Camera2RequestSettingsSet();
3958ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(s, CaptureRequest.CONTROL_CAPTURE_INTENT, null, true);
3968ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(s, CaptureRequest.CONTROL_CAPTURE_INTENT,
3978ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW, true);
3988ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(s, CaptureRequest.CONTROL_CAPTURE_INTENT, null, true);
3998ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetAndAssertChanged(s, CaptureRequest.CONTROL_CAPTURE_INTENT, null, false);
4008ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
4018ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
4028ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
4038ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetUnionChangesRecorded() {
4048ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet[] sets = { new Camera2RequestSettingsSet(),
4058ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                                             new Camera2RequestSettingsSet() };
4068ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        sets[0].union(sets[1]);
4078ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(1, sets[0].getRevision());
4088ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(0, sets[1].getRevision());
4098ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
4108ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
4118ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    private <T> void requestSettingsSetsCheckPairOfProperties(Camera2RequestSettingsSet firstSet,
4128ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                                                              Camera2RequestSettingsSet secondSet,
4138ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                                                              Key<T> firstKey,
4148ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                                                              Key<T> secondKey,
4158ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                                                              T expectedFirstSetFirstValue,
4168ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                                                              T expectedFirstSetSecondValue,
4178ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                                                              T expectedSecondSetFirstValue,
4188ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                                                              T expectedSecondSetSecondValue) {
4198ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(expectedFirstSetFirstValue, firstSet.get(firstKey));
4208ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(expectedFirstSetSecondValue, firstSet.get(secondKey));
4218ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(expectedSecondSetFirstValue, secondSet.get(firstKey));
4228ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        assertEquals(expectedSecondSetSecondValue, secondSet.get(secondKey));
4238ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
4248ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
4258ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    @Test
4268ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    public void requestSettingsSetUnionChangesReflected() {
4278ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        Camera2RequestSettingsSet[] sets = { new Camera2RequestSettingsSet(),
4288ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                                             new Camera2RequestSettingsSet() };
4298ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
4308ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        sets[0].set(CaptureRequest.CONTROL_AE_LOCK, true);
4318ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        sets[1].set(CaptureRequest.CONTROL_AWB_LOCK, true);
4328ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        sets[0].union(sets[1]);
4338ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        sets[1].set(CaptureRequest.CONTROL_AE_LOCK, false);
4348ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetsCheckPairOfProperties(sets[0], sets[1],
4358ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                CaptureRequest.CONTROL_AE_LOCK, CaptureRequest.CONTROL_AWB_LOCK,
4368ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                true, true, false, true);
4378ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
4388ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        sets[0].union(sets[1]);
4398ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetsCheckPairOfProperties(sets[0], sets[1],
4408ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                CaptureRequest.CONTROL_AE_LOCK, CaptureRequest.CONTROL_AWB_LOCK,
4418ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                false, true, false, true);
4428ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher
4438ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        sets[1].set(CaptureRequest.CONTROL_AE_LOCK, false);
4448ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        sets[1].set(CaptureRequest.CONTROL_AWB_LOCK, false);
4458ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        sets[0].union(sets[1]);
4468ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher        requestSettingsSetsCheckPairOfProperties(sets[0], sets[1],
4478ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                CaptureRequest.CONTROL_AE_LOCK, CaptureRequest.CONTROL_AWB_LOCK,
4488ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher                false, false, false, false);
4498ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher    }
4508ba391e3f88936557ad6d44bbef32cb08f4ca310Sol Boucher}
451