Home | History | Annotate | Download | only in util
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.internal.util;
     18 
     19 import junit.framework.TestCase;
     20 
     21 import java.io.ByteArrayOutputStream;
     22 import java.io.IOException;
     23 import java.io.PrintWriter;
     24 import java.io.Writer;
     25 import java.util.ArrayList;
     26 import java.util.LinkedList;
     27 import java.util.List;
     28 
     29 /**
     30  * Tests for {@link IndentingPrintWriter}.
     31  */
     32 public class LineBreakBufferedWriterTest extends TestCase {
     33 
     34     private ByteArrayOutputStream mStream;
     35     private RecordingWriter mWriter;
     36 
     37     @Override
     38     protected void setUp() throws Exception {
     39         super.setUp();
     40 
     41         mWriter = new RecordingWriter();
     42     }
     43 
     44     public void testLessThanBufferSize() {
     45         final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 1000);
     46 
     47         lw.println("Hello");
     48         lw.println("World");
     49         lw.println("Test");
     50         lw.flush();
     51 
     52         assertOutput("Hello\nWorld\nTest\n");
     53     }
     54 
     55     public void testMoreThanBufferSizeNoLineBreaks() {
     56         final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 20);
     57 
     58         String literal = "aaaaaaaaaaaaaaa";
     59         lw.print(literal);
     60         lw.print(literal);
     61         lw.flush();
     62 
     63         // Have to manually inspect output.
     64         List<String> result = mWriter.getStrings();
     65         // Expect two strings.
     66         assertEquals(2, result.size());
     67         // Expect the strings to sum up to the original input.
     68         assertEquals(2 * literal.length(), result.get(0).length() + result.get(1).length());
     69         // Strings should only be a.
     70         for (String s : result) {
     71             for (int i = 0; i < s.length(); i++) {
     72                 assertEquals('a', s.charAt(i));
     73             }
     74         }
     75     }
     76 
     77     public void testMoreThanBufferSizeNoLineBreaksSingleString() {
     78         final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 20);
     79 
     80         String literal = "aaaaaaaaaaaaaaa";
     81         lw.print(literal + literal);
     82         lw.flush();
     83 
     84         // Have to manually inspect output.
     85         List<String> result = mWriter.getStrings();
     86         // Expect two strings.
     87         assertEquals(2, result.size());
     88         // Expect the strings to sum up to the original input.
     89         assertEquals(2 * literal.length(), result.get(0).length() + result.get(1).length());
     90         // Strings should only be a.
     91         for (String s : result) {
     92             for (int i = 0; i < s.length(); i++) {
     93                 assertEquals('a', s.charAt(i));
     94             }
     95         }
     96     }
     97 
     98     public void testMoreThanBufferSizeLineBreakBefore() {
     99         final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 20);
    100 
    101         String literal1 = "aaaaaaaaaa\nbbbb";
    102         String literal2 = "cccccccccc";
    103         lw.print(literal1);
    104         lw.print(literal2);
    105         lw.flush();
    106 
    107         assertOutput("aaaaaaaaaa", "bbbbcccccccccc");
    108     }
    109 
    110     public void testMoreThanBufferSizeLineBreakBeforeSingleString() {
    111         final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 20);
    112 
    113         String literal1 = "aaaaaaaaaa\nbbbb";
    114         String literal2 = "cccccccccc";
    115         lw.print(literal1 + literal2);
    116         lw.flush();
    117 
    118         assertOutput("aaaaaaaaaa", "bbbbcccccccccc");
    119     }
    120 
    121     public void testMoreThanBufferSizeLineBreakNew() {
    122         final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 20);
    123 
    124         String literal1 = "aaaaaaaaaabbbbb";
    125         String literal2 = "c\nd\nddddddddd";
    126         lw.print(literal1);
    127         lw.print(literal2);
    128         lw.flush();
    129 
    130         assertOutput("aaaaaaaaaabbbbbc\nd", "ddddddddd");
    131     }
    132 
    133     public void testMoreThanBufferSizeLineBreakBeforeAndNew() {
    134         final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 20);
    135 
    136         String literal1 = "aaaaaaaaaa\nbbbbb";
    137         String literal2 = "c\nd\nddddddddd";
    138         lw.print(literal1);
    139         lw.print(literal2);
    140         lw.flush();
    141 
    142         assertOutput("aaaaaaaaaa\nbbbbbc\nd", "ddddddddd");
    143     }
    144 
    145     public void testMoreThanBufferSizeInt() {
    146         final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 15);
    147 
    148         int literal1 = 1234567890;
    149         int literal2 = 987654321;
    150         lw.print(literal1);
    151         lw.print(literal2);
    152         lw.flush();
    153 
    154         assertOutput("123456789098765", "4321");
    155     }
    156 
    157     public void testMoreThanBufferSizeChar() {
    158         final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 15);
    159 
    160         for(int i = 0; i < 10; i++) {
    161             lw.print('$');
    162         }
    163         for(int i = 0; i < 10; i++) {
    164             lw.print('%');
    165         }
    166         lw.flush();
    167 
    168         assertOutput("$$$$$$$$$$%%%%%", "%%%%%");
    169     }
    170 
    171     public void testMoreThanBufferSizeLineBreakNewChars() {
    172         final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 20);
    173 
    174         String literal1 = "aaaaaaaaaabbbbb";
    175         String literal2 = "c\nd\nddddddddd";
    176         lw.print(literal1.toCharArray());
    177         lw.print(literal2.toCharArray());
    178         lw.flush();
    179 
    180         assertOutput("aaaaaaaaaabbbbbc\nd", "ddddddddd");
    181     }
    182 
    183     public void testMoreThenInitialCapacitySimpleWrites() {
    184         // This check is different from testMoreThanBufferSizeChar. The initial capacity is lower
    185         // than the maximum buffer size here.
    186         final LineBreakBufferedWriter lw = new LineBreakBufferedWriter(mWriter, 1024, 3);
    187 
    188         for(int i = 0; i < 10; i++) {
    189             lw.print('$');
    190         }
    191         for(int i = 0; i < 10; i++) {
    192             lw.print('%');
    193         }
    194         lw.flush();
    195 
    196         assertOutput("$$$$$$$$$$%%%%%%%%%%");
    197     }
    198 
    199     private void assertOutput(String... golden) {
    200         List<String> goldList = createTestGolden(golden);
    201         assertEquals(goldList, mWriter.getStrings());
    202     }
    203 
    204     private static List<String> createTestGolden(String... args) {
    205         List<String> ret = new ArrayList<String>();
    206         for (String s : args) {
    207             ret.add(s);
    208         }
    209         return ret;
    210     }
    211 
    212     // A writer recording calls to write.
    213     private final static class RecordingWriter extends Writer {
    214 
    215         private List<String> strings = new ArrayList<String>();
    216 
    217         public RecordingWriter() {
    218         }
    219 
    220         public List<String> getStrings() {
    221             return strings;
    222         }
    223 
    224         @Override
    225         public void write(char[] cbuf, int off, int len) {
    226             strings.add(new String(cbuf, off, len));
    227         }
    228 
    229         @Override
    230         public void flush() {
    231             // Ignore.
    232         }
    233 
    234         @Override
    235         public void close() {
    236             // Ignore.
    237         }
    238     }
    239 }
    240