/*
* Copyright 2011-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package kr.debop4j.timeperiod.test.tools;
import kr.debop4j.timeperiod.*;
import kr.debop4j.timeperiod.test.TimePeriodTestBase;
import kr.debop4j.timeperiod.timerange.*;
import kr.debop4j.timeperiod.tools.Durations;
import kr.debop4j.timeperiod.tools.TimeSpec;
import kr.debop4j.timeperiod.tools.Times;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.joda.time.Duration;
import org.junit.Test;
import static kr.debop4j.timeperiod.tools.Times.*;
import static org.fest.assertions.Assertions.assertThat;
/**
* kr.debop4j.timeperiod.test.tools.TimesPeriodTest
*
* @author 배성혁 sunghyouk.bae@gmail.com
* @since 13. 5. 24. 오전 5:22
*/
@Slf4j
public class TimesPeriodTest extends TimePeriodTestBase {
public static final int PeriodCount = 24;
private DateTime startTime = new DateTime(2008, 4, 10, 5, 33, 24, 345);
private DateTime endTime = new DateTime(2018, 10, 20, 13, 43, 12, 599);
private Duration duration = new Duration(startTime, endTime);
@Test
public void getTimeBlockByDuration() {
TimeBlock block = getTimeBlock(startTime, duration);
assertThat(block.getStart()).isEqualTo(startTime);
assertThat(block.getEnd()).isEqualTo(endTime);
assertThat(block.getDuration()).isEqualTo(duration);
}
@Test
public void getTimeBlockByStartAndEnd() {
TimeBlock block = getTimeBlock(startTime, endTime);
assertThat(block.getStart()).isEqualTo(startTime);
assertThat(block.getEnd()).isEqualTo(endTime);
assertThat(block.getDuration()).isEqualTo(duration);
}
@Test
public void getTimeRangeByDuration() {
TimeRange range = getTimeRange(startTime, duration);
assertThat(range.getStart()).isEqualTo(startTime);
assertThat(range.getEnd()).isEqualTo(endTime);
assertThat(range.getDuration()).isEqualTo(duration);
range = getTimeRange(startTime, Durations.negate(duration));
assertThat(range.getStart()).isEqualTo(startTime.minus(duration));
assertThat(range.getEnd()).isEqualTo(endTime.minus(duration));
assertThat(range.getDuration()).isEqualTo(duration);
}
@Test
public void getTimeRangeByStartAndEnd() {
TimeRange range = getTimeRange(startTime, endTime);
assertThat(range.getStart()).isEqualTo(startTime);
assertThat(range.getEnd()).isEqualTo(endTime);
assertThat(range.getDuration()).isEqualTo(duration);
}
@Test
public void getPeriodOfTest() {
for (PeriodUnit unit : PeriodUnit.values()) {
if (unit == PeriodUnit.Millisecond)
continue;
DateTime moment = startTime;
ITimePeriod period = Times.getPeriodOf(moment, unit);
assertThat(period.hasInside(moment)).isTrue();
assertThat(period.hasInside(endTime)).isFalse();
log.trace("[{}] : period[{}] hasInside=[{}]", unit, period, moment);
}
}
@Test
public void getPeriodOfWithCalendar() {
for (PeriodUnit unit : PeriodUnit.values()) {
if (unit == PeriodUnit.Millisecond)
continue;
DateTime moment = startTime;
ITimeCalendar calendar = TimeCalendar.getEmptyOffset();
ITimePeriod period = Times.getPeriodOf(moment, unit, calendar);
assertThat(period.hasInside(moment)).isTrue();
assertThat(period.hasInside(endTime)).isFalse();
log.trace("[{}] : period[{}] hasInside=[{}]", unit, period, moment);
}
}
@Test
public void getPeriodsOfTest() {
for (PeriodUnit unit : PeriodUnit.values()) {
if (unit == PeriodUnit.Millisecond)
continue;
for (int count = 1; count < 5; count++) {
DateTime moment = startTime;
ITimeCalendar calendar = TimeCalendar.getEmptyOffset();
ITimePeriod period = Times.getPeriodsOf(moment, unit, count, calendar);
assertThat(period.hasPeriod()).isTrue();
assertThat(period.hasInside(moment)).isTrue();
assertThat(period.hasInside(endTime)).isFalse();
log.trace("[{}] : period[{}] hasInside=[{}]", unit, period, moment);
}
}
}
@Test
public void getYearRangeTest() {
YearRange yearRange = getYearRange(startTime, TimeCalendar.getEmptyOffset());
DateTime start = startTimeOfYear(startTime);
assertThat(yearRange.getStart()).isEqualTo(start);
assertThat(yearRange.getStartYear()).isEqualTo(start.getYear());
assertThat(yearRange.getEnd()).isEqualTo(start.plusYears(1));
assertThat(yearRange.getEndYear()).isEqualTo(start.plusYears(1).getYear());
}
@Test
public void getYearRangesTest() {
for (int i = 1; i < PeriodCount; i++) {
YearRangeCollection yearRanges = getYearRanges(startTime, i, TimeCalendar.getEmptyOffset());
DateTime start = startTimeOfYear(startTime);
assertThat(yearRanges.getStart()).isEqualTo(start);
assertThat(yearRanges.getStartYear()).isEqualTo(start.getYear());
assertThat(yearRanges.getEnd()).isEqualTo(start.plusYears(i));
assertThat(yearRanges.getEndYear()).isEqualTo(start.plusYears(i).getYear());
}
}
@Test
public void getHalfyearRangeTest() {
HalfyearRange hy = getHalfyearRange(startTime, TimeCalendar.getEmptyOffset());
DateTime start = startTimeOfHalfyear(startTime);
assertThat(hy.getStart()).isEqualTo(start);
assertThat(hy.getEnd()).isEqualTo(hy.nextHalfyear().getStart());
}
@Test
public void getHalfyearRangesTest() {
for (int i = 1; i < PeriodCount; i++) {
HalfyearRangeCollection hys = getHalfyearRanges(startTime, i, TimeCalendar.getEmptyOffset());
DateTime start = startTimeOfHalfyear(startTime);
assertThat(hys.getStart()).isEqualTo(start);
assertThat(hys.getEnd()).isEqualTo(start.plusMonths(i * TimeSpec.MonthsPerHalfyear));
assertThat(hys.getHalfyearCount()).isEqualTo(i);
}
}
@Test
public void getQuarterRangeTest() {
QuarterRange qr = getQuarterRange(startTime, TimeCalendar.getEmptyOffset());
DateTime start = startTimeOfQuarter(startTime);
assertThat(qr.getStart()).isEqualTo(start);
assertThat(qr.getEnd()).isEqualTo(qr.nextQuarter().getStart());
}
@Test
public void getQuarterRangesTest() {
for (int i = 1; i < PeriodCount; i++) {
QuarterRangeCollection quarters = getQuarterRanges(startTime, i, TimeCalendar.getEmptyOffset());
DateTime start = startTimeOfQuarter(startTime);
assertThat(quarters.getStart()).isEqualTo(start);
assertThat(quarters.getEnd()).isEqualTo(start.plusMonths(i * TimeSpec.MonthsPerQuarter));
assertThat(quarters.getQuarterCount()).isEqualTo(i);
}
}
@Test
public void getMonthRangeTest() {
MonthRange mr = getMonthRange(startTime, TimeCalendar.getEmptyOffset());
DateTime start = startTimeOfMonth(startTime);
assertThat(mr.getStart()).isEqualTo(start);
assertThat(mr.getEnd()).isEqualTo(mr.nextMonth().getStart());
}
@Test
public void getMonthRangesTest() {
for (int i = 1; i < PeriodCount; i++) {
MonthRangeCollection mrs = getMonthRanges(startTime, i, TimeCalendar.getEmptyOffset());
DateTime start = startTimeOfMonth(startTime);
assertThat(mrs.getStart()).isEqualTo(start);
assertThat(mrs.getEnd()).isEqualTo(start.plusMonths(i));
assertThat(mrs.getMonthCount()).isEqualTo(i);
}
}
@Test
public void getWeekRangeTest() {
WeekRange wr = Times.getWeekRange(startTime, TimeCalendar.getEmptyOffset());
DateTime start = startTimeOfWeek(startTime);
assertThat(wr.getStart()).isEqualTo(start);
assertThat(wr.getEnd()).isEqualTo(wr.nextWeek().getStart());
}
@Test
public void getWeekRangesTest() {
for (int i = 1; i < PeriodCount; i++) {
WeekRangeCollection wks = getWeekRanges(startTime, i, TimeCalendar.getEmptyOffset());
DateTime start = startTimeOfWeek(startTime);
assertThat(wks.getStart()).isEqualTo(start);
assertThat(wks.getEnd()).isEqualTo(start.plusWeeks(i));
assertThat(wks.getWeekCount()).isEqualTo(i);
}
}
@Test
public void getDayRangeTest() {
DayRange dr = getDayRange(startTime, TimeCalendar.getEmptyOffset());
DateTime start = startTimeOfDay(startTime);
assertThat(dr.getStart()).isEqualTo(start);
assertThat(dr.getEnd()).isEqualTo(dr.nextDay().getStart());
}
@Test
public void getDayRangesTest() {
for (int i = 1; i < PeriodCount; i++) {
DayRangeCollection drs = getDayRanges(startTime, i, TimeCalendar.getEmptyOffset());
DateTime start = startTimeOfDay(startTime);
assertThat(drs.getStart()).isEqualTo(start);
assertThat(drs.getEnd()).isEqualTo(start.plusDays(i));
assertThat(drs.getDayCount()).isEqualTo(i);
}
}
@Test
public void getHourRangeTest() {
HourRange hr = getHourRange(startTime, TimeCalendar.getEmptyOffset());
DateTime start = startTimeOfHour(startTime);
assertThat(hr.getStart()).isEqualTo(start);
assertThat(hr.getEnd()).isEqualTo(hr.nextHour().getStart());
}
@Test
public void getHourRangesTest() {
for (int i = 1; i < PeriodCount; i++) {
HourRangeCollection drs = getHourRanges(startTime, i, TimeCalendar.getEmptyOffset());
DateTime start = startTimeOfHour(startTime);
assertThat(drs.getStart()).isEqualTo(start);
assertThat(drs.getEnd()).isEqualTo(start.plusHours(i));
assertThat(drs.getHourCount()).isEqualTo(i);
}
}
@Test
public void getMinuteRangeTest() {
MinuteRange hr = getMinuteRange(startTime, TimeCalendar.getEmptyOffset());
DateTime start = startTimeOfMinute(startTime);
assertThat(hr.getStart()).isEqualTo(start);
assertThat(hr.getEnd()).isEqualTo(hr.nextMinute().getStart());
}
@Test
public void getMinuteRangesTest() {
for (int i = 1; i < PeriodCount; i++) {
MinuteRangeCollection drs = getMinuteRanges(startTime, i, TimeCalendar.getEmptyOffset());
DateTime start = startTimeOfMinute(startTime);
assertThat(drs.getStart()).isEqualTo(start);
assertThat(drs.getEnd()).isEqualTo(start.plusMinutes(i));
assertThat(drs.getMinuteCount()).isEqualTo(i);
}
}
}