samples/delegatingwriter/test/org/apidesign/delegatingwriter/BufferedWriterOnCDImageTest.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:53:03 +0200
changeset 61 59df94cee246
child 62 02ccc701dcbc
permissions -rw-r--r--
Demo for writer throwing an exception; and also writing out CD content
     1 
     2 package org.apidesign.delegatingwriter;
     3 
     4 import java.io.BufferedWriter;
     5 import java.io.IOException;
     6 import java.io.StringWriter;
     7 import org.junit.Before;
     8 import org.junit.Test;
     9 import static org.junit.Assert.*;
    10 
    11 /** Emulates what goes wrong when one wants to process really large character 
    12  * sequence.
    13  *
    14  * @author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
    15  */
    16 public class BufferedWriterOnCDImageTest {
    17     
    18     public BufferedWriterOnCDImageTest() {
    19     }
    20 
    21     @Test
    22     public void testBehaviourOfRealBufferInJDKObviouslyThisIsGoingToThrowOutOfMemoryException() throws IOException {
    23         // BEGIN: writer.countcd
    24         CountingWriter writer = new CountingWriter();
    25         CDSequence cdImage = new CDSequence();
    26         BufferedWriter bufferedWriter = new BufferedWriter(writer);
    27         bufferedWriter.append(cdImage);
    28         assertEquals("Correct number of writes delegated", cdImage.length(), writer.getCharacterCount());
    29         // END: writer.countcd
    30     }
    31 
    32     @Test
    33     public void testBehaviourOfBufferThatDelegatesToAppend() throws IOException {
    34         CountingWriter writer = new CountingWriter();
    35         CDSequence cdImage = new CDSequence();
    36         BufferedWriter bufferedWriter = new AltBufferedWriter(writer, AltBufferedWriter.Behaviour.DELEGATE_TO_OUT);
    37         bufferedWriter.append(cdImage);
    38         assertEquals("Correct number of writes delegated", cdImage.length(), writer.getCharacterCount());
    39     }
    40 
    41 // BEGIN: writer.bigseq
    42     /** A "lazy" sequence of characters, for example one that can represent
    43      * content of a CD, read it lazily, do not fit all into memory at once.
    44      */
    45     private static final class CDSequence implements CharSequence {
    46         private final int start;
    47         private final int end;
    48         
    49         public CDSequence() {
    50             this(0, 647 * 1024 * 1024);
    51         }
    52 
    53         private CDSequence(int start, int end) {
    54             this.start = start;
    55             this.end = end;
    56         }
    57         
    58         
    59         public int length() {
    60             return end - start;
    61         }
    62 // END: writer.bigseq
    63 
    64         public char charAt(int index) {
    65             int ch = index % ('Z' - 'A' + 1);
    66             return (char) ('A' + ch);
    67         }
    68 
    69         public CharSequence subSequence(int start, int end) {
    70             return new CDSequence(start, end);
    71         }
    72 
    73         @Override
    74         public String toString() {
    75             char[] arr = new char[length()];
    76             for (int i = 0; i < length(); i++) {
    77                 arr[i] = charAt(i);
    78             }
    79             return new String(arr);
    80         }
    81         
    82         
    83     } // end of CharSequence
    84 }