]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/testcases/org/simantics/databoard/tests/TestArrayUtils.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.databoard / testcases / org / simantics / databoard / tests / TestArrayUtils.java
1 /*******************************************************************************\r
2  *  Copyright (c) 2010 Association for Decentralized Information Management in\r
3  *  Industry THTH ry.\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
8  *\r
9  *  Contributors:\r
10  *      VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.databoard.tests;
13
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
19 \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
28 \r
29 import org.junit.Before;\r
30 import org.junit.Test;\r
31 import org.simantics.databoard.util.ArrayUtils;\r
32
33 public class TestArrayUtils {
34
35         @Before
36         public void setUp() {
37         }\r
38         \r
39         @Test\r
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
49         }\r
50         \r
51         @Test\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
60         }\r
61 \r
62         @Test\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
71         }\r
72 \r
73         @Test\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
81         }\r
82         \r
83         @Test\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
91         }\r
92 \r
93         @Test\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
101         }       \r
102         \r
103         @Test\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
111         }       \r
112         \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
119         }\r
120         \r
121         @Test\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
128         }\r
129         \r
130         @Test\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
137         }\r
138         \r
139         @Test\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
146         }\r
147         \r
148         @Test\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
157                         assertNull(c[i]);\r
158                 assertSame(a[0], c[0]);\r
159                 assertSame(b[0], c[3]);\r
160         }\r
161 \r
162         @Test\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
172         }\r
173 \r
174         @Test\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
183         }\r
184         \r
185         @Test\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
191         }\r
192         \r
193         @Test\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
199         }\r
200         \r
201         @Test\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
209         }\r
210         \r
211         @Test\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
219         }\r
220 \r
221         @Test\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
229         }\r
230         \r
231         @Test\r
232         public void testAppendEmptyA() {\r
233                 Integer[] a = new Integer[] { };\r
234                 Integer b = 4;\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
239         }\r
240 \r
241         @Test\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
249         }\r
250 \r
251         @Test\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
257         }\r
258         \r
259         @Test\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
267         }\r
268 \r
269         @Test\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
278         }       \r
279         \r
280         @Test\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
289         }       \r
290         \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
297         }\r
298         \r
299         @Test\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
312         }\r
313 \r
314         @Test\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
324         }\r
325         \r
326         @Test\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
335         }\r
336         \r
337         @Test\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
347         }\r
348         \r
349         @Test\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
358         }\r
359         \r
360         @Test\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
370         }\r
371         \r
372         @Test\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
381                         assertNull(c[i]);\r
382                 assertSame(a[0], c[0]);\r
383                 assertSame(b[0], c[3]);\r
384         }\r
385 \r
386         @Test\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
396         }\r
397 \r
398         @Test\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
407         }\r
408         \r
409         @Test\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
415         }\r
416         \r
417         @Test\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
423         }\r
424         \r
425         @Test\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
433         }\r
434         \r
435         @Test\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
442         }\r
443         \r
444         @Test\r
445         public void testGetCommonBase1() {\r
446                 Class<?> cl = ArrayUtils.getCommonBase(Integer.class, Double.class);\r
447                 assertSame(Number.class, cl);\r
448         }\r
449         \r
450         @Test\r
451         public void testGetCommonBase2() {\r
452                 Class<?> cl = ArrayUtils.getCommonBase(Integer[].class, Double[].class);\r
453                 assertSame(Number[].class, cl);\r
454         }\r
455         \r
456         @Test\r
457         public void testGetCommonBase3() {\r
458                 Class<?> cl = ArrayUtils.getCommonBase(Integer.class, Double[].class);\r
459                 assertSame(Object.class, cl);\r
460         }\r
461         \r
462         @Test\r
463         public void testGetCommonBase4() {\r
464                 Class<?> cl = ArrayUtils.getCommonBase(List.class, ArrayList.class);\r
465                 assertSame(List.class, cl);\r
466         }\r
467         \r
468         @Test\r
469         public void testGetCommonBase5() {\r
470                 Class<?> cl = ArrayUtils.getCommonBase(ArrayList.class, List.class);\r
471                 assertSame(List.class, cl);\r
472         }\r
473         \r
474         @Test\r
475         public void testGetCommonBase6() {\r
476                 Class<?> cl = ArrayUtils.getCommonBase(ArrayList.class, LinkedList.class);\r
477                 assertSame(AbstractList.class, cl);\r
478         }\r
479         \r
480         @Test\r
481         public void testGetCommonBase7() {\r
482                 Class<?> cl = ArrayUtils.getCommonBase(ArrayList.class, HashSet.class);\r
483                 assertSame(AbstractCollection.class, cl);\r
484         }\r
485         \r
486         @Test\r
487         public void testGetCommonBase8() {\r
488                 Iterable<Object> foo = new Iterable<Object>() {\r
489                         @Override\r
490                         public Iterator<Object> iterator() {\r
491                                 return null;\r
492                         }\r
493                 };\r
494                 \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
498                 \r
499                 assertSame(Iterable.class, cl2);\r
500                 assertSame(Iterable.class, cl3);\r
501                 assertSame(Object.class, cl);\r
502         }\r
503 }