/* * 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 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 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 goldList = createTestGolden(golden); assertEquals(goldList, mWriter.getStrings()); } private static List createTestGolden(String... args) { List ret = new ArrayList(); for (String s : args) { ret.add(s); } return ret; } // A writer recording calls to write. private final static class RecordingWriter extends Writer { private List strings = new ArrayList(); public RecordingWriter() { } public List 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. } } }