[astro] Fix for incorrect calculation of next season. (#9474)

Signed-off-by: Hilbrand Bouwkamp <hilbrand@h72.nl>
pull/9484/head
Hilbrand Bouwkamp 2020-12-22 20:03:08 +01:00 committed by GitHub
parent 2d1b32fabe
commit 4f7ac4ea30
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 88 additions and 4 deletions

View 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);
}
/**

View 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;
}
/**

View File

@ -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;
}
}