1 /***
2 * Redistribution and use in source and binary forms, with or without
3 * modification, are permitted provided that the following conditions are
4 * met :
5 *
6 * . Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 *
9 * . Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * . The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
25 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 *
28 * $Id$
29 */
30
31 package palmed.edit.text;
32
33 import java.io.ByteArrayInputStream;
34 import java.io.ByteArrayOutputStream;
35 import java.io.IOException;
36 import org.easymock.MockControl;
37 import palmed.edit.util.Coordinate;
38 import palmed.util.EasyMockTestCase;
39
40 /***
41 * Text test case.
42 *
43 * @author Mathieu Champlon
44 * @version $Revision$ $Date$
45 */
46 public class TextTest extends EasyMockTestCase
47 {
48 /***
49 * Tested object.
50 */
51 private Text text;
52 /***
53 * Mock objects.
54 */
55 private ITextView mockView;
56 /***
57 * Stub objects.
58 */
59 private ByteArrayOutputStream outputStreamStub;
60
61 protected void setUp()
62 {
63 mockView = (ITextView)createMock( ITextView.class );
64 outputStreamStub = new ByteArrayOutputStream();
65 text = new Text();
66 text.register( mockView );
67 }
68
69 private void assertArrayEquals( byte[] array1, byte[] array2 )
70 {
71 final MockControl controlArrayComparator = MockControl.createControl( IArrayComparator.class );
72 final IArrayComparator mockArrayComparator = (IArrayComparator)controlArrayComparator.getMock();
73 mockArrayComparator.compare( array1 );
74 controlArrayComparator.setMatcher( MockControl.ARRAY_MATCHER );
75 controlArrayComparator.replay();
76 mockArrayComparator.compare( array2 );
77 controlArrayComparator.verify();
78 }
79
80 private ByteArrayInputStream createInputStreamStub( final String string )
81 {
82 return new ByteArrayInputStream( string.getBytes() );
83 }
84
85 public void testViewUpdateWhenRegistered()
86 {
87 mockView.update( 0, 1 );
88 mockView.modified( false );
89 replay();
90 text.register( mockView );
91 }
92
93 public void testSingleLineTextCreation() throws IOException
94 {
95 final String string = "string in a single line";
96 mockView.update( string.length(), 1 );
97 mockView.modified( false );
98 replay();
99 text.read( createInputStreamStub( string ) );
100 assertEquals( 1, text.getHeight() );
101 assertNull( text.getLine( -1 ) );
102 assertEquals( string, text.getLine( 0 ) );
103 assertNull( text.getLine( 1 ) );
104 }
105
106 public void testThreeLinesTextCreation() throws IOException
107 {
108 final String string1 = "string on";
109 final String string2 = "three";
110 final String string3 = "lines";
111 mockView.update( string1.length(), 3 );
112 mockView.modified( false );
113 replay();
114 text.read( createInputStreamStub( string1 + '\n' + string2 + '\n' + string3 ) );
115 assertEquals( 3, text.getHeight() );
116 assertNull( text.getLine( -1 ) );
117 assertEquals( string1, text.getLine( 0 ) );
118 assertEquals( string2, text.getLine( 1 ) );
119 assertEquals( string3, text.getLine( 2 ) );
120 }
121
122 public void testInsertCharacterInTheMiddleOfText() throws IOException
123 {
124 final String string = "this is my string";
125 text.read( createInputStreamStub( string ) );
126 reset();
127 mockView.update( string.length() + 1, 1 );
128 mockView.modified( true );
129 replay();
130 text.insert( new Coordinate( 7, 0 ), '*' );
131 assertEquals( "this is* my string", text.getLine( 0 ) );
132 }
133
134 public void testInsertCharacterAfterLineLengthThrowsException() throws IOException
135 {
136 final String string = "this is my string";
137 text.read( createInputStreamStub( string ) );
138 reset();
139 try
140 {
141 text.insert( new Coordinate( 30, 0 ), '*' );
142 }
143 catch( Exception e )
144 {
145 assertEquals( string, text.getLine( 0 ) );
146 return;
147 }
148 fail();
149 }
150
151 public void testInsertCharacterAtNegativeLineNumberThrowsException() throws IOException
152 {
153 final String string = "this is my string";
154 text.read( createInputStreamStub( string ) );
155 reset();
156 try
157 {
158 text.insert( new Coordinate( 0, -7 ), '*' );
159 }
160 catch( Exception e )
161 {
162 assertEquals( string, text.getLine( 0 ) );
163 return;
164 }
165 fail();
166 }
167
168 public void testInsertCharacterAfterTextThrowsException() throws IOException
169 {
170 final String string = "this is my string";
171 text.read( createInputStreamStub( string ) );
172 reset();
173 try
174 {
175 text.insert( new Coordinate( 0, 30 ), '*' );
176 }
177 catch( Exception e )
178 {
179 assertEquals( string, text.getLine( 0 ) );
180 return;
181 }
182 fail();
183 }
184
185 public void testInsertCharacterAtNegativeColumnNumberThrowsException() throws IOException
186 {
187 final String string = "this is my string";
188 text.read( createInputStreamStub( string ) );
189 reset();
190 try
191 {
192 text.insert( new Coordinate( 0, -7 ), '*' );
193 }
194 catch( Exception e )
195 {
196 assertEquals( string, text.getLine( 0 ) );
197 return;
198 }
199 fail();
200 }
201
202 public void testInsertNewLineInTheMiddleOfText() throws IOException
203 {
204 final String string1 = "this is";
205 final String string2 = " my string";
206 text.read( createInputStreamStub( string1 + string2 ) );
207 reset();
208 mockView.update( string2.length(), 2 );
209 mockView.modified( true );
210 replay();
211 text.insertNewLine( new Coordinate( string1.length(), 0 ) );
212 assertEquals( 2, text.getHeight() );
213 assertEquals( string1, text.getLine( 0 ) );
214 assertEquals( string2, text.getLine( 1 ) );
215 }
216
217 public void testRemoveBetweenSamePositionsIsNoOp() throws IOException
218 {
219 final String string = "this is my string";
220 text.read( createInputStreamStub( string ) );
221 reset();
222 text.remove( new Coordinate( 5, 0 ), new Coordinate( 5, 0 ) );
223 assertEquals( string, text.getLine( 0 ) );
224 }
225
226 public void testRemoveBetweenPositionsOnSameLine() throws IOException
227 {
228 final String string1 = "abc";
229 final String string2 = "de";
230 final String string3 = "fg";
231 text.read( createInputStreamStub( string1 + string2 + string3 ) );
232 reset();
233 mockView.update( (string1 + string3).length(), 1 );
234 mockView.modified( true );
235 replay();
236 text.remove( new Coordinate( string1.length(), 0 ), new Coordinate( (string1 + string2).length(), 0 ) );
237 assertEquals( string1 + string3, text.getLine( 0 ) );
238 }
239
240 public void testRemoveBetweenPositionsSeparatedBySeveralLines() throws IOException
241 {
242 final String string1 = "abcdef";
243 final String string2 = "ghijkl";
244 final String string3 = "mnopqr";
245 final String string4 = "stuvwx";
246 text.read( createInputStreamStub( string1 + '\n' + string2 + '\n' + string3 + '\n' + string4 ) );
247 reset();
248 final String result = "abwx";
249 mockView.update( result.length(), 1 );
250 mockView.modified( true );
251 replay();
252 text.remove( new Coordinate( 2, 0 ), new Coordinate( 4, 3 ) );
253 assertEquals( 1, text.getHeight() );
254 assertEquals( result, text.getLine( 0 ) );
255 assertNull( text.getLine( 1 ) );
256 }
257
258 public void testGetOneLineTextReturnsSameAsSet() throws IOException
259 {
260 final String string = "this is a test";
261 text.read( createInputStreamStub( string ) );
262 reset();
263 mockView.modified( false );
264 replay();
265 text.write( outputStreamStub );
266 assertArrayEquals( string.getBytes(), outputStreamStub.toByteArray() );
267 }
268
269 public void testGetTwoLinesTextReturnsSameAsSet() throws IOException
270 {
271 final String string = "this is \na test";
272 text.read( createInputStreamStub( string ) );
273 reset();
274 mockView.modified( false );
275 replay();
276 text.write( outputStreamStub );
277 assertArrayEquals( string.getBytes(), outputStreamStub.toByteArray() );
278 }
279
280 public void testGetTextReturnsSameAsSetWithCR() throws IOException
281 {
282 final String string = "\r\rthis \r\ris a test\r\r";
283 text.read( createInputStreamStub( string ) );
284 reset();
285 mockView.modified( false );
286 replay();
287 text.write( outputStreamStub );
288 assertArrayEquals( string.getBytes(), outputStreamStub.toByteArray() );
289 }
290
291 public void testGetTextReturnsSameAsSetWithLF() throws IOException
292 {
293 final String string = "\n\nthis \n\nis a test\n\n";
294 text.read( createInputStreamStub( string ) );
295 reset();
296 mockView.modified( false );
297 replay();
298 text.write( outputStreamStub );
299 assertArrayEquals( string.getBytes(), outputStreamStub.toByteArray() );
300 }
301
302 public void testGetTextReturnsSameAsSetWithCRLF() throws IOException
303 {
304 final String string = "\r\n\r\nthis \r\n\r\nis a test\r\n\r\n";
305 text.read( createInputStreamStub( string ) );
306 reset();
307 mockView.modified( false );
308 replay();
309 text.write( outputStreamStub );
310 assertArrayEquals( string.getBytes(), outputStreamStub.toByteArray() );
311 }
312
313 public void testReadNullStreamThrowsAnException() throws IOException
314 {
315 try
316 {
317 text.read( null );
318 }
319 catch( IllegalArgumentException e )
320 {
321 return;
322 }
323 fail( "should throw an IllegalArgumentException" );
324 }
325
326 public void testWritePartOnSingleLineOfText() throws IOException
327 {
328 text.read( createInputStreamStub( "this is my string" ) );
329 reset();
330 text.write( outputStreamStub, new Coordinate( 2, 0 ), new Coordinate( 12, 0 ) );
331 assertArrayEquals( "is is my s".getBytes(), outputStreamStub.toByteArray() );
332 }
333
334 public void testWritePartOnMultipleLinesOfText() throws IOException
335 {
336 text.read( createInputStreamStub( "\n\nthis \n\nis a test\n\n" ) );
337 reset();
338 text.write( outputStreamStub, new Coordinate( 1, 2 ), new Coordinate( 2, 4 ) );
339 assertArrayEquals( "his \n\nis".getBytes(), outputStreamStub.toByteArray() );
340 }
341
342 public void testReadPartOnSingleLineOfText() throws IOException
343 {
344 text.read( createInputStreamStub( "thtring" ) );
345 reset();
346 text.read( createInputStreamStub( "is is my s" ), new Coordinate( 2, 0 ) );
347 reset();
348 mockView.modified( false );
349 replay();
350 text.write( outputStreamStub );
351 assertArrayEquals( "this is my string".getBytes(), outputStreamStub.toByteArray() );
352 }
353
354 public void testReadPartOnMultipleLinesOfText() throws IOException
355 {
356 text.read( createInputStreamStub( "\n\nt a test\n\n" ) );
357 reset();
358 text.read( createInputStreamStub( "his \n\nis" ), new Coordinate( 1, 2 ) );
359 reset();
360 mockView.modified( false );
361 replay();
362 text.write( outputStreamStub );
363 assertArrayEquals( "\n\nthis \n\nis a test\n\n".getBytes(), outputStreamStub.toByteArray() );
364 }
365 }