samples/delegatingwriter/test/org/apidesign/delegatingwriter/BufferedWriterOnCDImageTest.java
2 package org.apidesign.delegatingwriter;
4 import java.io.BufferedWriter;
5 import java.io.IOException;
7 import static org.junit.Assert.*;
9 /** Emulates what goes wrong when one wants to process really large character
12 * @author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
14 public class BufferedWriterOnCDImageTest {
16 public BufferedWriterOnCDImageTest() {
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
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());
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());
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.
53 private static final class CDSequence implements CharSequence {
54 private final int start;
55 private final int end;
58 this(0, 647 * 1024 * 1024);
61 private CDSequence(int start, int end) {
72 public char charAt(int index) {
73 int ch = index % ('Z' - 'A' + 1);
74 return (char) ('A' + ch);
77 public CharSequence subSequence(int start, int end) {
78 return new CDSequence(start, end);
82 public String toString() {
83 char[] arr = new char[length()];
84 for (int i = 0; i < length(); i++) {
87 return new String(arr);
91 } // end of CharSequence