blob: 9580db90c4d467e590121819c88eff30b9d842f0 [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.emultest.java.util;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/**
* Tests {@link Arrays}.
*/
public class ArraysTest extends EmulTestBase {
/**
* Helper class to use in sorted objects test.
*/
private static class TestObject {
private static int count = 0;
private int index;
private int value;
public TestObject(int value) {
this.value = value;
index = count++;
}
public int getIndex() {
return index;
}
public int getValue() {
return value;
}
public void setIndex(int val) {
index = val;
}
@Override
public String toString() {
return value + "@" + index;
}
}
@Override
public String getModuleName() {
return "com.google.gwt.emultest.EmulSuite";
}
/**
* Verifies that calling Arrays.hashCode(Object[]) with an array with
* embedded null references works properly (and most importantly doesn't
* throw an NPE).
*/
public void testArraysHashCodeWithNullElements() {
String[] a = new String[] { "foo", null, "bar", "baz" };
Arrays.hashCode(a);
}
public void testArraysEqualsWithEmptyArrays() {
assertTrue(Arrays.equals(new String[0], new String[0]));
}
public void testArraysEqualsWithoutNullElementsEqual() {
assertTrue(Arrays.equals(
new String[]{"foo"}, new String[]{"foo"}));
}
public void testArraysEqualsWithoutNullElementsNotEqual() {
assertFalse(Arrays.equals(
new String[]{"foo"}, new String[]{"bar"}));
}
public void testArraysEqualsWithNullElementsEqual() {
assertTrue(Arrays.equals(new String[2], new String[2]));
}
public void testArraysEqualsWithNullElementsNotEqual() {
assertFalse(Arrays.equals(new String[2], new String[1]));
}
public void testArraysEqualsWithNullAndNonNullElementsEqual() {
assertTrue(Arrays.equals(
new String[]{null, "foo", null, "bar"},
new String[]{null, "foo", null, "bar"}));
}
public void testArraysEqualsWithNullAndNonNullElementsNotEqual() {
assertFalse(Arrays.equals(
new String[]{null, "bar", null, "foo"},
new String[]{null, "foo", null, "foo"}));
}
/**
* Tests {@link Arrays#asList(Object[])}.
*/
@SuppressWarnings("unchecked")
public void testAsList() {
try {
Arrays.asList((Object[]) null);
fail();
} catch (NullPointerException expected) {
}
// 0
Object[] test = {};
List result = Arrays.asList(test);
assertEquals(test, result);
// n
Object[] test2 = {0, 1, 2};
List result2 = Arrays.asList(test2);
assertEquals(test2, result2);
// 1
Object[] test3 = {"Hello"};
List result3 = Arrays.asList(test3);
assertEquals(test3, result3);
}
/**
* Tests if changes to the list created by {@link Arrays#asList(Object[])} are
* reflected in the original array.
*/
@SuppressWarnings("unchecked")
public void testAsListBacking() {
Object[] test1 = {0, 1, 2};
List result1 = Arrays.asList(test1);
test1[0] = 3;
assertEquals(test1, result1);
Object[] test2 = {"a", "b", "c"};
List result2 = Arrays.asList(test2);
result2.set(2, "x");
assertEquals(test2, result2);
}
/**
* Tests {@link Arrays#asList(Object[])}.
*/
public void testAsListIsFixed() {
List<String> list = Arrays.asList("foo", "bar", "baz");
try {
list.add("bal");
fail("Expected UnsupportedOperationException");
} catch (UnsupportedOperationException expected) {
}
try {
list.remove(0);
fail("Expected UnsupportedOperationException");
} catch (UnsupportedOperationException expected) {
}
try {
list.clear();
fail("Expected UnsupportedOperationException");
} catch (UnsupportedOperationException expected) {
}
Iterator<String> it = list.iterator();
it.next();
try {
it.remove();
fail("Expected UnsupportedOperationException");
} catch (UnsupportedOperationException expected) {
}
ListIterator<String> lit = list.listIterator();
lit.next();
try {
lit.add("bal");
fail("Expected UnsupportedOperationException");
} catch (UnsupportedOperationException expected) {
}
assertEquals(3, list.size());
}
/**
* Test Arrays.binarySearch(byte[], byte).
*
* <pre>
* Verify the following cases:
* empty array
* odd numbers of elements
* even numbers of elements
* not found value larger than all elements
* not found value smaller than all elements
* negative values
* </pre>
*/
public void testBinarySearchByte() {
byte[] a1 = {};
int ret = Arrays.binarySearch(a1, (byte) 0);
assertEquals(-1, ret);
byte[] a2 = {1, 7, 31};
ret = Arrays.binarySearch(a2, (byte) 3);
assertEquals(-2, ret);
ret = Arrays.binarySearch(a2, (byte) 31);
assertEquals(2, ret);
byte[] a3 = {-71, 0, 35, 36};
ret = Arrays.binarySearch(a3, (byte) 42);
assertEquals(-5, ret);
ret = Arrays.binarySearch(a3, (byte) -80);
assertEquals(-1, ret);
ret = Arrays.binarySearch(a3, (byte) -71);
assertEquals(0, ret);
ret = Arrays.binarySearch(a3, 1, 4, (byte) 35);
assertEquals(2, ret);
ret = Arrays.binarySearch(a3, 1, 4, (byte) -71);
assertEquals(-2, ret);
}
/**
* Test Arrays.binarySearch(char[], char).
*
* <pre>
* Verify the following cases:
* empty array
* odd numbers of elements
* even numbers of elements
* not found value larger than all elements
* not found value smaller than all elements
* </pre>
*/
public void testBinarySearchChar() {
char[] a1 = {};
int ret = Arrays.binarySearch(a1, (char) 0);
assertEquals(-1, ret);
char[] a2 = {1, 7, 31};
ret = Arrays.binarySearch(a2, (char) 3);
assertEquals(-2, ret);
ret = Arrays.binarySearch(a2, (char) 31);
assertEquals(2, ret);
char[] a3 = {1, 2, 35, 36};
ret = Arrays.binarySearch(a3, (char) 42);
assertEquals(-5, ret);
ret = Arrays.binarySearch(a3, (char) 0);
assertEquals(-1, ret);
ret = Arrays.binarySearch(a3, (char) 1);
assertEquals(0, ret);
ret = Arrays.binarySearch(a3, 1, 4, (char) 35);
assertEquals(2, ret);
ret = Arrays.binarySearch(a3, 1, 4, (char) 1);
assertEquals(-2, ret);
}
/**
* Test Arrays.binarySearch(double[], double).
*
* <pre>
* Verify the following cases:
* empty array
* odd numbers of elements
* even numbers of elements
* not found value larger than all elements
* not found value smaller than all elements
* negative values
* </pre>
*/
public void testBinarySearchDouble() {
double[] a1 = {};
int ret = Arrays.binarySearch(a1, 0);
assertEquals(-1, ret);
double[] a2 = {1, 7, 31};
ret = Arrays.binarySearch(a2, 3);
assertEquals(-2, ret);
ret = Arrays.binarySearch(a2, 31);
assertEquals(2, ret);
double[] a3 = {-71, 0, 35, 36};
ret = Arrays.binarySearch(a3, 42);
assertEquals(-5, ret);
ret = Arrays.binarySearch(a3, -80);
assertEquals(-1, ret);
ret = Arrays.binarySearch(a3, -71);
assertEquals(0, ret);
ret = Arrays.binarySearch(a3, 1, 4, 35);
assertEquals(2, ret);
ret = Arrays.binarySearch(a3, 1, 4, -71);
assertEquals(-2, ret);
}
/**
* Test Arrays.binarySearch(float[], float).
*
* <pre>
* Verify the following cases:
* empty array
* odd numbers of elements
* even numbers of elements
* not found value larger than all elements
* not found value smaller than all elements
* negative values
* </pre>
*/
public void testBinarySearchFloat() {
float[] a1 = {};
int ret = Arrays.binarySearch(a1, 0);
assertEquals(-1, ret);
float[] a2 = {1, 7, 31};
ret = Arrays.binarySearch(a2, 3);
assertEquals(-2, ret);
ret = Arrays.binarySearch(a2, 31);
assertEquals(2, ret);
float[] a3 = {-71, 0, 35, 36};
ret = Arrays.binarySearch(a3, 42);
assertEquals(-5, ret);
ret = Arrays.binarySearch(a3, -80);
assertEquals(-1, ret);
ret = Arrays.binarySearch(a3, -71);
assertEquals(0, ret);
ret = Arrays.binarySearch(a3, 1, 4, 35);
assertEquals(2, ret);
ret = Arrays.binarySearch(a3, 1, 4, -71);
assertEquals(-2, ret);
}
/**
* Test Arrays.binarySearch(int[], int).
*
* <pre>
* Verify the following cases:
* empty array
* odd numbers of elements
* even numbers of elements
* not found value larger than all elements
* not found value smaller than all elements
* negative values
* </pre>
*/
public void testBinarySearchInt() {
int[] a1 = {};
int ret = Arrays.binarySearch(a1, 0);
assertEquals(-1, ret);
int[] a2 = {1, 7, 31};
ret = Arrays.binarySearch(a2, 3);
assertEquals(-2, ret);
ret = Arrays.binarySearch(a2, 31);
assertEquals(2, ret);
int[] a3 = {-71, 0, 35, 36};
ret = Arrays.binarySearch(a3, 42);
assertEquals(-5, ret);
ret = Arrays.binarySearch(a3, -80);
assertEquals(-1, ret);
ret = Arrays.binarySearch(a3, -71);
assertEquals(0, ret);
ret = Arrays.binarySearch(a3, 1, 4, 35);
assertEquals(2, ret);
ret = Arrays.binarySearch(a3, 1, 4, -71);
assertEquals(-2, ret);
}
/**
* Test Arrays.binarySearch(long[], long).
*
* <pre>
* Verify the following cases:
* empty array
* odd numbers of elements
* even numbers of elements
* not found value larger than all elements
* not found value smaller than all elements
* negative values
* </pre>
*/
public void testBinarySearchLong() {
long[] a1 = {};
int ret = Arrays.binarySearch(a1, 0L);
assertEquals(-1, ret);
long[] a2 = {1, 7, 31};
ret = Arrays.binarySearch(a2, 3L);
assertEquals(-2, ret);
ret = Arrays.binarySearch(a2, 31L);
assertEquals(2, ret);
long[] a3 = {-71, 0, 35, 36};
ret = Arrays.binarySearch(a3, 42L);
assertEquals(-5, ret);
ret = Arrays.binarySearch(a3, -80L);
assertEquals(-1, ret);
ret = Arrays.binarySearch(a3, -71L);
assertEquals(0, ret);
ret = Arrays.binarySearch(a3, 1, 4, 35);
assertEquals(2, ret);
ret = Arrays.binarySearch(a3, 1, 4, -71);
assertEquals(-2, ret);
}
/**
* Test Arrays.binarySearch(Object[], Object).
*
* <pre>
* Verify the following cases:
* empty array
* odd numbers of elements
* even numbers of elements
* not found value larger than all elements
* not found value smaller than all elements
* </pre>
*/
public void testBinarySearchObject() {
Object[] a1 = {};
int ret = Arrays.binarySearch(a1, "");
assertEquals(-1, ret);
Object[] a2 = {"a", "g", "y"};
ret = Arrays.binarySearch(a2, "c");
assertEquals(-2, ret);
ret = Arrays.binarySearch(a2, "y");
assertEquals(2, ret);
Object[] a3 = {"b", "c", "x", "y"};
ret = Arrays.binarySearch(a3, "z");
assertEquals(-5, ret);
ret = Arrays.binarySearch(a3, "a");
assertEquals(-1, ret);
ret = Arrays.binarySearch(a3, "b");
assertEquals(0, ret);
ret = Arrays.binarySearch(a3, 1, 4, "x");
assertEquals(2, ret);
ret = Arrays.binarySearch(a3, 1, 4, "b");
assertEquals(-2, ret);
}
/**
* Test Arrays.binarySearch(Object[], Object, Comparator).
*
* <pre>
* Verify the following cases:
* empty array
* odd numbers of elements
* even numbers of elements
* not found value larger than all elements
* not found value smaller than all elements
* Comparator uses natural ordering as a default
* </pre>
*/
@SuppressWarnings("unchecked")
public void testBinarySearchObjectComparator() {
final Comparator inverseSort = Collections.reverseOrder();
Object[] a1 = {};
int ret = Arrays.binarySearch(a1, "", inverseSort);
assertEquals(-1, ret);
Object[] a2 = {"y", "g", "a"};
ret = Arrays.binarySearch(a2, "c", inverseSort);
assertEquals(-3, ret);
ret = Arrays.binarySearch(a2, "a", inverseSort);
assertEquals(2, ret);
Object[] a3 = {"y", "x", "c", "b"};
ret = Arrays.binarySearch(a3, "a", inverseSort);
assertEquals(-5, ret);
ret = Arrays.binarySearch(a3, "z", inverseSort);
assertEquals(-1, ret);
ret = Arrays.binarySearch(a3, "y", inverseSort);
assertEquals(0, ret);
ret = Arrays.binarySearch(a3, 1, 3, "x", inverseSort);
assertEquals(1, ret);
ret = Arrays.binarySearch(a3, 1, 3, "b", inverseSort);
assertEquals(-4, ret);
Object[] a4 = {"a", "b", "c", "d", "e"};
ret = Arrays.binarySearch(a4, "d", null); // should not NPE
assertEquals(3, ret);
}
/**
* Test Arrays.binarySearch(short[], short).
*
* <pre>
* Verify the following cases:
* empty array
* odd numbers of elements
* even numbers of elements
* not found value larger than all elements
* not found value smaller than all elements
* negative values
* </pre>
*/
public void testBinarySearchShort() {
short[] a1 = {};
int ret = Arrays.binarySearch(a1, (short) 0);
assertEquals(-1, ret);
short[] a2 = {1, 7, 31};
ret = Arrays.binarySearch(a2, (short) 3);
assertEquals(-2, ret);
ret = Arrays.binarySearch(a2, (short) 31);
assertEquals(2, ret);
short[] a3 = {-71, 0, 35, 36};
ret = Arrays.binarySearch(a3, (short) 42);
assertEquals(-5, ret);
ret = Arrays.binarySearch(a3, (short) -80);
assertEquals(-1, ret);
ret = Arrays.binarySearch(a3, (short) -71);
assertEquals(0, ret);
ret = Arrays.binarySearch(a3, 1, 4, (short) 35);
assertEquals(2, ret);
ret = Arrays.binarySearch(a3, 1, 4, (short) -71);
assertEquals(-2, ret);
}
/**
* Tests {@link Arrays#copyOf(boolean[], int)}.
*/
public void testCopyOfBoolean() {
boolean[] a1 = {true, true, false, true, true, true, false, false, true};
boolean[] ret = Arrays.copyOf(a1, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOf(a1, 2);
assertTrue(Arrays.equals(new boolean[]{true, true}, ret));
ret = Arrays.copyOf(a1, 0);
assertEquals(0, ret.length);
ret = Arrays.copyOf(a1, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals(false, ret[i]);
}
boolean[] emptyArray = {};
ret = Arrays.copyOf(emptyArray, 0);
assertTrue(Arrays.equals(new boolean[0], ret));
ret = Arrays.copyOf(emptyArray, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals(false, ret[i]);
}
ret = Arrays.copyOf(new boolean[] {false, true}, 3);
assertTrue(Arrays.equals(new boolean[] {false, true, false}, ret));
}
/**
* Tests {@link Arrays#copyOf(byte[], int)}.
*/
public void testCopyOfByte() {
byte[] a1 = {9, 8, 7, 5, 1, 2, 3, 4, 0};
byte[] ret = Arrays.copyOf(a1, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOf(a1, 2);
assertTrue(Arrays.equals(new byte[] {9, 8}, ret));
ret = Arrays.copyOf(a1, 0);
assertEquals(0, ret.length);
ret = Arrays.copyOf(a1, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals((byte) 0, ret[i]);
}
byte[] emptyArray = {};
ret = Arrays.copyOf(emptyArray, 0);
assertTrue(Arrays.equals(new byte[0], ret));
ret = Arrays.copyOf(emptyArray, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals((byte) 0, ret[i]);
}
ret = Arrays.copyOf(new byte[] {1, 2}, 3);
assertTrue(Arrays.equals(new byte[] {1, 2, 0}, ret));
}
/**
* Tests {@link Arrays#copyOf(char[], int)}.
*/
public void testCopyOfChar() {
char[] a1 = {9, 8, 7, 5, 1, 2, 3, 4, 0};
char[] ret = Arrays.copyOf(a1, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOf(a1, 2);
assertTrue(Arrays.equals(new char[] {9, 8}, ret));
ret = Arrays.copyOf(a1, 0);
assertEquals(0, ret.length);
ret = Arrays.copyOf(a1, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals((char) 0, ret[i]);
}
char[] emptyArray = {};
ret = Arrays.copyOf(emptyArray, 0);
assertTrue(Arrays.equals(new char[0], ret));
ret = Arrays.copyOf(emptyArray, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals((char) 0, ret[i]);
}
ret = Arrays.copyOf(new char[] {1, 2}, 3);
assertTrue(Arrays.equals(new char[] {1, 2, 0}, ret));
}
/**
* Tests {@link Arrays#copyOf(double[], int)}.
*/
public void testCopyOfDouble() {
double[] a1 = {0.5, 1.25, -7., 0., 3.75, 101, 0.25, 33.75};
double[] ret = Arrays.copyOf(a1, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOf(a1, 2);
assertTrue(Arrays.equals(new double[] {0.5, 1.25}, ret));
ret = Arrays.copyOf(a1, 0);
assertEquals(0, ret.length);
ret = Arrays.copyOf(a1, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals(0., ret[i]);
}
double[] emptyArray = {};
ret = Arrays.copyOf(emptyArray, 0);
assertTrue(Arrays.equals(new double[0], ret));
ret = Arrays.copyOf(emptyArray, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals(0., ret[i]);
}
ret = Arrays.copyOf(new double[] {1, 2}, 3);
assertTrue(Arrays.equals(new double[] {1, 2, 0}, ret));
}
/**
* Tests {@link Arrays#copyOf(float[], int)}.
*/
public void testCopyOfFloat() {
float[] a1 = {0.5f, 1.25f, -7f, 0f, 3.75f, 101f, 0.25f, 33.75f};
float[] ret = Arrays.copyOf(a1, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOf(a1, 2);
assertTrue(Arrays.equals(new float[] {0.5f, 1.25f}, ret));
ret = Arrays.copyOf(a1, 0);
assertEquals(0, ret.length);
ret = Arrays.copyOf(a1, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals(0f, ret[i]);
}
float[] emptyArray = {};
ret = Arrays.copyOf(emptyArray, 0);
assertTrue(Arrays.equals(new float[0], ret));
ret = Arrays.copyOf(emptyArray, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals(0f, ret[i]);
}
ret = Arrays.copyOf(new float[] {1, 2}, 3);
assertTrue(Arrays.equals(new float[] {1, 2, 0}, ret));
}
/**
* Tests {@link Arrays#copyOf(int[], int)}.
*/
public void testCopyOfInt() {
int[] a1 = {9, 8, 7, 5, 1, 2, -1037, 3, 4, 0};
int[] ret = Arrays.copyOf(a1, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOf(a1, 2);
assertTrue(Arrays.equals(new int[] {9, 8}, ret));
ret = Arrays.copyOf(a1, 0);
assertEquals(0, ret.length);
ret = Arrays.copyOf(a1, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals(0, ret[i]);
}
int[] emptyArray = {};
ret = Arrays.copyOf(emptyArray, 0);
assertTrue(Arrays.equals(new int[0], ret));
ret = Arrays.copyOf(emptyArray, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals(0, ret[i]);
}
ret = Arrays.copyOf(new int[] {1, 2}, 3);
assertTrue(Arrays.equals(new int[] {1, 2, 0}, ret));
}
/**
* Tests {@link Arrays#copyOf(long[], int)}.
*/
public void testCopyOfLong() {
long[] a1 = {9, 8, 7, 5, 1, 2, -1037, 3, 4, 0};
long[] ret = Arrays.copyOf(a1, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOf(a1, 2);
assertTrue(Arrays.equals(new long[] {9, 8}, ret));
ret = Arrays.copyOf(a1, 0);
assertEquals(0, ret.length);
ret = Arrays.copyOf(a1, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals(0L, ret[i]);
}
long[] emptyArray = {};
ret = Arrays.copyOf(emptyArray, 0);
assertTrue(Arrays.equals(new long[0], ret));
ret = Arrays.copyOf(emptyArray, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals(0L, ret[i]);
}
ret = Arrays.copyOf(new long[] {1, 2}, 3);
assertTrue(Arrays.equals(new long[] {1, 2, 0}, ret));
}
/**
* Tests {@link Arrays#copyOf(short[], int)}.
*/
public void testCopyOfShort() {
short[] a1 = {9, 8, 7, 5, 1, 2, -1037, 3, 4, 0};
short[] ret = Arrays.copyOf(a1, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOf(a1, 2);
assertTrue(Arrays.equals(new short[] {9, 8}, ret));
ret = Arrays.copyOf(a1, 0);
assertEquals(0, ret.length);
ret = Arrays.copyOf(a1, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals((short) 0, ret[i]);
}
short[] emptyArray = {};
ret = Arrays.copyOf(emptyArray, 0);
assertTrue(Arrays.equals(new short[0], ret));
ret = Arrays.copyOf(emptyArray, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals((short) 0, ret[i]);
}
ret = Arrays.copyOf(new short[] {1, 2}, 3);
assertTrue(Arrays.equals(new short[] {1, 2, 0}, ret));
}
/**
* Tests {@link Arrays#copyOf(Object[], int)}.
*/
public void testCopyOfObject() {
Object obj1 = new Object();
Object obj2 = new Object();
Object obj3 = new Object();
Object[] a1 = {null, obj1, obj2, null, obj3};
Object[] ret = Arrays.copyOf(a1, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOf(a1, 2);
assertTrue(Arrays.equals(new Object[] {null, obj1}, ret));
ret = Arrays.copyOf(a1, 0);
assertEquals(0, ret.length);
ret = Arrays.copyOf(a1, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals(null, ret[i]);
}
Object[] emptyArray = {};
ret = Arrays.copyOf(emptyArray, 0);
assertTrue(Arrays.equals(new Object[0], ret));
ret = Arrays.copyOf(emptyArray, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals(null, ret[i]);
}
ret = Arrays.copyOf(new Object[] {obj1, obj2}, 3);
assertTrue(Arrays.equals(new Object[] {obj1, obj2, null}, ret));
}
/**
* Tests {@link Arrays#copyOfRange(boolean[], int, int)}.
*/
public void testCopyOfRangeBoolean() {
boolean[] a1 = {true, true, false, true, true};
boolean[] ret = Arrays.copyOfRange(a1, 0, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOfRange(a1, 0, 2);
assertTrue(Arrays.equals(new boolean[] {true, true}, ret));
ret = Arrays.copyOfRange(a1, 2, 4);
assertTrue(Arrays.equals(new boolean[] {false, true}, ret));
ret = Arrays.copyOfRange(a1, 3, 6);
assertTrue(Arrays.equals(new boolean[] {true, true, false}, ret));
ret = Arrays.copyOfRange(a1, 0, 0);
assertTrue(Arrays.equals(new boolean[0], ret));
ret = Arrays.copyOfRange(a1, 0, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals(false, ret[i]);
}
boolean[] emptyArray = {};
ret = Arrays.copyOfRange(emptyArray, 0, 0);
assertTrue(Arrays.equals(new boolean[0], ret));
ret = Arrays.copyOfRange(emptyArray, 0, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals(false, ret[i]);
}
}
/**
* Tests {@link Arrays#copyOfRange(byte[], int, int)}.
*/
public void testCopyOfRangeByte() {
byte[] a1 = {9, 8, 7, 5, 1};
byte[] ret = Arrays.copyOfRange(a1, 0, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOfRange(a1, 0, 2);
assertTrue(Arrays.equals(new byte[] {9, 8}, ret));
ret = Arrays.copyOfRange(a1, 2, 4);
assertTrue(Arrays.equals(new byte[] {7, 5}, ret));
ret = Arrays.copyOfRange(a1, 3, 6);
assertTrue(Arrays.equals(new byte[] {5, 1, 0}, ret));
ret = Arrays.copyOfRange(a1, 0, 0);
assertTrue(Arrays.equals(new byte[0], ret));
ret = Arrays.copyOfRange(a1, 0, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals((byte) 0, ret[i]);
}
byte[] emptyArray = {};
ret = Arrays.copyOfRange(emptyArray, 0, 0);
assertTrue(Arrays.equals(new byte[0], ret));
ret = Arrays.copyOfRange(emptyArray, 0, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals((byte) 0, ret[i]);
}
}
/**
* Tests {@link Arrays#copyOfRange(char[], int, int)}.
*/
public void testCopyOfRangeChar() {
char[] a1 = {9, 8, 7, 5, 1};
char[] ret = Arrays.copyOfRange(a1, 0, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOfRange(a1, 0, 2);
assertTrue(Arrays.equals(new char[] {9, 8}, ret));
ret = Arrays.copyOfRange(a1, 2, 4);
assertTrue(Arrays.equals(new char[] {7, 5}, ret));
ret = Arrays.copyOfRange(a1, 3, 6);
assertTrue(Arrays.equals(new char[] {5, 1, 0}, ret));
ret = Arrays.copyOfRange(a1, 0, 0);
assertTrue(Arrays.equals(new char[0], ret));
ret = Arrays.copyOfRange(a1, 0, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals((char) 0, ret[i]);
}
char[] emptyArray = {};
ret = Arrays.copyOfRange(emptyArray, 0, 0);
assertTrue(Arrays.equals(new char[0], ret));
ret = Arrays.copyOfRange(emptyArray, 0, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals((char) 0, ret[i]);
}
}
/**
* Tests {@link Arrays#copyOfRange(double[], int, int)}.
*/
public void testCopyOfRangeDouble() {
double[] a1 = {0.5, 1.25, -7., 0., 3.75};
double[] ret = Arrays.copyOfRange(a1, 0, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOfRange(a1, 0, 2);
assertTrue(Arrays.equals(new double[] {0.5, 1.25}, ret));
ret = Arrays.copyOfRange(a1, 2, 4);
assertTrue(Arrays.equals(new double[] {-7, 0.}, ret));
ret = Arrays.copyOfRange(a1, 3, 6);
assertTrue(Arrays.equals(new double[] {0., 3.75, 0.}, ret));
ret = Arrays.copyOfRange(a1, 0, 0);
assertTrue(Arrays.equals(new double[0], ret));
ret = Arrays.copyOfRange(a1, 0, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals(0., ret[i]);
}
double[] emptyArray = {};
ret = Arrays.copyOfRange(emptyArray, 0, 0);
assertTrue(Arrays.equals(new double[0], ret));
ret = Arrays.copyOfRange(emptyArray, 0, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals(0., ret[i]);
}
}
/**
* Tests {@link Arrays#copyOfRange(float[], int, int)}.
*/
public void testCopyOfRangeFloat() {
float[] a1 = {0.5f, 1.25f, -7f, 0f, 3.75f};
float[] ret = Arrays.copyOfRange(a1, 0, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOfRange(a1, 0, 2);
assertTrue(Arrays.equals(new float[] {0.5f, 1.25f}, ret));
ret = Arrays.copyOfRange(a1, 2, 4);
assertTrue(Arrays.equals(new float[] {-7f, 0f}, ret));
ret = Arrays.copyOfRange(a1, 3, 6);
assertTrue(Arrays.equals(new float[] {0f, 3.75f, 0f}, ret));
ret = Arrays.copyOfRange(a1, 0, 0);
assertTrue(Arrays.equals(new float[0], ret));
ret = Arrays.copyOfRange(a1, 0, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals(0f, ret[i]);
}
float[] emptyArray = {};
ret = Arrays.copyOfRange(emptyArray, 0, 0);
assertTrue(Arrays.equals(new float[0], ret));
ret = Arrays.copyOfRange(emptyArray, 0, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals(0f, ret[i]);
}
}
/**
* Tests {@link Arrays#copyOfRange(int[], int, int)}.
*/
public void testCopyOfRangeInt() {
int[] a1 = {9, 8, 7, 5, 1};
int[] ret = Arrays.copyOfRange(a1, 0, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOfRange(a1, 0, 2);
assertTrue(Arrays.equals(new int[] {9, 8}, ret));
ret = Arrays.copyOfRange(a1, 2, 4);
assertTrue(Arrays.equals(new int[] {7, 5}, ret));
ret = Arrays.copyOfRange(a1, 3, 6);
assertTrue(Arrays.equals(new int[] {5, 1, 0}, ret));
ret = Arrays.copyOfRange(a1, 0, 0);
assertTrue(Arrays.equals(new int[0], ret));
ret = Arrays.copyOfRange(a1, 0, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals(0, ret[i]);
}
int[] emptyArray = {};
ret = Arrays.copyOfRange(emptyArray, 0, 0);
assertTrue(Arrays.equals(new int[0], ret));
ret = Arrays.copyOfRange(emptyArray, 0, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals(0, ret[i]);
}
}
/**
* Tests {@link Arrays#copyOfRange(long[], int, int)}.
*/
public void testCopyOfRangeLong() {
long[] a1 = {9, 8, 7, 5, 1};
long[] ret = Arrays.copyOfRange(a1, 0, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOfRange(a1, 0, 2);
assertTrue(Arrays.equals(new long[] {9, 8}, ret));
ret = Arrays.copyOfRange(a1, 2, 4);
assertTrue(Arrays.equals(new long[] {7, 5}, ret));
ret = Arrays.copyOfRange(a1, 3, 6);
assertTrue(Arrays.equals(new long[] {5, 1, 0}, ret));
ret = Arrays.copyOfRange(a1, 0, 0);
assertTrue(Arrays.equals(new long[0], ret));
ret = Arrays.copyOfRange(a1, 0, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals(0L, ret[i]);
}
long[] emptyArray = {};
ret = Arrays.copyOfRange(emptyArray, 0, 0);
assertTrue(Arrays.equals(new long[0], ret));
ret = Arrays.copyOfRange(emptyArray, 0, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals(0L, ret[i]);
}
}
/**
* Tests {@link Arrays#copyOfRange(short[], int, int)}.
*/
public void testCopyOfRangeShort() {
short[] a1 = {9, 8, 7, 5, 1};
short[] ret = Arrays.copyOfRange(a1, 0, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOfRange(a1, 0, 2);
assertTrue(Arrays.equals(new short[] {9, 8}, ret));
ret = Arrays.copyOfRange(a1, 2, 4);
assertTrue(Arrays.equals(new short[] {7, 5}, ret));
ret = Arrays.copyOfRange(a1, 3, 6);
assertTrue(Arrays.equals(new short[] {5, 1, 0}, ret));
ret = Arrays.copyOfRange(a1, 0, 0);
assertTrue(Arrays.equals(new short[0], ret));
ret = Arrays.copyOfRange(a1, 0, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals((short) 0, ret[i]);
}
short[] emptyArray = {};
ret = Arrays.copyOfRange(emptyArray, 0, 0);
assertTrue(Arrays.equals(new short[0], ret));
ret = Arrays.copyOfRange(emptyArray, 0, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals((short) 0, ret[i]);
}
}
/**
* Tests {@link Arrays#copyOfRange(Object[], int, int)}.
*/
public void testCopyOfRangeObject() {
Object obj1 = new Object();
Object obj2 = new Object();
Object obj3 = new Object();
Object[] a1 = {null, obj1, obj2, null, obj3};
Object[] ret = Arrays.copyOfRange(a1, 0, a1.length);
assertNotSame(a1, ret);
assertTrue(Arrays.equals(a1, ret));
ret = Arrays.copyOfRange(a1, 0, 2);
assertTrue(Arrays.equals(new Object[] {null, obj1}, ret));
ret = Arrays.copyOfRange(a1, 2, 4);
assertTrue(Arrays.equals(new Object[] {obj2, null}, ret));
ret = Arrays.copyOfRange(a1, 3, 6);
assertTrue(Arrays.equals(new Object[] {null, obj3, null}, ret));
ret = Arrays.copyOfRange(a1, 0, 0);
assertTrue(Arrays.equals(new Object[0], ret));
ret = Arrays.copyOfRange(a1, 0, a1.length * 2);
assertEquals(a1.length * 2, ret.length);
int i = 0;
for (; i < a1.length; i++) {
assertEquals(a1[i], ret[i]);
}
for (; i < ret.length; i++) {
assertEquals(null, ret[i]);
}
Object[] emptyArray = {};
ret = Arrays.copyOfRange(emptyArray, 0, 0);
assertTrue(Arrays.equals(new Object[0], ret));
ret = Arrays.copyOfRange(emptyArray, 0, 5);
assertEquals(5, ret.length);
for (; i < ret.length; i++) {
assertEquals(null, ret[i]);
}
}
/**
* Tests sorting of long primitives.
*/
public void testLongSort() {
long[] array = new long[0];
Arrays.sort(array);
array = new long[]{Long.MIN_VALUE, 1, 2, 3, Long.MAX_VALUE};
Arrays.sort(array);
assertTrue(Arrays.equals(new long[]{Long.MIN_VALUE, 1, 2, 3, Long.MAX_VALUE}, array));
array = new long[]{3, Long.MAX_VALUE, 3, 2, 1, Long.MIN_VALUE};
Arrays.sort(array);
assertTrue(Arrays.equals(new long[]{Long.MIN_VALUE, 1, 2, 3, 3, Long.MAX_VALUE}, array));
}
/**
* Tests sorting of long primitives sub-range.
*/
public void testLongSubrangeSort() {
long[] array = new long[]{3, Long.MAX_VALUE, 3, 2, 1, Long.MIN_VALUE};
Arrays.sort(array, 2, 5);
assertTrue(Arrays.equals(new long[]{3, Long.MAX_VALUE, 1, 2, 3, Long.MIN_VALUE}, array));
array = new long[]{3, Long.MAX_VALUE, 3, 2, 1, Long.MIN_VALUE};
Arrays.sort(array, 0, 0);
assertTrue(Arrays.equals(new long[]{3, Long.MAX_VALUE, 3, 2, 1, Long.MIN_VALUE}, array));
}
/**
* Verifies that values are sorted numerically rather than as strings.
*/
public void testNumericSort() {
Integer[] x = {3, 11, 2, 1};
Arrays.sort(x);
assertEquals(2, x[1].intValue());
assertEquals(11, x[3].intValue());
}
/**
* Tests sorting primitives.
*/
public void testPrimitiveSort() {
int[] array = new int[0];
Arrays.sort(array);
array = new int[]{Integer.MIN_VALUE, 1, 2, 3, Integer.MAX_VALUE};
Arrays.sort(array);
assertTrue(Arrays.equals(new int[]{Integer.MIN_VALUE, 1, 2, 3, Integer.MAX_VALUE}, array));
array = new int[]{3, Integer.MAX_VALUE, 3, 2, 1, Integer.MIN_VALUE};
Arrays.sort(array);
assertTrue(Arrays.equals(new int[]{Integer.MIN_VALUE, 1, 2, 3, 3, Integer.MAX_VALUE}, array));
}
/**
* Tests sorting of doubles
*/
public void testDoubleSort() {
double[] array = new double[] {
41.5, Double.NaN, Double.NaN, 3, 932535, 1, Double.NaN,
-3, Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN};
Arrays.sort(array);
// Test the array element-by-element
// as GWT's Arrays.equal() does not consider NaNs "equal"
assertEquals(Double.NEGATIVE_INFINITY, array[0]);
assertEquals(-3.0, array[1]);
assertEquals(1.0, array[2]);
assertEquals(3.0, array[3]);
assertEquals(41.5, array[4]);
assertEquals(932535.0, array[5]);
assertEquals(Double.POSITIVE_INFINITY, array[6]);
assertTrue(Double.isNaN(array[7]));
assertTrue(Double.isNaN(array[8]));
assertTrue(Double.isNaN(array[9]));
assertTrue(Double.isNaN(array[10]));
}
/**
* Tests sorting of floats
*/
public void testFloatSort() {
float[] array = new float[] {
41.5f, Float.NaN, Float.NaN, 3, 932535, 1, Float.NaN,
-3, Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY, Float.NaN};
Arrays.sort(array);
// Test the array element-by-element
// as GWT's Arrays.equal() does not consider NaNs "equal"
assertEquals(Float.NEGATIVE_INFINITY, array[0]);
assertEquals(-3.0f, array[1]);
assertEquals(1.0f, array[2]);
assertEquals(3.0f, array[3]);
assertEquals(41.5f, array[4]);
assertEquals(932535.0f, array[5]);
assertEquals(Float.POSITIVE_INFINITY, array[6]);
assertTrue(Float.isNaN(array[7]));
assertTrue(Float.isNaN(array[8]));
assertTrue(Float.isNaN(array[9]));
assertTrue(Float.isNaN(array[10]));
}
/**
* Tests sorting a subrange of a primitive array.
*/
public void testPrimitiveSubrangeSort() {
int[] array = new int[]{3, Integer.MAX_VALUE, 3, 2, 1, Integer.MIN_VALUE};
Arrays.sort(array, 2, 5);
assertTrue(Arrays.equals(new int[]{3, Integer.MAX_VALUE, 1, 2, 3, Integer.MIN_VALUE}, array));
array = new int[]{3, Integer.MAX_VALUE, 3, 2, 1, Integer.MIN_VALUE};
Arrays.sort(array, 0, 0);
assertTrue(Arrays.equals(new int[]{3, Integer.MAX_VALUE, 3, 2, 1, Integer.MIN_VALUE}, array));
}
/**
* Tests simple use cases for {@link Arrays#sort(Object[])}.
*/
public void testSimpleSort() {
// empty array
Object[] test = {};
Arrays.sort(test);
assertEquals(test.length, 0);
// array with one element
Integer[] test2 = {1};
Arrays.sort(test2);
assertEquals(1, test2[0].intValue());
// multiple elements
Number[] test3 = {3, 0, 2, 4, 1};
Arrays.sort(test3);
for (int i = 0; i < test3.length; i++) {
assertEquals(i, test3[i].intValue());
}
}
/**
* Tests {@link Arrays#sort(Object[], Comparator)}.
*/
public void testSort() {
Object[] array = {"c", "b", "b", "a"};
Arrays.sort(array);
assertEquals(new Object[]{"a", "b", "b", "c"}, array);
array = new Object[]{"c", "b", "b", "a"};
Comparator<Object> natural = new Comparator<Object>() {
@Override
@SuppressWarnings("unchecked")
public int compare(Object a, Object b) {
return ((Comparable<Object>) a).compareTo(b);
}
};
Arrays.sort(array, natural);
assertEquals(new Object[]{"a", "b", "b", "c"}, array);
array = new Object[]{"c", "b", "b", "a"};
Arrays.sort(array, Collections.reverseOrder());
assertEquals(new Object[]{"c", "b", "b", "a"}, array);
array = new Object[]{"c", "b", "b", "a"};
Arrays.sort(array, null);
assertEquals(new Object[]{"a", "b", "b", "c"}, array);
}
/**
* Tests sorting of Object array sub-range.
*/
public void testSortSubRange() {
Object[] array = {"c", "b", "b", "a"};
Arrays.sort(array, 0, 0);
assertEquals(new Object[]{"c", "b", "b", "a"}, array);
array = new Object[]{"c", "b", "b", "a"};
Arrays.sort(array, 1, 2);
assertEquals(new Object[]{"c", "b", "b", "a"}, array);
Arrays.sort(array, 1, 4);
assertEquals(new Object[]{"c", "a", "b", "b"}, array);
array = new Object[]{"c", "b", "b", "a"};
Arrays.sort(array, 1, 4, Collections.reverseOrder());
assertEquals(new Object[]{"c", "b", "b", "a"}, array);
}
/**
* Verifies that equal values retain their original order. This is done by
* trying all possible permutations of a small test array to make sure the
* sort algorithm properly handles any ordering.
*
* The current test is 6 elements, so there are 6! = 720 possible orderings to
* test.
*/
public void testStableSort() {
Comparator<TestObject> comparator = new Comparator<TestObject>() {
@Override
public int compare(TestObject a, TestObject b) {
return a.getValue() - b.getValue();
}
};
testStableSort(comparator);
testStableSort(Collections.reverseOrder(comparator));
}
private void testStableSort(Comparator<TestObject> comparator) {
TestObject[] origData = new TestObject[] {
new TestObject(3), new TestObject(11), new TestObject(2),
new TestObject(3), new TestObject(1), new TestObject(3),
new TestObject(22)};
int[] permutation = new int[origData.length];
while (validPermutation(permutation, origData.length)) {
TestObject[] permutedArray = getPermutation(origData, permutation);
Arrays.sort(permutedArray, comparator);
for (int i = 1; i < permutedArray.length; ++i) {
TestObject prev = permutedArray[i - 1];
TestObject cur = permutedArray[i];
int cmp = comparator.compare(prev, cur);
if (cmp > 0
|| (cmp == 0 && prev.getIndex() > cur.getIndex())) {
String msg = "Permutation " + Arrays.toString(permutation) + ": "
+ Arrays.toString(permutedArray);
permutedArray = getPermutation(origData, permutation);
msg += " (orig: " + Arrays.toString(permutedArray) + ")";
fail(msg);
}
}
nextPermutation(permutation);
}
}
public void testDeepToString() {
assertEquals("[1, 2, Hello]", Arrays.deepToString(new Object[]{1, 2L, "Hello"}));
Object[] array = new Object[] {
new int[] {1, 2, 3},
new Object[] {1, 2L, "Hello"},
new double[] {0.1},
new Object[] {
new Object[] {null}}};
assertEquals("[[1, 2, 3], [1, 2, Hello], [0.1], [[null]]]" ,
Arrays.deepToString(array));
assertEquals("null", Arrays.deepToString(null));
array = new Object[1];
array[0] = array;
assertEquals("[[...]]", Arrays.deepToString(array));
assertEquals("[[[...]], [[...]]]", Arrays.deepToString(new Object[] {array, array}));
}
/**
* Returns a permuted array given the original array and a permutation. The
* permutation is an array of indices which select which possible source goes
* into the output slot of the same position. Note that previously used
* sources are not counted, so the first permutation of a three-element array
* [a,b,c] is [0,0,0], which maps to [a,b,c]. [1,0,0] maps to [b,a,c] since
* the range of index[1] is from 0-1 and excludes the value b since it has
* already been chosen. The permutation array may be shorter than the source
* array, in which case it is choosing any m elements out of n.
*
* Thus the range of index i is 0 <= permutation[i] < n-i where n is the
* number of elements in the source array.
*
* @param origData original array to permute
* @param permutation array of indices, as described above
* @return permuted array
*/
private TestObject[] getPermutation(TestObject[] origData, int[] permutation) {
TestObject[] array = new TestObject[permutation.length];
for (int i = 0; i < permutation.length; ++i) {
int idx = permutation[i];
// adjust for source elements already used
for (int j = i; j-- > 0;) {
if (permutation[j] <= idx) {
idx++;
}
}
array[i] = origData[idx];
// update position in output array for stability test
array[i].setIndex(i);
}
return array;
}
/**
* Advance the permutation to the next value. It leaves the first index set to
* -1 if the range has been exceeded.
*
* @param permutation array of indices -- see {@link #getPermutation} for
* details.
*/
private void nextPermutation(int[] permutation) {
for (int i = 0; i < permutation.length; ++i) {
if (++permutation[i] < permutation.length - i) {
return;
}
permutation[i] = 0;
}
permutation[0] = -1;
}
/**
* Checks to see if this permutation is valid; ie, if all of the indices are
* between 0 and n-i (see {@link #getPermutation} for details).
*
* @param permutations array of indices
* @param n length of source array.
* @return true if the permutation is valid
*/
private boolean validPermutation(int[] permutations, int n) {
if (permutations[0] < 0) {
return false;
}
for (int i = 0; i < permutations.length; ++i) {
if (permutations[i] >= n - i) {
return false;
}
}
return true;
}
}