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);
27 "Correct number of writes delegated",
28 cdImage.length(), writer.getCharacterCount()
30 // END: writer.countcd
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
40 bufferedWriter.append(cdImage);
42 "Correct number of writes delegated",
44 writer.getCharacterCount()
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
55 bufferedWriter.append(cdImage);
57 "Correct number of writes delegated",
59 writer.getCharacterCount()
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.
68 private static final class CDSequence implements CharSequence {
69 private final int start;
70 private final int end;
73 this(0, 647 * 1024 * 1024);
76 private CDSequence(int start, int end) {
87 public char charAt(int index) {
88 int ch = index % ('Z' - 'A' + 1);
89 return (char) ('A' + ch);
92 public CharSequence subSequence(int start, int end) {
93 return new CDSequence(start, end);
97 public String toString() {
98 char[] arr = new char[length()];
99 for (int i = 0; i < length(); i++) {
102 return new String(arr);
106 } // end of CharSequence