1/* 2 * Copyright (C) 2012 The Guava Authors 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 17package com.google.common.io; 18 19import static com.google.common.io.SourceSinkFactory.CharSourceFactory; 20 21import com.google.common.collect.ImmutableList; 22import com.google.common.collect.Lists; 23 24import junit.framework.TestSuite; 25 26import java.io.BufferedReader; 27import java.io.IOException; 28import java.io.Reader; 29import java.io.StringWriter; 30import java.lang.reflect.Method; 31import java.util.List; 32import java.util.Map; 33 34/** 35 * A generator of {@code TestSuite} instances for testing {@code CharSource} implementations. 36 * Generates tests of a all methods on a {@code CharSource} given various inputs the source is 37 * expected to contain. 38 * 39 * @author Colin Decker 40 */ 41public class CharSourceTester extends SourceSinkTester<CharSource, String, CharSourceFactory> { 42 43 private static final ImmutableList<Method> testMethods 44 = getTestMethods(CharSourceTester.class); 45 46 static TestSuite tests(String name, CharSourceFactory factory) { 47 TestSuite suite = new TestSuite(name); 48 for (Map.Entry<String, String> entry : TEST_STRINGS.entrySet()) { 49 suite.addTest(suiteForString(factory, entry.getValue(), name, entry.getKey())); 50 } 51 return suite; 52 } 53 54 static TestSuite suiteForString(CharSourceFactory factory, String string, 55 String name, String desc) { 56 TestSuite suite = new TestSuite(name + " [" + desc + "]"); 57 for (Method method : testMethods) { 58 suite.addTest(new CharSourceTester(factory, string, name, desc, method)); 59 } 60 return suite; 61 } 62 63 private final ImmutableList<String> expectedLines; 64 65 private CharSource source; 66 67 public CharSourceTester(CharSourceFactory factory, String string, 68 String suiteName, String caseDesc, Method method) { 69 super(factory, string, suiteName, caseDesc, method); 70 this.expectedLines = getLines(expected); 71 } 72 73 @Override 74 protected void setUp() throws Exception { 75 this.source = factory.createSource(data); 76 } 77 78 public void testOpenStream() throws IOException { 79 Reader reader = source.openStream(); 80 81 StringWriter writer = new StringWriter(); 82 char[] buf = new char[64]; 83 int read; 84 while ((read = reader.read(buf)) != -1) { 85 writer.write(buf, 0, read); 86 } 87 reader.close(); 88 writer.close(); 89 90 assertExpectedString(writer.toString()); 91 } 92 93 public void testOpenBufferedStream() throws IOException { 94 BufferedReader reader = source.openBufferedStream(); 95 96 StringWriter writer = new StringWriter(); 97 char[] buf = new char[64]; 98 int read; 99 while ((read = reader.read(buf)) != -1) { 100 writer.write(buf, 0, read); 101 } 102 reader.close(); 103 writer.close(); 104 105 assertExpectedString(writer.toString()); 106 } 107 108 public void testCopyTo_appendable() throws IOException { 109 StringBuilder builder = new StringBuilder(); 110 111 assertEquals(expected.length(), source.copyTo(builder)); 112 113 assertExpectedString(builder.toString()); 114 } 115 116 public void testCopyTo_charSink() throws IOException { 117 TestCharSink sink = new TestCharSink(); 118 119 assertEquals(expected.length(), source.copyTo(sink)); 120 121 assertExpectedString(sink.getString()); 122 } 123 124 public void testRead_toString() throws IOException { 125 String string = source.read(); 126 assertExpectedString(string); 127 } 128 129 public void testReadFirstLine() throws IOException { 130 if (expectedLines.isEmpty()) { 131 assertNull(source.readFirstLine()); 132 } else { 133 assertEquals(expectedLines.get(0), source.readFirstLine()); 134 } 135 } 136 137 public void testReadLines_toList() throws IOException { 138 assertExpectedLines(source.readLines()); 139 } 140 141 public void testIsEmpty() throws IOException { 142 assertEquals(expected.isEmpty(), source.isEmpty()); 143 } 144 145 public void testReadLines_withProcessor() throws IOException { 146 List<String> list = source.readLines(new LineProcessor<List<String>>() { 147 List<String> list = Lists.newArrayList(); 148 149 @Override 150 public boolean processLine(String line) throws IOException { 151 list.add(line); 152 return true; 153 } 154 155 @Override 156 public List<String> getResult() { 157 return list; 158 } 159 }); 160 161 assertExpectedLines(list); 162 } 163 164 public void testReadLines_withProcessor_stopsOnFalse() throws IOException { 165 List<String> list = source.readLines(new LineProcessor<List<String>>() { 166 List<String> list = Lists.newArrayList(); 167 168 @Override 169 public boolean processLine(String line) throws IOException { 170 list.add(line); 171 return false; 172 } 173 174 @Override 175 public List<String> getResult() { 176 return list; 177 } 178 }); 179 180 if (expectedLines.isEmpty()) { 181 assertTrue(list.isEmpty()); 182 } else { 183 assertEquals(expectedLines.subList(0, 1), list); 184 } 185 } 186 187 private void assertExpectedString(String string) { 188 assertEquals(expected, string); 189 } 190 191 private void assertExpectedLines(List<String> list) { 192 assertEquals(expectedLines, list); 193 } 194} 195