1cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath/*
2cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  Licensed to the Apache Software Foundation (ASF) under one or more
3cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  contributor license agreements.  See the NOTICE file distributed with
4cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  this work for additional information regarding copyright ownership.
5cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  The ASF licenses this file to You under the Apache License, Version 2.0
6cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  (the "License"); you may not use this file except in compliance with
7cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  the License.  You may obtain a copy of the License at
8cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *
9cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *     http://www.apache.org/licenses/LICENSE-2.0
10cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *
11cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  Unless required by applicable law or agreed to in writing, software
12cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  distributed under the License is distributed on an "AS IS" BASIS,
13cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  See the License for the specific language governing permissions and
15cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  limitations under the License.
16cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath */
17cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
18ab762bb740405d0fefcccf4a0899a234f995be13Narayan Kamathpackage org.apache.harmony.tests.java.io;
19cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
20bd024cc687470a008999d96fd3af4a1261413d55Narayan Kamathimport junit.framework.TestCase;
21cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.BufferedInputStream;
22cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ByteArrayInputStream;
23cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ByteArrayOutputStream;
24cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.IOException;
25cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.InputStream;
26cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.InputStreamReader;
27cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.OutputStreamWriter;
28cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.UnsupportedEncodingException;
29cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.nio.charset.Charset;
30cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.nio.charset.CharsetDecoder;
31cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.nio.charset.CodingErrorAction;
32cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.nio.charset.MalformedInputException;
33cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.Arrays;
34cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
35cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathpublic class InputStreamReaderTest extends TestCase {
36cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
37cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    static class LimitedByteArrayInputStream extends ByteArrayInputStream {
38cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
39cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // A ByteArrayInputStream that only returns a single byte per read
40cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        byte[] bytes;
41cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
42cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int count;
43cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
44cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public LimitedByteArrayInputStream(int type) {
45cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            super(new byte[0]);
46cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            switch (type) {
47cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                case 0:
48cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    bytes = new byte[] { 0x61, 0x72 };
49cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    break;
50cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                case 1:
51cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    bytes = new byte[] { (byte) 0xff, (byte) 0xfe, 0x61, 0x72 };
52cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    break;
53cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                case 2:
54cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    bytes = new byte[] { '\u001b', '$', 'B', '6', 'e', 'B', 'h',
55cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                            '\u001b', '(', 'B' };
56cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    break;
57cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
58cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            count = bytes.length;
59cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
60cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
61cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
62cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public int available() {
63cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return count;
64cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
65cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
66cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
67cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public int read() {
68cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (count == 0) {
69cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                return -1;
70cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
71cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            count--;
72cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return bytes[bytes.length - count];
73cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
74cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
75cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        @Override
76cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public int read(byte[] buffer, int offset, int length) {
77cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (count == 0) {
78cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                return -1;
79cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
80cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            if (length == 0) {
81cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                return 0;
82cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            }
83cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            buffer[offset] = bytes[bytes.length - count];
84cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            count--;
85cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return 1;
86cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
87cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
88cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
89cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public String fileString = "Test_All_Tests\nTest_java_io_BufferedInputStream\nTest_java_io_BufferedOutputStream\nTest_java_io_ByteArrayInputStream\nTest_java_io_ByteArrayOutputStream\nTest_java_io_DataInputStream\n";
90cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
91cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private InputStream fis;
92cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
93cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private InputStream in;
94cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
95cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private InputStreamReader is;
96cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
97cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private InputStreamReader reader;
98cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
99cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private final String source = "This is a test message with Unicode character. \u4e2d\u56fd is China's name in Chinese";
100cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
101cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /*
102cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @see TestCase#setUp()
103cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
104cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    @Override
105cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    protected void setUp() throws Exception {
106cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        super.setUp();
107cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
108cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        in = new ByteArrayInputStream(source.getBytes("UTF-8"));
109cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader = new InputStreamReader(in, "UTF-8");
110cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
111cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ByteArrayOutputStream bos = new ByteArrayOutputStream();
112cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        OutputStreamWriter osw = new OutputStreamWriter(bos);
113cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        char[] buf = new char[fileString.length()];
114cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        fileString.getChars(0, fileString.length(), buf, 0);
115cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        osw.write(buf);
116cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        osw.close();
117cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        fis = new ByteArrayInputStream(bos.toByteArray());
118cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        is = new InputStreamReader(fis);
119cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
120cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
121cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /*
122cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * @see TestCase#tearDown()
123cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
124cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    @Override
125cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    protected void tearDown() throws Exception {
126cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
127cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            in.close();
128cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            is.close();
129cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fis.close();
130cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IOException e) {
131cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Ignored
132cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
133cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
134cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        super.tearDown();
135cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
136cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
137cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
138cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.InputStreamReader#close()
139cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
140cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_close() throws IOException {
141cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        is.close();
142cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
143cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            is.read();
144cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Should throw IOException");
145cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IOException e) {
146cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Expected
147cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
148cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
149cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader.close();
150cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
151cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            reader.ready();
152cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Should throw IOException");
153cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IOException e) {
154cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Expected
155cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
156cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
157cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Should be a no-op
158cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader.close();
159cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
160cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Tests after reader closed
161cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        in = new BufferedInputStream(
162cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                this
163cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        .getClass()
164cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        .getClassLoader()
165cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        .getResourceAsStream(
166cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                                "org/apache/harmony/luni/tests/java/io/testfile-utf8.txt"));
167cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader = new InputStreamReader(in, "utf-8");
168cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        in.close();
169cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
170cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            int count = reader.read(new char[1]);
171cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("count:" + count);
172cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IOException e) {
173cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Expected
174cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
175cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
176cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            reader.read();
177cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail();
178cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IOException e) {
179cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Expected
180cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
181cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
182cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse(reader.ready());
183cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Charset cs = Charset.forName("utf-8");
184cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(cs, Charset.forName(reader.getEncoding()));
185cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
186cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
187cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
188cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.InputStreamReader#InputStreamReader(java.io.InputStream)
189cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
190cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_ConstructorLjava_io_InputStream() throws IOException {
191cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
192cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            reader = new InputStreamReader(null);
193cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail();
194cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (NullPointerException e) {
195cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Expected
196cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
197cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InputStreamReader reader2 = new InputStreamReader(in);
198cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader2.close();
199cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
200cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
201cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
202cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.InputStreamReader#InputStreamReader(java.io.InputStream,
203cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     *java.lang.String)
204cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
205cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_ConstructorLjava_io_InputStreamLjava_lang_String()
206cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            throws IOException {
207cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        is = new InputStreamReader(fis, "8859_1");
208cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
209cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
210cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            is = new InputStreamReader(fis, "Bogus");
211cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Failed to throw Unsupported Encoding exception");
212cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (UnsupportedEncodingException e) {
213cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertNotNull(e.getMessage());
214cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
215cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
216cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
217cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            reader = new InputStreamReader(null, "utf-8");
218cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail();
219cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (NullPointerException e) {
220cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Expected
221cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
222cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
223cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            reader = new InputStreamReader(in, (String) null);
224cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail();
225cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (NullPointerException e) {
226cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Expected
227cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
228cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
229cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            reader = new InputStreamReader(in, "");
230cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail();
231cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (UnsupportedEncodingException e) {
232cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Expected
233cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
234cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
235cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            reader = new InputStreamReader(in, "badname");
236cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail();
237cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (UnsupportedEncodingException e) {
238cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Expected
239cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
240cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InputStreamReader reader2 = new InputStreamReader(in, "utf-8");
241cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(Charset.forName(reader2.getEncoding()), Charset
242cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .forName("utf-8"));
243cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader2.close();
244cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader2 = new InputStreamReader(in, "utf8");
245cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(Charset.forName(reader2.getEncoding()), Charset
246cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .forName("utf-8"));
247cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader2.close();
248cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
249cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
250cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
251cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.InputStreamReader(java.io.InputStream,
252cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     *java.nio.charset.Charset)
253cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
254cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_ConstructorLjava_io_InputStreamLjava_nio_charset_Charset()
255cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            throws IOException {
256cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Charset cs = Charset.forName("utf-8");
257cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
258cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            reader = new InputStreamReader(null, cs);
259cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail();
260cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (NullPointerException e) {
261cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Expected
262cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
263cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
264cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            reader = new InputStreamReader(in, (Charset) null);
265cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail();
266cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (NullPointerException e) {
267cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Expected
268cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
269cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InputStreamReader reader2 = new InputStreamReader(in, cs);
270cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(Charset.forName(reader2.getEncoding()), cs);
271cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader2.close();
272cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
273cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
274cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
275cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.InputStreamReader(java.io.InputStream,
276cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     *java.nio.charset.CharsetDecoder)
277cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
278cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_ConstructorLjava_io_InputStreamLjava_nio_charset_CharsetDecoder()
279cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            throws IOException {
280cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        CharsetDecoder decoder = Charset.forName("utf-8").newDecoder();
281cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
282cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            reader = new InputStreamReader(null, decoder);
283cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail();
284cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (NullPointerException e) {
285cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Expected
286cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
287cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
288cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            reader = new InputStreamReader(in, (CharsetDecoder) null);
289cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail();
290cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (NullPointerException e) {
291cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Expected
292cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
293cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InputStreamReader reader2 = new InputStreamReader(in, decoder);
294cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(Charset.forName(reader2.getEncoding()), decoder.charset());
295cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader2.close();
296cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
297cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
298cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
299bd024cc687470a008999d96fd3af4a1261413d55Narayan Kamath     * Unlike the RI, we return a canonical encoding name and not something
300bd024cc687470a008999d96fd3af4a1261413d55Narayan Kamath     * java specific.
301cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
302cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getEncoding() throws IOException {
303cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InputStreamReader isr = new InputStreamReader(fis, "8859_1");
304bd024cc687470a008999d96fd3af4a1261413d55Narayan Kamath        assertEquals("ISO-8859-1", isr.getEncoding());
305cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
306cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        isr = new InputStreamReader(fis, "ISO-8859-1");
307bd024cc687470a008999d96fd3af4a1261413d55Narayan Kamath        assertEquals("ISO-8859-1", isr.getEncoding());
308cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
309cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        byte b[] = new byte[5];
310cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        isr = new InputStreamReader(new ByteArrayInputStream(b), "UTF-16BE");
311cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        isr.close();
312cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertNull(isr.getEncoding());
313cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
314cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
315cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            isr = new InputStreamReader(System.in, "UTF-16BE");
316cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (UnsupportedEncodingException e) {
317cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Ignored
318cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
319bd024cc687470a008999d96fd3af4a1261413d55Narayan Kamath        assertEquals("UTF-16BE", isr.getEncoding());
320cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
321cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
322cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
323cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.InputStreamReader#read()
324cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
325cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_read() throws IOException {
326cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals('T', (char) reader.read());
327cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals('h', (char) reader.read());
328cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals('i', (char) reader.read());
329cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals('s', (char) reader.read());
330cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(' ', (char) reader.read());
331cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader.read(new char[source.length() - 5], 0, source.length() - 5);
332cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(-1, reader.read());
333cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
334cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int c = is.read();
335cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("returned incorrect char", (char) c == fileString.charAt(0));
336cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InputStreamReader reader = new InputStreamReader(
337cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                new ByteArrayInputStream(new byte[] { (byte) 0xe8, (byte) 0x9d,
338cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        (byte) 0xa5 }), "UTF8");
339cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("wrong double byte char", reader.read() == '\u8765');
340cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
341cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Regression for HARMONY-166
342cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InputStream in;
343cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
344cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        in = new LimitedByteArrayInputStream(0);
345cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader = new InputStreamReader(in, "UTF-16BE");
346cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("Incorrect byte UTF-16BE", '\u6172', reader.read());
347cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
348cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        in = new LimitedByteArrayInputStream(0);
349cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader = new InputStreamReader(in, "UTF-16LE");
350cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("Incorrect byte UTF-16BE", '\u7261', reader.read());
351cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
352cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        in = new LimitedByteArrayInputStream(1);
353cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader = new InputStreamReader(in, "UTF-16");
354cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("Incorrect byte UTF-16BE", '\u7261', reader.read());
355cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
356cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        /*
357cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath         * Temporarily commented out due to lack of ISO2022 support in ICU4J 3.8
358cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath         * in = new LimitedByteArrayInputStream(2); reader = new
359cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath         * InputStreamReader(in, "ISO2022JP"); assertEquals("Incorrect byte
360cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath         * ISO2022JP 1", '\u4e5d', reader.read()); assertEquals("Incorrect byte
361cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath         * ISO2022JP 2", '\u7b2c', reader.read());
362cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath         */
363cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
364cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
365cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /*
366cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * Class under test for int read() Regression for Harmony-411
367cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
368cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_read_1() throws IOException {
369cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // if the decoder is constructed by InputStreamReader itself, the
370cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // decoder's default error action is REPLACE
371cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InputStreamReader isr = new InputStreamReader(new ByteArrayInputStream(
372cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                new byte[] { -32, -96 }), "UTF-8");
373cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("read() return incorrect value", 65533, isr.read());
374cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
375cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InputStreamReader isr2 = new InputStreamReader(
376cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                new ByteArrayInputStream(new byte[] { -32, -96 }), Charset
377cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .forName("UTF-8"));
378cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("read() return incorrect value", 65533, isr2.read());
379cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
380cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // if the decoder is passed in, keep its status intact
381cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
382cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        decoder.onMalformedInput(CodingErrorAction.REPORT);
383cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InputStreamReader isr3 = new InputStreamReader(
384cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                new ByteArrayInputStream(new byte[] { -32, -96 }), decoder);
385cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
386cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            isr3.read();
387cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Should throw MalformedInputException");
388cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (MalformedInputException e) {
389cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // expected
390cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
391cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
392cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        CharsetDecoder decoder2 = Charset.forName("UTF-8").newDecoder();
393cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        decoder2.onMalformedInput(CodingErrorAction.IGNORE);
394cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InputStreamReader isr4 = new InputStreamReader(
395cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                new ByteArrayInputStream(new byte[] { -32, -96 }), decoder2);
396cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("read() return incorrect value", -1, isr4.read());
397cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
398cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        CharsetDecoder decoder3 = Charset.forName("UTF-8").newDecoder();
399cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        decoder3.onMalformedInput(CodingErrorAction.REPLACE);
400cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InputStreamReader isr5 = new InputStreamReader(
401cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                new ByteArrayInputStream(new byte[] { -32, -96 }), decoder3);
402cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("read() return incorrect value", 65533, isr5.read());
403cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
404cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
405cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_read_specialCharset() throws IOException {
406cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader.close();
407cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        in = this.getClass().getClassLoader().getResourceAsStream(
408e0e5a7a0bb9c4412664807c8150e453c611cc4f7Narayan Kamath                "tests/api/java/io/testfile-utf8.txt");
409cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader = new InputStreamReader(in, "utf-8");
410cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int c;
411cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        StringBuffer sb = new StringBuffer();
412cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        while ((c = reader.read()) != -1) {
413cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            sb.append((char) c);
414cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
415cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // delete BOM
416cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(source, sb.deleteCharAt(0).toString());
417cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
418cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        sb.setLength(0);
419cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader.close();
420cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        in = this.getClass().getClassLoader().getResourceAsStream(
421e0e5a7a0bb9c4412664807c8150e453c611cc4f7Narayan Kamath                "tests/api/java/io/testfile.txt");
422e0e5a7a0bb9c4412664807c8150e453c611cc4f7Narayan Kamath
423e0e5a7a0bb9c4412664807c8150e453c611cc4f7Narayan Kamath        reader = new InputStreamReader(in, "gb18030");
424cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        while ((c = reader.read()) != -1) {
425cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            sb.append((char) c);
426cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
427cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(source, sb.toString());
428cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
429cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
430cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
431cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.InputStreamReader#read(char[], int, int)
432cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
433cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_read$CII() throws IOException {
434cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        char[] rbuf = new char[100];
435cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        char[] sbuf = new char[100];
436cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        fileString.getChars(0, 100, sbuf, 0);
437cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        is.read(rbuf, 0, 100);
438cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        for (int i = 0; i < rbuf.length; i++) {
439cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            assertTrue("returned incorrect chars", rbuf[i] == sbuf[i]);
440cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
441cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
442cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Test successive reads
443cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        byte[] data = new byte[8192 * 2];
444cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Arrays.fill(data, (byte) 116); // 116 = ISO-8859-1 value for 't'
445cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ByteArrayInputStream bis = new ByteArrayInputStream(data);
446cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        InputStreamReader isr = new InputStreamReader(bis, "ISO-8859-1");
447cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
448cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // One less than the InputStreamReader.BUFFER_SIZE
449cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        char[] buf = new char[8191];
450cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int bytesRead = isr.read(buf, 0, buf.length);
451cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse(-1 == bytesRead);
452cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        bytesRead = isr.read(buf, 0, buf.length);
453cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse(-1 == bytesRead);
454cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
455cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        bis = new ByteArrayInputStream(source.getBytes("UTF-8"));
456cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        isr = new InputStreamReader(in, "UTF-8");
457cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        char[] chars = new char[source.length()];
458cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(source.length() - 3, isr.read(chars, 0, chars.length - 3));
459cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(3, isr.read(chars, 0, 10));
460cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
461cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
462cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /*
463cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * Class under test for int read(char[], int, int)
464cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
465cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_read$CII_1() throws IOException {
466cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
467cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            reader.read(null, -1, 1);
468cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail();
469cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (NullPointerException expected) {
470cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IndexOutOfBoundsException expected) {
471cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
472cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
473cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
474cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            reader.read(null, 0, -1);
475cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail("Should throw NullPointerException");
476cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (NullPointerException e) {
477cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IndexOutOfBoundsException expected) {
478cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
479cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
480cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
481cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            reader.read(null, 0, 1);
482cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail();
483cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (NullPointerException e) {
484cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Expected
485cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
486cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
487cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            reader.read(new char[3], -1, 1);
488cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail();
489cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IndexOutOfBoundsException e) {
490cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Expected
491cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
492cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
493cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            reader.read(new char[3], 0, -1);
494cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail();
495cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IndexOutOfBoundsException e) {
496cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Expected
497cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
498cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        try {
499cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            reader.read(new char[3], 1, 3);
500cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            fail();
501cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        } catch (IndexOutOfBoundsException e) {
502cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            // Expected
503cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
504cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(0, reader.read(new char[3], 3, 0));
505cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        char[] chars = new char[source.length()];
506cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(0, reader.read(chars, 0, 0));
507cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(0, chars[0]);
508cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(3, reader.read(chars, 0, 3));
509cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(5, reader.read(chars, 3, 5));
510cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(source.length() - 8, reader.read(chars, 8,
511cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                chars.length - 8));
512cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue(Arrays.equals(chars, source.toCharArray()));
513cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(-1, reader.read(chars, 0, chars.length));
514cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue(Arrays.equals(chars, source.toCharArray()));
515cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
516cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
517cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
518cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.InputStreamReader#ready()
519cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
520cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_ready() throws IOException {
521cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Ready test failed", is.ready());
522cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        is.read();
523cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("More chars, but not ready", is.ready());
524cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
525cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue(reader.ready());
526cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        reader.read(new char[source.length()]);
527cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse(reader.ready());
528cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
529cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath}
530