From 81cf69929ce8c64ab5cacb78c5002cadbcf41d29 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Ho=C3=9F?= Date: Tue, 20 Aug 2013 22:59:37 +0200 Subject: [PATCH] Fixed calculation of calendar date from fiscal-year values. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The implementation was actually missing. Added some tests to ensure that this won't happen again.. Signed-off-by: Sebastian Hoß --- .../sebhoss/time/AbstractFiscalDateCalculator.java | 11 +++- .../sebhoss/time/EarlyFiscalDateCalculator.java | 12 +++-- .../sebhoss/time/LateFiscalDateCalculator.java | 12 +++-- .../sebhoss/time/FiscalDateCalculatorTest.java | 62 ++++++++++++++++++++++ 4 files changed, 90 insertions(+), 7 deletions(-) create mode 100644 src/test/java/com/github/sebhoss/time/FiscalDateCalculatorTest.java diff --git a/src/main/java/com/github/sebhoss/time/AbstractFiscalDateCalculator.java b/src/main/java/com/github/sebhoss/time/AbstractFiscalDateCalculator.java index aa99f3b..c4af92a 100644 --- a/src/main/java/com/github/sebhoss/time/AbstractFiscalDateCalculator.java +++ b/src/main/java/com/github/sebhoss/time/AbstractFiscalDateCalculator.java @@ -55,7 +55,16 @@ abstract class AbstractFiscalDateCalculator implements FiscalDateCalculator { @Override public LocalDate calculateCalendarDate(final int fiscalYear, final int fiscalMonth, final int fiscalDay) { - return new LocalDate(); + final int calendarYear = calculateCalendarYear(fiscalYear, fiscalMonth); + final int calendarMonth = calculateCalendarMonth(fiscalMonth); + + return new LocalDate(calendarYear, calendarMonth, fiscalDay); + } + + private final int calculateCalendarMonth(final int fiscalMonth) { + return (fiscalMonth + fiscalYearStartMonth - 1) % 12; } + protected abstract int calculateCalendarYear(int fiscalYear, int fiscalMonth); + } diff --git a/src/main/java/com/github/sebhoss/time/EarlyFiscalDateCalculator.java b/src/main/java/com/github/sebhoss/time/EarlyFiscalDateCalculator.java index 99f9dd2..87618c3 100644 --- a/src/main/java/com/github/sebhoss/time/EarlyFiscalDateCalculator.java +++ b/src/main/java/com/github/sebhoss/time/EarlyFiscalDateCalculator.java @@ -9,9 +9,6 @@ package com.github.sebhoss.time; import org.joda.time.LocalDate; -/** - * TODO: Write documentation - */ final class EarlyFiscalDateCalculator extends AbstractFiscalDateCalculator { EarlyFiscalDateCalculator(final int fiscalStartMonth) { @@ -27,4 +24,13 @@ final class EarlyFiscalDateCalculator extends AbstractFiscalDateCalculator { return calendarDate.getYear(); } + @Override + protected int calculateCalendarYear(final int fiscalYear, final int fiscalMonth) { + if (fiscalMonth <= 12 - fiscalYearStartMonth + 1) { + return fiscalYear - 1; + } + + return fiscalYear; + } + } diff --git a/src/main/java/com/github/sebhoss/time/LateFiscalDateCalculator.java b/src/main/java/com/github/sebhoss/time/LateFiscalDateCalculator.java index ff189df..0613a36 100644 --- a/src/main/java/com/github/sebhoss/time/LateFiscalDateCalculator.java +++ b/src/main/java/com/github/sebhoss/time/LateFiscalDateCalculator.java @@ -9,9 +9,6 @@ package com.github.sebhoss.time; import org.joda.time.LocalDate; -/** - * TODO: Write documentation - */ final class LateFiscalDateCalculator extends AbstractFiscalDateCalculator { LateFiscalDateCalculator(final int fiscalStartMonth) { @@ -27,4 +24,13 @@ final class LateFiscalDateCalculator extends AbstractFiscalDateCalculator { return calendarDate.getYear() - 1; } + @Override + protected int calculateCalendarYear(final int fiscalYear, final int fiscalMonth) { + if (fiscalMonth <= 12 - fiscalYearStartMonth + 1) { + return fiscalYear; + } + + return fiscalYear + 1; + } + } diff --git a/src/test/java/com/github/sebhoss/time/FiscalDateCalculatorTest.java b/src/test/java/com/github/sebhoss/time/FiscalDateCalculatorTest.java new file mode 100644 index 0000000..ed2c371 --- /dev/null +++ b/src/test/java/com/github/sebhoss/time/FiscalDateCalculatorTest.java @@ -0,0 +1,62 @@ +/* + * This program is free software. It comes without any warranty, to + * the extent permitted by applicable law. You can redistribute it + * and/or modify it under the terms of the Do What The Fuck You Want + * To Public License, Version 2, as published by Sam Hocevar. See + * http://www.wtfpl.net/ for more details. + */ +package com.github.sebhoss.time; + +import org.joda.time.LocalDate; +import org.junit.Assert; +import org.junit.Test; + +import com.github.sebhoss.common.annotation.CompilerWarnings; + +/** + * Test cases for {@link FiscalDateCalculator}. + */ +@SuppressWarnings(CompilerWarnings.STATIC_METHOD) +public class FiscalDateCalculatorTest { + + /** + * Ensures that the EarlyFiscalDateCalculator can calculate the calendar date. + */ + @Test + public void shouldCalculateCalendarDateInEarlyFiscalYear() { + // given + final FiscalDateCalculator earlyCalculator = new EarlyFiscalDateCalculator(11); + final int fiscalYear = 2013; + final int fiscalMonth = 1; + final int fiscalDay = 1; + + // when + final LocalDate calendarDate = earlyCalculator.calculateCalendarDate(fiscalYear, fiscalMonth, fiscalDay); + + // then + Assert.assertEquals(2012, calendarDate.getYear()); + Assert.assertEquals(11, calendarDate.getMonthOfYear()); + Assert.assertEquals(1, calendarDate.getDayOfMonth()); + } + + /** + * Ensures that the LateFiscalDateCalculator can calculate the calendar date. + */ + @Test + public void shouldCalculateCalendarDateInLateFiscalYear() { + // given + final FiscalDateCalculator earlyCalculator = new LateFiscalDateCalculator(3); + final int fiscalYear = 2013; + final int fiscalMonth = 1; + final int fiscalDay = 1; + + // when + final LocalDate calendarDate = earlyCalculator.calculateCalendarDate(fiscalYear, fiscalMonth, fiscalDay); + + // then + Assert.assertEquals(2013, calendarDate.getYear()); + Assert.assertEquals(3, calendarDate.getMonthOfYear()); + Assert.assertEquals(1, calendarDate.getDayOfMonth()); + } + +} -- 2.11.4.GIT