blob: 5b98073e3847fc81ce430d8fb0d8a3efa749179b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 hivemall.utils.lang;
import static hivemall.utils.lang.ArrayUtils.argmax;
import static hivemall.utils.lang.ArrayUtils.argmin;
import static hivemall.utils.lang.ArrayUtils.argrank;
import static hivemall.utils.lang.ArrayUtils.argsort;
import static hivemall.utils.lang.ArrayUtils.newInstance;
import static hivemall.utils.lang.ArrayUtils.range;
import static hivemall.utils.lang.ArrayUtils.slice;
import static java.lang.Math.abs;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Random;
import org.apache.commons.collections.ComparatorUtils;
import org.junit.Assert;
import org.junit.Test;
public class ArrayUtilsTest {
@Test
public void testSortedArraySet() {
final int[] original = new int[] {3, 7, 10};
Assert.assertSame(original, ArrayUtils.sortedArraySet(original, 7));
Assert.assertSame(original, ArrayUtils.sortedArraySet(original, 3));
Assert.assertSame(original, ArrayUtils.sortedArraySet(original, 10));
Assert.assertArrayEquals(new int[] {3, 7, 8, 10},
ArrayUtils.sortedArraySet(new int[] {3, 7, 10}, 8));
Assert.assertArrayEquals(new int[] {3, 7, 7, 8, 10},
ArrayUtils.sortedArraySet(new int[] {3, 7, 7, 10}, 8));
Assert.assertArrayEquals(new int[] {3, 7, 7, 10},
ArrayUtils.sortedArraySet(new int[] {3, 7, 7, 10}, 7));
Assert.assertArrayEquals(new int[] {3, 7, 10, 11},
ArrayUtils.sortedArraySet(new int[] {3, 7, 10}, 11));
Assert.assertArrayEquals(new int[] {-2, 3, 7, 10},
ArrayUtils.sortedArraySet(new int[] {3, 7, 10}, -2));
}
@Test
public void testAppendIntArrayInt() {
Assert.assertArrayEquals(new int[] {3, 7, 10, 8},
ArrayUtils.append(new int[] {3, 7, 10}, 8));
}
@Test
public void testInsert() {
final int[] original = new int[] {3, 7, 10};
Assert.assertArrayEquals(new int[] {3, 7, 8, 10}, ArrayUtils.insert(original, 2, 8));
Assert.assertArrayEquals(new int[] {1, 3, 7, 10}, ArrayUtils.insert(original, 0, 1));
Assert.assertArrayEquals(new int[] {3, 3, 7, 10}, ArrayUtils.insert(original, 0, 3));
Assert.assertArrayEquals(new int[] {3, 3, 7, 10}, ArrayUtils.insert(original, 0, 3));
Assert.assertArrayEquals(new int[] {3, 7, 10, 11},
ArrayUtils.insert(original, original.length, 11));
}
@Test(expected = IllegalArgumentException.class)
public void testInsertFail() {
final int[] original = new int[] {3, 7, 10};
Assert.assertArrayEquals(new int[] {3, 7, 10, 11},
ArrayUtils.insert(original, original.length + 1, 11));
}
@Test
public void testShuffle() {
String[] shuffled = new String[] {"1, 2, 3", "4, 5, 6", "7, 8, 9", "10, 11, 12"};
String[] outcome = new String[] {"10, 11, 12", "1, 2, 3", "4, 5, 6", "7, 8, 9"};
ArrayUtils.shuffle(shuffled, new Random(0L));
for (int i = 0; i < shuffled.length; i++) {
Assert.assertEquals(outcome[i], shuffled[i]);
}
}
@Test
public void asKryoSerializableListTest() {
String[] array = new String[] {"1, 2, 3", "4, 5, 6", "7, 8, 9", "10, 11, 12"};
List<String> actual = ArrayUtils.asKryoSerializableList(array);
Assert.assertEquals(Arrays.asList(array), actual);
Assert.assertEquals(ArrayList.class, actual.getClass());
}
public void testNewInstance() {
Assert.assertArrayEquals(new Integer[2], newInstance(new Integer[] {1, 2, 3}, 2));
}
@Test
public void testSlice() {
int[] a = new int[] {5, 2, 0, 1};
Assert.assertArrayEquals(new int[] {1, 2}, slice(a, new int[] {3, 1}));
}
@Test(expected = IndexOutOfBoundsException.class)
public void testSliceIndexOutOfBound() {
int[] a = new int[] {5, 2, 0, 1};
Assert.assertArrayEquals(new int[] {1, 2}, slice(a, new int[] {3, 5}));
}
@Test
public void testArgsortTArray() {
Double[] a = new Double[] {5d, 2d, 0d, 1d};
Assert.assertArrayEquals(new int[] {2, 3, 1, 0}, argsort(a));
Assert.assertArrayEquals(new Double[] {0d, 1d, 2d, 5d}, slice(a, argsort(a)));
Assert.assertArrayEquals(new int[] {3, 2, 0, 1}, argsort(argsort(a)));
}
@Test
public void testArgsortTArrayComparatorOfQsuperT() {
Double[] a = new Double[] {5d, -2d, 0d, -1d};
Comparator<Double> cmp = new Comparator<Double>() {
@Override
public int compare(Double l, Double r) {
return Double.compare(abs(l.doubleValue()), abs(r.doubleValue()));
}
};
Assert.assertArrayEquals(new int[] {2, 3, 1, 0}, argsort(a, cmp));
Assert.assertArrayEquals(new Double[] {0d, -1d, -2d, 5d}, slice(a, argsort(a, cmp)));
}
@Test
public void testArgrankIntArray() {
int[] a = new int[] {5, 2, 0, 1};
Assert.assertArrayEquals(new int[] {3, 2, 0, 1}, argrank(a));
}
@Test
public void testArgrankDoubleArray() {
double[] a = new double[] {5.1d, 2.1d, 0.1d, 1.1d};
Assert.assertArrayEquals(new int[] {3, 2, 0, 1}, argrank(a));
}
@Test
public void testArgminDoubleArray() {
double[] a = new double[] {5d, 2d, 0.1d, 1d};
Assert.assertEquals(2, argmin(a));
Assert.assertArrayEquals(new double[] {0.1d}, slice(a, argmin(a)), 1e-8);
}
@Test
public void testArgminTArray() {
Double[] a = new Double[] {5d, 2d, 0.1d, 1d};
Assert.assertEquals(2, argmin(a));
Assert.assertArrayEquals(new Double[] {0.1d}, slice(a, argmin(a)));
}
@Test
public void testArgminTArrayComparatorOfQsuperT() {
Double[] a = new Double[] {5d, -2d, 0.1d, -1d};
Comparator<Double> cmp = new Comparator<Double>() {
@Override
public int compare(Double l, Double r) {
return Double.compare(abs(l.doubleValue()), abs(r.doubleValue()));
}
};
Assert.assertEquals(2, argmin(a, cmp));
Assert.assertArrayEquals(new Double[] {0.1d}, slice(a, argmin(a, cmp)));
}
@Test
public void testArgmaxTArray() {
Double[] a = new Double[] {5d, 2d, 0.1d, 1d};
Assert.assertEquals(0, argmax(a));
Assert.assertArrayEquals(new Double[] {5d}, slice(a, argmax(a)));
}
@SuppressWarnings("unchecked")
@Test
public void testArgmaxTArrayComparatorOfQsuperT() {
Double[] a = new Double[] {2d, 5d, 0d, null, 1d};
Assert.assertEquals(2, argmax(a, ComparatorUtils.nullLowComparator(
ComparatorUtils.reversedComparator(ComparatorUtils.naturalComparator()))));
Assert.assertEquals(1,
argmax(a, ComparatorUtils.nullLowComparator(ComparatorUtils.naturalComparator())));
Assert.assertEquals(3,
argmax(a, ComparatorUtils.nullHighComparator(ComparatorUtils.naturalComparator())));
}
@Test
public void testRange() {
Assert.assertArrayEquals(new int[] {0, 1, 2, 3, 4}, range(5));
Assert.assertArrayEquals(new int[] {1, 2, 3, 4}, range(1, 5));
Assert.assertArrayEquals(new int[] {0, -1, -2}, range(-3));
Assert.assertArrayEquals(new int[] {5, 4, 3, 2}, range(5, 1));
Assert.assertArrayEquals(new int[] {3, 2, 1, 0, -1}, range(3, -2));
Assert.assertArrayEquals(new int[] {0, 1, 2, 3, 4}, range(0, 5, 1));
Assert.assertArrayEquals(new int[] {1, 2, 3, 4}, range(1, 5, 1));
Assert.assertArrayEquals(new int[] {0, -1, -2}, range(0, -3, 1));
Assert.assertArrayEquals(new int[] {5, 4, 3, 2}, range(5, 1, 1));
Assert.assertArrayEquals(new int[] {3, 2, 1, 0, -1}, range(3, -2, 1));
Assert.assertArrayEquals(new int[] {1, 3}, range(1, 5, 2));
Assert.assertArrayEquals(new int[] {1, 3, 5}, range(1, 6, 2));
Assert.assertArrayEquals(new int[] {6, 4, 2}, range(6, 1, 2));
Assert.assertArrayEquals(new int[] {-1, -3, -5}, range(-1, -6, 2));
}
}