samples/delegatingwriter/test/org/apidesign/delegatingwriter/BufferedWriterOnCDImageTest.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 30 Oct 2014 21:30:10 +0100
changeset 409 40cabcdcd2be
parent 181 81d72f69fa42
permissions -rw-r--r--
Updating to NBMs from NetBeans 8.0.1 as some of them are required to run on JDK8
     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         if (Boolean.getBoolean("no.failures")) return;
    22         // BEGIN: writer.countcd
    23         CountingWriter writer = new CountingWriter();
    24         CDSequence cdImage = new CDSequence();
    25         BufferedWriter bufferedWriter = new BufferedWriter(writer);
    26         bufferedWriter.append(cdImage);
    27         assertEquals(
    28             "Correct number of writes delegated", 
    29             cdImage.length(), writer.getCharacterCount()
    30         );
    31         // END: writer.countcd
    32     }
    33 
    34     @Test
    35     public void testBehaviourOfBufferThatDelegatesToAppend() throws IOException {
    36         CountingWriter writer = new CountingWriter();
    37         CDSequence cdImage = new CDSequence();
    38         BufferedWriter bufferedWriter = new AltBufferedWriter(
    39             writer, AltBufferedWriter.Behaviour.DELEGATE_TO_OUT
    40         );
    41         bufferedWriter.append(cdImage);
    42         assertEquals(
    43             "Correct number of writes delegated", 
    44             cdImage.length(), 
    45             writer.getCharacterCount()
    46         );
    47     }
    48     
    49     @Test
    50     public void testBehaviourWhenDelegatingConditionallyIsOK() throws IOException {
    51         CountingWriter writer = new CountingWriter();
    52         CDSequence cdImage = new CDSequence();
    53         BufferedWriter bufferedWriter = new AltBufferedWriter(
    54             writer, AltBufferedWriter.Behaviour.DELEGATE_CONDITIONALLY
    55         );
    56         bufferedWriter.append(cdImage);
    57         assertEquals(
    58             "Correct number of writes delegated", 
    59             cdImage.length(), 
    60             writer.getCharacterCount()
    61         );
    62     }
    63     
    64 
    65 // BEGIN: writer.bigseq
    66     /** A "lazy" sequence of characters, for example one that can represent
    67      * content of a CD, read it lazily, do not fit all into memory at once.
    68      */
    69     private static final class CDSequence implements CharSequence {
    70         private final int start;
    71         private final int end;
    72         
    73         public CDSequence() {
    74             this(0, 647 * 1024 * 1024);
    75         }
    76 
    77         private CDSequence(int start, int end) {
    78             this.start = start;
    79             this.end = end;
    80         }
    81         
    82         
    83         public int length() {
    84             return end - start;
    85         }
    86 // FINISH: writer.bigseq
    87 
    88         public char charAt(int index) {
    89             int ch = index % ('Z' - 'A' + 1);
    90             return (char) ('A' + ch);
    91         }
    92 
    93         public CharSequence subSequence(int start, int end) {
    94             return new CDSequence(start, end);
    95         }
    96 
    97         @Override
    98         public String toString() {
    99             char[] arr = new char[length()];
   100             for (int i = 0; i < length(); i++) {
   101                 arr[i] = charAt(i);
   102             }
   103             return new String(arr);
   104         }
   105         
   106         
   107     } // end of CharSequence
   108 }