Home | History | Annotate | Download | only in io
      1 /* Licensed to the Apache Software Foundation (ASF) under one or more
      2  * contributor license agreements.  See the NOTICE file distributed with
      3  * this work for additional information regarding copyright ownership.
      4  * The ASF licenses this file to You under the Apache License, Version 2.0
      5  * (the "License"); you may not use this file except in compliance with
      6  * the License.  You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package org.apache.harmony.luni.tests.java.io;
     18 
     19 import java.io.IOException;
     20 import java.io.Reader;
     21 import java.nio.CharBuffer;
     22 
     23 import junit.framework.TestCase;
     24 import tests.support.Support_ASimpleReader;
     25 import dalvik.annotation.TestLevel;
     26 import dalvik.annotation.TestTargetClass;
     27 import dalvik.annotation.TestTargetNew;
     28 import dalvik.annotation.TestTargets;
     29 
     30 @TestTargetClass(Reader.class)
     31 public class ReaderTest extends TestCase {
     32 
     33     @TestTargetNew(
     34             level = TestLevel.COMPLETE,
     35             method = "Reader",
     36             args = {}
     37         )
     38     public void test_Reader() {
     39         MockReader r = new MockReader();
     40         assertTrue("Test 1: Lock has not been set correctly.", r.lockSet(r));
     41     }
     42 
     43     @TestTargetNew(
     44         level = TestLevel.PARTIAL_COMPLETE,
     45         notes = "",
     46         method = "Reader",
     47         args = {java.lang.Object.class}
     48     )
     49     public void test_Reader_CharBuffer_null() throws IOException {
     50         String s = "MY TEST STRING";
     51         MockReader mockReader = new MockReader(s.toCharArray());
     52         CharBuffer charBuffer = null;
     53         try {
     54             mockReader.read(charBuffer);
     55             fail("Should throw NullPointerException");
     56         } catch (NullPointerException e) {
     57             //expected;
     58         }
     59     }
     60 
     61     @TestTargets ({
     62         @TestTargetNew(
     63                 level = TestLevel.PARTIAL_COMPLETE,
     64                 notes = "Functional test.",
     65                 method = "Reader",
     66                 args = {java.lang.Object.class}
     67         ),
     68         @TestTargetNew(
     69                 level = TestLevel.PARTIAL_COMPLETE,
     70                 notes = "Functional test.",
     71                 method = "read",
     72                 args = {java.nio.CharBuffer.class}
     73         )
     74     })
     75     public void test_Reader_CharBuffer_ZeroChar() throws IOException {
     76         // If the charBuffer has a capacity of 0, then the number of char read
     77         // to the CharBuffer is 0. Furthermore, the MockReader is intact in
     78         // its content.
     79         String s = "MY TEST STRING";
     80         char[] srcBuffer = s.toCharArray();
     81         MockReader mockReader = new MockReader(srcBuffer);
     82         CharBuffer charBuffer = CharBuffer.allocate(0);
     83         int result = mockReader.read(charBuffer);
     84         assertEquals(0, result);
     85         char[] destBuffer = new char[srcBuffer.length];
     86         mockReader.read(destBuffer);
     87         assertEquals(s, String.valueOf(destBuffer));
     88     }
     89 
     90     @TestTargets ({
     91         @TestTargetNew(
     92                 level = TestLevel.PARTIAL_COMPLETE,
     93                 notes = "Functional test.",
     94                 method = "Reader",
     95                 args = {java.lang.Object.class}
     96         ),
     97         @TestTargetNew(
     98                 level = TestLevel.PARTIAL_COMPLETE,
     99                 notes = "Functional test.",
    100                 method = "read",
    101                 args = {java.nio.CharBuffer.class}
    102         )
    103     })
    104     public void test_Reader_CharBufferChar() throws IOException {
    105         String s = "MY TEST STRING";
    106         char[] srcBuffer = s.toCharArray();
    107         final int CHARBUFFER_SIZE = 10;
    108         MockReader mockReader = new MockReader(srcBuffer);
    109         CharBuffer charBuffer = CharBuffer.allocate(CHARBUFFER_SIZE);
    110         charBuffer.append('A');
    111         final int CHARBUFFER_REMAINING = charBuffer.remaining();
    112         int result = mockReader.read(charBuffer);
    113         assertEquals(CHARBUFFER_REMAINING, result);
    114         charBuffer.rewind();
    115         assertEquals(s.substring(0, CHARBUFFER_REMAINING), charBuffer
    116                 .subSequence(CHARBUFFER_SIZE - CHARBUFFER_REMAINING,
    117                         CHARBUFFER_SIZE).toString());
    118         char[] destBuffer = new char[srcBuffer.length - CHARBUFFER_REMAINING];
    119         mockReader.read(destBuffer);
    120         assertEquals(s.substring(CHARBUFFER_REMAINING), String
    121                 .valueOf(destBuffer));
    122 
    123         Support_ASimpleReader simple;
    124         simple = new Support_ASimpleReader("Bla bla, what else?");
    125         CharBuffer buf = CharBuffer.allocate(4);
    126         assertEquals("Wrong return value!", 4, simple.read(buf));
    127         buf.rewind();
    128         assertEquals("Wrong stuff read!", "Bla ", String.valueOf(buf));
    129         simple.read(buf);
    130         buf.rewind();
    131         assertEquals("Wrong stuff read!", "bla,", String.valueOf(buf));
    132         simple.throwExceptionOnNextUse = true;
    133         try {
    134             simple.read(buf);
    135             fail("IOException not thrown!");
    136         } catch (IOException e) {
    137             // expected
    138         }
    139     }
    140 
    141     @TestTargetNew(
    142         level = TestLevel.COMPLETE,
    143         notes = "",
    144         method = "read",
    145         args = {char[].class}
    146     )
    147     public void test_Read_$C() throws IOException {
    148         Support_ASimpleReader simple;
    149         simple = new Support_ASimpleReader("Bla bla, what else?");
    150         char[] buf = new char[4];
    151         assertEquals("Wrong return value!", 4, simple.read(buf));
    152         assertEquals("Wrong stuff read!", "Bla ", new String(buf));
    153         simple.read(buf);
    154         assertEquals("Wrong stuff read!", "bla,", new String(buf));
    155         simple.throwExceptionOnNextUse = true;
    156         try {
    157             simple.read(buf);
    158             fail("IOException not thrown!");
    159         } catch (IOException e) {
    160             // expected
    161         }
    162     }
    163 
    164     /**
    165      * @tests {@link java.io.Reader#mark(int)}
    166      */
    167     @TestTargetNew(
    168         level = TestLevel.COMPLETE,
    169         notes = "",
    170         method = "mark",
    171         args = {int.class}
    172     )
    173     public void test_mark() {
    174         MockReader mockReader = new MockReader();
    175         try {
    176             mockReader.mark(0);
    177             fail("Should throw IOException for Reader do not support mark");
    178         } catch (IOException e) {
    179             // Excepted
    180         }
    181     }
    182 
    183     @TestTargetNew(
    184         level = TestLevel.COMPLETE,
    185         notes = "",
    186         method = "markSupported",
    187         args = {}
    188     )
    189     public void test_markSupported() {
    190         assertFalse("markSupported must return false", new MockReader().markSupported());
    191     }
    192 
    193     /**
    194      * @tests {@link java.io.Reader#read()}
    195      */
    196     @TestTargetNew(
    197         level = TestLevel.COMPLETE,
    198         notes = "",
    199         method = "read",
    200         args = {}
    201     )
    202     public void test_read() throws IOException {
    203         MockReader reader = new MockReader();
    204 
    205         // return -1 when the stream is null;
    206         assertEquals("Should be equal to -1", -1, reader.read());
    207 
    208         String string = "MY TEST STRING";
    209         char[] srcBuffer = string.toCharArray();
    210         MockReader mockReader = new MockReader(srcBuffer);
    211 
    212         // normal read
    213         for (char c : srcBuffer) {
    214             assertEquals("Should be equal to \'" + c + "\'", c, mockReader
    215                     .read());
    216         }
    217 
    218         // return -1 when read Out of Index
    219         mockReader.read();
    220         assertEquals("Should be equal to -1", -1, reader.read());
    221 
    222         Support_ASimpleReader simple;
    223         simple = new Support_ASimpleReader("Bla bla, what else?");
    224         int res;
    225         res = simple.read();
    226         assertEquals("Wrong stuff read!", 'B', res);
    227         res = simple.read();
    228         assertEquals("Wrong stuff read!", 'l', res);
    229         simple.throwExceptionOnNextUse = true;
    230         try {
    231             simple.read();
    232             fail("IOException not thrown!");
    233         } catch (IOException e) {
    234             // expected
    235         }
    236     }
    237 
    238     /**
    239      * @tests {@link java.io.Reader#ready()}
    240      */
    241     @TestTargetNew(
    242         level = TestLevel.COMPLETE,
    243         notes = "",
    244         method = "ready",
    245         args = {}
    246     )
    247     public void test_ready() throws IOException {
    248         MockReader mockReader = new MockReader();
    249         assertFalse("Should always return false", mockReader.ready());
    250 
    251         Support_ASimpleReader simple;
    252         simple = new Support_ASimpleReader("Bla bla, what else?");
    253         simple.throwExceptionOnNextUse = true;
    254         try {
    255             simple.ready();
    256             fail("IOException not thrown!");
    257         } catch (IOException e) {
    258             // expected
    259         }
    260     }
    261 
    262     /**
    263      * @throws IOException
    264      * @tests {@link java.io.Reader#reset()}
    265      */
    266     @TestTargetNew(
    267         level = TestLevel.COMPLETE,
    268         notes = "",
    269         method = "reset",
    270         args = {}
    271     )
    272     public void test_reset() throws IOException {
    273         MockReader mockReader = new MockReader();
    274         try {
    275             mockReader.reset();
    276             fail("Should throw IOException");
    277         } catch (IOException e) {
    278             // Excepted
    279         }
    280     }
    281 
    282     /**
    283      * @tests {@link java.io.Reader#skip(long)}
    284      */
    285     @TestTargetNew(
    286         level = TestLevel.COMPLETE,
    287         notes = "",
    288         method = "skip",
    289         args = {long.class}
    290     )
    291     public void test_skip() throws IOException {
    292         String string = "MY TEST STRING";
    293         char[] srcBuffer = string.toCharArray();
    294         int length = srcBuffer.length;
    295         MockReader mockReader = new MockReader(srcBuffer);
    296         assertEquals("Should be equal to \'M\'", 'M', mockReader.read());
    297 
    298         // normal skip
    299         mockReader.skip(length / 2);
    300         assertEquals("Should be equal to \'S\'", 'S', mockReader.read());
    301 
    302         // try to skip a bigger number of characters than the total
    303         // Should do nothing
    304         mockReader.skip(length);
    305 
    306         // try to skip a negative number of characters throw IllegalArgumentException
    307         try {
    308             mockReader.skip(-1);
    309             fail("Should throw IllegalArgumentException");
    310         } catch (IllegalArgumentException e) {
    311             // Excepted
    312         }
    313 
    314         Support_ASimpleReader simple;
    315         simple = new Support_ASimpleReader("Bla bla, what else?");
    316         char[] buf = new char[4];
    317         simple.read(buf);
    318         assertEquals("Wrong stuff read!", "Bla ", new String(buf));
    319         simple.skip(5);
    320         simple.read(buf);
    321         assertEquals("Wrong stuff read!", "what", new String(buf));
    322         simple.throwExceptionOnNextUse = true;
    323         try {
    324             simple.skip(1);
    325             fail("IOException not thrown!");
    326         } catch (IOException e) {
    327             // expected
    328         }
    329     }
    330 
    331     class MockReader extends Reader {
    332 
    333         private char[] contents;
    334 
    335         private int current_offset = 0;
    336 
    337         private int length = 0;
    338 
    339         public MockReader() {
    340             super();
    341         }
    342 
    343         public MockReader(char[] data) {
    344             contents = data;
    345             length = contents.length;
    346         }
    347 
    348         @Override
    349         public void close() throws IOException {
    350 
    351             contents = null;
    352         }
    353 
    354         @Override
    355         public int read(char[] buf, int offset, int count) throws IOException {
    356 
    357             if (null == contents) {
    358                 return -1;
    359             }
    360             if (length <= current_offset) {
    361                 return -1;
    362             }
    363             if (buf.length < offset + count) {
    364                 throw new IndexOutOfBoundsException();
    365             }
    366 
    367             count = Math.min(count, length - current_offset);
    368             for (int i = 0; i < count; i++) {
    369                 buf[offset + i] = contents[current_offset + i];
    370             }
    371             current_offset += count;
    372             return count;
    373         }
    374 
    375         public boolean lockSet(Object o) {
    376             return (lock == o);
    377         }
    378     }
    379 }
    380