1 /*******************************************************************************
\r
2 * Copyright (c) 2010 Association for Decentralized Information Management in
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.databoard.tests;
14 import static org.junit.Assert.assertArrayEquals;
\r
15 import static org.junit.Assert.assertEquals;
\r
16 import static org.junit.Assert.assertNotSame;
\r
17 import static org.junit.Assert.assertNull;
\r
18 import static org.junit.Assert.assertSame;
\r
20 import java.io.Serializable;
\r
21 import java.util.AbstractCollection;
\r
22 import java.util.AbstractList;
\r
23 import java.util.ArrayList;
\r
24 import java.util.HashSet;
\r
25 import java.util.Iterator;
\r
26 import java.util.LinkedList;
\r
27 import java.util.List;
\r
29 import org.junit.Before;
\r
30 import org.junit.Test;
\r
31 import org.simantics.databoard.util.ArrayUtils;
\r
33 public class TestArrayUtils {
40 public void testConcatenate1() {
\r
41 Integer[] a = new Integer[] { 1, 2, 3 };
\r
42 Integer[] b = new Integer[] { 4, 5 };
\r
43 Integer[] c = ArrayUtils.concatenate(a, b);
\r
44 assertEquals(5, c.length);
\r
45 for (int i = 0; i < c.length; i++)
\r
46 assertEquals(i+1, (int)c[i]);
\r
47 assertSame(a[0], c[0]);
\r
48 assertSame(b[0], c[3]);
\r
52 public void testConcatenateEmptyA() {
\r
53 Integer[] a = new Integer[] { };
\r
54 Integer[] b = new Integer[] { 4, 5 };
\r
55 Integer[] c = ArrayUtils.concatenate(a, b);
\r
56 assertArrayEquals(b, c);
\r
57 assertNotSame(b, c);
\r
58 assertSame(b[0], c[0]);
\r
59 assertSame(b[1], c[1]);
\r
63 public void testConcatenateEmptyB() {
\r
64 Integer[] a = new Integer[] { 1, 2 };
\r
65 Integer[] b = new Integer[] { };
\r
66 Integer[] c = ArrayUtils.concatenate(a, b);
\r
67 assertArrayEquals(a, c);
\r
68 assertNotSame(a, c);
\r
69 assertSame(a[0], c[0]);
\r
70 assertSame(a[1], c[1]);
\r
74 public void testConcatenateEmptyBoth() {
\r
75 Integer[] a = new Integer[] { };
\r
76 Integer[] b = new Integer[] { };
\r
77 Integer[] c = ArrayUtils.concatenate(a, b);
\r
78 assertEquals(0, c.length);
\r
79 assertNotSame(a, c);
\r
80 assertNotSame(b, c);
\r
84 public void testConcatenateMixedTypes() {
\r
85 Integer[] a = new Integer[] { 1 };
\r
86 Double[] b = new Double[] { 2.0 };
\r
87 Number[] c = ArrayUtils.concatenate(a, b);
\r
88 assertSame(Number[].class, c.getClass());
\r
89 assertSame(a[0], c[0]);
\r
90 assertSame(b[0], c[1]);
\r
94 public void testConcatenateMixedTypes2() {
\r
95 Integer[] a = new Integer[] { 1 };
\r
96 Double[] b = new Double[] { 2.0 };
\r
97 Object[] c = ArrayUtils.concatenate(a, b);
\r
98 assertSame(c.getClass(), Number[].class);
\r
99 assertSame(a[0], c[0]);
\r
100 assertSame(b[0], c[1]);
\r
104 public void testConcatenateMixedTypes3() {
\r
105 Integer[] a = new Integer[] { 1 };
\r
106 Double[] b = new Double[] { 2.0 };
\r
107 Object[] c = ArrayUtils.concatenate(a, b, Object.class);
\r
108 assertSame(c.getClass(), Object[].class);
\r
109 assertSame(a[0], c[0]);
\r
110 assertSame(b[0], c[1]);
\r
113 @Test(expected = ClassCastException.class)
\r
114 public void testConcatenateMixedTypes4() {
\r
115 Integer[] a = new Integer[] { 1 };
\r
116 Double[] b = new Double[] { 2.0 };
\r
117 @SuppressWarnings("unused")
\r
118 Number[] c = (Number[])ArrayUtils.concatenate(a, b, Object.class);
\r
122 public void testConcatenateMixedTypes5() {
\r
123 Integer[] a = new Integer[] { 1 };
\r
124 String[] b = new String[] { "foo" };
\r
125 Object[] c = ArrayUtils.concatenate(a, b);
\r
126 assertSame(Object[].class, c.getClass());
\r
127 assertEquals(2, c.length);
\r
131 public void testConcatenateMixedTypes6() {
\r
132 Object[] a = new CharSequence[] { "bar" };
\r
133 Object[] b = new String[] { "foo" };
\r
134 Object[] c = ArrayUtils.concatenate(a, b);
\r
135 assertSame(CharSequence[].class, c.getClass());
\r
136 assertEquals(2, c.length);
\r
140 public void testConcatenateMixedTypes7() {
\r
141 Object[] a = new String[] { "bar" };
\r
142 Object[] b = new CharSequence[] { "foo" };
\r
143 Object[] c = ArrayUtils.concatenate(a, b);
\r
144 assertSame(CharSequence[].class, c.getClass());
\r
145 assertEquals(2, c.length);
\r
149 public void testConcatenateLengthGt() {
\r
150 Integer[] a = new Integer[] { 1, 2, 3 };
\r
151 Integer[] b = new Integer[] { 4, 5 };
\r
152 Integer[] c = ArrayUtils.concatenate(a, b, 8);
\r
153 assertEquals(8, c.length);
\r
154 for (int i = 0; i < 5; i++)
\r
155 assertEquals(i+1, (int)c[i]);
\r
156 for (int i = 5; i < 8; i++)
\r
158 assertSame(a[0], c[0]);
\r
159 assertSame(b[0], c[3]);
\r
163 public void testConcatenateLengthLtB() {
\r
164 Integer[] a = new Integer[] { 1, 2, 3 };
\r
165 Integer[] b = new Integer[] { 4, 5 };
\r
166 Integer[] c = ArrayUtils.concatenate(a, b, 4);
\r
167 assertEquals(4, c.length);
\r
168 for (int i = 0; i < 4; i++)
\r
169 assertEquals(i+1, (int)c[i]);
\r
170 assertSame(a[0], c[0]);
\r
171 assertSame(b[0], c[3]);
\r
175 public void testConcatenateLengthLtA() {
\r
176 Integer[] a = new Integer[] { 1, 2, 3 };
\r
177 Integer[] b = new Integer[] { 4, 5 };
\r
178 Integer[] c = ArrayUtils.concatenate(a, b, 2);
\r
179 assertEquals(2, c.length);
\r
180 for (int i = 0; i < 2; i++)
\r
181 assertEquals(i+1, (int)c[i]);
\r
182 assertSame(a[0], c[0]);
\r
186 public void testConcatenateLengthZero() {
\r
187 Integer[] a = new Integer[] { 1, 2, 3 };
\r
188 Integer[] b = new Integer[] { 4, 5 };
\r
189 Integer[] c = ArrayUtils.concatenate(a, b, 0);
\r
190 assertEquals(0, c.length);
\r
194 public void testConcatenateLengthZeroEmptyA() {
\r
195 Integer[] a = new Integer[] { };
\r
196 Integer[] b = new Integer[] { 4, 5 };
\r
197 Integer[] c = ArrayUtils.concatenate(a, b, 0);
\r
198 assertEquals(0, c.length);
\r
202 public void testConcatenateLengthEmptyA() {
\r
203 Integer[] a = new Integer[] { };
\r
204 Integer[] b = new Integer[] { 4, 5 };
\r
205 Integer[] c = ArrayUtils.concatenate(a, b, 2);
\r
206 assertEquals(2, c.length);
\r
207 assertArrayEquals(b, c);
\r
208 assertNotSame(b, c);
\r
212 public void testConcatenateLengthEmptyB() {
\r
213 Integer[] a = new Integer[] { 1, 2, 3 };
\r
214 Integer[] b = new Integer[] { };
\r
215 Integer[] c = ArrayUtils.concatenate(a, b, 3);
\r
216 assertEquals(3, c.length);
\r
217 assertArrayEquals(a, c);
\r
218 assertNotSame(a, c);
\r
222 public void testAppend1() {
\r
223 Integer[] a = new Integer[] { 1, 2, 3 };
\r
224 Integer[] c = ArrayUtils.append(a, 4, 5);
\r
225 assertEquals(5, c.length);
\r
226 for (int i = 0; i < c.length; i++)
\r
227 assertEquals(i+1, (int)c[i]);
\r
228 assertSame(a[0], c[0]);
\r
232 public void testAppendEmptyA() {
\r
233 Integer[] a = new Integer[] { };
\r
235 Integer[] c = ArrayUtils.append(a, b, 5);
\r
236 assertEquals(2, c.length);
\r
237 assertSame(b, c[0]);
\r
238 assertEquals(5, (int)c[1]);
\r
242 public void testAppendEmptyB() {
\r
243 Integer[] a = new Integer[] { 1, 2 };
\r
244 Integer[] c = ArrayUtils.append(a);
\r
245 assertArrayEquals(a, c);
\r
246 assertNotSame(a, c);
\r
247 assertSame(a[0], c[0]);
\r
248 assertSame(a[1], c[1]);
\r
252 public void testAppendEmptyBoth() {
\r
253 Integer[] a = new Integer[] { };
\r
254 Integer[] c = ArrayUtils.append(a);
\r
255 assertEquals(0, c.length);
\r
256 assertNotSame(a, c);
\r
260 public void testAppendMixedTypes() {
\r
261 Integer[] a = new Integer[] { 1 };
\r
262 Number[] c = ArrayUtils.append(a, 2.0);
\r
263 assertEquals(2, c.length);
\r
264 assertSame(Number[].class, c.getClass());
\r
265 assertSame(a[0], c[0]);
\r
266 assertEquals(2.0, c[1]);
\r
270 public void testAppendMixedTypes2() {
\r
271 Integer[] a = new Integer[] { 1 };
\r
272 Double[] b = new Double[] { 2.0 };
\r
273 Object[] c = ArrayUtils.append(a, b[0]);
\r
274 assertEquals(2, c.length);
\r
275 assertSame(Number[].class, c.getClass());
\r
276 assertSame(a[0], c[0]);
\r
277 assertSame(b[0], c[1]);
\r
281 public void testAppendMixedTypes3() {
\r
282 Integer[] a = new Integer[] { 1 };
\r
283 Double[] b = new Double[] { 2.0 };
\r
284 Object[] c = ArrayUtils.append(Comparable.class, a, b[0]);
\r
285 assertEquals(2, c.length);
\r
286 assertSame(c.getClass(), Comparable[].class);
\r
287 assertSame(a[0], c[0]);
\r
288 assertSame(b[0], c[1]);
\r
291 @Test(expected = ClassCastException.class)
\r
292 public void testAppendMixedTypes4() {
\r
293 Integer[] a = new Integer[] { 1 };
\r
294 Double[] b = new Double[] { 2.0 };
\r
295 @SuppressWarnings("unused")
\r
296 Number[] c = (Number[])ArrayUtils.append(Object.class, a, b[0]);
\r
300 public void testAppendMixedTypes5() {
\r
301 // Java generic type inference does some fairly unpredictable stuff here
\r
302 Integer[] a = new Integer[] { 1 };
\r
303 String[] b = new String[] { "foo" };
\r
304 Object[] c = ArrayUtils.append(a, b[0]);
\r
305 // c is in fact not an Object array!
\r
306 // Java has determined that both Integer and String are instances of Comparable
\r
307 // Could be a Comparable array just as well...
\r
308 assert(Serializable[].class == c.getClass() || Comparable[].class == c.getClass());
\r
309 assertEquals(2, c.length);
\r
310 assertSame(a[0], c[0]);
\r
311 assertSame(b[0], c[1]);
\r
315 public void testAppendMixedTypes5b() {
\r
316 Object[] a = new Integer[] { 1 };
\r
317 Object[] b = new String[] { "foo" };
\r
318 // b[0] is passed as a VarArg of type Object
\r
319 Object[] c = ArrayUtils.append(a, b[0]);
\r
320 assertSame(Object[].class, c.getClass());
\r
321 assertEquals(2, c.length);
\r
322 assertSame(a[0], c[0]);
\r
323 assertSame(b[0], c[1]);
\r
327 public void testAppendMixedTypes6() {
\r
328 CharSequence[] a = new CharSequence[] { "bar" };
\r
329 String[] b = new String[] { "foo" };
\r
330 Object[] c = ArrayUtils.append(a, b[0]);
\r
331 assertSame(CharSequence[].class, c.getClass());
\r
332 assertEquals(2, c.length);
\r
333 assertSame(a[0], c[0]);
\r
334 assertSame(b[0], c[1]);
\r
338 public void testAppendMixedTypes6b() {
\r
339 Object[] a = new CharSequence[] { "bar" };
\r
340 Object[] b = new String[] { "foo" };
\r
341 // b[0] is passed as a VarArg of type Object
\r
342 Object[] c = ArrayUtils.append(a, b[0]);
\r
343 assertSame(Object[].class, c.getClass());
\r
344 assertEquals(2, c.length);
\r
345 assertSame(a[0], c[0]);
\r
346 assertSame(b[0], c[1]);
\r
350 public void testAppendMixedTypes7() {
\r
351 String[] a = new String[] { "bar" };
\r
352 CharSequence[] b = new CharSequence[] { "foo" };
\r
353 Object[] c = ArrayUtils.append(a, b[0]);
\r
354 assertSame(CharSequence[].class, c.getClass());
\r
355 assertEquals(2, c.length);
\r
356 assertSame(a[0], c[0]);
\r
357 assertSame(b[0], c[1]);
\r
361 public void testAppendMixedTypes7b() {
\r
362 Object[] a = new String[] { "bar" };
\r
363 Object[] b = new CharSequence[] { "foo" };
\r
364 Object[] c = ArrayUtils.append(a, b[0]);
\r
365 // Type inference presents b[0] as a VarArg of type Object
\r
366 assertSame(Object[].class, c.getClass());
\r
367 assertEquals(2, c.length);
\r
368 assertSame(a[0], c[0]);
\r
369 assertSame(b[0], c[1]);
\r
373 public void testAppendLengthGt() {
\r
374 Integer[] a = new Integer[] { 1, 2, 3 };
\r
375 Integer[] b = new Integer[] { 4, 5 };
\r
376 Integer[] c = ArrayUtils.append(8, a, b[0], b[1]);
\r
377 assertEquals(8, c.length);
\r
378 for (int i = 0; i < 5; i++)
\r
379 assertEquals(i+1, (int)c[i]);
\r
380 for (int i = 5; i < 8; i++)
\r
382 assertSame(a[0], c[0]);
\r
383 assertSame(b[0], c[3]);
\r
387 public void testAppendLengthLtB() {
\r
388 Integer[] a = new Integer[] { 1, 2, 3 };
\r
389 Integer[] b = new Integer[] { 4, 5 };
\r
390 Integer[] c = ArrayUtils.append(4, a, b[0], b[1]);
\r
391 assertEquals(4, c.length);
\r
392 for (int i = 0; i < 4; i++)
\r
393 assertEquals(i+1, (int)c[i]);
\r
394 assertSame(a[0], c[0]);
\r
395 assertSame(b[0], c[3]);
\r
399 public void testAppendLengthLtA() {
\r
400 Integer[] a = new Integer[] { 1, 2, 3 };
\r
401 Integer[] b = new Integer[] { 4, 5 };
\r
402 Integer[] c = ArrayUtils.append(2, a, b[0], b[1]);
\r
403 assertEquals(2, c.length);
\r
404 for (int i = 0; i < 2; i++)
\r
405 assertEquals(i+1, (int)c[i]);
\r
406 assertSame(a[0], c[0]);
\r
410 public void testAppendLengthZero() {
\r
411 Integer[] a = new Integer[] { 1, 2, 3 };
\r
412 Integer[] b = new Integer[] { 4, 5 };
\r
413 Integer[] c = ArrayUtils.append(0, a, b[0], b[1]);
\r
414 assertEquals(0, c.length);
\r
418 public void testAppendLengthZeroEmptyA() {
\r
419 Integer[] a = new Integer[] { };
\r
420 Integer[] b = new Integer[] { 4, 5 };
\r
421 Integer[] c = ArrayUtils.append(0, a, b[0], b[1]);
\r
422 assertEquals(0, c.length);
\r
426 public void testAppendLengthEmptyA() {
\r
427 Integer[] a = new Integer[] { };
\r
428 Integer[] b = new Integer[] { 4, 5 };
\r
429 Integer[] c = ArrayUtils.append(2, a, b[0], b[1]);
\r
430 assertEquals(2, c.length);
\r
431 assertArrayEquals(b, c);
\r
432 assertNotSame(b, c);
\r
436 public void testAppendLengthEmptyB() {
\r
437 Integer[] a = new Integer[] { 1, 2, 3 };
\r
438 Integer[] c = ArrayUtils.append(3, a);
\r
439 assertEquals(3, c.length);
\r
440 assertArrayEquals(a, c);
\r
441 assertNotSame(a, c);
\r
445 public void testGetCommonBase1() {
\r
446 Class<?> cl = ArrayUtils.getCommonBase(Integer.class, Double.class);
\r
447 assertSame(Number.class, cl);
\r
451 public void testGetCommonBase2() {
\r
452 Class<?> cl = ArrayUtils.getCommonBase(Integer[].class, Double[].class);
\r
453 assertSame(Number[].class, cl);
\r
457 public void testGetCommonBase3() {
\r
458 Class<?> cl = ArrayUtils.getCommonBase(Integer.class, Double[].class);
\r
459 assertSame(Object.class, cl);
\r
463 public void testGetCommonBase4() {
\r
464 Class<?> cl = ArrayUtils.getCommonBase(List.class, ArrayList.class);
\r
465 assertSame(List.class, cl);
\r
469 public void testGetCommonBase5() {
\r
470 Class<?> cl = ArrayUtils.getCommonBase(ArrayList.class, List.class);
\r
471 assertSame(List.class, cl);
\r
475 public void testGetCommonBase6() {
\r
476 Class<?> cl = ArrayUtils.getCommonBase(ArrayList.class, LinkedList.class);
\r
477 assertSame(AbstractList.class, cl);
\r
481 public void testGetCommonBase7() {
\r
482 Class<?> cl = ArrayUtils.getCommonBase(ArrayList.class, HashSet.class);
\r
483 assertSame(AbstractCollection.class, cl);
\r
487 public void testGetCommonBase8() {
\r
488 Iterable<Object> foo = new Iterable<Object>() {
\r
490 public Iterator<Object> iterator() {
\r
495 Class<?> cl2 = ArrayUtils.getCommonBase(Iterable.class, foo.getClass());
\r
496 Class<?> cl3 = ArrayUtils.getCommonBase(Iterable.class, ArrayList.class);
\r
497 Class<?> cl = ArrayUtils.getCommonBase(ArrayList.class, foo.getClass());
\r
499 assertSame(Iterable.class, cl2);
\r
500 assertSame(Iterable.class, cl3);
\r
501 assertSame(Object.class, cl);
\r