package jp.terasoluna.fw.file.dao.standard;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import jp.terasoluna.fw.file.annotation.NullStringConverter;
import jp.terasoluna.fw.file.annotation.PaddingType;
import jp.terasoluna.fw.file.dao.FileException;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Test;
import org.springframework.test.util.ReflectionTestUtils;
/**
* {@link jp.terasoluna.fw.file.dao.standard.CSVFileLineWriter} クラスのテスト。
* <p>
* <h4>【クラスの概要】</h4> ファイル行オブジェクトからデータを読み込み、 1行分のデータをCSV形式でファイル に書き込む。<br>
* AbstractFileLineWriterのサブクラス。
* <p>
* @see jp.terasoluna.fw.file.dao.standard.CSVFileLineWriter
*/
public class CSVFileLineWriterTest {
private static final String TEMP_FILE_NAME = CSVFileLineWriterTest.class
.getResource("CSVFileLineWriterTest_tmp.txt").getPath();
@Before
public void setUp() throws Exception {
// ファイルの初期化
File file = new File(TEMP_FILE_NAME);
file.delete();
file.createNewFile();
}
@AfterClass
public static void afterClass() throws Exception {
// ファイルの初期化
File file = new File(TEMP_FILE_NAME);
file.delete();
file.createNewFile();
}
/**
* testCSVFileLineWriter01() <br>
* <br>
* (異常系) <br>
* <br>
* 観点:G <br>
* <br>
* 入力値:(引数) fileName:"(パス)CSVFileLineWriter_testCSVFileLineWriter01.txt"<br>
* (引数) clazz:CSVFileLineWriter_Stub05インスタンス<br>
* @FileFormatの設定<br>
* delimiter='、'<br>
* (引数) columnFormatterMap:以下の要素を持つMap<String, ColumnFormatter>インスタンス<br>
* ・"java.lang.String"=NullColumnFormatter.java<br>
* <br>
* 期待値:(状態変化) 例外:"Delimiter can not change."のメッセージ、IllegalStateException、ファイル名を持つFileExceptionが発生する。<br>
* <br>
* 例外。@FileFormatのdelimiterに初期値以外を設定した場合、例外が発生することを確認する。<br>
* ファイル名が入力値のfileNameに一致することを確認する。 <br>
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testCSVFileLineWriter01() throws Exception {
// テスト対象のインスタンス化
// コンストラクタの試験だから不要
// 引数の設定
String fileName = TEMP_FILE_NAME;
Class<CSVFileLineWriter_Stub05> clazz = CSVFileLineWriter_Stub05.class;
Map<String, ColumnFormatter> columnFormatterMap = new HashMap<String, ColumnFormatter>();
columnFormatterMap.put("java.lang.String", new NullColumnFormatter());
// 前提条件の設定
// なし
CSVFileLineWriter<CSVFileLineWriter_Stub05> writer = null;
try {
// テスト実施
writer = new CSVFileLineWriter<CSVFileLineWriter_Stub05>(fileName, clazz, columnFormatterMap);
fail("FileExceptionがスローされませんでした。");
} catch (FileException e) {
// 返却値の確認
// なし
// 状態変化の確認
assertEquals(FileException.class, e.getClass());
assertEquals("Delimiter can not change.", e.getMessage());
assertEquals(IllegalStateException.class, e.getCause().getClass());
assertEquals(fileName, e.getFileName());
} finally {
if (writer != null) {
writer.closeFile();
}
}
}
/**
* testCSVFileLineWriter02() <br>
* <br>
* (正常系) <br>
* 観点:E <br>
* <br>
* 入力値:(引数) fileName:"(パス)CSVFileLineWriter_testCSVFileLineWriter02.txt"<br>
* (引数) clazz:CSVFileLineWriter_Stub01<br>
* @FileFormatの設定<br>
* delimiter以外=デフォルト値以外<br>
* (引数) columnFormatterMap:以下の要素を持つMap<String, ColumnFormatter>インスタンス<br>
* ・"java.lang.String"=NullColumnFormatter.java<br>
* <br>
* 期待値:(状態変化) this.encloseChar:引数clazzのアノテーションFileFormatのencloseChar()の値。<br>
* (状態変化) AbstractFileLineWriter#AbstractFileLineWriter():1回呼び出されること<br>
* 引数を確認すること<br>
* (状態変化) AbstractFileLineWriter#init():1回呼び出されること<br>
* <br>
* @FileFormatのdelimiter以外の設定をデフォルト値ではないデータで設定した場合、コンストラクタの呼び出しが正常に行われることを確認する。 <br>
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testCSVFileLineWriter02() throws Exception {
// テスト対象のインスタンス化
// コンストラクタの試験だから不要
// 引数の設定
String fileName = TEMP_FILE_NAME;
Class<CSVFileLineWriter_Stub01> clazz = CSVFileLineWriter_Stub01.class;
Map<String, ColumnFormatter> columnFormatterMap = new HashMap<String, ColumnFormatter>();
columnFormatterMap.put("java.lang.String", new NullColumnFormatter());
// 前提条件の設定
// なし
CSVFileLineWriter<CSVFileLineWriter_Stub01> result = null;
try {
// テスト実施
result = new CSVFileLineWriter<CSVFileLineWriter_Stub01>(fileName, clazz, columnFormatterMap);
// 返却値の確認
// なし
// 状態変化の確認
assertEquals('\"', ReflectionTestUtils.getField(result,
"encloseChar"));
assertEquals(fileName, ReflectionTestUtils.getField(result,
"fileName"));
assertEquals(CSVFileLineWriter_Stub01.class, ReflectionTestUtils
.getField(result, "clazz"));
assertEquals(columnFormatterMap, ReflectionTestUtils.getField(
result, "columnFormatterMap"));
} finally {
// テスト対象のクローズ処理
if (result != null) {
result.closeFile();
}
}
}
/**
* 異常系<br>
* ファイル行オブジェクトにOutputFileColumnアノテーションが無し
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testCSVFileLineWriter03() throws Exception {
// 引数の設定
String fileName = TEMP_FILE_NAME;
Class<FileLineObject_Empty> clazz = FileLineObject_Empty.class;
Map<String, ColumnFormatter> columnFormatterMap = new HashMap<String, ColumnFormatter>();
columnFormatterMap.put("java.lang.String", new NullColumnFormatter());
CSVFileLineWriter<FileLineObject_Empty> writer = null;
// テスト実施
try {
new CSVFileLineWriter<FileLineObject_Empty>(fileName, clazz, columnFormatterMap);
fail("FileExceptionがスローされませんでした。");
} catch (FileException e) {
// 返却値なし
// 状態変化の確認
assertEquals("OutputFileColumn is not found.", e.getMessage());
assertEquals(fileName, e.getFileName());
assertEquals(IllegalStateException.class, e.getCause().getClass());
} finally {
if (writer != null) {
writer.closeFile();
}
}
}
/**
* testGetColumn01() <br>
* <br>
* (正常系) <br>
* 観点:E <br>
* <br>
* 入力値:(引数) t:CSVFileLineWriter_Stub06インスタンス<br>
* @FileFormat()<br>
* String変数column01<br>
* アノテーション:@OutputFileColumn(columnIndex = 0)<br>
* 値:"abcdef"<br>
* (引数) index:0<br>
* <br>
* 期待値:(戻り値) String:"abcdef"<br>
* <br>
* 引数tに設定されたクラス(囲み文字が設定されていない場合)のカラムインデックス1の属性値(囲み文字が含まれない)が取得できることを確認するテスト。 <br>
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testGetColumn01() throws Exception {
// テスト対象のインスタンス化
String fileName = TEMP_FILE_NAME;
Map<String, ColumnFormatter> columnFormatterMap = new HashMap<String, ColumnFormatter>();
columnFormatterMap.put("java.lang.String", new NullColumnFormatter());
CSVFileLineWriter<CSVFileLineWriter_Stub06> lineWriter = new CSVFileLineWriter<CSVFileLineWriter_Stub06>(fileName, CSVFileLineWriter_Stub06.class, columnFormatterMap);
// 引数の設定
CSVFileLineWriter_Stub06 stub = new CSVFileLineWriter_Stub06();
stub.setColumn01("abcdef");
// 前提条件の設定
// なし
try {
// テスト実施
String result = lineWriter.getColumn(stub, 0);
// 返却値の確認
assertEquals("abcdef", result);
} finally {
// テスト対象のクローズ処理
lineWriter.closeFile();
}
}
/**
* testGetColumn02() <br>
* <br>
* (正常系) <br>
* 観点:E <br>
* <br>
* 入力値:(引数) t:CSVFileLineWriter_Stub07インスタンス<br>
* @FileFormat(encloseChar='\"')<br>
* String変数column01<br>
* アノテーション:@OutputFileColumn(columnIndex = 0)<br>
* 値:"abcdef"<br>
* (引数) index:0<br>
* <br>
* 期待値:(戻り値) String:"abcdef"<br>
* <br>
* 引数tに設定されたクラス(囲み文字が設定されている場合)のカラムインデックス1の属性値(囲み文字が含まれない)が取得できることを確認するテスト。 <br>
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testGetColumn02() throws Exception {
// テスト対象のインスタンス化
String fileName = TEMP_FILE_NAME;
Map<String, ColumnFormatter> columnFormatterMap = new HashMap<String, ColumnFormatter>();
columnFormatterMap.put("java.lang.String", new NullColumnFormatter());
CSVFileLineWriter<CSVFileLineWriter_Stub07> lineWriter = new CSVFileLineWriter<CSVFileLineWriter_Stub07>(fileName, CSVFileLineWriter_Stub07.class, columnFormatterMap);
// 引数の設定
CSVFileLineWriter_Stub07 stub = new CSVFileLineWriter_Stub07();
stub.setColumn01("abcdef");
// 前提条件の設定
// なし
// テスト実施
try {
String result = lineWriter.getColumn(stub, 0);
// 返却値の確認
assertEquals("abcdef", result);
} finally {
// テスト対象のクローズ処理
lineWriter.closeFile();
}
}
/**
* testGetColumn03() <br>
* <br>
* (正常系) <br>
* 観点:E <br>
* <br>
* 入力値:(引数) t:CSVFileLineWriter_Stub07インスタンス<br>
* @FileFormat(encloseChar='\"')<br>
* String変数column01<br>
* アノテーション:@OutputFileColumn(columnIndex = 0)<br>
* 値:"ab\"cdef"<br>
* (引数) index:0<br>
* <br>
* 期待値:(戻り値) String:"ab""cdef"<br>
* <br>
* 引数tに設定されたクラス(囲み文字が設定されている場合)のカラムインデックス1の属性値(囲み文字が含まれる)がエスケープ処理されて、取得できることを確認するテスト。 <br>
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testGetColumn03() throws Exception {
// テスト対象のインスタンス化
String fileName = TEMP_FILE_NAME;
Map<String, ColumnFormatter> columnFormatterMap = new HashMap<String, ColumnFormatter>();
columnFormatterMap.put("java.lang.String", new NullColumnFormatter());
CSVFileLineWriter<CSVFileLineWriter_Stub07> lineWriter = new CSVFileLineWriter<CSVFileLineWriter_Stub07>(fileName, CSVFileLineWriter_Stub07.class, columnFormatterMap);
// 引数の設定
CSVFileLineWriter_Stub07 stub = new CSVFileLineWriter_Stub07();
ReflectionTestUtils.setField(stub, "column01", "ab\"cdef");
// 前提条件の設定
// なし
// テスト実施
try {
String result = lineWriter.getColumn(stub, 0);
// 返却値の確認
assertEquals("ab\"\"cdef", result);
} finally {
// テスト対象のクローズ処理
lineWriter.closeFile();
}
}
/**
* testGetColumn04() <br>
* <br>
* (異常系) <br>
* 観点:G <br>
* <br>
* 入力値:(引数) t:CSVFileLineWriter_Stub06インスタンス<br>
* @FileFormat()<br>
* String変数column01<br>
* アノテーション:@OutputFileColumn(columnIndex = 0)<br>
* 値:"abcdef"<br>
* (引数) index:1<br>
* <br>
* (状態変化) 例外:ArrayIndexOutOfBoundsException<br>
* AbstractFileLineWriter#getColumn()で発生する<br>
* <br>
* 引数indexにカラムインデックスに存在しない値を渡すと、ArrayIndexOutOfBoundsExceptionが発生することを確認する。 <br>
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testGetColumn04() throws Exception {
// テスト対象のインスタンス化
String fileName = TEMP_FILE_NAME;
Map<String, ColumnFormatter> columnFormatterMap = new HashMap<String, ColumnFormatter>();
columnFormatterMap.put("java.lang.String", new NullColumnFormatter());
CSVFileLineWriter<CSVFileLineWriter_Stub06> lineWriter = new CSVFileLineWriter<CSVFileLineWriter_Stub06>(fileName, CSVFileLineWriter_Stub06.class, columnFormatterMap);
// 引数の設定
CSVFileLineWriter_Stub06 stub = new CSVFileLineWriter_Stub06();
ReflectionTestUtils.setField(stub, "column01", "abcdef");
// 前提条件の設定
// なし
// テスト実施
try {
lineWriter.getColumn(stub, 1);
fail("ArrayIndexOutOfBoundsExceptionがスローされませんでした。");
} catch (ArrayIndexOutOfBoundsException e) {
// 返却値の確認
// なし
// 状態変化の確認
assertEquals(ArrayIndexOutOfBoundsException.class, e.getClass());
} finally {
// テスト対象のクローズ処理
lineWriter.closeFile();
}
}
/**
* testGetDelimiter01() <br>
* <br>
* (正常系) <br>
* 観点:F <br>
* <br>
* 入力値:(状態) this.delimiter:"','"<br>
* <br>
* 期待値:(戻り値) this.delimiter:"','"<br>
* <br>
* delimiterのgetterメソッドが正しく値を取得することを確認する。 <br>
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testGetDelimiter01() throws Exception {
// テスト対象のインスタンス化
String fileName = TEMP_FILE_NAME;
Map<String, ColumnFormatter> columnFormatterMap = new HashMap<String, ColumnFormatter>();
columnFormatterMap.put("java.lang.String", new NullColumnFormatter());
CSVFileLineWriter<CSVFileLineWriter_Stub04> lineWriter = new CSVFileLineWriter<CSVFileLineWriter_Stub04>(fileName, CSVFileLineWriter_Stub04.class, columnFormatterMap);
// 引数の設定
// なし
// 前提条件の設定
// デフォルトで以下になっているため、何もしない
// this.delimiter:"','"
// テスト実施
try {
char result = lineWriter.getDelimiter();
// 返却値の確認
assertEquals(',', result);
// 状態変化の確認
// なし
} finally {
// テスト対象のクローズ処理
lineWriter.closeFile();
}
}
/**
* testGetEncloseChar01() <br>
* <br>
* (正常系) <br>
* 観点:F <br>
* <br>
* 入力値:(状態) this.encloseChar:'\u0000'<br>
* <br>
* 期待値:(戻り値) this.encloseChar:'\u0000'<br>
* <br>
* encloseCharのgetterメソッドが正しく値を取得することを確認する。 <br>
* @throws Exception このメソッドで発生した例外
*/
@Test
public void testGetEncloseChar01() throws Exception {
// テスト対象のインスタンス化
String fileName = TEMP_FILE_NAME;
Map<String, ColumnFormatter> columnFormatterMap = new HashMap<String, ColumnFormatter>();
columnFormatterMap.put("java.lang.String", new NullColumnFormatter());
CSVFileLineWriter<CSVFileLineWriter_Stub04> lineWriter = new CSVFileLineWriter<CSVFileLineWriter_Stub04>(fileName, CSVFileLineWriter_Stub04.class, columnFormatterMap);
// 引数の設定
// なし
// 前提条件の設定
// デフォルトで以下になっているため、何もしない
// this.encloseChar:\u0000'
// テスト実施
try {
char result = lineWriter.getEncloseChar();
// 返却値の確認
assertEquals('\u0000', result);
// 状態変化の確認
// なし
} finally {
// テスト対象のクローズ処理
lineWriter.closeFile();
}
}
/**
* 正常系<br>
* OutputFileColumnのcolumnEncloseCharによって、個々のカラムに囲み文字を設定
* @throws Exception
*/
@Test
public void testPrintDataLine01() throws Exception {
// 前処理(ファイル)
String fileName = TEMP_FILE_NAME;
// 前処理(試験対象)
Map<String, ColumnFormatter> columnFormatterMap = new HashMap<String, ColumnFormatter>();
columnFormatterMap.put("java.lang.String", new NullColumnFormatter());
CSVFileLineWriter<CSVFileLine_Stub01> fileLineWriter = new CSVFileLineWriter<CSVFileLine_Stub01>(fileName, CSVFileLine_Stub01.class, columnFormatterMap);
// 前処理(引数)
CSVFileLine_Stub01 t1 = new CSVFileLine_Stub01();
CSVFileLine_Stub01 t2 = new CSVFileLine_Stub01();
CSVFileLine_Stub01 t3 = new CSVFileLine_Stub01();
t1.setColumn1("1");
t1.setColumn2("22");
t1.setColumn3("333");
t1.setColumn4("4444");
t2.setColumn1("5");
t2.setColumn2("66");
t2.setColumn3("777");
t2.setColumn4("8888");
t3.setColumn1("9");
t3.setColumn2("AA");
t3.setColumn3("BBB");
t3.setColumn4("CCCC");
// テスト実施
fileLineWriter.printDataLine(t1);
fileLineWriter.printDataLine(t2);
fileLineWriter.printDataLine(t3);
fileLineWriter.closeFile();
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), System
.getProperty("file.encoding")));
assertEquals("\"1\",22,333,|4444|", reader.readLine());
assertEquals("\"5\",66,777,|8888|", reader.readLine());
assertEquals("\"9\",AA,BBB,|CCCC|", reader.readLine());
} finally {
reader.close();
}
}
/**
* 正常系<br>
* FileFormatのencloseCharとOutputFileColumnのcolumnEncloseCharによって、個々のカラムに囲み文字を設定
* @throws Exception
*/
@Test
public void testPrintDataLine02() throws Exception {
// 前処理(ファイル)
String fileName = TEMP_FILE_NAME;
// 前処理(試験対象)
Map<String, ColumnFormatter> columnFormatterMap = new HashMap<String, ColumnFormatter>();
columnFormatterMap.put("java.lang.String", new NullColumnFormatter());
CSVFileLineWriter<CSVFileLine_Stub02> fileLineWriter = new CSVFileLineWriter<CSVFileLine_Stub02>(fileName, CSVFileLine_Stub02.class, columnFormatterMap);
// 前処理(引数)
CSVFileLine_Stub02 t1 = new CSVFileLine_Stub02();
CSVFileLine_Stub02 t2 = new CSVFileLine_Stub02();
CSVFileLine_Stub02 t3 = new CSVFileLine_Stub02();
t1.setColumn1("1");
t1.setColumn2("22");
t1.setColumn3("333");
t1.setColumn4("4444");
t2.setColumn1("5");
t2.setColumn2("66");
t2.setColumn3("777");
t2.setColumn4("8888");
t3.setColumn1("9");
t3.setColumn2("AA");
t3.setColumn3("BBB");
t3.setColumn4("CCCC");
// テスト実施
fileLineWriter.printDataLine(t1);
fileLineWriter.printDataLine(t2);
fileLineWriter.printDataLine(t3);
fileLineWriter.closeFile();
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), System
.getProperty("file.encoding")));
assertEquals("\"1\",'22',\"333\",|4444|", reader.readLine());
assertEquals("\"5\",'66',\"777\",|8888|", reader.readLine());
assertEquals("\"9\",'AA',\"BBB\",|CCCC|", reader.readLine());
} finally {
reader.close();
}
}
/**
* 正常系<br>
* キャッシュしているアノテーションの情報を利用している事を確認する。<br>
* @throws Exception
*/
@Test
public void testPrintDataLine03() throws Exception {
// 前処理(ファイル)
String fileName = TEMP_FILE_NAME;
// 前処理(試験対象)
Map<String, ColumnFormatter> columnFormatterMap = new HashMap<String, ColumnFormatter>();
columnFormatterMap.put("java.lang.String", new NullColumnFormatter());
CSVFileLineWriter<CSVFileLine_Stub03> fileLineWriter = new CSVFileLineWriter<CSVFileLine_Stub03>(fileName, CSVFileLine_Stub03.class, columnFormatterMap);
// 前処理(引数)
CSVFileLine_Stub03 t1 = new CSVFileLine_Stub03();
t1.setColumn1("1");
t1.setColumn2("22");
t1.setColumn3("333");
t1.setColumn4("4444");
// ファイル行オブジェクトに設定してあった値を全て上書き
// 以下の設定が適用されれば、ファイル行オブジェクトの
// アノテーションにアクセスしていないことになる。
char[] charArray = new char[] { 0, 0, 0, 0 };
// 前提条件
ReflectionTestUtils.setField(fileLineWriter, "lineFeedChar", "\r\n");
ReflectionTestUtils.setField(fileLineWriter, "delimiter", '_');
ReflectionTestUtils.setField(fileLineWriter, "outputFileColumns", null);
ReflectionTestUtils.setField(fileLineWriter, "columnFormats",
new String[] { "", "", "", "" });
ReflectionTestUtils.setField(fileLineWriter, "columnBytes", new int[] {
-1, -1, -1, -1 });
// ReflectionTestUtils.setField(fileLineWriter, "totalBytes", 0);
ReflectionTestUtils.setField(fileLineWriter, "paddingTypes",
new PaddingType[] { PaddingType.NONE, PaddingType.NONE,
PaddingType.NONE, PaddingType.NONE });
ReflectionTestUtils.setField(fileLineWriter, "paddingChars", charArray);
ReflectionTestUtils.setField(fileLineWriter, "trimChars", charArray);
ReflectionTestUtils.setField(fileLineWriter, "columnEncloseChar",
charArray);
ReflectionTestUtils.setField(fileLineWriter, "stringConverters",
new NullStringConverter[] { new NullStringConverter(),
new NullStringConverter(), new NullStringConverter(),
new NullStringConverter() });
// テスト実施
fileLineWriter.printDataLine(t1);
fileLineWriter.closeFile();
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), System
.getProperty("file.encoding")));
assertEquals("1_22_333_4444", reader.readLine());
} finally {
reader.close();
}
}
}