samples/delegatingwriter/test/org/apidesign/delegatingwriter/BufferedWriterOnCDImageTest.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:58:05 +0200
changeset 152 eb6f29070331
parent 132 3bc4c54f4bcc
child 153 b5cbb797ec0a
permissions -rw-r--r--
Checking that all examples pair the opening and closing brackets
     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(
    27             "Correct number of writes delegated", 
    28             cdImage.length(), writer.getCharacterCount()
    29         );
    30         // END: writer.countcd
    31     }
    32 
    33     @Test
    34     public void testBehaviourOfBufferThatDelegatesToAppend() throws IOException {
    35         CountingWriter writer = new CountingWriter();
    36         CDSequence cdImage = new CDSequence();
    37         BufferedWriter bufferedWriter = new AltBufferedWriter(
    38             writer, AltBufferedWriter.Behaviour.DELEGATE_TO_OUT
    39         );
    40         bufferedWriter.append(cdImage);
    41         assertEquals(
    42             "Correct number of writes delegated", 
    43             cdImage.length(), 
    44             writer.getCharacterCount()
    45         );
    46     }
    47     
    48     @Test
    49     public void testBehaviourWhenDelegatingConditionallyIsOK() throws IOException {
    50         CountingWriter writer = new CountingWriter();
    51         CDSequence cdImage = new CDSequence();
    52         BufferedWriter bufferedWriter = new AltBufferedWriter(
    53             writer, AltBufferedWriter.Behaviour.DELEGATE_CONDITIONALLY
    54         );
    55         bufferedWriter.append(cdImage);
    56         assertEquals(
    57             "Correct number of writes delegated", 
    58             cdImage.length(), 
    59             writer.getCharacterCount()
    60         );
    61     }
    62     
    63 
    64 // BEGIN: writer.bigseq
    65     /** A "lazy" sequence of characters, for example one that can represent
    66      * content of a CD, read it lazily, do not fit all into memory at once.
    67      */
    68     private static final class CDSequence implements CharSequence {
    69         private final int start;
    70         private final int end;
    71         
    72         public CDSequence() {
    73             this(0, 647 * 1024 * 1024);
    74         }
    75 
    76         private CDSequence(int start, int end) {
    77             this.start = start;
    78             this.end = end;
    79         }
    80         
    81         
    82         public int length() {
    83             return end - start;
    84         }
    85 // FINISH: writer.bigseq
    86 
    87         public char charAt(int index) {
    88             int ch = index % ('Z' - 'A' + 1);
    89             return (char) ('A' + ch);
    90         }
    91 
    92         public CharSequence subSequence(int start, int end) {
    93             return new CDSequence(start, end);
    94         }
    95 
    96         @Override
    97         public String toString() {
    98             char[] arr = new char[length()];
    99             for (int i = 0; i < length(); i++) {
   100                 arr[i] = charAt(i);
   101             }
   102             return new String(arr);
   103         }
   104         
   105         
   106     } // end of CharSequence
   107 }