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 java.util.ArrayList;
206d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport java.util.Arrays;
216d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport java.util.Collection;
226d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport java.util.List;
236d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
246d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport static junit.framework.Assert.assertEquals;
256d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport static junit.framework.Assert.assertTrue;
266d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport static junit.framework.Assert.fail;
276d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
286d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim/**
296d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Helper set of methods to add extra useful assert functionality missing in junit.
306d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim */
316d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim/**
326d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * (non-Javadoc)
336d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @see android.hardware.camera2.cts.helpers.AssertHelpers
346d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim */
356d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimpublic class AssertHelpers {
366d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
376d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    private static final int MAX_FORMAT_STRING = 50;
386d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
396d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
406d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Assert that at least one of the elements in data is non-zero.
416d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
426d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * <p>An empty or a null array always fails.</p>
436d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
446d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public static void assertArrayNotAllZeroes(String message, byte[] data) {
456d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        int size = data.length;
466d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
476d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        int i = 0;
486d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        for (i = 0; i < size; ++i) {
496d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            if (data[i] != 0) {
506d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                break;
516d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            }
526d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
536d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
546d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        assertTrue(message, i < size);
556d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
566d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
576d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
586d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Assert that every element in left is less than or equals to the corresponding element in
596d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * right.
606d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
616d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * <p>Array sizes must match.</p>
626d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
636d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param message Message to use in case the assertion fails
646d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param left Left array
656d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param right Right array
666d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
676d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public static void assertArrayNotGreater(String message, float[] left, float[] right) {
686d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        assertEquals("Array lengths did not match", left.length, right.length);
696d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
706d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String leftString = Arrays.toString(left);
716d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        String rightString = Arrays.toString(right);
726d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
736d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        for (int i = 0; i < left.length; ++i) {
746d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            String msg = String.format(
756d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    "%s: (%s should be less than or equals than %s; item index %d; left = %s; " +
766d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    "right = %s)",
776d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    message, left[i], right[i], i, leftString, rightString);
786d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
796d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            assertTrue(msg, left[i] <= right[i]);
806d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
816d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
826d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
836d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
846d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Assert that every element in the value array is greater than the lower bound (exclusive).
856d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
866d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param value an array of items
876d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param lowerBound the exclusive lower bound
886d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
896d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public static void assertArrayWithinLowerBound(String message, float[] value, float lowerBound)
906d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    {
916d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        for (int i = 0; i < value.length; ++i) {
926d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            assertTrue(
936d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    String.format("%s: (%s should be greater than than %s; item index %d in %s)",
946d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                            message, value[i], lowerBound, i, Arrays.toString(value)),
956d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    value[i] > lowerBound);
966d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
976d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
986d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
996d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
1006d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Assert that every element in the value array is less than the upper bound (exclusive).
1016d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
1026d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param value an array of items
1036d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param upperBound the exclusive upper bound
1046d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
1056d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public static void assertArrayWithinUpperBound(String message, float[] value, float upperBound)
1066d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    {
1076d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        for (int i = 0; i < value.length; ++i) {
1086d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            assertTrue(
1096d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    String.format("%s: (%s should be less than than %s; item index %d in %s)",
1106d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                            message, value[i], upperBound, i, Arrays.toString(value)),
1116d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    value[i] < upperBound);
1126d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
1136d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
1146d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1156d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
1166d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Assert that {@code low <= value <= high}
1176d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
1186d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public static void assertInRange(float value, float low, float high) {
1196d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        assertTrue(
1206d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                String.format("Value %s must be greater or equal to %s, but was lower", value, low),
1216d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                value >= low);
1226d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        assertTrue(
1236d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                String.format("Value %s must be less than or equal to %s, but was higher",
1246d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                        value, high),
1256d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                value <= high);
1266d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1276d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        // TODO: generic by using comparators
1286d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
1296d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1306d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
1316d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Assert that the given array contains the given value.
1326d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
1336d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param message message to print on failure.
1346d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual array to test.
1356d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param checkVals value to check for array membership.
1366d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
1376d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public static <T> void assertArrayContains(String message, T[] actual, T checkVals) {
1386d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        assertCollectionContainsAnyOf(message, buildList(actual), Arrays.asList(checkVals));
1396d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
1406d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1416d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1426d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
1436d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Assert that the given array contains the given value.
1446d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
1456d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param message message to print on failure.
1466d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual array to test.
1476d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param checkVals value to check for array membership.
1486d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
1496d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public static void assertArrayContains(String message, int[] actual, int checkVals) {
1506d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        assertCollectionContainsAnyOf(message, buildList(actual), Arrays.asList(checkVals));
1516d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
1526d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1536d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
1546d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Assert that the given array contains at least one of the given values.
1556d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
1566d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param message message to print on failure.
1576d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual array to test
1586d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param checkVals values to check for array membership.
1596d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return the value contained, or null.
1606d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
1616d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public static <T> T assertArrayContainsAnyOf(String message, T[] actual, T[] checkVals) {
1626d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return assertCollectionContainsAnyOf(message, buildList(actual), buildList(checkVals));
1636d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
1646d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1656d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
1666d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Assert that the given array contains at least one of the given values.
1676d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
1686d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param message message to print on failure.
1696d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual array to test
1706d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param checkVals values to check for array membership.
1716d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return the value contained.
1726d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
1736d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public static int assertArrayContainsAnyOf(String message, int[] actual, int[] checkVals) {
1746d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return assertCollectionContainsAnyOf(message, buildList(actual), buildList(checkVals));
1756d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
1766d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1776d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    /**
1786d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * Assert that the given {@link Collection} contains at least one of the given values.
1796d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     *
1806d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param message message to print on failure.
1816d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param actual {@link Collection} to test.
1826d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @param checkVals a {@link Collection} of values to check for membership.
1836d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     * @return the value contained, or null.
1846d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim     */
1856d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    public static <T> T assertCollectionContainsAnyOf(String message, Collection<T> actual,
1866d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                                                      Collection<T> checkVals) {
1876d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        boolean contains = false;
1886d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        T selected = null;
1896d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        for (T check : checkVals) {
1906d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            contains = actual.contains(check);
1916d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            if (contains) {
1926d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                selected = check;
1936d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                break;
1946d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            }
1956d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
1966d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
1976d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        if (!contains) {
1986d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            fail(String.format("%s : No elements from %s in %s", message,
1996d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    formatCollection(actual, MAX_FORMAT_STRING),
2006d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                    formatCollection(checkVals, MAX_FORMAT_STRING)));
2016d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
2026d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return selected;
2036d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
2046d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
2056d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    private static <T> List<T> buildList(T[] array) {
2066d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return new ArrayList<T>(Arrays.asList(array));
2076d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
2086d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
2096d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    private static List<Integer> buildList(int[] array) {
2106d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        List<Integer> list = new ArrayList<Integer>(array.length);
2116d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        for (Integer val : array) {
2126d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            list.add(val);
2136d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
2146d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return list;
2156d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
2166d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
2176d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    private static <T> String formatCollection(Collection<T> collection, int maxLen) {
2186d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        StringBuilder builder = new StringBuilder();
2196d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        builder.append("[");
2206d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
2216d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        boolean first = true;
2226d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        for (T elem : collection) {
2236d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            String val = ((first) ? ", " : "") + ((elem != null) ? elem.toString() : "null");
2246d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            first = false;
2256d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            if ((builder.length() + val.length()) > maxLen - "...]".length()) {
2266d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                builder.append("...");
2276d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                break;
2286d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            } else {
2296d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim                builder.append(val);
2306d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim            }
2316d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        }
2326d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        builder.append("]");
2336d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim        return builder.toString();
2346d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    }
2356d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
2366d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim
2376d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    // Suppress default constructor for noninstantiability
2386d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim    private AssertHelpers() { throw new AssertionError(); }
2396d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim}
240