View Javadoc
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  package org.apache.juneau.commons.io;
18  
19  import static org.junit.jupiter.api.Assertions.*;
20  
21  import org.apache.juneau.*;
22  import org.junit.jupiter.api.*;
23  
24  class CharSequenceReader_Test extends TestBase {
25  
26  	//====================================================================================================
27  	// Constructor tests
28  	//====================================================================================================
29  	@Test void a01_constructorWithString() {
30  		var reader = new CharSequenceReader("test");
31  		var result = new StringBuilder();
32  		int c;
33  		while ((c = reader.read()) != -1) {
34  			result.append((char)c);
35  		}
36  		assertEquals("test", result.toString());
37  	}
38  
39  	@Test void a02_constructorWithStringBuilder() {
40  		var cs = new StringBuilder("test");
41  		var reader = new CharSequenceReader(cs);
42  		var result = new StringBuilder();
43  		int c;
44  		while ((c = reader.read()) != -1) {
45  			result.append((char)c);
46  		}
47  		assertEquals("test", result.toString());
48  	}
49  
50  	@Test void a03_constructorWithStringBuffer() {
51  		var cs = new StringBuffer("test");
52  		var reader = new CharSequenceReader(cs);
53  		var result = new StringBuilder();
54  		int c;
55  		while ((c = reader.read()) != -1) {
56  			result.append((char)c);
57  		}
58  		assertEquals("test", result.toString());
59  	}
60  
61  	@Test void a04_constructorWithNull() {
62  		var reader = new CharSequenceReader(null);
63  		assertEquals(-1, reader.read());
64  		assertEquals("", reader.toString());
65  	}
66  
67  	@Test void a05_constructorWithEmptyString() {
68  		var reader = new CharSequenceReader("");
69  		assertEquals(-1, reader.read());
70  		assertEquals("", reader.toString());
71  	}
72  
73  	//====================================================================================================
74  	// read() tests
75  	//====================================================================================================
76  	@Test void b01_readSingleChar() {
77  		var reader = new CharSequenceReader("abc");
78  		assertEquals('a', reader.read());
79  		assertEquals('b', reader.read());
80  		assertEquals('c', reader.read());
81  		assertEquals(-1, reader.read());
82  	}
83  
84  	@Test void b02_readEndOfStream() {
85  		var reader = new CharSequenceReader("a");
86  		assertEquals('a', reader.read());
87  		assertEquals(-1, reader.read());
88  		assertEquals(-1, reader.read()); // Should continue returning -1
89  	}
90  
91  	//====================================================================================================
92  	// read(char[], int, int) tests
93  	//====================================================================================================
94  	@Test void c01_readCharArray() {
95  		var reader = new CharSequenceReader("hello");
96  		var buf = new char[5];
97  		var count = reader.read(buf, 0, 5);
98  		assertEquals(5, count);
99  		assertEquals("hello", new String(buf));
100 	}
101 
102 	@Test void c02_readCharArray_partial() {
103 		var reader = new CharSequenceReader("hello");
104 		var buf = new char[10];
105 		var count = reader.read(buf, 0, 3);
106 		assertEquals(3, count);
107 		assertEquals("hel", new String(buf, 0, 3));
108 	}
109 
110 	@Test void c03_readCharArray_multipleReads() {
111 		var reader = new CharSequenceReader("hello");
112 		var buf = new char[3];
113 		var count1 = reader.read(buf, 0, 3);
114 		assertEquals(3, count1);
115 		assertEquals("hel", new String(buf));
116 		var count2 = reader.read(buf, 0, 3);
117 		assertEquals(2, count2);
118 		assertEquals("lo", new String(buf, 0, 2));
119 	}
120 
121 	@Test void c04_readCharArray_endOfStream() {
122 		var reader = new CharSequenceReader("a");
123 		var buf = new char[10];
124 		var count = reader.read(buf, 0, 10);
125 		assertEquals(1, count);
126 		assertEquals('a', buf[0]);
127 		var count2 = reader.read(buf, 0, 10);
128 		assertEquals(-1, count2);
129 	}
130 
131 	@Test void c05_readCharArray_empty() {
132 		var reader = new CharSequenceReader("");
133 		var buf = new char[10];
134 		var count = reader.read(buf, 0, 10);
135 		assertEquals(-1, count);
136 	}
137 
138 	@Test void c06_readCharArray_withOffset() {
139 		var reader = new CharSequenceReader("hello");
140 		var buf = new char[10];
141 		var count = reader.read(buf, 2, 3);
142 		assertEquals(3, count);
143 		assertEquals("hel", new String(buf, 2, 3));
144 	}
145 
146 	//====================================================================================================
147 	// skip() tests
148 	//====================================================================================================
149 	@Test void d01_skip() {
150 		var reader = new CharSequenceReader("hello");
151 		var skipped = reader.skip(2);
152 		assertEquals(2, skipped);
153 		assertEquals('l', reader.read());
154 	}
155 
156 	@Test void d02_skip_all() {
157 		var reader = new CharSequenceReader("hello");
158 		var skipped = reader.skip(10);
159 		assertEquals(5, skipped);
160 		assertEquals(-1, reader.read());
161 	}
162 
163 	@Test void d03_skip_zero() {
164 		var reader = new CharSequenceReader("hello");
165 		var skipped = reader.skip(0);
166 		assertEquals(0, skipped);
167 		assertEquals('h', reader.read());
168 	}
169 
170 	@Test void d04_skip_negative() {
171 		var reader = new CharSequenceReader("hello");
172 		var skipped = reader.skip(-5);
173 		assertEquals(0, skipped); // Should clamp to 0
174 		assertEquals('h', reader.read());
175 	}
176 
177 	@Test void d05_skip_afterEnd() {
178 		var reader = new CharSequenceReader("a");
179 		reader.read(); // Read the 'a'
180 		var skipped = reader.skip(10);
181 		assertEquals(0, skipped);
182 	}
183 
184 	//====================================================================================================
185 	// markSupported() tests
186 	//====================================================================================================
187 	@Test void e01_markSupported() {
188 		var reader = new CharSequenceReader("test");
189 		assertFalse(reader.markSupported());
190 	}
191 
192 	//====================================================================================================
193 	// close() tests
194 	//====================================================================================================
195 	@Test void f01_close() {
196 		var reader = new CharSequenceReader("test");
197 		reader.close(); // Should not throw
198 		// Should still be able to read after close
199 		assertEquals('t', reader.read());
200 	}
201 
202 	//====================================================================================================
203 	// toString() tests
204 	//====================================================================================================
205 	@Test void g01_toString() {
206 		var reader = new CharSequenceReader("test");
207 		assertEquals("test", reader.toString());
208 	}
209 
210 	@Test void g02_toString_afterReading() {
211 		var reader = new CharSequenceReader("test");
212 		reader.read(); // Read one character
213 		assertEquals("test", reader.toString()); // Should still return full string
214 	}
215 
216 	//====================================================================================================
217 	// Different CharSequence types
218 	//====================================================================================================
219 	@Test void h01_stringOptimization() {
220 		var reader = new CharSequenceReader("test");
221 		var buf = new char[4];
222 		reader.read(buf, 0, 4);
223 		assertEquals("test", new String(buf));
224 	}
225 
226 	@Test void h02_stringBuilderOptimization() {
227 		var cs = new StringBuilder("test");
228 		var reader = new CharSequenceReader(cs);
229 		var buf = new char[4];
230 		reader.read(buf, 0, 4);
231 		assertEquals("test", new String(buf));
232 	}
233 
234 	@Test void h03_stringBufferOptimization() {
235 		var cs = new StringBuffer("test");
236 		var reader = new CharSequenceReader(cs);
237 		var buf = new char[4];
238 		reader.read(buf, 0, 4);
239 		assertEquals("test", new String(buf));
240 	}
241 
242 	@Test void h04_genericCharSequence() {
243 		// Using a custom CharSequence implementation
244 		CharSequence cs = new CharSequence() {
245 			@Override
246 			public int length() { return 4; }
247 			@Override
248 			public char charAt(int index) {
249 				return "test".charAt(index);
250 			}
251 			@Override
252 			public CharSequence subSequence(int start, int end) {
253 				return "test".subSequence(start, end);
254 			}
255 		};
256 		var reader = new CharSequenceReader(cs);
257 		var buf = new char[4];
258 		reader.read(buf, 0, 4);
259 		assertEquals("test", new String(buf));
260 	}
261 }
262