6月12日

ストリームとコレクション

前回、TextDocumentクラスをテスト駆動開発で作成し始めたので、その続きを実施する。

  1. 指定した行の文字列取得
  2. 指定した行を削除(削除した行の文字列を返す)
  3. 指定した文字列を行として末尾に挿入
  4. 指定した場所に指定した文字列を行として挿入
  5. 出力先ファイル名を指定してファイル出力

指定した場所に指定した文字列を行として挿入

TextDocument.java

	public void addLine(int i, String s) {
		lines.add(i, s);
	}

前回は、4まで実施したが、先頭行に挿入するテストしかやっていないので、別のテストを追加して動作確認を実施する。

まずは、途中に挿入するテストを追加してみる。

	@Test
	public void testAdd2() {
		TextDocument td = new TextDocument();
		td.load("hoge.txt");
		int lines = td.getLines();
		assertThat(lines, is(10));
		td.addLine(3, "1234567890");
		lines = td.getLines();
		assertThat(lines, is(11));
		String s = td.getLine(0);
		assertThat(s, is("ab"));
		s = td.getLine(3);
		assertThat(s, is("1234567890"));
		s = td.getLine(4);
		assertThat(s, is("abcde"));
	}

範囲外の -1 行目を引数で指定した場合は例外が発生する。
例外の発生をテストで書くには、Testアノテーションの引数に発生する例外を記述する。

TextDocumentTest.java

	@Test(expected = IndexOutOfBoundsException.class)
	public void testAdd3() {
		TextDocument td = new TextDocument();
		td.load("hoge.txt");
		td.addLine(-1, "1234567890");
	}

10行しかないときに11行目に追加しようとしても例外が発生する。
まずは、例外が発生してエラーになるテストを書く。
TextDocumentTest.java

	@Test
	public void testAdd4() {
		TextDocument td = new TextDocument();
		td.load("hoge.txt");
		td.addLine(11, "1234567890");
	}

例外が発生してエラーになることを確認してから、アノテーションに expected 引数を追加する。

	@Test(expected = IndexOutOfBoundsException.class)
	public void testAdd4() {
		TextDocument td = new TextDocument();
		td.load("hoge.txt");
		td.addLine(11, "1234567890");
	}

次はファイルに書き込む機能を追加する。
まずはテストを書く。
ファイルに書けたかどうかは、ファイルを読み込んでテストしてみる。
TextDocumentTest.java

	@Test
	public void testSave() {
		TextDocument td = new TextDocument();
		td.load("hoge.txt");
		td.addLine(0, "1234567890");
		td.save("out.txt");
		td.load("out.txt");
		int lines = td.getLines();
		assertThat(lines, is(11));
	}

TextDocumentに、保存の処理を実装する。

	public void save(String path) {
		try (PrintWriter out = new PrintWriter(new FileWriter(path))) {
			for (String s : lines) {
				out.println(s);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

Mapの使用例

ゲームタイトルをキーにして会社名を保存するクラスを作成する。

Games.java

public class Games {
}

テストを作る。
GamesTest.java

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.Test;


public class GamesTest {

	@Test
	public void testAdd() {
		Games g = new Games();
		g.add("スーパーマリオブラザーズ", "任天堂");
		int n = g.getCount();
		assertThat(n, is(1));
		g.add("パズドラ", "ガンホー");
		n = g.getCount();
		assertThat(n, is(2));
	}

}

テストにパスするように Games を実装したら、さらにテストを追加する。
GamesTest.java

	@Test
	public void testGet() {
		Games g = new Games();
		g.add("スーパーマリオブラザーズ", "任天堂");
		String s = g.get("スーパーマリオブラザーズ");
		assertThat(s, is("任天堂"));
	}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です