diff options
Diffstat (limited to 'src/test/java/junitparams/ParamsConverterTest.java')
-rw-r--r-- | src/test/java/junitparams/ParamsConverterTest.java | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/src/test/java/junitparams/ParamsConverterTest.java b/src/test/java/junitparams/ParamsConverterTest.java new file mode 100644 index 0000000..0bdd5a1 --- /dev/null +++ b/src/test/java/junitparams/ParamsConverterTest.java @@ -0,0 +1,168 @@ +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"); + } + } + } +} |