samples/delegatingwriter/test/org/apidesign/delegatingwriter/BufferedWriterOnCDImageTest.java
changeset 61 59df94cee246
child 62 02ccc701dcbc
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/samples/delegatingwriter/test/org/apidesign/delegatingwriter/BufferedWriterOnCDImageTest.java	Sat Jun 14 09:53:03 2008 +0200
     1.3 @@ -0,0 +1,84 @@
     1.4 +
     1.5 +package org.apidesign.delegatingwriter;
     1.6 +
     1.7 +import java.io.BufferedWriter;
     1.8 +import java.io.IOException;
     1.9 +import java.io.StringWriter;
    1.10 +import org.junit.Before;
    1.11 +import org.junit.Test;
    1.12 +import static org.junit.Assert.*;
    1.13 +
    1.14 +/** Emulates what goes wrong when one wants to process really large character 
    1.15 + * sequence.
    1.16 + *
    1.17 + * @author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
    1.18 + */
    1.19 +public class BufferedWriterOnCDImageTest {
    1.20 +    
    1.21 +    public BufferedWriterOnCDImageTest() {
    1.22 +    }
    1.23 +
    1.24 +    @Test
    1.25 +    public void testBehaviourOfRealBufferInJDKObviouslyThisIsGoingToThrowOutOfMemoryException() throws IOException {
    1.26 +        // BEGIN: writer.countcd
    1.27 +        CountingWriter writer = new CountingWriter();
    1.28 +        CDSequence cdImage = new CDSequence();
    1.29 +        BufferedWriter bufferedWriter = new BufferedWriter(writer);
    1.30 +        bufferedWriter.append(cdImage);
    1.31 +        assertEquals("Correct number of writes delegated", cdImage.length(), writer.getCharacterCount());
    1.32 +        // END: writer.countcd
    1.33 +    }
    1.34 +
    1.35 +    @Test
    1.36 +    public void testBehaviourOfBufferThatDelegatesToAppend() throws IOException {
    1.37 +        CountingWriter writer = new CountingWriter();
    1.38 +        CDSequence cdImage = new CDSequence();
    1.39 +        BufferedWriter bufferedWriter = new AltBufferedWriter(writer, AltBufferedWriter.Behaviour.DELEGATE_TO_OUT);
    1.40 +        bufferedWriter.append(cdImage);
    1.41 +        assertEquals("Correct number of writes delegated", cdImage.length(), writer.getCharacterCount());
    1.42 +    }
    1.43 +
    1.44 +// BEGIN: writer.bigseq
    1.45 +    /** A "lazy" sequence of characters, for example one that can represent
    1.46 +     * content of a CD, read it lazily, do not fit all into memory at once.
    1.47 +     */
    1.48 +    private static final class CDSequence implements CharSequence {
    1.49 +        private final int start;
    1.50 +        private final int end;
    1.51 +        
    1.52 +        public CDSequence() {
    1.53 +            this(0, 647 * 1024 * 1024);
    1.54 +        }
    1.55 +
    1.56 +        private CDSequence(int start, int end) {
    1.57 +            this.start = start;
    1.58 +            this.end = end;
    1.59 +        }
    1.60 +        
    1.61 +        
    1.62 +        public int length() {
    1.63 +            return end - start;
    1.64 +        }
    1.65 +// END: writer.bigseq
    1.66 +
    1.67 +        public char charAt(int index) {
    1.68 +            int ch = index % ('Z' - 'A' + 1);
    1.69 +            return (char) ('A' + ch);
    1.70 +        }
    1.71 +
    1.72 +        public CharSequence subSequence(int start, int end) {
    1.73 +            return new CDSequence(start, end);
    1.74 +        }
    1.75 +
    1.76 +        @Override
    1.77 +        public String toString() {
    1.78 +            char[] arr = new char[length()];
    1.79 +            for (int i = 0; i < length(); i++) {
    1.80 +                arr[i] = charAt(i);
    1.81 +            }
    1.82 +            return new String(arr);
    1.83 +        }
    1.84 +        
    1.85 +        
    1.86 +    } // end of CharSequence
    1.87 +}
    1.88 \ No newline at end of file