package com.github.mygreen.supercsv.tool; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.reflect.Field; import org.assertj.core.api.AbstractAssert; import org.supercsv.cellprocessor.CellProcessorAdaptor; import org.supercsv.cellprocessor.ift.CellProcessor; /** * Assertj用の任意のCellProcessorを持っているかの判定を行う。 * * @since 2.0 * @author T.TSUCHIE * */ public class HasCellProcessorAssert extends AbstractAssert<HasCellProcessorAssert, CellProcessor> { public HasCellProcessorAssert(final CellProcessor actual) { super(actual, HasCellProcessorAssert.class); } /** * static import用のエントリポイント * @param actual * @return */ public static HasCellProcessorAssert assertThat(final CellProcessor actual) { return new HasCellProcessorAssert(actual); } public HasCellProcessorAssert hasCellProcessor(final Class<? extends CellProcessor> clazz) { CellProcessor cp = actual; if(!(cp instanceof CellProcessorAdaptor)) { failWithMessage("Expected CellProcessor should be implemeted CellProcessorAdaptor, but <%s> wat not implemented", cp.getClass().getName()); } do{ if(cp.getClass().isAssignableFrom(clazz)) { return this; } // next processor try { if(cp instanceof CellProcessorAdaptor) { final Field field = CellProcessorAdaptor.class.getDeclaredField("next"); field.setAccessible(true); cp = (CellProcessor) field.get(cp); } else { break; } } catch(ReflectiveOperationException e) { failWithMessage("Fail get field of CellProcessor next chain. :%s", e.getMessage()); } } while(cp != null); StringWriter writer = new StringWriter(); TestUtils.printCellProcessorChain((CellProcessor)actual, new PrintWriter(writer)); writer.flush(); failWithMessage("Expected CellProcessor should be implemeted CellProcessorAdaptor, but <%s> wat not implemented.%s", cp.getClass().getName(), writer.toString()); return this; } }