1*b2c653efSSorin Basca package junitparams; 2*b2c653efSSorin Basca 3*b2c653efSSorin Basca import java.lang.annotation.ElementType; 4*b2c653efSSorin Basca import java.lang.annotation.Retention; 5*b2c653efSSorin Basca import java.lang.annotation.RetentionPolicy; 6*b2c653efSSorin Basca import java.lang.annotation.Target; 7*b2c653efSSorin Basca import java.text.ParseException; 8*b2c653efSSorin Basca import java.text.SimpleDateFormat; 9*b2c653efSSorin Basca import java.util.Arrays; 10*b2c653efSSorin Basca import java.util.Calendar; 11*b2c653efSSorin Basca import java.util.Date; 12*b2c653efSSorin Basca import java.util.List; 13*b2c653efSSorin Basca 14*b2c653efSSorin Basca import org.junit.Test; 15*b2c653efSSorin Basca import org.junit.runner.RunWith; 16*b2c653efSSorin Basca 17*b2c653efSSorin Basca import junitparams.converters.ConversionFailedException; 18*b2c653efSSorin Basca import junitparams.converters.ConvertParam; 19*b2c653efSSorin Basca import junitparams.converters.Converter; 20*b2c653efSSorin Basca import junitparams.converters.Param; 21*b2c653efSSorin Basca import junitparams.converters.ParamConverter; 22*b2c653efSSorin Basca 23*b2c653efSSorin Basca import static org.assertj.core.api.Assertions.*; 24*b2c653efSSorin Basca 25*b2c653efSSorin Basca @RunWith(JUnitParamsRunner.class) 26*b2c653efSSorin Basca public class ParamsConverterTest { 27*b2c653efSSorin Basca 28*b2c653efSSorin Basca @Test 29*b2c653efSSorin Basca @Parameters({"01.12.2012"}) convertSingleParam( @onvertParamvalue = StringToDateConverter.class, options = "dd.MM.yyyy") Date date)30*b2c653efSSorin Basca public void convertSingleParam( 31*b2c653efSSorin Basca @ConvertParam(value = StringToDateConverter.class, options = "dd.MM.yyyy") Date date) { 32*b2c653efSSorin Basca Calendar calendar = createCalendarWithDate(date); 33*b2c653efSSorin Basca assertCalendarDate(calendar); 34*b2c653efSSorin Basca } 35*b2c653efSSorin Basca 36*b2c653efSSorin Basca @Test 37*b2c653efSSorin Basca @Parameters({"01.12.2012,A"}) convertMultipleParams( @onvertParamvalue = StringToDateConverter.class, options = "dd.MM.yyyy") Date date, @ConvertParam(LetterToNumberConverter.class) int num)38*b2c653efSSorin Basca public void convertMultipleParams( 39*b2c653efSSorin Basca @ConvertParam(value = StringToDateConverter.class, options = "dd.MM.yyyy") Date date, 40*b2c653efSSorin Basca @ConvertParam(LetterToNumberConverter.class) int num) { 41*b2c653efSSorin Basca Calendar calendar = createCalendarWithDate(date); 42*b2c653efSSorin Basca assertCalendarDate(calendar); 43*b2c653efSSorin Basca assertThat(num).isEqualTo(1); 44*b2c653efSSorin Basca } 45*b2c653efSSorin Basca 46*b2c653efSSorin Basca @Test 47*b2c653efSSorin Basca @Parameters(method = "params") convertParamsFromMethod( @onvertParamvalue = StringToDateConverter.class, options = "dd.MM.yyyy") Date date)48*b2c653efSSorin Basca public void convertParamsFromMethod( 49*b2c653efSSorin Basca @ConvertParam(value = StringToDateConverter.class, options = "dd.MM.yyyy") Date date) { 50*b2c653efSSorin Basca Calendar calendar = createCalendarWithDate(date); 51*b2c653efSSorin Basca assertCalendarDate(calendar); 52*b2c653efSSorin Basca } 53*b2c653efSSorin Basca 54*b2c653efSSorin Basca @Test 55*b2c653efSSorin Basca @Parameters({"01.12.2012"}) convertParamsUsingParamAnnotation(@aramconverter = SimpleDateConverter.class) Date date)56*b2c653efSSorin Basca public void convertParamsUsingParamAnnotation(@Param(converter = SimpleDateConverter.class) Date date) { 57*b2c653efSSorin Basca Calendar calendar = createCalendarWithDate(date); 58*b2c653efSSorin Basca assertCalendarDate(calendar); 59*b2c653efSSorin Basca } 60*b2c653efSSorin Basca 61*b2c653efSSorin Basca @Test 62*b2c653efSSorin Basca @Parameters({"01.12.2012"}) convertParamsUsingCustomParamAnnotation(@ateParam Date date)63*b2c653efSSorin Basca public void convertParamsUsingCustomParamAnnotation(@DateParam Date date) { 64*b2c653efSSorin Basca Calendar calendar = createCalendarWithDate(date); 65*b2c653efSSorin Basca assertCalendarDate(calendar); 66*b2c653efSSorin Basca } 67*b2c653efSSorin Basca 68*b2c653efSSorin Basca @Test 69*b2c653efSSorin Basca @Parameters(method = "params") convertParamsFromMethodUsingCustomParamAnnotation(@ateParam Date date)70*b2c653efSSorin Basca public void convertParamsFromMethodUsingCustomParamAnnotation(@DateParam Date date) { 71*b2c653efSSorin Basca Calendar calendar = createCalendarWithDate(date); 72*b2c653efSSorin Basca assertCalendarDate(calendar); 73*b2c653efSSorin Basca } 74*b2c653efSSorin Basca params()75*b2c653efSSorin Basca private List<String> params() { 76*b2c653efSSorin Basca return Arrays.asList("01.12.2012"); 77*b2c653efSSorin Basca } 78*b2c653efSSorin Basca 79*b2c653efSSorin Basca @Test 80*b2c653efSSorin Basca @Parameters({"2012-12-01"}) convertParamsUsingCustomParamAnnotationOverridingAttributes(@ateParamformat = "yyyy-MM-dd") Date date)81*b2c653efSSorin Basca public void convertParamsUsingCustomParamAnnotationOverridingAttributes(@DateParam(format = "yyyy-MM-dd") Date date) { 82*b2c653efSSorin Basca Calendar calendar = createCalendarWithDate(date); 83*b2c653efSSorin Basca assertCalendarDate(calendar); 84*b2c653efSSorin Basca } 85*b2c653efSSorin Basca 86*b2c653efSSorin Basca @Test 87*b2c653efSSorin Basca @Parameters({"2012-12-01"}) passesParametersWithOtherAnnotations(@ther String parameter)88*b2c653efSSorin Basca public void passesParametersWithOtherAnnotations(@Other String parameter) { 89*b2c653efSSorin Basca assertThat(parameter) 90*b2c653efSSorin Basca .isExactlyInstanceOf(String.class) 91*b2c653efSSorin Basca .isEqualTo("2012-12-01"); 92*b2c653efSSorin Basca } 93*b2c653efSSorin Basca assertCalendarDate(Calendar calendar)94*b2c653efSSorin Basca private void assertCalendarDate(Calendar calendar) { 95*b2c653efSSorin Basca assertThat(calendar.get(Calendar.YEAR)).isEqualTo(2012); 96*b2c653efSSorin Basca assertThat(calendar.get(Calendar.MONTH)).isEqualTo(11); 97*b2c653efSSorin Basca assertThat(calendar.get(Calendar.DAY_OF_MONTH)).isEqualTo(1); 98*b2c653efSSorin Basca } 99*b2c653efSSorin Basca createCalendarWithDate(Date date)100*b2c653efSSorin Basca private Calendar createCalendarWithDate(Date date) { 101*b2c653efSSorin Basca Calendar calendar = Calendar.getInstance(); 102*b2c653efSSorin Basca calendar.setTime(date); 103*b2c653efSSorin Basca return calendar; 104*b2c653efSSorin Basca } 105*b2c653efSSorin Basca 106*b2c653efSSorin Basca public static class LetterToNumberConverter implements ParamConverter<Integer> { convert(Object param, String options)107*b2c653efSSorin Basca public Integer convert(Object param, String options) { 108*b2c653efSSorin Basca return param.toString().charAt(0) - 64; 109*b2c653efSSorin Basca } 110*b2c653efSSorin Basca } 111*b2c653efSSorin Basca 112*b2c653efSSorin Basca public static class StringToDateConverter implements ParamConverter<Date> { convert(Object param, String options)113*b2c653efSSorin Basca public Date convert(Object param, String options) { 114*b2c653efSSorin Basca try { 115*b2c653efSSorin Basca return new SimpleDateFormat(options).parse(param.toString()); 116*b2c653efSSorin Basca } catch (ParseException e) { 117*b2c653efSSorin Basca throw new RuntimeException(e); 118*b2c653efSSorin Basca } 119*b2c653efSSorin Basca } 120*b2c653efSSorin Basca } 121*b2c653efSSorin Basca 122*b2c653efSSorin Basca @Retention(RetentionPolicy.RUNTIME) 123*b2c653efSSorin Basca @Target(ElementType.PARAMETER) 124*b2c653efSSorin Basca @Param(converter = FormattedDateConverter.class) 125*b2c653efSSorin Basca public @interface DateParam { 126*b2c653efSSorin Basca format()127*b2c653efSSorin Basca String format() default "dd.MM.yyyy"; 128*b2c653efSSorin Basca } 129*b2c653efSSorin Basca 130*b2c653efSSorin Basca @Retention(RetentionPolicy.RUNTIME) 131*b2c653efSSorin Basca @Target(ElementType.PARAMETER) 132*b2c653efSSorin Basca public @interface Other { 133*b2c653efSSorin Basca } 134*b2c653efSSorin Basca 135*b2c653efSSorin Basca public static class FormattedDateConverter implements Converter<DateParam, Date> { 136*b2c653efSSorin Basca 137*b2c653efSSorin Basca private String format; 138*b2c653efSSorin Basca 139*b2c653efSSorin Basca @Override initialize(DateParam annotation)140*b2c653efSSorin Basca public void initialize(DateParam annotation) { 141*b2c653efSSorin Basca this.format = annotation.format(); 142*b2c653efSSorin Basca } 143*b2c653efSSorin Basca 144*b2c653efSSorin Basca @Override convert(Object param)145*b2c653efSSorin Basca public Date convert(Object param) throws ConversionFailedException { 146*b2c653efSSorin Basca try { 147*b2c653efSSorin Basca return new SimpleDateFormat(format).parse(param.toString()); 148*b2c653efSSorin Basca } catch (ParseException e) { 149*b2c653efSSorin Basca throw new ConversionFailedException("failed"); 150*b2c653efSSorin Basca } 151*b2c653efSSorin Basca } 152*b2c653efSSorin Basca } 153*b2c653efSSorin Basca 154*b2c653efSSorin Basca public static class SimpleDateConverter implements Converter<Param, Date> { 155*b2c653efSSorin Basca @Override initialize(Param annotation)156*b2c653efSSorin Basca public void initialize(Param annotation) { 157*b2c653efSSorin Basca } 158*b2c653efSSorin Basca 159*b2c653efSSorin Basca @Override convert(Object param)160*b2c653efSSorin Basca public Date convert(Object param) throws ConversionFailedException { 161*b2c653efSSorin Basca try { 162*b2c653efSSorin Basca return new SimpleDateFormat("dd.MM.yyyy").parse(param.toString()); 163*b2c653efSSorin Basca } catch (ParseException e) { 164*b2c653efSSorin Basca throw new ConversionFailedException("failed"); 165*b2c653efSSorin Basca } 166*b2c653efSSorin Basca } 167*b2c653efSSorin Basca } 168*b2c653efSSorin Basca } 169