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 testBehaviourOfRealBufferInJDKObviouslyThisIsGoingToThrowOutOfMemoryException() 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());
39 // BEGIN: writer.bigseq
40 /** A "lazy" sequence of characters, for example one that can represent
41 * content of a CD, read it lazily, do not fit all into memory at once.
43 private static final class CDSequence implements CharSequence {
44 private final int start;
45 private final int end;
48 this(0, 647 * 1024 * 1024);
51 private CDSequence(int start, int end) {
62 public char charAt(int index) {
63 int ch = index % ('Z' - 'A' + 1);
64 return (char) ('A' + ch);
67 public CharSequence subSequence(int start, int end) {
68 return new CDSequence(start, end);
72 public String toString() {
73 char[] arr = new char[length()];
74 for (int i = 0; i < length(); i++) {
77 return new String(arr);
81 } // end of CharSequence