1/*
2 *  Licensed to the Apache Software Foundation (ASF) under one or more
3 *  contributor license agreements.  See the NOTICE file distributed with
4 *  this work for additional information regarding copyright ownership.
5 *  The ASF licenses this file to You under the Apache License, Version 2.0
6 *  (the "License"); you may not use this file except in compliance with
7 *  the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17package org.apache.harmony.tests.java.util;
18
19import java.util.AbstractSequentialList;
20import java.util.Arrays;
21import java.util.Collection;
22import java.util.Iterator;
23import java.util.LinkedList;
24import java.util.ListIterator;
25import java.util.Vector;
26
27import junit.framework.TestCase;
28
29public class AbstractSequentialListTest extends TestCase {
30
31    @Override
32    protected void setUp() throws Exception {
33        super.setUp();
34    }
35
36    @Override
37    protected void tearDown() throws Exception {
38        super.tearDown();
39    }
40
41    class ASLT<E> extends AbstractSequentialList<E> {
42
43        LinkedList<E> l = new LinkedList<E>();
44
45        @Override
46        public ListIterator<E> listIterator(int index) {
47            return l.listIterator(index);
48        }
49
50        @Override
51        public int size() {
52            return l.size();
53        }
54    }
55
56    /**
57     * {@link java.util.AbstractSequentialList#addAll(int, java.util.Collection)}
58     */
59    public void test_addAll_ILCollection() {
60        AbstractSequentialList<String> al = new ASLT<String>();
61        String[] someList = { "Aardvark"  ,
62                              "Bear"      ,
63                              "Chimpanzee",
64                              "Duck"      };
65        Collection<String> c = Arrays.asList(someList);
66        al.addAll(c);
67        assertTrue("Should return true", al.addAll(2, c));
68    }
69
70    class Mock_unsupportedListIterator implements ListIterator {
71        public void add(Object o) {
72            throw new UnsupportedOperationException();
73        }
74
75        public boolean hasNext() {
76            return true;
77        }
78
79        public boolean hasPrevious() {
80            return false;
81        }
82
83        public Object next() {
84            return null;
85        }
86
87        public int nextIndex() {
88            return 0;
89        }
90
91        public Object previous() {
92            return null;
93        }
94
95        public int previousIndex() {
96            return 0;
97        }
98
99        public void remove() {
100        }
101
102        public void set(Object o) {
103            throw new UnsupportedOperationException();
104        }
105    }
106
107    class Mock_ListIterator<E> implements ListIterator<E> {
108        final String wrongElement = "String";
109        public void add(E o) {
110            if (o.equals(wrongElement)) throw new IllegalArgumentException();
111            if (o == null) throw new NullPointerException();
112        }
113
114        public boolean hasNext() {
115            return false;
116        }
117
118        public boolean hasPrevious() {
119            return false;
120        }
121
122        public E next() {
123            return null;
124        }
125
126        public int nextIndex() {
127            return 0;
128        }
129
130        public E previous() {
131            return null;
132        }
133
134        public int previousIndex() {
135            return 0;
136        }
137
138        public void remove() {
139        }
140
141        public void set(E o) {
142        }
143    }
144
145    public void test_addAllILjava_util_Collection() {
146        AbstractSequentialList asl = new AbstractSequentialList() {
147
148            @Override
149            public int size() {
150                return 0;
151            }
152
153            @Override
154            public ListIterator listIterator(int index) {
155                return new Mock_unsupportedListIterator();
156            }
157        };
158        Collection strV = new Vector<String>();
159
160        strV.add("String");
161        strV.add("1");
162        strV.add("3.14");
163
164        try {
165            asl.addAll(0, strV);
166            fail("UnsupportedOperationException expected.");
167        } catch (UnsupportedOperationException ee) {
168            //expected
169        }
170        try {
171            asl.addAll(0, null);
172            fail("NullPointerException expected");
173        } catch (NullPointerException ee) {
174            //expected
175        }
176
177        //ClassCastException can not be checked for this method.
178
179        asl = new AbstractSequentialList() {
180
181            @Override
182            public int size() {
183                return 0;
184            }
185
186            @Override
187            public ListIterator listIterator(int index) {
188                return new Mock_ListIterator();
189            }
190        };
191
192        try {
193            asl.addAll(0, strV);
194            fail("IllegalArgumentException expected");
195        } catch (IllegalArgumentException e) {
196            //expected
197        }
198
199        strV.remove("String");
200        strV.add(null);
201
202        try {
203            asl.addAll(0, strV);
204            fail("NullPointerException expected");
205        } catch (NullPointerException e) {
206            //expected
207        }
208
209        strV.remove(null);
210        asl.addAll(0, strV);
211
212        asl = new LinkedList();
213
214        try {
215            asl.addAll(-10, strV);
216            fail("IndexOutOfBoundsException expected");
217        } catch (IndexOutOfBoundsException e) {
218            //expected
219        }
220
221        try {
222            asl.addAll(1, strV);
223            fail("IndexOutOfBoundsException expected");
224        } catch (IndexOutOfBoundsException e) {
225            //expected
226        }
227    }
228
229    public void test_addILjava_lang_Object() {
230        AbstractSequentialList asl = new AbstractSequentialList() {
231
232            @Override
233            public int size() {
234                return 0;
235            }
236
237            @Override
238            public ListIterator listIterator(int index) {
239                return new Mock_unsupportedListIterator();
240            }
241        };
242
243        try {
244            asl.add(0, 1);
245            fail("UnsupportedOperationException expected");
246        } catch (UnsupportedOperationException e) {
247            //expected
248        }
249
250        asl = new AbstractSequentialList() {
251
252            @Override
253            public int size() {
254                return 0;
255            }
256
257            @Override
258            public ListIterator listIterator(int index) {
259                return new Mock_ListIterator();
260            }
261        };
262
263        try {
264            asl.add(0, "String");
265            fail("IllegalArgumentException expected");
266        } catch (IllegalArgumentException ee) {
267            //expected
268        }
269
270        try {
271            asl.add(0, null);
272            fail("NullPointerException expected");
273        } catch (NullPointerException ee) {
274            //expected
275        }
276
277        //ClassCastException can not be checked for this method.
278
279        asl.add(0, 1);
280
281        asl = new LinkedList();
282
283        try {
284            asl.add(-1, 1);
285            fail("IndexOutOfBoundsException expected");
286        } catch (IndexOutOfBoundsException ee) {
287            //expected
288        }
289
290        asl.add(0, 1);
291
292        try {
293            asl.add(2, 1);
294            fail("IndexOutOfBoundsException expected");
295        } catch (IndexOutOfBoundsException ee) {
296            //expected
297        }
298    }
299
300    public void test_getI() {
301        final String buff[] = {"0", "1", "2", "3", "4", "5"};
302        AbstractSequentialList asl = new AbstractSequentialList() {
303            int currPos = 0;
304
305            @Override
306            public int size() {
307                return buff.length;
308            }
309
310            @Override
311            public ListIterator listIterator(int index) {
312                currPos = index;
313                return new ListIterator() {
314                    public void add(Object o) {
315                    }
316
317                    public boolean hasNext() {
318                        return true;
319                    }
320
321                    public boolean hasPrevious() {
322                        return false;
323                    }
324
325                    public Object next() {
326                        return buff[currPos];
327                    }
328
329                    public int nextIndex() {
330                        return 0;
331                    }
332
333                    public Object previous() {
334                        return null;
335                    }
336
337                    public int previousIndex() {
338                        return 0;
339                    }
340
341                    public void remove() {
342                    }
343
344                    public void set(Object o) {
345                    }
346                };
347            }
348        };
349
350        for (int i = 0; i < buff.length; i++) {
351            assertEquals(buff[i], asl.get(i));
352        }
353
354        try {
355            asl.get(asl.size() + 1);
356            fail("IndexOutOfBoundsException expected");
357        } catch (IndexOutOfBoundsException e) {
358            //expected
359        }
360
361        try {
362            asl.get(-1);
363            fail("IndexOutOfBoundsException expected");
364        } catch (IndexOutOfBoundsException e) {
365            //expected
366        }
367    }
368
369    public void test_iterrator() {
370        AbstractSequentialList asl = new AbstractSequentialList() {
371
372            @Override
373            public int size() {
374                return 0;
375            }
376
377            @Override
378            public ListIterator listIterator(int index) {
379                return new Mock_unsupportedListIterator();
380            }
381        };
382
383        assertTrue(asl.iterator().getClass().toString().contains("Mock_unsupportedListIterator"));
384
385        asl = new AbstractSequentialList() {
386
387            @Override
388            public int size() {
389                return 0;
390            }
391
392            @Override
393            public ListIterator listIterator(int index) {
394                return new Mock_ListIterator();
395            }
396        };
397
398        assertTrue(asl.iterator().getClass().toString().contains("Mock_ListIterator"));
399
400        asl = new AbstractSequentialList() {
401
402            @Override
403            public int size() {
404                return 0;
405            }
406
407            @Override
408            public ListIterator listIterator(int index) {
409                return null;
410            }
411        };
412        assertNull(asl.iterator());
413    }
414
415    public void test_removeI() {
416        AbstractSequentialList asl = new AbstractSequentialList() {
417            String buff[] = {"0", "1", "2", "3", "4", "5"};
418            int currPos = 0;
419
420            @Override
421            public int size() {
422                return buff.length;
423            }
424
425            @Override
426            public ListIterator listIterator(int index) {
427                currPos = index;
428                return new ListIterator() {
429                    public void add(Object o) {
430                    }
431
432                    public boolean hasNext() {
433                        return true;
434                    }
435
436                    public boolean hasPrevious() {
437                        return false;
438                    }
439
440                    public Object next() {
441                        return buff[currPos];
442                    }
443
444                    public int nextIndex() {
445                        return 0;
446                    }
447
448                    public Object previous() {
449                        return null;
450                    }
451
452                    public int previousIndex() {
453                        return 0;
454                    }
455
456                    public void remove() {
457                        buff[currPos] = "removed element";
458                    }
459
460                    public void set(Object o) {
461                    }
462                };
463            }
464        };
465
466        try {
467            asl.remove(asl.size() + 1);
468            fail("IndexOutOfBoundsException expected");
469        } catch (IndexOutOfBoundsException e) {
470            //expected
471        }
472
473        try {
474            asl.remove(-1);
475            fail("IndexOutOfBoundsException expected");
476        } catch (IndexOutOfBoundsException e) {
477            //expected
478        }
479
480        for(int i = 0; i < asl.size(); i++) {
481            assertFalse(asl.get(i).toString().contains("removed element"));
482            asl.remove(i);
483            assertTrue(asl.get(i).toString().contains("removed element"));
484        }
485    }
486
487    public void test_setILjava_lang_Object() {
488        AbstractSequentialList asl = new AbstractSequentialList() {
489            String buff[] = {"0", "1", "2", "3", "4", "5"};
490            final String illegalStr = "Illegal element";
491            int currPos = 0;
492
493            @Override
494            public int size() {
495                return buff.length;
496            }
497
498            @Override
499            public ListIterator listIterator(int index) {
500                currPos = index;
501                return new ListIterator() {
502                    public void add(Object o) {
503                    }
504
505                    public boolean hasNext() {
506                        return true;
507                    }
508
509                    public boolean hasPrevious() {
510                        return false;
511                    }
512
513                    public Object next() {
514                        return buff[currPos];
515                    }
516
517                    public int nextIndex() {
518                        return 0;
519                    }
520
521                    public Object previous() {
522                        return null;
523                    }
524
525                    public int previousIndex() {
526                        return 0;
527                    }
528
529                    public void remove() {
530                        buff[currPos] = "removed element";
531                    }
532
533                    public void set(Object o) {
534                        if (o == null) throw new NullPointerException();
535                        if (o.equals(illegalStr)) throw new IllegalArgumentException();
536                        buff[currPos] = (String) o;
537                    }
538                };
539            }
540        };
541
542        try {
543            asl.set(asl.size() + 1, "new element");
544            fail("IndexOutOfBoundsException expected");
545        } catch (IndexOutOfBoundsException e) {
546            //expected
547        }
548
549        try {
550            asl.set(-1, "new element");
551            fail("IndexOutOfBoundsException expected");
552        } catch (IndexOutOfBoundsException e) {
553            //expected
554        }
555
556        for(int i = 0; i < asl.size(); i++) {
557            assertFalse(asl.get(i).toString().contains("new element"));
558            asl.set(i, "new element");
559            assertTrue(asl.get(i).toString().contains("new element"));
560        }
561
562        try {
563            asl.set(1, new Double(1));
564            fail("ClassCastException expected");
565        } catch (ClassCastException e) {
566            //
567        }
568
569        try {
570            asl.set(1, "Illegal element");
571            fail("IllegalArgumentException expected");
572        } catch (IllegalArgumentException ee) {
573            //expected
574        }
575
576        try {
577            asl.set(1, null);
578            fail("NullPointerException expected");
579        } catch (NullPointerException ee) {
580            //expected
581        }
582
583        asl = new AbstractSequentialList() {
584
585            @Override
586            public int size() {
587                return 0;
588            }
589
590            @Override
591            public ListIterator listIterator(int index) {
592                return new Mock_unsupportedListIterator();
593            }
594        };
595
596        try {
597            asl.set(0, "New element");
598            fail("UnsupportedOperationException expected");
599        } catch (UnsupportedOperationException e) {
600            //expected
601        }
602    }
603}
604