16d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim/*
26d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Copyright 2016 The Android Open Source Project
36d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim *
46d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Licensed under the Apache License, Version 2.0 (the "License");
56d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * you may not use this file except in compliance with the License.
66d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * You may obtain a copy of the License at
76d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim *
86d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim *      http://www.apache.org/licenses/LICENSE-2.0
96d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim *
106d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Unless required by applicable law or agreed to in writing, software
116d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * distributed under the License is distributed on an "AS IS" BASIS,
126d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * See the License for the specific language governing permissions and
146d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * limitations under the License.
156d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim */
166d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
176d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimpackage com.android.mediaframeworktest.helpers;
186d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
196d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport org.hamcrest.CoreMatchers;
206d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport org.hamcrest.Matcher;
216d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport org.junit.rules.ErrorCollector;
226d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
236d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport android.graphics.Rect;
246d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport android.hardware.camera2.CameraCharacteristics;
256d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport android.hardware.camera2.CaptureRequest;
266d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport android.hardware.camera2.CaptureRequest.Builder;
276d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport android.hardware.camera2.CaptureResult;
286d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport android.hardware.camera2.params.MeteringRectangle;
296d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport android.media.Image;
306d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport android.util.Log;
316d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport android.util.Size;
326d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
336d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport java.util.ArrayList;
346d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport java.util.Arrays;
356d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport java.util.HashSet;
366d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport java.util.List;
376d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport java.util.Objects;
386d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport java.util.Set;
396d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
406d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim/**
416d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * A camera test ErrorCollector class to gather the test failures during a test,
426d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * instead of failing the test immediately for each failure.
436d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim */
446d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim/**
456d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * (non-Javadoc)
466d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @see android.hardware.camera2.cts.helpers.CameraErrorCollector
476d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim */
486d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimpublic class CameraErrorCollector extends ErrorCollector {
496d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
506d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    private static final String TAG = "CameraErrorCollector";
516d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    private static final boolean LOG_ERRORS = Log.isLoggable(TAG, Log.ERROR);
526d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
536d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    private String mCameraMsg = "";
546d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
556d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    @Override
566d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public void verify() throws Throwable {
576d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        // Do not remove if using JUnit 3 test runners. super.verify() is protected.
586d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        super.verify();
596d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
606d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
616d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
626d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Adds an unconditional error to the table.
636d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
646d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * <p>Execution continues, but test will fail at the end.</p>
656d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
666d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param message A string containing the failure reason.
676d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
686d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public void addMessage(String message) {
696d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        addErrorSuper(new Throwable(mCameraMsg + message));
706d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
716d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
726d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
736d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Adds a Throwable to the table. <p>Execution continues, but the test will fail at the end.</p>
746d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
756d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    @Override
766d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public void addError(Throwable error) {
776d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        addErrorSuper(new Throwable(mCameraMsg + error.getMessage(), error));
786d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
796d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
806d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    private void addErrorSuper(Throwable error) {
816d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (LOG_ERRORS) Log.e(TAG, error.getMessage());
826d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        super.addError(error);
836d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
846d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
856d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
866d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Adds a failure to the table if {@code matcher} does not match {@code value}.
876d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Execution continues, but the test will fail at the end if the match fails.
886d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * The camera id is included into the failure log.
896d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
906d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    @Override
916d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> void checkThat(final T value, final Matcher<T> matcher) {
926d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        super.checkThat(mCameraMsg, value, matcher);
936d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
946d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
956d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
966d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Adds a failure with the given {@code reason} to the table if
976d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * {@code matcher} does not match {@code value}. Execution continues, but
986d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * the test will fail at the end if the match fails. The camera id is
996d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * included into the failure log.
1006d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
1016d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    @Override
1026d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> void checkThat(final String reason, final T value, final Matcher<T> matcher) {
1036d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        super.checkThat(mCameraMsg + reason, value, matcher);
1046d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
1056d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1066d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
1076d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Set the camera id to this error collector object for logging purpose.
1086d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
1096d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param id The camera id to be set.
1106d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
1116d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public void setCameraId(String id) {
1126d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (id != null) {
1136d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            mCameraMsg = "Test failed for camera " + id + ": ";
1146d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        } else {
1156d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            mCameraMsg = "";
1166d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
1176d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
1186d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1196d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
1206d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Adds a failure to the table if {@code condition} is not {@code true}.
1216d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * <p>
1226d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Execution continues, but the test will fail at the end if the condition
1236d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * failed.
1246d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * </p>
1256d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
1266d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged when check fails.
1276d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param condition Log the failure if it is not true.
1286d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
1296d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public boolean expectTrue(String msg, boolean condition) {
1306d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (!condition) {
1316d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            addMessage(msg);
1326d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
1336d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1346d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return condition;
1356d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
1366d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1376d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
1386d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the two values are equal.
1396d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
1406d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged when check fails.
1416d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected Expected value to be checked against.
1426d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual Actual value to be checked.
1436d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return {@code true} if the two values are equal, {@code false} otherwise.
1446d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
1456d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @throws IllegalArgumentException if {@code expected} was {@code null}
1466d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
1476d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> boolean expectEquals(String msg, T expected, T actual) {
1486d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (expected == null) {
1496d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            throw new IllegalArgumentException("expected value shouldn't be null");
1506d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
1516d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1526d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (!Objects.equals(expected, actual)) {
1536d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            addMessage(String.format("%s (expected = %s, actual = %s) ", msg, expected,
1546d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    actual));
1556d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return false;
1566d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
1576d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1586d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return true;
1596d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
1606d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1616d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
1626d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the two values are not equal.
1636d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
1646d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged when check fails.
1656d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected Expected value to be checked against.
1666d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual Actual value to be checked.
1676d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return {@code true} if the two values are not equal, {@code false} otherwise.
1686d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
1696d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> boolean expectNotEquals(String msg, T expected, T actual) {
1706d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (Objects.equals(expected, actual)) {
1716d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            addMessage(String.format("%s (expected = %s, actual = %s) ", msg, expected,
1726d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    actual));
1736d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return false;
1746d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
1756d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1766d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return true;
1776d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
1786d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1796d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
1806d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the two arrays of values are deeply equal.
1816d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
1826d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged when check fails.
1836d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected Expected array of values to be checked against.
1846d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual Actual array of values to be checked.
1856d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return {@code true} if the two arrays of values are deeply equal, {@code false} otherwise.
1866d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
1876d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @throws IllegalArgumentException if {@code expected} was {@code null}
1886d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
1896d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> boolean expectEquals(String msg, T[] expected, T[] actual) {
1906d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (expected == null) {
1916d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            throw new IllegalArgumentException("expected value shouldn't be null");
1926d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
1936d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1946d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (!Arrays.deepEquals(expected, actual)) {
1956d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            addMessage(String.format("%s (expected = %s, actual = %s) ", msg,
1966d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    Arrays.deepToString(expected), Arrays.deepToString(actual)));
1976d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return false;
1986d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
1996d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
2006d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return true;
2016d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
2026d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
2036d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
2046d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the two arrays of values are not deeply equal.
2056d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
2066d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged when check fails.
2076d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected Expected array of values to be checked against.
2086d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual Actual array of values to be checked.
2096d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return {@code true} if the two arrays of values are not deeply equal, {@code false}
2106d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *          otherwise.
2116d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
2126d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @throws IllegalArgumentException if {@code expected} was {@code null}
2136d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
2146d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> boolean expectNotEquals(String msg, T[] expected, T[] actual) {
2156d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (expected == null) {
2166d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            throw new IllegalArgumentException("expected value shouldn't be null");
2176d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
2186d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
2196d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (Arrays.deepEquals(expected, actual)) {
2206d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            addMessage(String.format("%s (expected = %s, actual = %s) ", msg,
2216d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    Arrays.deepToString(expected), Arrays.deepToString(actual)));
2226d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return false;
2236d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
2246d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
2256d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return true;
2266d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
2276d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
2286d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
2296d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check that the {@code actual} value is greater than the {@code expected} value.
2306d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
2316d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged when check fails.
2326d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The expected value to check that the actual value is larger than.
2336d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual Actual value to check.
2346d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return {@code true} if {@code actual} is greater than {@code expected}.
2356d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
2366d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T extends Comparable<? super T>> boolean expectGreater(String msg, T expected,
2376d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            T actual) {
2386d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return expectTrue(String.format("%s: (expected = %s was not greater than actual = %s) ",
2396d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                msg, expected, actual), actual.compareTo(expected) > 0);
2406d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
2416d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
2426d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
2436d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check that the {@code actual} value is greater than or equal to the {@code expected} value.
2446d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
2456d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged when check fails.
2466d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The expected value to check that the actual value is larger than or equal to.
2476d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual Actual value to check.
2486d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return {@code true} if {@code actual} is greater than or equal to {@code expected}.
2496d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
2506d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T extends Comparable<? super T>> boolean expectGreaterOrEqual(String msg, T expected,
2516d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                                                                       T actual) {
2526d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return expectTrue(String.format("%s: (expected = %s was not greater than actual = %s) ",
2536d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                msg, expected, actual), actual.compareTo(expected) >= 0);
2546d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
2556d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
2566d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
2576d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check that the {@code actual} value is less than the {@code expected} value.
2586d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
2596d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged when check fails.
2606d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The expected value to check that the actual value is less than.
2616d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual Actual value to check.
2626d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return {@code true} if {@code actual} is less than {@code expected}.
2636d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
2646d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T extends Comparable<? super T>> boolean expectLess(String msg, T expected,
2656d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            T actual) {
2666d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return expectTrue(String.format("%s: (expected = %s was not greater than actual = %s) ",
2676d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                msg, expected, actual), actual.compareTo(expected) < 0);
2686d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
2696d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
2706d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
2716d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check that the {@code actual} value is less than or equal to the {@code expected} value.
2726d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
2736d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged when check fails.
2746d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The expected value to check that the actual value is less than or equal to.
2756d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual Actual value to check.
2766d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return {@code true} if {@code actual} is less than or equal to {@code expected}.
2776d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
2786d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T extends Comparable<? super T>> boolean expectLessOrEqual(String msg, T expected,
2796d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            T actual) {
2806d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return expectTrue(String.format("%s: (expected = %s was not greater than actual = %s) ",
2816d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                msg, expected, actual), actual.compareTo(expected) <= 0);
2826d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
2836d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
2846d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
2856d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the two float values are equal with given error tolerance.
2866d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
2876d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged when check fails.
2886d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected Expected value to be checked against.
2896d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual Actual value to be checked.
2906d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param tolerance The error margin for the equality check.
2916d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return {@code true} if the two values are equal, {@code false} otherwise.
2926d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
2936d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> boolean expectEquals(String msg, float expected, float actual, float tolerance) {
2946d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (expected == actual) {
2956d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return true;
2966d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
2976d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
2986d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (!(Math.abs(expected - actual) <= tolerance)) {
2996d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            addMessage(String.format("%s (expected = %s, actual = %s, tolerance = %s) ", msg,
3006d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    expected, actual, tolerance));
3016d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return false;
3026d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
3036d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
3046d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return true;
3056d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
3066d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
3076d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
3086d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the two double values are equal with given error tolerance.
3096d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
3106d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged when check fails.
3116d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected Expected value to be checked against.
3126d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual Actual value to be checked.
3136d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param tolerance The error margin for the equality check
3146d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return {@code true} if the two values are equal, {@code false} otherwise.
3156d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
3166d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> boolean expectEquals(String msg, double expected, double actual, double tolerance) {
3176d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (expected == actual) {
3186d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return true;
3196d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
3206d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
3216d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (!(Math.abs(expected - actual) <= tolerance)) {
3226d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            addMessage(String.format("%s (expected = %s, actual = %s, tolerance = %s) ", msg,
3236d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    expected, actual, tolerance));
3246d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return false;
3256d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
3266d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
3276d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return true;
3286d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
3296d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
3306d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
3316d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check that all values in the list are greater than or equal to the min value.
3326d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
3336d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged when check fails
3346d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param list The list of values to be checked
3356d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param min The smallest allowed value
3366d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
3376d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T extends Comparable<? super T>> void expectValuesGreaterOrEqual(String msg,
3386d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            List<T> list, T min) {
3396d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        for (T value : list) {
3406d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            expectTrue(msg + String.format(", array value " + value.toString() +
3416d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                                    " is less than %s",
3426d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                            min.toString()), value.compareTo(min) >= 0);
3436d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
3446d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
3456d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
3466d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
3476d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check that all values in the array are greater than or equal to the min value.
3486d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
3496d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged when check fails
3506d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param array The array of values to be checked
3516d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param min The smallest allowed value
3526d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
3536d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T extends Comparable<? super T>> void expectValuesGreaterOrEqual(String msg,
3546d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                                                                             T[] array, T min) {
3556d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectValuesGreaterOrEqual(msg, Arrays.asList(array), min);
3566d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
3576d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
3586d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
3596d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Expect the list of values are in the range.
3606d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
3616d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged
3626d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param list The list of values to be checked
3636d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param min The min value of the range
3646d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param max The max value of the range
3656d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
3666d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T extends Comparable<? super T>> void expectValuesInRange(String msg, List<T> list,
3676d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            T min, T max) {
3686d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        for (T value : list) {
3696d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            expectTrue(msg + String.format(", array value " + value.toString() +
3706d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    " is out of range [%s, %s]",
3716d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    min.toString(), max.toString()),
3726d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    value.compareTo(max)<= 0 && value.compareTo(min) >= 0);
3736d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
3746d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
3756d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
3766d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
3776d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Expect the array of values are in the range.
3786d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
3796d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged
3806d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param array The array of values to be checked
3816d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param min The min value of the range
3826d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param max The max value of the range
3836d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
3846d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T extends Comparable<? super T>> void expectValuesInRange(String msg, T[] array,
3856d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            T min, T max) {
3866d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectValuesInRange(msg, Arrays.asList(array), min, max);
3876d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
3886d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
3896d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
3906d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Expect the array of values are in the range.
3916d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
3926d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged
3936d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param array The array of values to be checked
3946d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param min The min value of the range
3956d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param max The max value of the range
3966d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
3976d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public void expectValuesInRange(String msg, int[] array, int min, int max) {
3986d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        ArrayList<Integer> l = new ArrayList<>(array.length);
3996d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        for (int i : array) {
4006d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            l.add(i);
4016d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
4026d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectValuesInRange(msg, l, min, max);
4036d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
4046d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
4056d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
4066d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Expect the value is in the range.
4076d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
4086d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged
4096d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param value The value to be checked
4106d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param min The min value of the range
4116d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param max The max value of the range
4126d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
4136d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return {@code true} if the value was in range, {@code false} otherwise
4146d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
4156d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T extends Comparable<? super T>> boolean expectInRange(String msg, T value,
4166d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            T min, T max) {
4176d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return expectTrue(msg + String.format(", value " + value.toString()
4186d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                + " is out of range [%s, %s]",
4196d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                min.toString(), max.toString()),
4206d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                value.compareTo(max)<= 0 && value.compareTo(min) >= 0);
4216d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
4226d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
4236d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
4246d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
4256d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check that two metering region arrays are similar enough by ensuring that each of their width,
4266d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * height, and all corners are within {@code errorPercent} of each other.
4276d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
4286d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * <p>Note that the length of the arrays must be the same, and each weight must be the same
4296d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * as well. We assume the order is also equivalent.</p>
4306d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
4316d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * <p>At most 1 error per each dissimilar metering region is collected.</p>
4326d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
4336d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged
4346d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The reference 'expected' values to be used to check against
4356d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual The actual values that were received
4366d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param errorPercent Within how many percent the components should be
4376d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
4386d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return {@code true} if all expects passed, {@code false} otherwise
4396d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
4406d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public boolean expectMeteringRegionsAreSimilar(String msg,
4416d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            MeteringRectangle[] expected, MeteringRectangle[] actual,
4426d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            float errorPercent) {
4436d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String expectedActualMsg = String.format("expected (%s), actual (%s)",
4446d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                Arrays.deepToString(expected), Arrays.deepToString(actual));
4456d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
4466d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String differentSizesMsg = String.format(
4476d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                "%s: rect lists are different sizes; %s",
4486d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                msg, expectedActualMsg);
4496d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
4506d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String differentWeightsMsg = String.format(
4516d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                "%s: rect weights are different; %s",
4526d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                msg, expectedActualMsg);
4536d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
4546d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (!expectTrue(differentSizesMsg, actual != null)) {
4556d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return false;
4566d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
4576d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
4586d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (!expectEquals(differentSizesMsg, expected.length, actual.length)) return false;
4596d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
4606d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        boolean succ = true;
4616d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        for (int i = 0; i < expected.length; ++i) {
4626d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            if (i < actual.length) {
4636d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                // Avoid printing multiple errors for the same rectangle
4646d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                if (!expectRectsAreSimilar(
4656d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                        msg, expected[i].getRect(), actual[i].getRect(), errorPercent)) {
4666d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    succ = false;
4676d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    continue;
4686d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                }
4696d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                if (!expectEquals(differentWeightsMsg,
4706d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                        expected[i].getMeteringWeight(), actual[i].getMeteringWeight())) {
4716d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    succ = false;
4726d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    continue;
4736d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                }
4746d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            }
4756d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
4766d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
4776d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return succ;
4786d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
4796d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
4806d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
4816d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check that two rectangles are similar enough by ensuring that their width, height,
4826d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * and all corners are within {@code errorPercent} of each other.
4836d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
4846d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * <p>Only the first error is collected, to avoid spamming several error messages when
4856d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * the rectangle is hugely dissimilar.</p>
4866d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
4876d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged
4886d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The reference 'expected' value to be used to check against
4896d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual The actual value that was received
4906d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param errorPercent Within how many percent the components should be
4916d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
4926d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return {@code true} if all expects passed, {@code false} otherwise
4936d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
4946d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public boolean expectRectsAreSimilar(String msg, Rect expected, Rect actual,
4956d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            float errorPercent) {
4966d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String formattedMsg = String.format("%s: rects are not similar enough; expected (%s), " +
4976d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                "actual (%s), error percent (%s), reason: ",
4986d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                msg, expected, actual, errorPercent);
4996d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5006d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (!expectSimilarValues(
5016d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                formattedMsg, "too wide", "too narrow", actual.width(), expected.width(),
5026d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                errorPercent)) return false;
5036d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5046d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (!expectSimilarValues(
5056d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                formattedMsg, "too tall", "too short", actual.height(), expected.height(),
5066d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                errorPercent)) return false;
5076d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5086d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (!expectSimilarValues(
5096d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                formattedMsg, "left pt too right", "left pt too left", actual.left, expected.left,
5106d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                errorPercent)) return false;
5116d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5126d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (!expectSimilarValues(
5136d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                formattedMsg, "right pt too right", "right pt too left",
5146d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                actual.right, expected.right, errorPercent)) return false;
5156d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5166d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (!expectSimilarValues(
5176d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                formattedMsg, "top pt too low", "top pt too high", actual.top, expected.top,
5186d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                errorPercent)) return false;
5196d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5206d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (!expectSimilarValues(
5216d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                formattedMsg, "bottom pt too low", "bottom pt too high", actual.top, expected.top,
5226d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                errorPercent)) return false;
5236d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5246d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return true;
5256d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
5266d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5276d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
5286d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check that two sizes are similar enough by ensuring that their width and height
5296d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * are within {@code errorPercent} of each other.
5306d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
5316d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * <p>Only the first error is collected, to avoid spamming several error messages when
5326d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * the rectangle is hugely dissimilar.</p>
5336d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
5346d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged
5356d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The reference 'expected' value to be used to check against
5366d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual The actual value that was received
5376d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param errorPercent Within how many percent the components should be
5386d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
5396d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return {@code true} if all expects passed, {@code false} otherwise
5406d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
5416d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public boolean expectSizesAreSimilar(String msg, Size expected, Size actual,
5426d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            float errorPercent) {
5436d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String formattedMsg = String.format("%s: rects are not similar enough; expected (%s), " +
5446d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                "actual (%s), error percent (%s), reason: ",
5456d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                msg, expected, actual, errorPercent);
5466d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5476d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (!expectSimilarValues(
5486d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                formattedMsg, "too wide", "too narrow", actual.getWidth(), expected.getWidth(),
5496d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                errorPercent)) return false;
5506d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5516d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (!expectSimilarValues(
5526d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                formattedMsg, "too tall", "too short", actual.getHeight(), expected.getHeight(),
5536d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                errorPercent)) return false;
5546d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5556d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return true;
5566d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
5576d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5586d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
5596d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check that the rectangle is centered within a certain tolerance of {@code errorPercent},
5606d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * with respect to the {@code bounds} bounding rectangle.
5616d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
5626d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg Message to be logged
5636d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expectedBounds The width/height of the bounding rectangle
5646d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual The actual value that was received
5656d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param errorPercent Within how many percent the centering should be
5666d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
5676d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public void expectRectCentered(String msg, Size expectedBounds, Rect actual,
5686d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            float errorPercent) {
5696d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String formattedMsg = String.format("%s: rect should be centered; expected bounds (%s), " +
5706d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                "actual (%s), error percent (%s), reason: ",
5716d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                msg, expectedBounds, actual, errorPercent);
5726d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5736d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        int centerBoundX = expectedBounds.getWidth() / 2;
5746d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        int centerBoundY = expectedBounds.getHeight() / 2;
5756d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5766d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectSimilarValues(
5776d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                formattedMsg, "too low", "too high", actual.centerY(), centerBoundY,
5786d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                errorPercent);
5796d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5806d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectSimilarValues(
5816d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                formattedMsg, "too right", "too left", actual.centerX(), centerBoundX,
5826d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                errorPercent);
5836d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
5846d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5856d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    private boolean expectSimilarValues(
5866d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            String formattedMsg, String tooSmall, String tooLarge, int actualValue,
5876d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            int expectedValue, float errorPercent) {
5886d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        boolean succ = true;
5896d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        succ = expectTrue(formattedMsg + tooLarge,
5906d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                actualValue <= (expectedValue * (1.0f + errorPercent))) && succ;
5916d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        succ = expectTrue(formattedMsg + tooSmall,
5926d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                actualValue >= (expectedValue * (1.0f - errorPercent))) && succ;
5936d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5946d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return succ;
5956d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
5966d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
5976d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public void expectNotNull(String msg, Object obj) {
5986d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        checkThat(msg, obj, CoreMatchers.notNullValue());
5996d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
6006d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
6016d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public void expectNull(String msg, Object obj) {
6026d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (obj != null) {
6036d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            addMessage(msg);
6046d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
6056d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
6066d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
6076d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
6086d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the values in the array are monotonically increasing (decreasing) and not all
6096d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * equal.
6106d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
6116d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param array The array of values to be checked
6126d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param ascendingOrder The monotonicity ordering to be checked with
6136d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
6146d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T extends Comparable<? super T>>  void checkArrayMonotonicityAndNotAllEqual(T[] array,
6156d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            boolean ascendingOrder) {
6166d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String orderMsg = ascendingOrder ? ("increasing order") : ("decreasing order");
6176d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        for (int i = 0; i < array.length - 1; i++) {
6186d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            int compareResult = array[i + 1].compareTo(array[i]);
6196d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            boolean condition = compareResult >= 0;
6206d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            if (!ascendingOrder) {
6216d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                condition = compareResult <= 0;
6226d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            }
6236d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
6246d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            expectTrue(String.format("Adjacent values (%s and %s) %s monotonicity is broken",
6256d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    array[i].toString(), array[i + 1].toString(), orderMsg), condition);
6266d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
6276d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
6286d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectTrue("All values of this array are equal: " + array[0].toString(),
6296d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                array[0].compareTo(array[array.length - 1]) != 0);
6306d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
6316d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
6326d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
6336d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the key value is not null and return the value.
6346d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
6356d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param characteristics The {@link CameraCharacteristics} to get the key from.
6366d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param key The {@link CameraCharacteristics} key to be checked.
6376d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
6386d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return The value of the key.
6396d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
6406d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> T expectKeyValueNotNull(CameraCharacteristics characteristics,
6416d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            CameraCharacteristics.Key<T> key) {
6426d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
6436d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        T value = characteristics.get(key);
6446d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (value == null) {
6456d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            addMessage("Key " + key.getName() + " shouldn't be null");
6466d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
6476d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
6486d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return value;
6496d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
6506d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
6516d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
6526d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the key value is not null and return the value.
6536d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
6546d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param request The {@link CaptureRequest} to get the key from.
6556d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param key The {@link CaptureRequest} key to be checked.
6566d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
6576d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return The value of the key.
6586d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
6596d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> T expectKeyValueNotNull(CaptureRequest request,
6606d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                                       CaptureRequest.Key<T> key) {
6616d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
6626d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        T value = request.get(key);
6636d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (value == null) {
6646d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            addMessage("Key " + key.getName() + " shouldn't be null");
6656d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
6666d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
6676d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return value;
6686d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
6696d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
6706d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
6716d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the key value is not null and return the value.
6726d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
6736d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param request The {@link CaptureRequest#Builder} to get the key from.
6746d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param key The {@link CaptureRequest} key to be checked.
6756d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return The value of the key.
6766d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
6776d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> T expectKeyValueNotNull(Builder request, CaptureRequest.Key<T> key) {
6786d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
6796d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        T value = request.get(key);
6806d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (value == null) {
6816d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            addMessage("Key " + key.getName() + " shouldn't be null");
6826d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
6836d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
6846d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return value;
6856d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
6866d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
6876d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
6886d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the key value is not null and return the value.
6896d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
6906d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param result The {@link CaptureResult} to get the key from.
6916d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param key The {@link CaptureResult} key to be checked.
6926d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return The value of the key.
6936d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
6946d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> T expectKeyValueNotNull(CaptureResult result, CaptureResult.Key<T> key) {
6956d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return expectKeyValueNotNull("", result, key);
6966d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
6976d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
6986d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
6996d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the key value is not null and return the value.
7006d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
7016d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg The message to be logged.
7026d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param result The {@link CaptureResult} to get the key from.
7036d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param key The {@link CaptureResult} key to be checked.
7046d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return The value of the key.
7056d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
7066d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> T expectKeyValueNotNull(String msg, CaptureResult result, CaptureResult.Key<T> key) {
7076d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
7086d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        T value = result.get(key);
7096d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (value == null) {
7106d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            addMessage(msg + " Key " + key.getName() + " shouldn't be null");
7116d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
7126d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
7136d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return value;
7146d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
7156d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
7166d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
7176d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the key is non-null and the value is not equal to target.
7186d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
7196d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param request The The {@link CaptureRequest#Builder} to get the key from.
7206d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param key The {@link CaptureRequest} key to be checked.
7216d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The expected value of the CaptureRequest key.
7226d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
7236d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> void expectKeyValueNotEquals(
7246d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            Builder request, CaptureRequest.Key<T> key, T expected) {
7256d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (request == null || key == null || expected == null) {
7266d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            throw new IllegalArgumentException("request, key and expected shouldn't be null");
7276d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
7286d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
7296d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        T value;
7306d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if ((value = expectKeyValueNotNull(request, key)) == null) {
7316d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return;
7326d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
7336d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
7346d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String reason = "Key " + key.getName() + " shouldn't have value " + value.toString();
7356d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        checkThat(reason, value, CoreMatchers.not(expected));
7366d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
7376d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
7386d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
7396d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the key is non-null and the value is not equal to target.
7406d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
7416d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param result The {@link CaptureResult} to get the key from.
7426d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param key The {@link CaptureResult} key to be checked.
7436d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The expected value of the CaptureResult key.
7446d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
7456d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> void expectKeyValueNotEquals(
7466d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            CaptureResult result, CaptureResult.Key<T> key, T expected) {
7476d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (result == null || key == null || expected == null) {
7486d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            throw new IllegalArgumentException("result, key and expected shouldn't be null");
7496d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
7506d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
7516d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        T value;
7526d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if ((value = expectKeyValueNotNull(result, key)) == null) {
7536d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return;
7546d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
7556d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
7566d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String reason = "Key " + key.getName() + " shouldn't have value " + value.toString();
7576d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        checkThat(reason, value, CoreMatchers.not(expected));
7586d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
7596d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
7606d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
7616d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the value is non-null and the value is equal to target.
7626d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
7636d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param result The  {@link CaptureResult} to lookup the value in.
7646d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param key The {@link CaptureResult} key to be checked.
7656d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The expected value of the {@link CaptureResult} key.
7666d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
7676d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> void expectKeyValueEquals(CaptureResult result, CaptureResult.Key<T> key,
7686d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            T expected) {
7696d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (result == null || key == null || expected == null) {
7706d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            throw new IllegalArgumentException("request, key and expected shouldn't be null");
7716d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
7726d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
7736d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        T value;
7746d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if ((value = expectKeyValueNotNull(result, key)) == null) {
7756d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return;
7766d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
7776d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
7786d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String reason = "Key " + key.getName() + " value " + value.toString()
7796d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                + " doesn't match the expected value " + expected.toString();
7806d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        checkThat(reason, value, CoreMatchers.equalTo(expected));
7816d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
7826d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
7836d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
7846d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the key is non-null and the value is equal to target.
7856d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
7866d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * <p>Only check non-null if the target is null.</p>
7876d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
7886d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param request The The {@link CaptureRequest#Builder} to get the key from.
7896d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param key The {@link CaptureRequest} key to be checked.
7906d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The expected value of the CaptureRequest key.
7916d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
7926d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> void expectKeyValueEquals(Builder request, CaptureRequest.Key<T> key, T expected) {
7936d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (request == null || key == null || expected == null) {
7946d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            throw new IllegalArgumentException("request, key and expected shouldn't be null");
7956d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
7966d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
7976d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        T value;
7986d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if ((value = expectKeyValueNotNull(request, key)) == null) {
7996d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return;
8006d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
8016d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
8026d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String reason = "Key " + key.getName() + " value " + value.toString()
8036d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                + " doesn't match the expected value " + expected.toString();
8046d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        checkThat(reason, value, CoreMatchers.equalTo(expected));
8056d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
8066d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
8076d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
8086d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the key is non-null, and the key value is greater than the expected value.
8096d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
8106d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param result {@link CaptureResult} to check.
8116d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param key The {@link CaptureResult} key to be checked.
8126d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The expected to be compared to the value for the given key.
8136d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
8146d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T extends Comparable<? super T>> void expectKeyValueGreaterOrEqual(
8156d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            CaptureResult result, CaptureResult.Key<T> key, T expected) {
8166d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        T value;
8176d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if ((value = expectKeyValueNotNull(result, key)) == null) {
8186d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return;
8196d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
8206d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
8216d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectGreaterOrEqual(key.getName(), expected, value);
8226d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
8236d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
8246d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
8256d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the key is non-null, and the key value is greater than the expected value.
8266d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
8276d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param characteristics {@link CameraCharacteristics} to check.
8286d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param key The {@link CameraCharacteristics} key to be checked.
8296d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The expected to be compared to the value for the given key.
8306d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
8316d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T extends Comparable<? super T>> void expectKeyValueGreaterThan(
8326d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            CameraCharacteristics characteristics, CameraCharacteristics.Key<T> key, T expected) {
8336d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        T value;
8346d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if ((value = expectKeyValueNotNull(characteristics, key)) == null) {
8356d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return;
8366d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
8376d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
8386d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectGreater(key.getName(), expected, value);
8396d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
8406d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
8416d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
8426d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the key is non-null, and the key value is in the expected range.
8436d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
8446d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param characteristics {@link CameraCharacteristics} to check.
8456d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param key The {@link CameraCharacteristics} key to be checked.
8466d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param min The min value of the range
8476d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param max The max value of the range
8486d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
8496d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T extends Comparable<? super T>> void expectKeyValueInRange(
8506d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            CameraCharacteristics characteristics, CameraCharacteristics.Key<T> key, T min, T max) {
8516d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        T value;
8526d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if ((value = expectKeyValueNotNull(characteristics, key)) == null) {
8536d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return;
8546d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
8556d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectInRange(key.getName(), value, min, max);
8566d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
8576d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
8586d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
8596d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the key is non-null, and the key value is one of the expected values.
8606d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
8616d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param characteristics {@link CameraCharacteristics} to check.
8626d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param key The {@link CameraCharacteristics} key to be checked.
8636d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The expected values for the given key.
8646d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
8656d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> void expectKeyValueIsIn(CameraCharacteristics characteristics,
8666d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                                       CameraCharacteristics.Key<T> key, T... expected) {
8676d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        T value = expectKeyValueNotNull(characteristics, key);
8686d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (value == null) {
8696d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return;
8706d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
8716d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String reason = "Key " + key.getName() + " value " + value
8726d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                + " isn't one of the expected values " + Arrays.deepToString(expected);
8736d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectContains(reason, expected, value);
8746d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
8756d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
8766d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
8776d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the key is non-null, and the key value is one of the expected values.
8786d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
8796d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param request The The {@link CaptureRequest#Builder} to get the key from.
8806d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param key The {@link CaptureRequest} key to be checked.
8816d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The expected values of the CaptureRequest key.
8826d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
8836d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> void expectKeyValueIsIn(Builder request, CaptureRequest.Key<T> key, T... expected) {
8846d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        T value = expectKeyValueNotNull(request, key);
8856d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (value == null) {
8866d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return;
8876d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
8886d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String reason = "Key " + key.getName() + " value " + value
8896d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                + " isn't one of the expected values " + Arrays.deepToString(expected);
8906d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectContains(reason, expected, value);
8916d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
8926d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
8936d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
8946d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the key is non-null, and the key value contains the expected element.
8956d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
8966d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param characteristics {@link CameraCharacteristics} to check.
8976d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param key The {@link CameraCharacteristics} key to be checked.
8986d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The expected element to be contained in the value for the given key.
8996d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
9006d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> void expectKeyValueContains(CameraCharacteristics characteristics,
9016d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                                           CameraCharacteristics.Key<T[]> key, T expected) {
9026d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        T[] value;
9036d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if ((value = expectKeyValueNotNull(characteristics, key)) == null) {
9046d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return;
9056d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
9066d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String reason = "Key " + key.getName() + " value " + value
9076d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                + " doesn't contain the expected value " + expected;
9086d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectContains(reason, value, expected);
9096d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
9106d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
9116d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
9126d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the key is non-null, and the key value contains the expected element.
9136d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
9146d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param characteristics {@link CameraCharacteristics} to check.
9156d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param key The {@link CameraCharacteristics} key to be checked.
9166d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The expected element to be contained in the value for the given key.
9176d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
9186d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public void expectKeyValueContains(CameraCharacteristics characteristics,
9196d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                                           CameraCharacteristics.Key<int[]> key, int expected) {
9206d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        int[] value;
9216d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if ((value = expectKeyValueNotNull(characteristics, key)) == null) {
9226d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return;
9236d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
9246d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String reason = "Key " + key.getName() + " value " + value
9256d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                + " doesn't contain the expected value " + expected;
9266d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectContains(reason, value, expected);
9276d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
9286d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
9296d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
9306d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the key is non-null, and the key value contains the expected element.
9316d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
9326d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param characteristics {@link CameraCharacteristics} to check.
9336d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param key The {@link CameraCharacteristics} key to be checked.
9346d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected The expected element to be contained in the value for the given key.
9356d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
9366d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public void expectKeyValueContains(CameraCharacteristics characteristics,
9376d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                                       CameraCharacteristics.Key<boolean[]> key, boolean expected) {
9386d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        boolean[] value;
9396d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if ((value = expectKeyValueNotNull(characteristics, key)) == null) {
9406d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            return;
9416d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
9426d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String reason = "Key " + key.getName() + " value " + value
9436d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                + " doesn't contain the expected value " + expected;
9446d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectContains(reason, value, expected);
9456d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
9466d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
9476d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
9486d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the {@code values} array contains the expected element.
9496d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
9506d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param reason reason to print for failure.
9516d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param values array to check for membership in.
9526d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected the value to check.
9536d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
9546d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> void expectContains(String reason, T[] values, T expected) {
9556d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (values == null) {
9566d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            throw new NullPointerException();
9576d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
9586d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        checkThat(reason, expected, InMatcher.in(values));
9596d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
9606d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
9616d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> void expectContains(T[] values, T expected) {
9626d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String reason = "Expected value " + expected
9636d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                + " is not contained in the given values " + values;
9646d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectContains(reason, values, expected);
9656d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
9666d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
9676d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
9686d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Specialize {@link InMatcher} class for integer primitive array.
9696d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
9706d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    private static class IntInMatcher extends InMatcher<Integer> {
9716d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        public IntInMatcher(int[] values) {
9726d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            Preconditions.checkNotNull("values", values);
9736d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            mValues = new ArrayList<>(values.length);
9746d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            for (int i : values) {
9756d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                mValues.add(i);
9766d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            }
9776d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
9786d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
9796d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
9806d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
9816d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the {@code values} array contains the expected element.
9826d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
9836d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * <p>Specialized for primitive int arrays</p>
9846d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
9856d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param reason reason to print for failure.
9866d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param values array to check for membership in.
9876d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected the value to check.
9886d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
9896d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public void expectContains(String reason, int[] values, int expected) {
9906d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (values == null) {
9916d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            throw new NullPointerException();
9926d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
9936d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
9946d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        checkThat(reason, expected, new IntInMatcher(values));
9956d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
9966d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
9976d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public void expectContains(int[] values, int expected) {
9986d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String reason = "Expected value " + expected
9996d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                + " is not contained in the given values " + values;
10006d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectContains(reason, values, expected);
10016d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
10026d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
10036d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
10046d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Specialize {@link BooleanInMatcher} class for boolean primitive array.
10056d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
10066d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    private static class BooleanInMatcher extends InMatcher<Boolean> {
10076d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        public BooleanInMatcher(boolean[] values) {
10086d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            Preconditions.checkNotNull("values", values);
10096d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            mValues = new ArrayList<>(values.length);
10106d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            for (boolean i : values) {
10116d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                mValues.add(i);
10126d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            }
10136d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
10146d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
10156d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
10166d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
10176d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the {@code values} array contains the expected element.
10186d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
10196d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * <p>Specialized for primitive boolean arrays</p>
10206d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
10216d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param reason reason to print for failure.
10226d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param values array to check for membership in.
10236d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected the value to check.
10246d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
10256d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public void expectContains(String reason, boolean[] values, boolean expected) {
10266d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (values == null) {
10276d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            throw new NullPointerException();
10286d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
10296d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
10306d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        checkThat(reason, expected, new BooleanInMatcher(values));
10316d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
10326d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
10336d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
10346d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the {@code values} array contains the expected element.
10356d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
10366d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * <p>Specialized for primitive boolean arrays</p>
10376d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
10386d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param values array to check for membership in.
10396d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param expected the value to check.
10406d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
10416d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public void expectContains(boolean[] values, boolean expected) {
10426d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String reason = "Expected value " + expected
10436d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                + " is not contained in the given values " + values;
10446d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectContains(reason, values, expected);
10456d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
10466d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
10476d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
10486d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Check if the element inside of the list are unique.
10496d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
10506d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param msg The message to be logged
10516d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param list The list of values to be checked
10526d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
10536d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public <T> void expectValuesUnique(String msg, List<T> list) {
10546d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        Set<T> sizeSet = new HashSet<T>(list);
10556d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectTrue(msg + " each element must be distinct", sizeSet.size() == list.size());
10566d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
10576d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
10586d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public void expectImageProperties(String msg, Image image, int format, Size size,
10596d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            long timestampNs) {
10606d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectEquals(msg + "Image format is wrong.", image.getFormat(), format);
10616d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectEquals(msg + "Image width is wrong.", image.getWidth(), size.getWidth());
10626d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectEquals(msg + "Image height is wrong.", image.getHeight(), size.getHeight());
10636d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        expectEquals(msg + "Image timestamp is wrong.", image.getTimestamp(), timestampNs);
10646d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
10656d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
10666d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim}
1067