package com.github.mygreen.supercsv.cellprocessor.conversion;
import static org.junit.Assert.*;
import static org.assertj.core.api.Assertions.*;
import org.junit.Before;
import org.junit.Test;
/**
* {@link CharReplacer}のテスタ
*
* @since 2.0
* @author T.TSUCHIE
*
*/
public class CharReplacerTest {
private CharReplacer replacer;
@Before
public void setUp() throws Exception {
this.replacer = new CharReplacer();
}
@Test(expected=NullPointerException.class)
public void testRegister_srcNull() {
replacer.register(null, "a");
fail();
}
@Test(expected=IllegalArgumentException.class)
public void testRegister_srcEmpty() {
replacer.register("", "a");
fail();
}
@Test(expected=NullPointerException.class)
public void testRegister_destNull() {
replacer.register("A", null);
fail();
}
@Test
public void testRegister_destEmpty() {
replacer.register("A", "");
}
/**
* 置換文字が1文字の場合の置換
*/
@Test
public void testReplace_single() {
replacer.register("a", "z");
replacer.register("z", "Z");
replacer.ready();
// nullの場合
assertThat(replacer.replace(null)).isEqualTo(null);
// 空文字の場合
assertThat(replacer.replace("")).isEqualTo("");
// 1文字の場合 - match
assertThat(replacer.replace("a")).isEqualTo("z");
// 1文字の場合 - no match
assertThat(replacer.replace("c")).isEqualTo("c");
// 複数文字の場合 - match
assertThat(replacer.replace("a_a_z")).isEqualTo("z_z_Z");
// 複数文字の場合 - no-match
assertThat(replacer.replace("hello")).isEqualTo("hello");
}
/**
* 置換文字が複数文字の場合の置換
*/
@Test
public void testReplace_multi() {
replacer.register("ab", "cd");
replacer.register("cd", "ef");
replacer.register("abcd", "ef");
replacer.register("abc", "defg");
replacer.ready();
// nullの場合
assertThat(replacer.replace(null)).isEqualTo(null);
// 空文字の場合
assertThat(replacer.replace("")).isEqualTo("");
// 2文字の場合 - match
assertThat(replacer.replace("ab")).isEqualTo("cd");
// 2文字の場合 - no match
assertThat(replacer.replace("bc")).isEqualTo("bc");
// 4文字の場合 - match
assertThat(replacer.replace("abcd")).isEqualTo("ef");
// 複数文字の場合 - match
assertThat(replacer.replace("ab_abcd_cd")).isEqualTo("cd_ef_ef");
// 複数文字の場合 - no-match
assertThat(replacer.replace("hello")).isEqualTo("hello");
}
/**
* 置換文字が複合の場合の置換
*/
@Test
public void testReplace_complex() {
replacer.register("a", "z");
replacer.register("z", "Z");
replacer.register("ab", "cd");
replacer.register("cd", "ef");
replacer.register("abcd", "ef");
replacer.ready();
// nullの場合
assertThat(replacer.replace(null)).isEqualTo(null);
// 空文字の場合
assertThat(replacer.replace("")).isEqualTo("");
// match
assertThat(replacer.replace("test_aa_zz_abcd_ef")).isEqualTo("test_zz_ZZ_ef_ef");
// no match
assertThat(replacer.replace("hello")).isEqualTo("hello");
}
/**
* 置換語彙が重複する場合
*/
@Test
public void testRegisterAndReplace_duplicateWord() {
replacer.register("a", "b");
replacer.register("a", "c");
replacer.register("xyz", "hello");
replacer.register("xyz", "world");
replacer.ready();
assertThat(replacer.replace("abc")).isEqualTo("bbc");
assertThat(replacer.replace("abc_xyz")).isEqualTo("bbc_hello");
}
}