Repository: incubator-tamaya-sandbox Updated Branches: refs/heads/master 041f59985 -> 6fa2b34a7
TAMAYA-72; Added converter for jodatime Duration. Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/commit/6fa2b34a Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/tree/6fa2b34a Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/diff/6fa2b34a Branch: refs/heads/master Commit: 6fa2b34a79143942757d89fe731f059c79a6a72f Parents: 041f599 Author: anatole <anat...@apache.org> Authored: Mon Oct 31 00:21:55 2016 +0100 Committer: anatole <anat...@apache.org> Committed: Mon Oct 31 00:21:55 2016 +0100 ---------------------------------------------------------------------- .../apache/tamaya/jodatime/PeriodConverter.java | 4 + .../org.apache.tamaya.spi.PropertyConverter | 1 + .../tamaya/jodatime/DurationConverterTest.java | 81 ++++++++++++++++++++ 3 files changed, 86 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/6fa2b34a/jodatime/src/main/java/org/apache/tamaya/jodatime/PeriodConverter.java ---------------------------------------------------------------------- diff --git a/jodatime/src/main/java/org/apache/tamaya/jodatime/PeriodConverter.java b/jodatime/src/main/java/org/apache/tamaya/jodatime/PeriodConverter.java index a350d58..2b946e2 100644 --- a/jodatime/src/main/java/org/apache/tamaya/jodatime/PeriodConverter.java +++ b/jodatime/src/main/java/org/apache/tamaya/jodatime/PeriodConverter.java @@ -84,6 +84,10 @@ public class PeriodConverter implements PropertyConverter<org.joda.time.Period> } private void addSupportedFormats(ConversionContext context) { + if(context==null){ + // use case when called internally from DurationConverter. + return; + } context.addSupportedFormats(PeriodConverter.class, "PyYmMwWdDThHmMsS"); context.addSupportedFormats(PeriodConverter.class, "Pyyyy-mm-ddThh:mm:ss"); } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/6fa2b34a/jodatime/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertyConverter ---------------------------------------------------------------------- diff --git a/jodatime/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertyConverter b/jodatime/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertyConverter index f312e9d..13c48c5 100644 --- a/jodatime/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertyConverter +++ b/jodatime/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertyConverter @@ -19,3 +19,4 @@ org.apache.tamaya.jodatime.DateTimeConverter org.apache.tamaya.jodatime.DateTimeZoneConverter org.apache.tamaya.jodatime.PeriodConverter +org.apache.tamaya.jodatime.DurationConverter http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/6fa2b34a/jodatime/src/test/java/org/apache/tamaya/jodatime/DurationConverterTest.java ---------------------------------------------------------------------- diff --git a/jodatime/src/test/java/org/apache/tamaya/jodatime/DurationConverterTest.java b/jodatime/src/test/java/org/apache/tamaya/jodatime/DurationConverterTest.java index f1141a6..39cf41b 100644 --- a/jodatime/src/test/java/org/apache/tamaya/jodatime/DurationConverterTest.java +++ b/jodatime/src/test/java/org/apache/tamaya/jodatime/DurationConverterTest.java @@ -18,5 +18,86 @@ */ package org.apache.tamaya.jodatime; +import org.apache.tamaya.TypeLiteral; +import org.apache.tamaya.spi.ConversionContext; +import org.joda.time.Duration; +import org.joda.time.format.ISOPeriodFormat; +import org.joda.time.format.PeriodFormatter; +import org.junit.Test; +import org.mockito.Mockito; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasSize; + public class DurationConverterTest { + + /* + * I am aware of the 'Parameterized tests' feature of JUnit but + * decided not to use it. Oliver B. Fischer, 3th April 2015 + */ + + private static DurationConverter converter = new DurationConverter(); + + private static PeriodFormatter FORMATTER = ISOPeriodFormat.standard(); + + @Test + public void canConvertPropertiesInAllSupportedFormats() { + Object[][] inputResultPairs = { + // Duration format + {"PT72.345S", Duration.parse("PT72.345S")}, + // ISO format + {"P1D", FORMATTER.parsePeriod("P1DT0H0M0S").toStandardDuration()}, + {"PT1S", FORMATTER.parsePeriod("P0DT0H0M1S").toStandardDuration()}, + + // Alternative format + {"00T00:00:05", FORMATTER.parsePeriod("P0DT0H0M5S").toStandardDuration()}, + + }; + + ConversionContext context = Mockito.mock(ConversionContext.class); + + for (Object[] pair : inputResultPairs) { + Duration duration = converter.convert((String) pair[0], context); + + assertThat("Converter failed to convert input value " + pair[0], duration, notNullValue()); + assertThat(duration, equalTo((Duration) pair[1])); + } + } + + @Test + public void invalidInputValuesResultInReturningNull() { + String[] inputValues = { + "01-03T00:00:05", + "00:00:05", + "000011215", + "-", + "fooBar", + }; + + ConversionContext context = Mockito.mock(ConversionContext.class); + + for (String input : inputValues) { + Duration duration = converter.convert(input, context); + + assertThat(duration, nullValue()); + } + } + + @Test + public void allSupportedFormatsAreAddedToTheConversionContext() { + String name = DurationConverter.class.getSimpleName(); + + ConversionContext context = new ConversionContext.Builder(TypeLiteral.of(Duration.class)).build(); + + converter.convert("P0DT0H0M0S", context); + + assertThat(context.getSupportedFormats(), hasSize(3)); + assertThat(context.getSupportedFormats(), hasItem("PdDThHmMsS (" + name + ")")); + assertThat(context.getSupportedFormats(), hasItem("ddThh:mm:ss (" + name + ")")); + assertThat(context.getSupportedFormats(), hasItem("PTa.bS ("+name+")")); + } }