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 org.apache.harmony.luni.tests.java.io;
19
20import java.io.IOException;
21import java.io.StringReader;
22
23public class StringReaderTest extends junit.framework.TestCase {
24
25	String testString = "This is a test string";
26
27	StringReader sr;
28
29	/**
30	 * @tests java.io.StringReader#StringReader(java.lang.String)
31	 */
32	public void test_ConstructorLjava_lang_String() {
33		// Test for method java.io.StringReader(java.lang.String)
34		assertTrue("Used in tests", true);
35	}
36
37	/**
38	 * @tests java.io.StringReader#close()
39	 */
40	public void test_close() throws Exception {
41		// Test for method void java.io.StringReader.close()
42		try {
43			sr = new StringReader(testString);
44			sr.close();
45			char[] buf = new char[10];
46			sr.read(buf, 0, 2);
47			fail("Close failed");
48		} catch (java.io.IOException e) {
49			return;
50		}
51	}
52
53	/**
54	 * @tests java.io.StringReader#mark(int)
55	 */
56	public void test_markI() throws Exception {
57		// Test for method void java.io.StringReader.mark(int)
58                sr = new StringReader(testString);
59                sr.skip(5);
60                sr.mark(0);
61                sr.skip(5);
62                sr.reset();
63                char[] buf = new char[10];
64                sr.read(buf, 0, 2);
65                assertTrue("Failed to return to mark", new String(buf, 0, 2)
66                                .equals(testString.substring(5, 7)));
67	}
68
69	/**
70	 * @tests java.io.StringReader#markSupported()
71	 */
72	public void test_markSupported() {
73		// Test for method boolean java.io.StringReader.markSupported()
74
75		sr = new StringReader(testString);
76		assertTrue("markSupported returned false", sr.markSupported());
77	}
78
79	/**
80	 * @tests java.io.StringReader#read()
81	 */
82	public void test_read() throws Exception {
83		// Test for method int java.io.StringReader.read()
84                sr = new StringReader(testString);
85                int r = sr.read();
86                assertEquals("Failed to read char", 'T', r);
87                sr = new StringReader(new String(new char[] { '\u8765' }));
88                assertTrue("Wrong double byte char", sr.read() == '\u8765');
89	}
90
91	/**
92	 * @tests java.io.StringReader#read(char[], int, int)
93	 */
94	public void test_read$CII() throws Exception {
95		// Test for method int java.io.StringReader.read(char [], int, int)
96                sr = new StringReader(testString);
97                char[] buf = new char[testString.length()];
98                int r = sr.read(buf, 0, testString.length());
99                assertTrue("Failed to read chars", r == testString.length());
100                assertTrue("Read chars incorrectly", new String(buf, 0, r)
101                                .equals(testString));
102	}
103
104	/**
105	 * @tests java.io.StringReader#ready()
106	 */
107	public void test_ready() throws Exception {
108		// Test for method boolean java.io.StringReader.ready()
109                sr = new StringReader(testString);
110                assertTrue("Steam not ready", sr.ready());
111                sr.close();
112                int r = 0;
113                try {
114                        sr.ready();
115                } catch (IOException e) {
116                        r = 1;
117                }
118                assertEquals("Expected IOException not thrown in read()", 1, r);
119	}
120
121	/**
122	 * @tests java.io.StringReader#reset()
123	 */
124	public void test_reset() throws Exception {
125		// Test for method void java.io.StringReader.reset()
126                sr = new StringReader(testString);
127                sr.skip(5);
128                sr.mark(0);
129                sr.skip(5);
130                sr.reset();
131                char[] buf = new char[10];
132                sr.read(buf, 0, 2);
133                assertTrue("Failed to reset properly", new String(buf, 0, 2)
134                                .equals(testString.substring(5, 7)));
135	}
136
137	/**
138	 * @tests java.io.StringReader#skip(long)
139	 */
140	public void test_skipJ() throws Exception {
141		// Test for method long java.io.StringReader.skip(long)
142                sr = new StringReader(testString);
143                sr.skip(5);
144                char[] buf = new char[10];
145                sr.read(buf, 0, 2);
146                assertTrue("Failed to skip properly", new String(buf, 0, 2)
147                                .equals(testString.substring(5, 7)));
148	}
149
150	// Regression test for HARMONY-5077
151    static boolean finish = false;
152
153    public void test_synchronization() {
154        String anything = "Hello world";
155        final StringReader sr = new StringReader(anything);
156        Thread other = new Thread(new Runnable() {
157            public void run() {
158                sr.close();
159                finish = true;
160            };
161        });
162
163        synchronized (anything) {
164            other.start();
165            while (!finish) {
166                Thread.yield();
167            }
168        }
169    }
170}
171