samples/delegatingwriter/test/org/apidesign/delegatingwriter/BufferedWriterOnCDImageTest.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:53:04 +0200
changeset 63 cbba5b31d11c
parent 62 02ccc701dcbc
child 64 7b26c64804c2
permissions -rw-r--r--
CrytoWriter and when it is broken
     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 // BEGIN: writer.bigseq
    40     /** A "lazy" sequence of characters, for example one that can represent
    41      * content of a CD, read it lazily, do not fit all into memory at once.
    42      */
    43     private static final class CDSequence implements CharSequence {
    44         private final int start;
    45         private final int end;
    46         
    47         public CDSequence() {
    48             this(0, 647 * 1024 * 1024);
    49         }
    50 
    51         private CDSequence(int start, int end) {
    52             this.start = start;
    53             this.end = end;
    54         }
    55         
    56         
    57         public int length() {
    58             return end - start;
    59         }
    60 // END: writer.bigseq
    61 
    62         public char charAt(int index) {
    63             int ch = index % ('Z' - 'A' + 1);
    64             return (char) ('A' + ch);
    65         }
    66 
    67         public CharSequence subSequence(int start, int end) {
    68             return new CDSequence(start, end);
    69         }
    70 
    71         @Override
    72         public String toString() {
    73             char[] arr = new char[length()];
    74             for (int i = 0; i < length(); i++) {
    75                 arr[i] = charAt(i);
    76             }
    77             return new String(arr);
    78         }
    79         
    80         
    81     } // end of CharSequence
    82 }