Skip to content

Commit

Permalink
[astro] Fix for incorrect calculation of next season. (openhab#9474)
Browse files Browse the repository at this point in the history
Signed-off-by: Hilbrand Bouwkamp <[email protected]>
  • Loading branch information
Hilbrand authored and seaside1 committed Dec 28, 2020
1 parent 64c7a3c commit 43514b8
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ public void setName(SeasonName name) {
* Returns the next season.
*/
public Calendar getNextSeason() {
return DateTimeUtils.getNext(spring, summer, autumn, winter);
return DateTimeUtils.getNextFromToday(spring, summer, autumn, winter);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,15 +159,22 @@ public static Date getDate(Calendar calendar) {
/**
* 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;
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
}

0 comments on commit 43514b8

Please sign in to comment.