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.base.Preconditions.checkNotNull;
20
21import com.google.common.collect.ImmutableList;
22import com.google.common.collect.ImmutableMap;
23import com.google.common.collect.Lists;
24
25import junit.framework.TestCase;
26
27import java.io.IOException;
28import java.io.Reader;
29import java.io.StringReader;
30import java.lang.reflect.Method;
31import java.lang.reflect.Modifier;
32import java.util.List;
33
34/**
35 * @param <S> the source or sink type
36 * @param <T> the data type (byte[] or String)
37 * @param <F> the factory type
38 * @author Colin Decker
39 */
40public class SourceSinkTester<S, T, F extends SourceSinkFactory<S, T>> extends TestCase {
41
42  static final String LOREM_IPSUM = "Lorem ipsum dolor sit amet, consectetur adipiscing "
43      + "elit. Cras fringilla elit ac ipsum adipiscing vulputate. Maecenas in lorem nulla, ac "
44      + "sollicitudin quam. Praesent neque elit, sodales quis vestibulum vel, pellentesque nec "
45      + "erat. Proin cursus commodo lacus eget congue. Aliquam erat volutpat. Fusce ut leo sed "
46      + "risus tempor vehicula et a odio. Nam aliquet dolor viverra libero rutrum accumsan quis "
47      + "in augue. Suspendisse id dui in lorem tristique placerat eget vel risus. Sed metus neque, "
48      + "scelerisque in molestie ac, mattis quis lectus. Pellentesque viverra justo commodo quam "
49      + "bibendum ut gravida leo accumsan. Nullam malesuada sagittis diam, quis suscipit mauris "
50      + "euismod vulputate. Pellentesque ultrices tellus sed lorem aliquet pulvinar. Nam lorem "
51      + "nunc, ultrices at auctor non, scelerisque eget turpis. Nullam eget varius erat. Sed a "
52      + "lorem id arcu dictum euismod. Fusce lectus odio, elementum ullamcorper mattis viverra, "
53      + "dictum sit amet lacus.\n"
54      + "\n"
55      + "Nunc quis lacus est. Sed aliquam pretium cursus. Sed eu libero eros. In hac habitasse "
56      + "platea dictumst. Pellentesque molestie, nibh nec iaculis luctus, justo sem lobortis enim, "
57      + "at feugiat leo magna nec libero. Mauris quis odio eget nisl rutrum cursus nec eget augue. "
58      + "Sed nec arcu sem. In hac habitasse platea dictumst.";
59
60  static final ImmutableMap<String, String> TEST_STRINGS
61      = ImmutableMap.<String, String>builder()
62      .put("empty", "")
63      .put("1 char", "0")
64      .put("1 word", "hello")
65      .put("2 words", "hello world")
66      .put("\\n line break", "hello\nworld")
67      .put("\\r line break", "hello\rworld")
68      .put("\\r\\n line break", "hello\r\nworld")
69      .put("\\n at EOF", "hello\nworld\n")
70      .put("\\r at EOF", "hello\nworld\r")
71      .put("lorem ipsum", LOREM_IPSUM)
72      .build();
73
74  protected final F factory;
75  protected final T data;
76  protected final T expected;
77
78  private final String suiteName;
79  private final String caseDesc;
80
81  SourceSinkTester(F factory, T data, String suiteName, String caseDesc, Method method) {
82    super(method.getName());
83    this.factory = checkNotNull(factory);
84    this.data = checkNotNull(data);
85    this.expected = checkNotNull(factory.getExpected(data));
86    this.suiteName = checkNotNull(suiteName);
87    this.caseDesc = checkNotNull(caseDesc);
88  }
89
90  @Override
91  public String getName() {
92    return super.getName() + " [" + suiteName + " [" + caseDesc + "]]";
93  }
94
95  protected static ImmutableList<String> getLines(final String string) {
96    try {
97      return new CharSource() {
98        @Override
99        public Reader openStream() throws IOException {
100          return new StringReader(string);
101        }
102      }.readLines();
103    } catch (IOException e) {
104      throw new AssertionError();
105    }
106  }
107
108  @Override
109  public void tearDown() throws IOException {
110    factory.tearDown();
111  }
112
113  static ImmutableList<Method> getTestMethods(Class<?> testClass) {
114    List<Method> result = Lists.newArrayList();
115    for (Method method : testClass.getDeclaredMethods()) {
116      if (Modifier.isPublic(method.getModifiers())
117          && method.getReturnType() == void.class
118          && method.getParameterTypes().length == 0
119          && method.getName().startsWith("test")) {
120        result.add(method);
121      }
122    }
123    return ImmutableList.copyOf(result);
124  }
125}
126