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