]> git.basschouten.com Git - openhab-addons.git/commitdiff
[astro] Fix for incorrect calculation of next season. (#9474)
authorHilbrand Bouwkamp <hilbrand@h72.nl>
Tue, 22 Dec 2020 19:03:08 +0000 (20:03 +0100)
committerGitHub <noreply@github.com>
Tue, 22 Dec 2020 19:03:08 +0000 (20:03 +0100)
Signed-off-by: Hilbrand Bouwkamp <hilbrand@h72.nl>
bundles/org.openhab.binding.astro/src/main/java/org/openhab/binding/astro/internal/model/Season.java
bundles/org.openhab.binding.astro/src/main/java/org/openhab/binding/astro/internal/util/DateTimeUtils.java
bundles/org.openhab.binding.astro/src/test/java/org/openhab/binding/astro/internal/util/DateTimeUtilsTest.java [new file with mode: 0644]

index f173e385496ed89093a6971f3fb5db3f2ca4f0ed..ed788eea5f3966ee10fbf74e62ad75e8da76084f 100644 (file)
@@ -109,7 +109,7 @@ public class Season {
      * Returns the next season.
      */
     public Calendar getNextSeason() {
-        return DateTimeUtils.getNext(spring, summer, autumn, winter);
+        return DateTimeUtils.getNextFromToday(spring, summer, autumn, winter);
     }
 
     /**
index c98db93b84e3a69e1949322957e8a38fa82c231f..fa916d5d762d3554d69d6fc3a87641908b793405 100644 (file)
@@ -159,15 +159,22 @@ public class DateTimeUtils {
     /**
      * Returns the next Calendar from today.
      */
-    public static Calendar getNext(Calendar... calendars) {
-        Calendar now = Calendar.getInstance();
+    public static Calendar getNextFromToday(Calendar... calendars) {
+        return getNext(Calendar.getInstance(), calendars);
+    }
+
+    static Calendar getNext(Calendar now, Calendar... calendars) {
         Calendar next = null;
+        Calendar firstSeasonOfYear = null;
         for (Calendar calendar : calendars) {
+            if (firstSeasonOfYear == null || calendar.before(firstSeasonOfYear)) {
+                firstSeasonOfYear = calendar;
+            }
             if (calendar.after(now) && (next == null || calendar.before(next))) {
                 next = calendar;
             }
         }
-        return next;
+        return next == null ? firstSeasonOfYear : next;
     }
 
     /**
diff --git a/bundles/org.openhab.binding.astro/src/test/java/org/openhab/binding/astro/internal/util/DateTimeUtilsTest.java b/bundles/org.openhab.binding.astro/src/test/java/org/openhab/binding/astro/internal/util/DateTimeUtilsTest.java
new file mode 100644 (file)
index 0000000..b5a4218
--- /dev/null
@@ -0,0 +1,77 @@
+/**
+ * Copyright (c) 2010-2020 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.astro.internal.util;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.openhab.binding.astro.internal.calc.SeasonCalc;
+import org.openhab.binding.astro.internal.model.Season;
+
+/**
+ * Test class for {@link DateTimeUtils}.
+ *
+ * @author Hilbrand Bouwkamp - Initial contribution
+ */
+public class DateTimeUtilsTest {
+
+    private static final TimeZone TIME_ZONE = TimeZone.getTimeZone("Europe/Amsterdam");
+    private static final Calendar JAN_20_2020 = newCalendar(2020, Calendar.JANUARY, 20, 1, 0, TIME_ZONE);
+    private static final Calendar MAY_20_2020 = newCalendar(2020, Calendar.MAY, 20, 1, 0, TIME_ZONE);
+    private static final Calendar SEPT_20_2020 = newCalendar(2020, Calendar.SEPTEMBER, 20, 1, 0, TIME_ZONE);
+    private static final Calendar DEC_10_2020 = newCalendar(2020, Calendar.DECEMBER, 1, 1, 0, TIME_ZONE);
+    private static final double AMSTERDAM_LATITUDE = 52.367607;
+    private static final double SYDNEY_LATITUDE = -33.87;
+
+    private SeasonCalc seasonCalc;
+
+    @BeforeEach
+    public void init() {
+        seasonCalc = new SeasonCalc();
+    }
+
+    @Test
+    public void testGetSeasonAmsterdam() {
+        Season season = seasonCalc.getSeason(DEC_10_2020, AMSTERDAM_LATITUDE, true);
+        assertNextSeason(season.getSpring(), JAN_20_2020, season);
+        assertNextSeason(season.getSummer(), MAY_20_2020, season);
+        assertNextSeason(season.getWinter(), SEPT_20_2020, season);
+        assertNextSeason(season.getSpring(), DEC_10_2020, season);
+    }
+
+    @Test
+    public void testGetSeasonSydney() {
+        Season season = seasonCalc.getSeason(DEC_10_2020, SYDNEY_LATITUDE, true);
+        assertNextSeason(season.getAutumn(), JAN_20_2020, season);
+        assertNextSeason(season.getWinter(), MAY_20_2020, season);
+        assertNextSeason(season.getSummer(), SEPT_20_2020, season);
+        assertNextSeason(season.getAutumn(), DEC_10_2020, season);
+    }
+
+    private void assertNextSeason(Calendar expectedSeason, Calendar date, Season season) {
+        assertEquals(expectedSeason, DateTimeUtils.getNext(date, season.getSpring(), season.getSummer(),
+                season.getAutumn(), season.getWinter()));
+    }
+
+    private static Calendar newCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, TimeZone zone) {
+        Calendar result = new GregorianCalendar(year, month, dayOfMonth, hourOfDay, minute);
+        result.setTimeZone(zone);
+
+        return result;
+    }
+}