package junitparams; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import junitparams.converters.ConversionFailedException; import junitparams.converters.ConvertParam; import junitparams.converters.Converter; import junitparams.converters.Param; import junitparams.converters.ParamConverter; import static org.assertj.core.api.Assertions.*; @RunWith(JUnitParamsRunner.class) public class ParamsConverterTest { @Test @Parameters({"01.12.2012"}) public void convertSingleParam( @ConvertParam(value = StringToDateConverter.class, options = "dd.MM.yyyy") Date date) { Calendar calendar = createCalendarWithDate(date); assertCalendarDate(calendar); } @Test @Parameters({"01.12.2012,A"}) public void convertMultipleParams( @ConvertParam(value = StringToDateConverter.class, options = "dd.MM.yyyy") Date date, @ConvertParam(LetterToNumberConverter.class) int num) { Calendar calendar = createCalendarWithDate(date); assertCalendarDate(calendar); assertThat(num).isEqualTo(1); } @Test @Parameters(method = "params") public void convertParamsFromMethod( @ConvertParam(value = StringToDateConverter.class, options = "dd.MM.yyyy") Date date) { Calendar calendar = createCalendarWithDate(date); assertCalendarDate(calendar); } @Test @Parameters({"01.12.2012"}) public void convertParamsUsingParamAnnotation(@Param(converter = SimpleDateConverter.class) Date date) { Calendar calendar = createCalendarWithDate(date); assertCalendarDate(calendar); } @Test @Parameters({"01.12.2012"}) public void convertParamsUsingCustomParamAnnotation(@DateParam Date date) { Calendar calendar = createCalendarWithDate(date); assertCalendarDate(calendar); } @Test @Parameters(method = "params") public void convertParamsFromMethodUsingCustomParamAnnotation(@DateParam Date date) { Calendar calendar = createCalendarWithDate(date); assertCalendarDate(calendar); } private List<String> params() { return Arrays.asList("01.12.2012"); } @Test @Parameters({"2012-12-01"}) public void convertParamsUsingCustomParamAnnotationOverridingAttributes(@DateParam(format = "yyyy-MM-dd") Date date) { Calendar calendar = createCalendarWithDate(date); assertCalendarDate(calendar); } @Test @Parameters({"2012-12-01"}) public void passesParametersWithOtherAnnotations(@Other String parameter) { assertThat(parameter) .isExactlyInstanceOf(String.class) .isEqualTo("2012-12-01"); } private void assertCalendarDate(Calendar calendar) { assertThat(calendar.get(Calendar.YEAR)).isEqualTo(2012); assertThat(calendar.get(Calendar.MONTH)).isEqualTo(11); assertThat(calendar.get(Calendar.DAY_OF_MONTH)).isEqualTo(1); } private Calendar createCalendarWithDate(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar; } public static class LetterToNumberConverter implements ParamConverter<Integer> { public Integer convert(Object param, String options) { return param.toString().charAt(0) - 64; } } public static class StringToDateConverter implements ParamConverter<Date> { public Date convert(Object param, String options) { try { return new SimpleDateFormat(options).parse(param.toString()); } catch (ParseException e) { throw new RuntimeException(e); } } } @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) @Param(converter = FormattedDateConverter.class) public @interface DateParam { String format() default "dd.MM.yyyy"; } @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) public @interface Other { } public static class FormattedDateConverter implements Converter<DateParam, Date> { private String format; @Override public void initialize(DateParam annotation) { this.format = annotation.format(); } @Override public Date convert(Object param) throws ConversionFailedException { try { return new SimpleDateFormat(format).parse(param.toString()); } catch (ParseException e) { throw new ConversionFailedException("failed"); } } } public static class SimpleDateConverter implements Converter<Param, Date> { @Override public void initialize(Param annotation) { } @Override public Date convert(Object param) throws ConversionFailedException { try { return new SimpleDateFormat("dd.MM.yyyy").parse(param.toString()); } catch (ParseException e) { throw new ConversionFailedException("failed"); } } } }