Webエンジニア susumuis の技術ブログ

このブログの内容は個人の見解であり、所属する組織の公式見解ではありません

変態Comparatorを書いてユニットテストをしてみた

変態アドベントカレンダーが止まってしまいそうなので支援します。

最近、勤務先の会社で、アルバイト希望の学生に試験を出したりしているのですが、Comparatorが書ける子いないので、(ある意味)模範例のつもりで颯爽と書いてみたいと思います。(いえーい!みんな見てるー?w)

どんなときでも"hentai"または"HENTAI"が先頭に来るコンパレーターです。

import java.util.Comparator;

public class HentaiComparator implements Comparator<String> {
	public int compare(String o1, String o2) {
		if ("hentai".equalsIgnoreCase(o1)) {
			if ("hentai".equalsIgnoreCase(o2)) {
				return o1.compareTo(o2);
			}
			return -1;
		} else if ("hentai".equalsIgnoreCase(o2)) {
			return 1;
		}
		if (o1 == null) {
			if (o2 == null) {
				return 0;
			}
			return 1;
		}
		if (o2 == null) {
			return -1;
		}
		return o1.compareTo(o2);
	};
}

ついでにユニットテストも書いてみましょう。

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

import java.util.Iterator;
import java.util.TreeSet;

import org.junit.Test;


public class HentaiCompareTest {
	@Test
	public void 並び順テスト() {
		TreeSet<String> hentaiSet = new TreeSet<String>(new HentaiComparator());
		hentaiSet.add("susumuis");
		hentaiSet.add("hoge");
		hentaiSet.add("HENTAI");
		hentaiSet.add("fuga");
		hentaiSet.add(null);
		hentaiSet.add("hentai");
		
		Iterator<String> iter = hentaiSet.iterator();
		assertThat(iter.hasNext(), is(true));
		assertThat(iter.next(), is("HENTAI"));
		assertThat(iter.hasNext(), is(true));
		assertThat(iter.next(), is("hentai"));
		assertThat(iter.hasNext(), is(true));
		assertThat(iter.next(), is("fuga"));
		assertThat(iter.hasNext(), is(true));
		assertThat(iter.next(), is("hoge"));
		assertThat(iter.hasNext(), is(true));
		assertThat(iter.next(), is("susumuis"));
		assertThat(iter.hasNext(), is(true));
		assertThat(iter.next(), nullValue());
		assertThat(iter.hasNext(), is(false));
		
	}
}

JUnit4でassertThat使ったの初めてだったなんて内緒だ。

注意:このコードを参考にして弊社の試験を落ちても何の保証もできません。