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
18package tests.api.java.io;
19
20import java.io.IOException;
21import java.io.LineNumberReader;
22import java.io.Reader;
23import java.io.StringReader;
24
25import dalvik.annotation.TestLevel;
26import dalvik.annotation.TestTargetClass;
27import dalvik.annotation.TestTargetNew;
28
29@TestTargetClass(LineNumberReader.class)
30public class LineNumberReaderTest extends junit.framework.TestCase {
31
32    String text = "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\n78\n79\n80\n81\n82\n83\n84\n85\n86\n87\n88\n89\n90\n91\n92\n93\n94\n95\n96\n97\n98\n99\n100\n101\n102\n103\n104\n105\n106\n107\n108\n109\n110\n111\n112\n113\n114\n115\n116\n117\n118\n119\n120\n121\n122\n123\n124\n125\n126\n127\n128\n129\n130\n131\n132\n133\n134\n135\n136\n137\n138\n139\n140\n141\n142\n143\n144\n145\n146\n147\n148\n149\n150\n151\n152\n153\n154\n155\n156\n157\n158\n159\n160\n161\n162\n163\n164\n165\n166\n167\n168\n169\n170\n171\n172\n173\n174\n175\n176\n177\n178\n179\n180\n181\n182\n183\n184\n185\n186\n187\n188\n189\n190\n191\n192\n193\n194\n195\n196\n197\n198\n199\n200\n201\n202\n203\n204\n205\n206\n207\n208\n209\n210\n211\n212\n213\n214\n215\n216\n217\n218\n219\n220\n221\n222\n223\n224\n225\n226\n227\n228\n229\n230\n231\n232\n233\n234\n235\n236\n237\n238\n239\n240\n241\n242\n243\n244\n245\n246\n247\n248\n249\n250\n251\n252\n253\n254\n255\n256\n257\n258\n259\n260\n261\n262\n263\n264\n265\n266\n267\n268\n269\n270\n271\n272\n273\n274\n275\n276\n277\n278\n279\n280\n281\n282\n283\n284\n285\n286\n287\n288\n289\n290\n291\n292\n293\n294\n295\n296\n297\n298\n299\n300\n301\n302\n303\n304\n305\n306\n307\n308\n309\n310\n311\n312\n313\n314\n315\n316\n317\n318\n319\n320\n321\n322\n323\n324\n325\n326\n327\n328\n329\n330\n331\n332\n333\n334\n335\n336\n337\n338\n339\n340\n341\n342\n343\n344\n345\n346\n347\n348\n349\n350\n351\n352\n353\n354\n355\n356\n357\n358\n359\n360\n361\n362\n363\n364\n365\n366\n367\n368\n369\n370\n371\n372\n373\n374\n375\n376\n377\n378\n379\n380\n381\n382\n383\n384\n385\n386\n387\n388\n389\n390\n391\n392\n393\n394\n395\n396\n397\n398\n399\n400\n401\n402\n403\n404\n405\n406\n407\n408\n409\n410\n411\n412\n413\n414\n415\n416\n417\n418\n419\n420\n421\n422\n423\n424\n425\n426\n427\n428\n429\n430\n431\n432\n433\n434\n435\n436\n437\n438\n439\n440\n441\n442\n443\n444\n445\n446\n447\n448\n449\n450\n451\n452\n453\n454\n455\n456\n457\n458\n459\n460\n461\n462\n463\n464\n465\n466\n467\n468\n469\n470\n471\n472\n473\n474\n475\n476\n477\n478\n479\n480\n481\n482\n483\n484\n485\n486\n487\n488\n489\n490\n491\n492\n493\n494\n495\n496\n497\n498\n499\n500\n";
33
34    LineNumberReader lnr;
35
36    /**
37     * @tests java.io.LineNumberReader#LineNumberReader(java.io.Reader)
38     */
39    @TestTargetNew(
40        level = TestLevel.COMPLETE,
41        notes = "",
42        method = "LineNumberReader",
43        args = {java.io.Reader.class, int.class}
44    )
45    public void test_ConstructorLjava_io_Reader() {
46        // Test for method java.io.LineNumberReader(java.io.Reader)
47        lnr = new LineNumberReader(new StringReader(text), 4092);
48        assertEquals("Failed to create reader", 0, lnr.getLineNumber());
49    }
50
51    /**
52     * @tests java.io.LineNumberReader#LineNumberReader(java.io.Reader, int)
53     */
54    @TestTargetNew(
55        level = TestLevel.COMPLETE,
56        notes = "",
57        method = "LineNumberReader",
58        args = {java.io.Reader.class}
59    )
60    public void test_ConstructorLjava_io_ReaderI() {
61        // Test for method java.io.LineNumberReader(java.io.Reader, int)
62        lnr = new LineNumberReader(new StringReader(text));
63        assertEquals("Failed to create reader", 0, lnr.getLineNumber());
64    }
65
66    /**
67     * @tests java.io.LineNumberReader#getLineNumber()
68     */
69    @TestTargetNew(
70        level = TestLevel.COMPLETE,
71        notes = "",
72        method = "getLineNumber",
73        args = {}
74    )
75    public void test_getLineNumber() {
76        // Test for method int java.io.LineNumberReader.getLineNumber()
77        lnr = new LineNumberReader(new StringReader(text));
78        assertEquals("Returned incorrect line number--expected 0, got ", 0, lnr
79                .getLineNumber());
80        try {
81            lnr.readLine();
82            lnr.readLine();
83        } catch (IOException e) {
84            fail("Exception during getLineNumberTest: " + e.toString());
85        }
86        assertTrue("Returned incorrect line number--expected 2, got: "
87                + lnr.getLineNumber(), lnr.getLineNumber() == 2);
88    }
89
90    /**
91     * @tests java.io.LineNumberReader#mark(int)
92     */
93    @TestTargetNew(
94        level = TestLevel.COMPLETE,
95        method = "mark",
96        args = {int.class}
97    )
98    public void test_markI() throws IOException {
99        lnr = new LineNumberReader(new StringReader(text));
100        String line;
101        lnr.skip(80);
102        lnr.mark(100);
103        line = lnr.readLine();
104        lnr.reset();
105        assertTrue("Test 1: Failed to return to marked position.",
106                line.equals(lnr.readLine()));
107
108        lnr.close();
109        try {
110            lnr.mark(42);
111            fail("Test 2: IOException expected.");
112        } catch (IOException e) {
113            // Expected.
114        }
115
116        // The spec does not say the mark has to be invalidated
117    }
118
119    /**
120     * @tests java.io.LineNumberReader#read()
121     */
122    @TestTargetNew(
123        level = TestLevel.COMPLETE,
124        method = "read",
125        args = {}
126    )
127    public void test_read() throws IOException {
128        lnr = new LineNumberReader(new StringReader(text));
129
130        int c = lnr.read();
131        assertEquals("Test 1: Read returned incorrect character;",
132                '0', c);
133        lnr.read();
134        assertEquals("Test 2: Read failed to increase the line number;",
135                1, lnr.getLineNumber());
136
137        lnr.close();
138        try {
139            lnr.read();
140            fail("Test 3: IOException expected.");
141        } catch (IOException e) {
142            // Expected.
143        }
144    }
145
146    /**
147     * @tests java.io.LineNumberReader#read(char[], int, int)
148     */
149    @TestTargetNew(
150        level = TestLevel.PARTIAL_COMPLETE,
151        method = "read",
152        args = {char[].class, int.class, int.class}
153    )
154    public void test_read$CII() throws IOException {
155        lnr = new LineNumberReader(new StringReader(text));
156        char[] c = new char[100];
157        lnr.read(c, 0, 4);
158        assertTrue("Test 1: Read returned incorrect characters.", "0\n1\n"
159                .equals(new String(c, 0, 4)));
160        assertEquals("Test 2: Read failed to inc lineNumber",
161                2, lnr.getLineNumber());
162
163        lnr.close();
164        try {
165            lnr.read(c, 0, 4);
166            fail("Test 3: IOException expected.");
167        } catch (IOException e) {
168            // Expected.
169        }
170    }
171
172    /**
173     * @tests java.io.LineNumberReader#read(char[], int, int)
174     */
175    @TestTargetNew(
176        level = TestLevel.PARTIAL_COMPLETE,
177        method = "read",
178        args = {char[].class, int.class, int.class}
179    )
180    public void test_read$CII_Exception() throws IOException {
181        lnr = new LineNumberReader(new StringReader(text));
182        char[] c = new char[10];
183
184        try {
185            lnr.read(c, -1, 1);
186            fail("IndexOutOfBoundsException expected.");
187        } catch (IndexOutOfBoundsException e) {
188            // Expected.
189        }
190
191        try {
192            lnr.read(c, 0, -1);
193            fail("IndexOutOfBoundsException expected.");
194        } catch (IndexOutOfBoundsException e) {
195            // Expected.
196        }
197
198        try {
199            lnr.read(c, 10, 1);
200            fail("IndexOutOfBoundsException expected.");
201        } catch (IndexOutOfBoundsException e) {
202            // Expected.
203        }
204    }
205
206    /**
207     * @tests java.io.LineNumberReader#readLine()
208     */
209    @TestTargetNew(
210        level = TestLevel.COMPLETE,
211        method = "readLine",
212        args = {}
213    )
214    public void test_readLine() throws IOException {
215        lnr = new LineNumberReader(new StringReader(text));
216        assertEquals("Returned incorrect line number", 0, lnr.getLineNumber());
217        String line = null;
218        lnr.readLine();
219        line = lnr.readLine();
220        assertEquals("Test 1: Returned incorrect string;", "1", line);
221        assertTrue("Test 2: Returned incorrect line number:" + lnr.getLineNumber(),
222                lnr.getLineNumber() == 2);
223
224        lnr.close();
225        try {
226            lnr.readLine();
227            fail("Test 3: IOException expected.");
228        } catch (IOException e) {
229            // Expected.
230        }
231    }
232
233    /**
234     * @tests java.io.LineNumberReader#reset()
235     */
236    @TestTargetNew(
237        level = TestLevel.COMPLETE,
238        method = "reset",
239        args = {}
240    )
241    public void test_reset() throws IOException {
242        lnr = new LineNumberReader(new StringReader(text));
243        assertEquals("Test 1: Returned incorrect line number;",
244                0, lnr.getLineNumber());
245        String line = null;
246        lnr.mark(100);
247        lnr.readLine();
248        lnr.reset();
249        line = lnr.readLine();
250        assertEquals("Test 2: Failed to reset reader", "0", line);
251
252        lnr.mark(100);
253        lnr.close();
254        try {
255            lnr.reset();
256            fail("Test 3: IOException expected.");
257        } catch (IOException e) {
258            // Expected.
259        }
260    }
261
262    public void testReadLineSourceThrows() throws IOException {
263        lnr = new LineNumberReader(new Reader() {
264            private StringReader delegate = new StringReader("hello\nworld");
265            private int calls = 0;
266            @Override public void close() throws IOException {}
267            @Override public int read(char[] buf, int offset, int len) throws IOException {
268                if (calls++ < 2) {
269                    throw new IOException();
270                } else {
271                    return delegate.read(buf, offset, len);
272                }
273            }
274        });
275
276        assertEquals(0, lnr.getLineNumber());
277        try {
278            lnr.readLine();
279            fail();
280        } catch (IOException expected) {
281        }
282
283        assertEquals(0, lnr.getLineNumber());
284        try {
285            lnr.readLine();
286            fail();
287        } catch (IOException expected) {
288        }
289
290        assertEquals(0, lnr.getLineNumber());
291        assertEquals("hello", lnr.readLine());
292        assertEquals(1, lnr.getLineNumber());
293        assertEquals("world", lnr.readLine());
294        assertEquals(2, lnr.getLineNumber());
295    }
296
297    public void testGetLineNumberAfterEnd() throws IOException {
298        lnr = new LineNumberReader(new StringReader("hello\nworld"));
299        assertEquals(0, lnr.getLineNumber());
300        assertEquals("hello", lnr.readLine());
301        assertEquals(1, lnr.getLineNumber());
302        assertEquals("world", lnr.readLine());
303        assertEquals(2, lnr.getLineNumber());
304        assertEquals(null, lnr.readLine());
305        assertEquals(2, lnr.getLineNumber());
306        assertEquals(null, lnr.readLine());
307        assertEquals(2, lnr.getLineNumber());
308    }
309
310    /**
311     * @tests java.io.LineNumberReader#setLineNumber(int)
312     */
313    @TestTargetNew(
314        level = TestLevel.COMPLETE,
315        notes = "",
316        method = "setLineNumber",
317        args = {int.class}
318    )
319    public void test_setLineNumberI() {
320        // Test for method void java.io.LineNumberReader.setLineNumber(int)
321        lnr = new LineNumberReader(new StringReader(text));
322        lnr.setLineNumber(1001);
323        assertEquals("set incorrect line number", 1001, lnr.getLineNumber());
324    }
325
326    /**
327     * @tests java.io.LineNumberReader#skip(long)
328     */
329    @TestTargetNew(
330        level = TestLevel.COMPLETE,
331        method = "skip",
332        args = {long.class}
333    )
334    public void test_skipJ() throws IOException {
335        lnr = new LineNumberReader(new StringReader(text));
336        char[] c = new char[100];
337        long skipped = lnr.skip(80);
338        assertEquals("Test 1: Incorrect number of characters skipped;",
339                80, skipped);
340        lnr.read(c, 0, 100);
341        assertTrue("Test 2: Failed to skip to correct position.",
342                text.substring(80, 180).equals(new String(c, 0, c.length)));
343
344        try {
345            lnr.skip(-1);
346            fail("Test 3: IllegalArgumentException expected.");
347        } catch (IllegalArgumentException e) {
348            // Expected.
349        }
350
351        lnr.close();
352        try {
353            lnr.skip(1);
354            fail("Test 4: IOException expected.");
355        } catch (IOException e) {
356            // Expected.
357        }
358    }
359}
360