使っていたらテスト不足が発見される
今回HtmlTableCreatorの実装にStringSplitterByString*1を利用しました。一文字の","をデリミタに利用したのですが、以前の実装では例外が発生してしまいました。文字列の終端まで行った時に何か失敗しているようです。
修正したものを記載しておきます。このような場合は単体テスト不足であるとみなせるので一文字のデリミタ用のテストも記述します。
/** * */ package ms2310.oot.section5.sample0; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; public class StringSplitterByString implements Splitter { private String delim; private String input; private SplitHandler handler; public StringSplitterByString(SplitHandler handler, String input, String delim) { if(handler == null) throw new IllegalArgumentException("handler == null"); if(input == null) throw new IllegalArgumentException("input == null"); if(delim == null) throw new IllegalArgumentException("delim == null"); this.delim = delim; this.input = input; this.handler = handler; } public void split() throws IOException { if(input.length() == 0) return; if(delim.length() == 0) return; BufferedReader reader = new BufferedReader(new StringReader(input)); int c; StringBuffer buf = new StringBuffer(); char[] delimBuf = new char[delim.length()]; for (;;) { reader.mark(delim.length()); c = reader.read(delimBuf); if (c != delim.length()) { String part; if(c == -1){ part = buf.toString(); } else{ part = buf.append(new String(delimBuf, 0, c)).toString(); } handler.handleSplit(part); break; } else if (delim.equals(new String(delimBuf))) { handler.handleSplit(buf.toString()); buf = new StringBuffer(); } else { reader.reset(); c = reader.read(); buf.append((char) c); } } } }
package ms2310.oot.section5.sample0; import java.util.ArrayList; import java.util.List; import junit.framework.TestCase; public class StringSplitterByStringTest extends TestCase { private static class TestHandler implements SplitHandler { private List result = new ArrayList(); public void handleSplit(String str) { result.add(str); } public List getResult() { return result; } } public void testSenario() throws Exception { TestHandler handler = new TestHandler(); String input = "こんな::文字列を::::分解します"; String delim = "::"; Splitter outputter = new StringSplitterByString(handler, input, delim); // 文字列分解を行う outputter.split(); // handlerは分解された文字を受け取る List result = handler.getResult(); assertEquals(4, result.size()); assertEquals("こんな", result.get(0)); assertEquals("文字列を", result.get(1)); assertEquals("", result.get(2)); assertEquals("分解します", result.get(3)); } public void testDelimChar() throws Exception { TestHandler handler = new TestHandler(); String input = "こんな:文字列を::分解します"; String delim = ":"; //デリミタが一文字 Splitter outputter = new StringSplitterByString(handler, input, delim); // 文字列分解を行う outputter.split(); // handlerは分解された文字を受け取る List result = handler.getResult(); assertEquals(4, result.size()); assertEquals("こんな", result.get(0)); assertEquals("文字列を", result.get(1)); assertEquals("", result.get(2)); assertEquals("分解します", result.get(3)); } public void testInputIsNull() throws Exception { TestHandler handler = new TestHandler(); String input = null; String delim = "::"; try { new StringSplitterByString(handler, input, delim); fail("inputがnullなら例外"); } catch (IllegalArgumentException e) { // ここに来れば良い } } public void testDelimIsNull() throws Exception { TestHandler handler = new TestHandler(); String input = "こんな::文字列を::::分解します"; String delim = null; try { new StringSplitterByString(handler, input, delim); fail("delimがnullなら例外"); } catch (IllegalArgumentException e) { // ここに来れば良い } } public void testHandlerIsNull() throws Exception { TestHandler handler = null; String input = "こんな::文字列を::::分解します"; String delim = null; try { new StringSplitterByString(handler, input, delim); fail("handlerがnullなら例外"); } catch (IllegalArgumentException e) { // ここに来れば良い } } public void testInputIsNothing() throws Exception { TestHandler handler = new TestHandler(); String input = ""; String delim = "::"; Splitter outputter = new StringSplitterByString(handler, input, delim); // 文字列分解を行う outputter.split(); // handlerは分解された文字を受け取る List result = handler.getResult(); // handleSpritは一度も呼ばれていない assertEquals(0, result.size()); } public void testDelimIsNothing() throws Exception { TestHandler handler = new TestHandler(); String input = "こんな::文字列を::::分解します"; String delim = ""; Splitter outputter = new StringSplitterByString(handler, input, delim); // 文字列分解を行う outputter.split(); // handlerは分解された文字を受け取る List result = handler.getResult(); // handleSpritは一度も呼ばれていない assertEquals(0, result.size()); } }
*1:本来はByCharの方を使うべきかもしれません