package net.time4j.tz.model; import net.time4j.Month; import net.time4j.PlainDate; import net.time4j.PlainTime; import net.time4j.PlainTimestamp; import net.time4j.Weekday; import net.time4j.tz.TZID; import net.time4j.tz.Timezone; import net.time4j.tz.TransitionHistory; import net.time4j.tz.ZonalOffset; import net.time4j.tz.ZoneModelProvider; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @RunWith(JUnit4.class) public class StartOfDayTest { private static final String NAME = StartOfDayTest.class.getName(); private static final TransitionHistory TEST_HISTORY = createModel(); @BeforeClass public static void init() { Timezone.registerProvider(new TestProvider()); } @Test public void startOfDayNormal() { String tzid = NAME + "~" + "America/Sao_Paulo"; PlainDate date = PlainDate.of(2010, 5, 31); PlainTimestamp tsp = date.atStartOfDay(tzid); assertThat(tsp, is(date.atTime(0, 0))); assertThat(tsp.in(Timezone.of(tzid)), is(date.atFirstMoment(() -> tzid))); } @Test public void startOfDayIfSummerToWinter() { // overlap String tzid = NAME + "~" + "America/Sao_Paulo"; PlainDate date = PlainDate.of(2010, 2, 21); PlainTimestamp tsp = date.atStartOfDay(tzid); assertThat(tsp, is(date.atTime(0, 0))); assertThat(tsp.in(Timezone.of(tzid)), is(date.atFirstMoment(tzid))); } @Test public void startOfDayIfWinterToSummer() { // gap String tzid = NAME + "~" + "America/Sao_Paulo"; PlainDate date = PlainDate.of(2010, 10, 17); PlainTimestamp tsp = date.atStartOfDay(tzid); assertThat(tsp, is(date.atTime(1, 0))); assertThat(tsp.in(Timezone.of(tzid)), is(date.atFirstMoment(tzid))); } private static RuleBasedTransitionModel createModel() { DaylightSavingRule spring = GregorianTimezoneRule.ofWeekdayAfterDate( // 2010-10-17 Month.OCTOBER, 15, Weekday.SUNDAY, PlainTime.midnightAtStartOfDay(), OffsetIndicator.WALL_TIME, 3600); DaylightSavingRule autumn = GregorianTimezoneRule.ofWeekdayAfterDate( // 2010-02-21 Month.FEBRUARY, 15, Weekday.SUNDAY, PlainTime.midnightAtStartOfDay(), OffsetIndicator.WALL_TIME, 0); List<DaylightSavingRule> rules = new ArrayList<>(); rules.add(autumn); rules.add(spring); return new RuleBasedTransitionModel( ZonalOffset.ofTotalSeconds(-3 * 3600), rules); } private static class TestProvider implements ZoneModelProvider { @Override public Set<String> getAvailableIDs() { return Collections.singleton("America/Sao_Paulo"); } @Override public Map<String, String> getAliases() { return Collections.emptyMap(); } @Override public TransitionHistory load(String zoneID) { if (zoneID.equals("America/Sao_Paulo")) { return TEST_HISTORY; } return null; } @Override public String getFallback() { return ""; } @Override public String getName() { return NAME; } @Override public String getLocation() { return ""; } @Override public String getVersion() { return ""; } } }