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