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 java.io.InputStream;
37 import java.io.OutputStream;
38 import java.util.Enumeration;
39 import java.util.Vector;
40 import org.easymock.MockControl;
41 import palmed.edit.util.Coordinate;
42 import palmed.util.EasyMockTestCase;
43
44 /***
45 * LargeText test case.
46 *
47 * @author Mathieu Champlon
48 * @version $Revision$ $Date$
49 */
50 public class LargeTextTest extends EasyMockTestCase
51 {
52 private static final int THRESHOLD = 20;
53 /***
54 * Tested object.
55 */
56 private LargeText text;
57 /***
58 * Mock objects.
59 */
60 private ITextView mockView;
61 /***
62 * Stub objects.
63 */
64 private ByteArrayOutputStream outputStreamStub;
65
66 private class NullCache implements ICache
67 {
68 private Vector elements_ = new Vector();
69
70 public void wake( ICachable cachable )
71 {
72 }
73
74 public void sleep( ICachable cachable )
75 {
76 }
77
78 public void clear()
79 {
80 elements_.removeAllElements();
81 }
82
83 public Enumeration elements()
84 {
85 return elements_.elements();
86 }
87
88 public void add( ICachable chunk )
89 {
90 elements_.addElement( chunk );
91 }
92
93 public void unmarshall( InputStream stream )
94 {
95 }
96
97 public void marshall( OutputStream stream )
98 {
99 }
100
101 public void delete()
102 {
103 clear();
104 }
105 }
106
107 protected final void setUp()
108 {
109 mockView = (ITextView)createMock( ITextView.class );
110 text = new LargeText( new NullCache(), THRESHOLD );
111 outputStreamStub = new ByteArrayOutputStream();
112 text.register( mockView );
113 }
114
115 private void assertArrayEquals( byte[] array1, byte[] array2 )
116 {
117 final MockControl controlArrayComparator = MockControl.createControl( IArrayComparator.class );
118 final IArrayComparator mockArrayComparator = (IArrayComparator)controlArrayComparator.getMock();
119 mockArrayComparator.compare( array1 );
120 controlArrayComparator.setMatcher( MockControl.ARRAY_MATCHER );
121 controlArrayComparator.replay();
122 mockArrayComparator.compare( array2 );
123 controlArrayComparator.verify();
124 }
125
126 private ByteArrayInputStream createInputStreamStub( final String string )
127 {
128 return new ByteArrayInputStream( string.getBytes() );
129 }
130
131 public void testNewTextIsEmpty()
132 {
133 assertEquals( 1, text.getHeight() );
134 assertEquals( "", text.getLine( 0 ) );
135 assertNull( text.getLine( 1 ) );
136 }
137
138 public void testInsertCharacterInNewText()
139 {
140 mockView.update( 1, 1 );
141 mockView.modified( true );
142 replay();
143 text.insert( new Coordinate( 0, 0 ), '*' );
144 assertEquals( "*", text.getLine( 0 ) );
145 }
146
147 public void testReadAndWriteOneLineTextSmallerThanThreshold() throws IOException
148 {
149 final String string = "this is my string";
150 assertTrue( THRESHOLD > string.length() );
151 mockView.update( string.length(), 1 );
152 mockView.modified( false );
153 replay();
154 text.read( createInputStreamStub( string ) );
155 verify();
156 reset();
157 mockView.modified( false );
158 replay();
159 text.write( outputStreamStub );
160 assertArrayEquals( string.getBytes(), outputStreamStub.toByteArray() );
161 assertEquals( 1, text.getHeight() );
162 assertNull( text.getLine( -1 ) );
163 assertEquals( string, text.getLine( 0 ) );
164 assertNull( text.getLine( 1 ) );
165 }
166
167 public void testReadAndWriteOneLongLineTextLargerThanThreshold() throws IOException
168 {
169 final String string = "this is my very long string larger than three times the threshold";
170 assertTrue( 3 * THRESHOLD < string.length() );
171 mockView.update( string.length(), 1 );
172 mockView.modified( false );
173 replay();
174 text.read( createInputStreamStub( string ) );
175 verify();
176 reset();
177 mockView.modified( false );
178 replay();
179 text.write( outputStreamStub );
180 assertArrayEquals( string.getBytes(), outputStreamStub.toByteArray() );
181 assertEquals( 1, text.getHeight() );
182 assertNull( text.getLine( -1 ) );
183 assertEquals( string, text.getLine( 0 ) );
184 assertNull( text.getLine( 1 ) );
185 }
186
187 public void testReadAndWriteTextLargerThanThreshold() throws IOException
188 {
189 final String string = "\nthis\n is\n\n my\n string larger than threshold\n";
190 assertTrue( THRESHOLD < string.length() );
191 mockView.update( 29, 7 );
192 mockView.modified( false );
193 replay();
194 text.read( createInputStreamStub( string ) );
195 verify();
196 reset();
197 mockView.modified( false );
198 replay();
199 text.write( outputStreamStub );
200 assertArrayEquals( string.getBytes(), outputStreamStub.toByteArray() );
201 assertEquals( 7, text.getHeight() );
202 assertNull( text.getLine( -1 ) );
203 assertEquals( "", text.getLine( 0 ) );
204 assertEquals( "this", text.getLine( 1 ) );
205 assertEquals( " is", text.getLine( 2 ) );
206 assertEquals( "", text.getLine( 3 ) );
207 assertEquals( " my", text.getLine( 4 ) );
208 assertEquals( " string larger than threshold", text.getLine( 5 ) );
209 assertEquals( "", text.getLine( 6 ) );
210 assertNull( text.getLine( 7 ) );
211 }
212
213 public void testInsertCharacterInTextSmallerThanThreshold() throws IOException
214 {
215 final String string = "this is my string";
216 assertTrue( THRESHOLD > string.length() );
217 text.read( createInputStreamStub( string ) );
218 mockView.modified( false );
219 reset();
220 mockView.update( string.length() + 1, 1 );
221 mockView.modified( true );
222 replay();
223 text.insert( new Coordinate( 7, 0 ), '*' );
224 assertEquals( "this is* my string", text.getLine( 0 ) );
225 }
226
227 public void testInsertCharacterAfterLineLengthThrowsException() throws IOException
228 {
229 final String string = "\nthis\n is\n\n my\n string larger than threshold\n";
230 assertTrue( THRESHOLD < string.length() );
231 text.read( createInputStreamStub( string ) );
232 reset();
233 try
234 {
235 text.insert( new Coordinate( 1, 0 ), '*' );
236 }
237 catch( Exception e )
238 {
239 return;
240 }
241 fail();
242 }
243
244 public void testInsertCharacterAtNegativeLineNumberThrowsException() throws IOException
245 {
246 final String string = "\nthis\n is\n\n my\n string larger than threshold\n";
247 assertTrue( THRESHOLD < string.length() );
248 text.read( createInputStreamStub( string ) );
249 reset();
250 try
251 {
252 text.insert( new Coordinate( 0, -1 ), '*' );
253 }
254 catch( Exception e )
255 {
256 return;
257 }
258 fail();
259 }
260
261 public void testInsertCharacterAfterTextThrowsException() throws IOException
262 {
263 final String string = "\nthis\n is\n\n my\n string larger than threshold\n";
264 assertTrue( THRESHOLD < string.length() );
265 text.read( createInputStreamStub( string ) );
266 reset();
267 try
268 {
269 text.insert( new Coordinate( 0, 7 ), '*' );
270 }
271 catch( Exception e )
272 {
273 return;
274 }
275 fail();
276 }
277
278 public void testInsertCharacterAtNegativeColumnNumberThrowsException() throws IOException
279 {
280 final String string = "\nthis\n is\n\n my\n string larger than threshold\n";
281 assertTrue( THRESHOLD < string.length() );
282 text.read( createInputStreamStub( string ) );
283 reset();
284 try
285 {
286 text.insert( new Coordinate( 0, -1 ), '*' );
287 }
288 catch( Exception e )
289 {
290 return;
291 }
292 fail();
293 }
294
295 public void testInsertCharacterInOneLineTextLargerThanThreshold() throws IOException
296 {
297 final String string = "this is my very long string larger than three times the threshold";
298 assertTrue( 3 * THRESHOLD < string.length() );
299 text.read( createInputStreamStub( string ) );
300 reset();
301 mockView.update( string.length() + 1, 1 );
302 mockView.modified( true );
303 replay();
304 text.insert( new Coordinate( THRESHOLD + 1, 0 ), '*' );
305 assertEquals( "this is my very long *string larger than three times the threshold", text.getLine( 0 ) );
306 verify();
307 reset();
308 mockView.update( string.length() + 2, 1 );
309 mockView.modified( true );
310 replay();
311 text.insert( new Coordinate( THRESHOLD, 0 ), '*' );
312 assertEquals( "this is my very long* *string larger than three times the threshold", text.getLine( 0 ) );
313 verify();
314 reset();
315 mockView.update( string.length() + 3, 1 );
316 mockView.modified( true );
317 replay();
318 text.insert( new Coordinate( THRESHOLD - 1, 0 ), '*' );
319 assertEquals( "this is my very lon*g* *string larger than three times the threshold", text.getLine( 0 ) );
320 }
321
322 public void testInsertCharacterInTextLargerThanThreshold() throws IOException
323 {
324 final String string = "\nthis\n is\n\n my\n string larger than threshold\n";
325 assertTrue( THRESHOLD < string.length() );
326 text.read( createInputStreamStub( string ) );
327 reset();
328 mockView.update( 30, 7 );
329 mockView.modified( true );
330 replay();
331 text.insert( new Coordinate( 29, 5 ), '*' );
332 assertEquals( " string larger than threshold*", text.getLine( 5 ) );
333 }
334
335 public void testRemoveFromTextSmallerThanThreshold() throws IOException
336 {
337 final String string = "this is my string";
338 assertTrue( THRESHOLD > string.length() );
339 text.read( createInputStreamStub( string ) );
340 reset();
341 mockView.update( string.length() - 3, 1 );
342 mockView.modified( true );
343 replay();
344 text.remove( new Coordinate( 7, 0 ), new Coordinate( 10, 0 ) );
345 assertEquals( "this is string", text.getLine( 0 ) );
346 }
347
348 public void testRemoveFromOneLongLineTextLargerThanThreshold() throws IOException
349 {
350 final String string = "this is my very long string larger than three times the threshold";
351 assertTrue( 3 * THRESHOLD < string.length() );
352 text.read( createInputStreamStub( string ) );
353 reset();
354 mockView.update( string.length() - 1, 1 );
355 mockView.modified( true );
356 replay();
357 text.remove( new Coordinate( THRESHOLD - 2, 0 ), new Coordinate( THRESHOLD - 1, 0 ) );
358 assertEquals( "this is my very log string larger than three times the threshold", text.getLine( 0 ) );
359 verify();
360 reset();
361 mockView.update( string.length() - 2, 1 );
362 mockView.modified( true );
363 replay();
364 text.remove( new Coordinate( THRESHOLD + 3, 0 ), new Coordinate( THRESHOLD + 4, 0 ) );
365 assertEquals( "this is my very log strng larger than three times the threshold", text.getLine( 0 ) );
366 verify();
367 reset();
368 mockView.update( string.length() - 8, 1 );
369 mockView.modified( true );
370 replay();
371 text.remove( new Coordinate( THRESHOLD - 3, 0 ), new Coordinate( THRESHOLD + 3, 0 ) );
372 assertEquals( "this is my very lng larger than three times the threshold", text.getLine( 0 ) );
373 }
374
375 public void testRemoveFromMultipleLinesTextLargerThanThreshold() throws IOException
376 {
377 final String string = "\nthis\n is\n\n my\n string larger than threshold\n";
378 assertTrue( THRESHOLD < string.length() );
379 text.read( createInputStreamStub( string ) );
380 reset();
381 mockView.update( 16, 3 );
382 mockView.modified( true );
383 replay();
384 text.remove( new Coordinate( 2, 1 ), new Coordinate( 15, 5 ) );
385 assertEquals( "", text.getLine( 0 ) );
386 assertEquals( "ththan threshold", text.getLine( 1 ) );
387 assertEquals( "", text.getLine( 2 ) );
388 assertNull( text.getLine( 3 ) );
389 }
390 }