--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2010 Association for Decentralized Information Management in\r
+ * Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.databoard.tests;
+
+import static org.junit.Assert.assertArrayEquals;\r
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertNotSame;\r
+import static org.junit.Assert.assertNull;\r
+import static org.junit.Assert.assertSame;\r
+\r
+import java.io.Serializable;\r
+import java.util.AbstractCollection;\r
+import java.util.AbstractList;\r
+import java.util.ArrayList;\r
+import java.util.HashSet;\r
+import java.util.Iterator;\r
+import java.util.LinkedList;\r
+import java.util.List;\r
+\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.simantics.databoard.util.ArrayUtils;\r
+
+public class TestArrayUtils {
+
+ @Before
+ public void setUp() {
+ }\r
+ \r
+ @Test\r
+ public void testConcatenate1() {\r
+ Integer[] a = new Integer[] { 1, 2, 3 };\r
+ Integer[] b = new Integer[] { 4, 5 };\r
+ Integer[] c = ArrayUtils.concatenate(a, b);\r
+ assertEquals(5, c.length);\r
+ for (int i = 0; i < c.length; i++)\r
+ assertEquals(i+1, (int)c[i]);\r
+ assertSame(a[0], c[0]);\r
+ assertSame(b[0], c[3]);\r
+ }\r
+ \r
+ @Test\r
+ public void testConcatenateEmptyA() {\r
+ Integer[] a = new Integer[] { };\r
+ Integer[] b = new Integer[] { 4, 5 };\r
+ Integer[] c = ArrayUtils.concatenate(a, b);\r
+ assertArrayEquals(b, c);\r
+ assertNotSame(b, c);\r
+ assertSame(b[0], c[0]);\r
+ assertSame(b[1], c[1]);\r
+ }\r
+\r
+ @Test\r
+ public void testConcatenateEmptyB() {\r
+ Integer[] a = new Integer[] { 1, 2 };\r
+ Integer[] b = new Integer[] { };\r
+ Integer[] c = ArrayUtils.concatenate(a, b);\r
+ assertArrayEquals(a, c);\r
+ assertNotSame(a, c);\r
+ assertSame(a[0], c[0]);\r
+ assertSame(a[1], c[1]);\r
+ }\r
+\r
+ @Test\r
+ public void testConcatenateEmptyBoth() {\r
+ Integer[] a = new Integer[] { };\r
+ Integer[] b = new Integer[] { };\r
+ Integer[] c = ArrayUtils.concatenate(a, b);\r
+ assertEquals(0, c.length);\r
+ assertNotSame(a, c);\r
+ assertNotSame(b, c);\r
+ }\r
+ \r
+ @Test\r
+ public void testConcatenateMixedTypes() {\r
+ Integer[] a = new Integer[] { 1 };\r
+ Double[] b = new Double[] { 2.0 };\r
+ Number[] c = ArrayUtils.concatenate(a, b);\r
+ assertSame(Number[].class, c.getClass());\r
+ assertSame(a[0], c[0]);\r
+ assertSame(b[0], c[1]);\r
+ }\r
+\r
+ @Test\r
+ public void testConcatenateMixedTypes2() {\r
+ Integer[] a = new Integer[] { 1 };\r
+ Double[] b = new Double[] { 2.0 };\r
+ Object[] c = ArrayUtils.concatenate(a, b);\r
+ assertSame(c.getClass(), Number[].class);\r
+ assertSame(a[0], c[0]);\r
+ assertSame(b[0], c[1]);\r
+ } \r
+ \r
+ @Test\r
+ public void testConcatenateMixedTypes3() {\r
+ Integer[] a = new Integer[] { 1 };\r
+ Double[] b = new Double[] { 2.0 };\r
+ Object[] c = ArrayUtils.concatenate(a, b, Object.class);\r
+ assertSame(c.getClass(), Object[].class);\r
+ assertSame(a[0], c[0]);\r
+ assertSame(b[0], c[1]);\r
+ } \r
+ \r
+ @Test(expected = ClassCastException.class)\r
+ public void testConcatenateMixedTypes4() {\r
+ Integer[] a = new Integer[] { 1 };\r
+ Double[] b = new Double[] { 2.0 };\r
+ @SuppressWarnings("unused")\r
+ Number[] c = (Number[])ArrayUtils.concatenate(a, b, Object.class);\r
+ }\r
+ \r
+ @Test\r
+ public void testConcatenateMixedTypes5() {\r
+ Integer[] a = new Integer[] { 1 };\r
+ String[] b = new String[] { "foo" };\r
+ Object[] c = ArrayUtils.concatenate(a, b);\r
+ assertSame(Object[].class, c.getClass());\r
+ assertEquals(2, c.length);\r
+ }\r
+ \r
+ @Test\r
+ public void testConcatenateMixedTypes6() {\r
+ Object[] a = new CharSequence[] { "bar" };\r
+ Object[] b = new String[] { "foo" };\r
+ Object[] c = ArrayUtils.concatenate(a, b);\r
+ assertSame(CharSequence[].class, c.getClass());\r
+ assertEquals(2, c.length);\r
+ }\r
+ \r
+ @Test\r
+ public void testConcatenateMixedTypes7() {\r
+ Object[] a = new String[] { "bar" };\r
+ Object[] b = new CharSequence[] { "foo" };\r
+ Object[] c = ArrayUtils.concatenate(a, b);\r
+ assertSame(CharSequence[].class, c.getClass());\r
+ assertEquals(2, c.length);\r
+ }\r
+ \r
+ @Test\r
+ public void testConcatenateLengthGt() {\r
+ Integer[] a = new Integer[] { 1, 2, 3 };\r
+ Integer[] b = new Integer[] { 4, 5 };\r
+ Integer[] c = ArrayUtils.concatenate(a, b, 8);\r
+ assertEquals(8, c.length);\r
+ for (int i = 0; i < 5; i++)\r
+ assertEquals(i+1, (int)c[i]);\r
+ for (int i = 5; i < 8; i++)\r
+ assertNull(c[i]);\r
+ assertSame(a[0], c[0]);\r
+ assertSame(b[0], c[3]);\r
+ }\r
+\r
+ @Test\r
+ public void testConcatenateLengthLtB() {\r
+ Integer[] a = new Integer[] { 1, 2, 3 };\r
+ Integer[] b = new Integer[] { 4, 5 };\r
+ Integer[] c = ArrayUtils.concatenate(a, b, 4);\r
+ assertEquals(4, c.length);\r
+ for (int i = 0; i < 4; i++)\r
+ assertEquals(i+1, (int)c[i]);\r
+ assertSame(a[0], c[0]);\r
+ assertSame(b[0], c[3]);\r
+ }\r
+\r
+ @Test\r
+ public void testConcatenateLengthLtA() {\r
+ Integer[] a = new Integer[] { 1, 2, 3 };\r
+ Integer[] b = new Integer[] { 4, 5 };\r
+ Integer[] c = ArrayUtils.concatenate(a, b, 2);\r
+ assertEquals(2, c.length);\r
+ for (int i = 0; i < 2; i++)\r
+ assertEquals(i+1, (int)c[i]);\r
+ assertSame(a[0], c[0]);\r
+ }\r
+ \r
+ @Test\r
+ public void testConcatenateLengthZero() {\r
+ Integer[] a = new Integer[] { 1, 2, 3 };\r
+ Integer[] b = new Integer[] { 4, 5 };\r
+ Integer[] c = ArrayUtils.concatenate(a, b, 0);\r
+ assertEquals(0, c.length);\r
+ }\r
+ \r
+ @Test\r
+ public void testConcatenateLengthZeroEmptyA() {\r
+ Integer[] a = new Integer[] { };\r
+ Integer[] b = new Integer[] { 4, 5 };\r
+ Integer[] c = ArrayUtils.concatenate(a, b, 0);\r
+ assertEquals(0, c.length);\r
+ }\r
+ \r
+ @Test\r
+ public void testConcatenateLengthEmptyA() {\r
+ Integer[] a = new Integer[] { };\r
+ Integer[] b = new Integer[] { 4, 5 };\r
+ Integer[] c = ArrayUtils.concatenate(a, b, 2);\r
+ assertEquals(2, c.length);\r
+ assertArrayEquals(b, c);\r
+ assertNotSame(b, c);\r
+ }\r
+ \r
+ @Test\r
+ public void testConcatenateLengthEmptyB() {\r
+ Integer[] a = new Integer[] { 1, 2, 3 };\r
+ Integer[] b = new Integer[] { };\r
+ Integer[] c = ArrayUtils.concatenate(a, b, 3);\r
+ assertEquals(3, c.length);\r
+ assertArrayEquals(a, c);\r
+ assertNotSame(a, c);\r
+ }\r
+\r
+ @Test\r
+ public void testAppend1() {\r
+ Integer[] a = new Integer[] { 1, 2, 3 };\r
+ Integer[] c = ArrayUtils.append(a, 4, 5);\r
+ assertEquals(5, c.length);\r
+ for (int i = 0; i < c.length; i++)\r
+ assertEquals(i+1, (int)c[i]);\r
+ assertSame(a[0], c[0]);\r
+ }\r
+ \r
+ @Test\r
+ public void testAppendEmptyA() {\r
+ Integer[] a = new Integer[] { };\r
+ Integer b = 4;\r
+ Integer[] c = ArrayUtils.append(a, b, 5);\r
+ assertEquals(2, c.length);\r
+ assertSame(b, c[0]);\r
+ assertEquals(5, (int)c[1]);\r
+ }\r
+\r
+ @Test\r
+ public void testAppendEmptyB() {\r
+ Integer[] a = new Integer[] { 1, 2 };\r
+ Integer[] c = ArrayUtils.append(a);\r
+ assertArrayEquals(a, c);\r
+ assertNotSame(a, c);\r
+ assertSame(a[0], c[0]);\r
+ assertSame(a[1], c[1]);\r
+ }\r
+\r
+ @Test\r
+ public void testAppendEmptyBoth() {\r
+ Integer[] a = new Integer[] { };\r
+ Integer[] c = ArrayUtils.append(a);\r
+ assertEquals(0, c.length);\r
+ assertNotSame(a, c);\r
+ }\r
+ \r
+ @Test\r
+ public void testAppendMixedTypes() {\r
+ Integer[] a = new Integer[] { 1 };\r
+ Number[] c = ArrayUtils.append(a, 2.0);\r
+ assertEquals(2, c.length);\r
+ assertSame(Number[].class, c.getClass());\r
+ assertSame(a[0], c[0]);\r
+ assertEquals(2.0, c[1]);\r
+ }\r
+\r
+ @Test\r
+ public void testAppendMixedTypes2() {\r
+ Integer[] a = new Integer[] { 1 };\r
+ Double[] b = new Double[] { 2.0 };\r
+ Object[] c = ArrayUtils.append(a, b[0]);\r
+ assertEquals(2, c.length);\r
+ assertSame(Number[].class, c.getClass());\r
+ assertSame(a[0], c[0]);\r
+ assertSame(b[0], c[1]);\r
+ } \r
+ \r
+ @Test\r
+ public void testAppendMixedTypes3() {\r
+ Integer[] a = new Integer[] { 1 };\r
+ Double[] b = new Double[] { 2.0 };\r
+ Object[] c = ArrayUtils.append(Comparable.class, a, b[0]);\r
+ assertEquals(2, c.length);\r
+ assertSame(c.getClass(), Comparable[].class);\r
+ assertSame(a[0], c[0]);\r
+ assertSame(b[0], c[1]);\r
+ } \r
+ \r
+ @Test(expected = ClassCastException.class)\r
+ public void testAppendMixedTypes4() {\r
+ Integer[] a = new Integer[] { 1 };\r
+ Double[] b = new Double[] { 2.0 };\r
+ @SuppressWarnings("unused")\r
+ Number[] c = (Number[])ArrayUtils.append(Object.class, a, b[0]);\r
+ }\r
+ \r
+ @Test\r
+ public void testAppendMixedTypes5() {\r
+ // Java generic type inference does some fairly unpredictable stuff here\r
+ Integer[] a = new Integer[] { 1 };\r
+ String[] b = new String[] { "foo" };\r
+ Object[] c = ArrayUtils.append(a, b[0]);\r
+ // c is in fact not an Object array!\r
+ // Java has determined that both Integer and String are instances of Comparable\r
+ // Could be a Comparable array just as well...\r
+ assert(Serializable[].class == c.getClass() || Comparable[].class == c.getClass());\r
+ assertEquals(2, c.length);\r
+ assertSame(a[0], c[0]);\r
+ assertSame(b[0], c[1]);\r
+ }\r
+\r
+ @Test\r
+ public void testAppendMixedTypes5b() {\r
+ Object[] a = new Integer[] { 1 };\r
+ Object[] b = new String[] { "foo" };\r
+ // b[0] is passed as a VarArg of type Object\r
+ Object[] c = ArrayUtils.append(a, b[0]);\r
+ assertSame(Object[].class, c.getClass());\r
+ assertEquals(2, c.length);\r
+ assertSame(a[0], c[0]);\r
+ assertSame(b[0], c[1]);\r
+ }\r
+ \r
+ @Test\r
+ public void testAppendMixedTypes6() {\r
+ CharSequence[] a = new CharSequence[] { "bar" };\r
+ String[] b = new String[] { "foo" };\r
+ Object[] c = ArrayUtils.append(a, b[0]);\r
+ assertSame(CharSequence[].class, c.getClass());\r
+ assertEquals(2, c.length);\r
+ assertSame(a[0], c[0]);\r
+ assertSame(b[0], c[1]);\r
+ }\r
+ \r
+ @Test\r
+ public void testAppendMixedTypes6b() {\r
+ Object[] a = new CharSequence[] { "bar" };\r
+ Object[] b = new String[] { "foo" };\r
+ // b[0] is passed as a VarArg of type Object\r
+ Object[] c = ArrayUtils.append(a, b[0]);\r
+ assertSame(Object[].class, c.getClass());\r
+ assertEquals(2, c.length);\r
+ assertSame(a[0], c[0]);\r
+ assertSame(b[0], c[1]);\r
+ }\r
+ \r
+ @Test\r
+ public void testAppendMixedTypes7() {\r
+ String[] a = new String[] { "bar" };\r
+ CharSequence[] b = new CharSequence[] { "foo" };\r
+ Object[] c = ArrayUtils.append(a, b[0]);\r
+ assertSame(CharSequence[].class, c.getClass());\r
+ assertEquals(2, c.length);\r
+ assertSame(a[0], c[0]);\r
+ assertSame(b[0], c[1]);\r
+ }\r
+ \r
+ @Test\r
+ public void testAppendMixedTypes7b() {\r
+ Object[] a = new String[] { "bar" };\r
+ Object[] b = new CharSequence[] { "foo" };\r
+ Object[] c = ArrayUtils.append(a, b[0]);\r
+ // Type inference presents b[0] as a VarArg of type Object\r
+ assertSame(Object[].class, c.getClass());\r
+ assertEquals(2, c.length);\r
+ assertSame(a[0], c[0]);\r
+ assertSame(b[0], c[1]);\r
+ }\r
+ \r
+ @Test\r
+ public void testAppendLengthGt() {\r
+ Integer[] a = new Integer[] { 1, 2, 3 };\r
+ Integer[] b = new Integer[] { 4, 5 };\r
+ Integer[] c = ArrayUtils.append(8, a, b[0], b[1]);\r
+ assertEquals(8, c.length);\r
+ for (int i = 0; i < 5; i++)\r
+ assertEquals(i+1, (int)c[i]);\r
+ for (int i = 5; i < 8; i++)\r
+ assertNull(c[i]);\r
+ assertSame(a[0], c[0]);\r
+ assertSame(b[0], c[3]);\r
+ }\r
+\r
+ @Test\r
+ public void testAppendLengthLtB() {\r
+ Integer[] a = new Integer[] { 1, 2, 3 };\r
+ Integer[] b = new Integer[] { 4, 5 };\r
+ Integer[] c = ArrayUtils.append(4, a, b[0], b[1]);\r
+ assertEquals(4, c.length);\r
+ for (int i = 0; i < 4; i++)\r
+ assertEquals(i+1, (int)c[i]);\r
+ assertSame(a[0], c[0]);\r
+ assertSame(b[0], c[3]);\r
+ }\r
+\r
+ @Test\r
+ public void testAppendLengthLtA() {\r
+ Integer[] a = new Integer[] { 1, 2, 3 };\r
+ Integer[] b = new Integer[] { 4, 5 };\r
+ Integer[] c = ArrayUtils.append(2, a, b[0], b[1]);\r
+ assertEquals(2, c.length);\r
+ for (int i = 0; i < 2; i++)\r
+ assertEquals(i+1, (int)c[i]);\r
+ assertSame(a[0], c[0]);\r
+ }\r
+ \r
+ @Test\r
+ public void testAppendLengthZero() {\r
+ Integer[] a = new Integer[] { 1, 2, 3 };\r
+ Integer[] b = new Integer[] { 4, 5 };\r
+ Integer[] c = ArrayUtils.append(0, a, b[0], b[1]);\r
+ assertEquals(0, c.length);\r
+ }\r
+ \r
+ @Test\r
+ public void testAppendLengthZeroEmptyA() {\r
+ Integer[] a = new Integer[] { };\r
+ Integer[] b = new Integer[] { 4, 5 };\r
+ Integer[] c = ArrayUtils.append(0, a, b[0], b[1]);\r
+ assertEquals(0, c.length);\r
+ }\r
+ \r
+ @Test\r
+ public void testAppendLengthEmptyA() {\r
+ Integer[] a = new Integer[] { };\r
+ Integer[] b = new Integer[] { 4, 5 };\r
+ Integer[] c = ArrayUtils.append(2, a, b[0], b[1]);\r
+ assertEquals(2, c.length);\r
+ assertArrayEquals(b, c);\r
+ assertNotSame(b, c);\r
+ }\r
+ \r
+ @Test\r
+ public void testAppendLengthEmptyB() {\r
+ Integer[] a = new Integer[] { 1, 2, 3 };\r
+ Integer[] c = ArrayUtils.append(3, a);\r
+ assertEquals(3, c.length);\r
+ assertArrayEquals(a, c);\r
+ assertNotSame(a, c);\r
+ }\r
+ \r
+ @Test\r
+ public void testGetCommonBase1() {\r
+ Class<?> cl = ArrayUtils.getCommonBase(Integer.class, Double.class);\r
+ assertSame(Number.class, cl);\r
+ }\r
+ \r
+ @Test\r
+ public void testGetCommonBase2() {\r
+ Class<?> cl = ArrayUtils.getCommonBase(Integer[].class, Double[].class);\r
+ assertSame(Number[].class, cl);\r
+ }\r
+ \r
+ @Test\r
+ public void testGetCommonBase3() {\r
+ Class<?> cl = ArrayUtils.getCommonBase(Integer.class, Double[].class);\r
+ assertSame(Object.class, cl);\r
+ }\r
+ \r
+ @Test\r
+ public void testGetCommonBase4() {\r
+ Class<?> cl = ArrayUtils.getCommonBase(List.class, ArrayList.class);\r
+ assertSame(List.class, cl);\r
+ }\r
+ \r
+ @Test\r
+ public void testGetCommonBase5() {\r
+ Class<?> cl = ArrayUtils.getCommonBase(ArrayList.class, List.class);\r
+ assertSame(List.class, cl);\r
+ }\r
+ \r
+ @Test\r
+ public void testGetCommonBase6() {\r
+ Class<?> cl = ArrayUtils.getCommonBase(ArrayList.class, LinkedList.class);\r
+ assertSame(AbstractList.class, cl);\r
+ }\r
+ \r
+ @Test\r
+ public void testGetCommonBase7() {\r
+ Class<?> cl = ArrayUtils.getCommonBase(ArrayList.class, HashSet.class);\r
+ assertSame(AbstractCollection.class, cl);\r
+ }\r
+ \r
+ @Test\r
+ public void testGetCommonBase8() {\r
+ Iterable<Object> foo = new Iterable<Object>() {\r
+ @Override\r
+ public Iterator<Object> iterator() {\r
+ return null;\r
+ }\r
+ };\r
+ \r
+ Class<?> cl2 = ArrayUtils.getCommonBase(Iterable.class, foo.getClass());\r
+ Class<?> cl3 = ArrayUtils.getCommonBase(Iterable.class, ArrayList.class);\r
+ Class<?> cl = ArrayUtils.getCommonBase(ArrayList.class, foo.getClass());\r
+ \r
+ assertSame(Iterable.class, cl2);\r
+ assertSame(Iterable.class, cl3);\r
+ assertSame(Object.class, cl);\r
+ }\r
+}