blob: 4845c4ef28f82a69dd2b87480fef7e5618a3ca1f [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.util;
import junit.framework.TestCase;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* Tests for {@link IndentingPrintWriter}.
*/
public class LineBreakBufferedWriterTest extends TestCase {
private ByteArrayOutputStream mStream;
private RecordingWriter mWriter;
@Override
protected void setUp() throws Exception {
super.setUp();
mWriter = new RecordingWriter();
}
public void testLessThanBufferSize() {
final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 1000);
lw.println("Hello");
lw.println("World");
lw.println("Test");
lw.flush();
assertOutput("Hello\nWorld\nTest\n");
}
public void testMoreThanBufferSizeNoLineBreaks() {
final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 20);
String literal = "aaaaaaaaaaaaaaa";
lw.print(literal);
lw.print(literal);
lw.flush();
// Have to manually inspect output.
List<String> result = mWriter.getStrings();
// Expect two strings.
assertEquals(2, result.size());
// Expect the strings to sum up to the original input.
assertEquals(2 * literal.length(), result.get(0).length() + result.get(1).length());
// Strings should only be a.
for (String s : result) {
for (int i = 0; i < s.length(); i++) {
assertEquals('a', s.charAt(i));
}
}
}
public void testMoreThanBufferSizeNoLineBreaksSingleString() {
final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 20);
String literal = "aaaaaaaaaaaaaaa";
lw.print(literal + literal);
lw.flush();
// Have to manually inspect output.
List<String> result = mWriter.getStrings();
// Expect two strings.
assertEquals(2, result.size());
// Expect the strings to sum up to the original input.
assertEquals(2 * literal.length(), result.get(0).length() + result.get(1).length());
// Strings should only be a.
for (String s : result) {
for (int i = 0; i < s.length(); i++) {
assertEquals('a', s.charAt(i));
}
}
}
public void testMoreThanBufferSizeLineBreakBefore() {
final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 20);
String literal1 = "aaaaaaaaaa\nbbbb";
String literal2 = "cccccccccc";
lw.print(literal1);
lw.print(literal2);
lw.flush();
assertOutput("aaaaaaaaaa", "bbbbcccccccccc");
}
public void testMoreThanBufferSizeLineBreakBeforeSingleString() {
final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 20);
String literal1 = "aaaaaaaaaa\nbbbb";
String literal2 = "cccccccccc";
lw.print(literal1 + literal2);
lw.flush();
assertOutput("aaaaaaaaaa", "bbbbcccccccccc");
}
public void testMoreThanBufferSizeLineBreakNew() {
final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 20);
String literal1 = "aaaaaaaaaabbbbb";
String literal2 = "c\nd\nddddddddd";
lw.print(literal1);
lw.print(literal2);
lw.flush();
assertOutput("aaaaaaaaaabbbbbc\nd", "ddddddddd");
}
public void testMoreThanBufferSizeLineBreakBeforeAndNew() {
final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 20);
String literal1 = "aaaaaaaaaa\nbbbbb";
String literal2 = "c\nd\nddddddddd";
lw.print(literal1);
lw.print(literal2);
lw.flush();
assertOutput("aaaaaaaaaa\nbbbbbc\nd", "ddddddddd");
}
public void testMoreThanBufferSizeInt() {
final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 15);
int literal1 = 1234567890;
int literal2 = 987654321;
lw.print(literal1);
lw.print(literal2);
lw.flush();
assertOutput("123456789098765", "4321");
}
public void testMoreThanBufferSizeChar() {
final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 15);
for(int i = 0; i < 10; i++) {
lw.print('$');
}
for(int i = 0; i < 10; i++) {
lw.print('%');
}
lw.flush();
assertOutput("$$$$$$$$$$%%%%%", "%%%%%");
}
public void testMoreThanBufferSizeLineBreakNewChars() {
final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 20);
String literal1 = "aaaaaaaaaabbbbb";
String literal2 = "c\nd\nddddddddd";
lw.print(literal1.toCharArray());
lw.print(literal2.toCharArray());
lw.flush();
assertOutput("aaaaaaaaaabbbbbc\nd", "ddddddddd");
}
public void testMoreThenInitialCapacitySimpleWrites() {
// This check is different from testMoreThanBufferSizeChar. The initial capacity is lower
// than the maximum buffer size here.
final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 1024, 3);
for(int i = 0; i < 10; i++) {
lw.print('$');
}
for(int i = 0; i < 10; i++) {
lw.print('%');
}
lw.flush();
assertOutput("$$$$$$$$$$%%%%%%%%%%");
}
private void assertOutput(String... golden) {
List<String> goldList = createTestGolden(golden);
assertEquals(goldList, mWriter.getStrings());
}
private static List<String> createTestGolden(String... args) {
List<String> ret = new ArrayList<String>();
for (String s : args) {
ret.add(s);
}
return ret;
}
// A writer recording calls to write.
private final static class RecordingWriter extends Writer {
private List<String> strings = new ArrayList<String>();
public RecordingWriter() {
}
public List<String> getStrings() {
return strings;
}
@Override
public void write(char[] cbuf, int off, int len) {
strings.add(new String(cbuf, off, len));
}
@Override
public void flush() {
// Ignore.
}
@Override
public void close() {
// Ignore.
}
}
}