Home | History | Annotate | Download | only in util
      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  */
     17 
     18 package org.apache.harmony.tests.java.util;
     19 
     20 import java.util.AbstractCollection;
     21 import java.util.Arrays;
     22 import java.util.Collection;
     23 import java.util.Iterator;
     24 import junit.framework.TestCase;
     25 
     26 public class AbstractCollectionTest extends TestCase {
     27 
     28     /**
     29      * java.util.AbstractCollection#add(java.lang.Object)
     30      */
     31     public void test_addLjava_lang_Object() {
     32         AbstractCollection<Object> ac = new AbstractCollection<Object>() {
     33 
     34             @Override
     35             public Iterator<Object> iterator() {
     36                 fail("iterator should not get called");
     37                 return null;
     38             }
     39 
     40             @Override
     41             public int size() {
     42                 fail("size should not get called");
     43                 return 0;
     44             }
     45 
     46         };
     47         try {
     48             ac.add(null);
     49         } catch (UnsupportedOperationException e) {
     50         }
     51     }
     52 
     53     /**
     54      * java.util.AbstractCollection#addAll(java.util.Collection)
     55      */
     56     public void test_addAllLjava_util_Collection() {
     57         final Collection<String> fixtures = Arrays.asList("0", "1", "2");
     58         AbstractCollection<String> ac = new AbstractCollection<String>() {
     59 
     60             @Override
     61             public boolean add(String object) {
     62                 assertTrue(fixtures.contains(object));
     63                 return true;
     64             }
     65 
     66             @Override
     67             public Iterator<String> iterator() {
     68                 fail("iterator should not get called");
     69                 return null;
     70             }
     71 
     72             @Override
     73             public int size() {
     74                 fail("size should not get called");
     75                 return 0;
     76             }
     77 
     78         };
     79         assertTrue(ac.addAll(fixtures));
     80     }
     81 
     82     /**
     83      * java.util.AbstractCollection#containsAll(java.util.Collection)
     84      */
     85     public void test_containsAllLjava_util_Collection() {
     86         final Collection<String> fixtures = Arrays.asList("0", "1", "2");
     87         AbstractCollection<String> ac = new AbstractCollection<String>() {
     88 
     89             @Override
     90             public boolean contains(Object object) {
     91                 assertTrue(fixtures.contains(object));
     92                 return true;
     93             }
     94 
     95             @Override
     96             public Iterator<String> iterator() {
     97                 fail("iterator should not get called");
     98                 return null;
     99             }
    100 
    101             @Override
    102             public int size() {
    103                 fail("size should not get called");
    104                 return 0;
    105             }
    106 
    107         };
    108         assertTrue(ac.containsAll(fixtures));
    109     }
    110 
    111     /**
    112      * java.util.AbstractCollection#isEmpty()
    113      */
    114     public void test_isEmpty() {
    115         final boolean[] sizeCalled = new boolean[1];
    116         AbstractCollection<Object> ac = new AbstractCollection<Object>() {
    117             @Override
    118             public Iterator<Object> iterator() {
    119                 fail("iterator should not get called");
    120                 return null;
    121             }
    122 
    123             @Override
    124             public int size() {
    125                 sizeCalled[0] = true;
    126                 return 0;
    127             }
    128         };
    129         assertTrue(ac.isEmpty());
    130         assertTrue(sizeCalled[0]);
    131     }
    132 
    133     /**
    134      * java.util.AbstractCollection#removeAll(java.util.Collection)
    135      */
    136     public void test_removeAllLjava_util_Collection() {
    137         final String[] removed = new String[3];
    138         AbstractCollection<String> ac = new AbstractCollection<String>() {
    139 
    140             @Override
    141             public Iterator<String> iterator() {
    142                 return new Iterator<String>() {
    143                     String[] values = new String[] { "0", "1", "2" };
    144                     int index;
    145 
    146                     public boolean hasNext() {
    147                         return index < values.length;
    148                     }
    149 
    150                     public String next() {
    151                         return values[index++];
    152                     }
    153 
    154                     public void remove() {
    155                         removed[index - 1] = values[index - 1];
    156                     }
    157 
    158                 };
    159             }
    160 
    161             @Override
    162             public int size() {
    163                 fail("size should not get called");
    164                 return 0;
    165             }
    166 
    167         };
    168         assertTrue(ac.removeAll(Arrays.asList("0", "1", "2")));
    169         for (String r : removed) {
    170             if (!"0".equals(r) && !"1".equals(r) && !"2".equals(r)) {
    171                 fail("an unexpected element was removed");
    172             }
    173         }
    174     }
    175 
    176     /**
    177      * java.util.AbstractCollection#retainAll(java.util.Collection)
    178      */
    179     public void test_retainAllLjava_util_Collection() {
    180         final String[] removed = new String[1];
    181         AbstractCollection<String> ac = new AbstractCollection<String>() {
    182 
    183             @Override
    184             public Iterator<String> iterator() {
    185                 return new Iterator<String>() {
    186                     String[] values = new String[] { "0", "1", "2" };
    187                     int index;
    188 
    189                     public boolean hasNext() {
    190                         return index < values.length;
    191                     }
    192 
    193                     public String next() {
    194                         return values[index++];
    195                     }
    196 
    197                     public void remove() {
    198                         removed[index - 1] = values[index - 1];
    199                     }
    200 
    201                 };
    202             }
    203 
    204             @Override
    205             public int size() {
    206                 fail("size should not get called");
    207                 return 0;
    208             }
    209 
    210         };
    211         assertTrue(ac.retainAll(Arrays.asList("1", "2")));
    212         assertEquals("0", removed[0]);
    213     }
    214 
    215     /**
    216      * java.util.AbstractCollection#toArray()
    217      */
    218     public void test_toArray() {
    219         AbstractCollection<String> ac = new AbstractCollection<String>() {
    220             @Override
    221             public Iterator<String> iterator() {
    222                 return new Iterator<String>() {
    223                     String[] values = new String[] { "0", "1", "2" };
    224                     int index;
    225 
    226                     public boolean hasNext() {
    227                         return index < values.length;
    228                     }
    229 
    230                     public String next() {
    231                         return values[index++];
    232                     }
    233 
    234                     public void remove() {
    235                         fail("remove should not get called");
    236                     }
    237 
    238                 };
    239             }
    240 
    241             @Override
    242             public int size() {
    243                 return 3;
    244             }
    245         };
    246 
    247         Object[] array = ac.toArray();
    248         assertEquals(3, array.length);
    249         for (Object o : array) {
    250             if (!"0".equals(o) && !"1".equals(o) && !"2".equals(o)) {
    251                 fail("an unexpected element was removed");
    252             }
    253         }
    254     }
    255 
    256     /**
    257      * java.util.AbstractCollection#toArray(java.lang.Object[])
    258      */
    259     public void test_toArray$Ljava_lang_Object() {
    260         AbstractCollection<String> ac = new AbstractCollection<String>() {
    261             @Override
    262             public Iterator<String> iterator() {
    263                 return new Iterator<String>() {
    264                     String[] values = new String[] { "0", "1", "2" };
    265                     int index;
    266 
    267                     public boolean hasNext() {
    268                         return index < values.length;
    269                     }
    270 
    271                     public String next() {
    272                         return values[index++];
    273                     }
    274 
    275                     public void remove() {
    276                         fail("remove should not get called");
    277                     }
    278 
    279                 };
    280             }
    281 
    282             @Override
    283             public int size() {
    284                 return 3;
    285             }
    286         };
    287         try {
    288             ac.toArray(null);
    289             fail("No expected NullPointerException");
    290         } catch (NullPointerException e) {
    291             // expected
    292         }
    293 
    294         try {
    295             ac.toArray(new StringBuffer[ac.size()]);
    296             fail("No expected ArrayStoreException");
    297         } catch (ArrayStoreException e) {
    298             // expected
    299         }
    300 
    301         String[] a = new String[3];
    302         assertSame(a, ac.toArray(a));
    303 
    304         a = new String[0];
    305         assertNotSame(a, ac.toArray(a));
    306         a = ac.toArray(a);
    307         assertEquals(3, a.length);
    308 
    309         CharSequence[] csa = new CharSequence[3];
    310         ac.toArray(csa);
    311         assertEquals(3, csa.length);
    312         assertEquals("0", csa[0]);
    313         assertEquals("1", csa[1]);
    314         assertEquals("2", csa[2]);
    315     }
    316 
    317     /**
    318      * java.util.AbstractCollection#toString()
    319      */
    320     public void test_toString() {
    321         // see HARMONY-1522
    322         // collection that returns null iterator(this is against the spec.)
    323         AbstractCollection<?> c = new AbstractCollection<Object>() {
    324             @Override
    325             public int size() {
    326                 // return non-zero value to pass 'isEmpty' check
    327                 return 1;
    328             }
    329 
    330             @Override
    331             public Iterator<Object> iterator() {
    332                 // this violates the spec.
    333                 return null;
    334             }
    335         };
    336 
    337         try {
    338             // AbstractCollection.toString() doesn't verify
    339             // whether iterator() returns null value or not
    340             c.toString();
    341             fail("No expected NullPointerException");
    342         } catch (NullPointerException e) {
    343         }
    344     }
    345 }
    346