/*
* 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.timeranges;
import kr.debop4j.core.Action1;
import kr.debop4j.core.parallelism.Parallels;
import kr.debop4j.timeperiod.Halfyear;
import kr.debop4j.timeperiod.Quarter;
import kr.debop4j.timeperiod.TimeCalendar;
import kr.debop4j.timeperiod.test.TimePeriodTestBase;
import kr.debop4j.timeperiod.timerange.HalfyearRange;
import kr.debop4j.timeperiod.timerange.MonthRange;
import kr.debop4j.timeperiod.timerange.QuarterRange;
import kr.debop4j.timeperiod.tools.TimeSpec;
import kr.debop4j.timeperiod.tools.Times;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.junit.Test;
import java.util.List;
import static kr.debop4j.timeperiod.tools.Times.asDate;
import static kr.debop4j.timeperiod.tools.Times.startTimeOfHalfyear;
import static org.fest.assertions.Assertions.assertThat;
/**
* kr.debop4j.timeperiod.test.timeranges.HalfyearRangeTest
*
* @author 배성혁 sunghyouk.bae@gmail.com
* @since 13. 5. 25. 오후 5:30
*/
@Slf4j
public class HalfyearRangeTest extends TimePeriodTestBase {
@Test
public void initValues() {
DateTime now = Times.now();
DateTime firstHalfyear = startTimeOfHalfyear(now.getYear(), Halfyear.First);
DateTime secondHalfyear = startTimeOfHalfyear(now.getYear(), Halfyear.Second);
HalfyearRange hyr = new HalfyearRange(now.getYear(), Halfyear.First, TimeCalendar.getEmptyOffset());
assertThat(hyr.getStart().getYear()).isEqualTo(firstHalfyear.getYear());
assertThat(hyr.getStart().getMonthOfYear()).isEqualTo(firstHalfyear.getMonthOfYear());
assertThat(hyr.getStart().getDayOfMonth()).isEqualTo(firstHalfyear.getDayOfMonth());
assertThat(hyr.getStart().getHourOfDay()).isEqualTo(0);
assertThat(hyr.getStart().getMinuteOfHour()).isEqualTo(0);
assertThat(hyr.getStart().getMinuteOfHour()).isEqualTo(0);
assertThat(hyr.getStart().getSecondOfMinute()).isEqualTo(0);
assertThat(hyr.getStart().getMillisOfSecond()).isEqualTo(0);
assertThat(hyr.getEnd().getYear()).isEqualTo(secondHalfyear.getYear());
assertThat(hyr.getEnd().getMonthOfYear()).isEqualTo(secondHalfyear.getMonthOfYear());
assertThat(hyr.getEnd().getDayOfMonth()).isEqualTo(secondHalfyear.getDayOfMonth());
assertThat(hyr.getEnd().getHourOfDay()).isEqualTo(0);
assertThat(hyr.getEnd().getMinuteOfHour()).isEqualTo(0);
assertThat(hyr.getEnd().getMinuteOfHour()).isEqualTo(0);
assertThat(hyr.getEnd().getSecondOfMinute()).isEqualTo(0);
assertThat(hyr.getEnd().getMillisOfSecond()).isEqualTo(0);
}
@Test
public void defaultCalendarTest() {
DateTime yearStart = Times.startTimeOfYear(Times.currentYear());
for (Halfyear halfyear : Halfyear.values()) {
int offset = halfyear.getValue() - 1;
HalfyearRange hyr = new HalfyearRange(yearStart.plusMonths(TimeSpec.MonthsPerHalfyear * offset));
assertThat(hyr.getYearBaseMonth()).isEqualTo(1);
assertThat(hyr.getBaseYear()).isEqualTo(yearStart.getYear());
assertThat(hyr.getStart()).isEqualTo(hyr.getTimeCalendar().mapStart(yearStart.plusMonths(TimeSpec.MonthsPerHalfyear * offset)));
assertThat(hyr.getEnd()).isEqualTo(hyr.getTimeCalendar().mapEnd(yearStart.plusMonths(TimeSpec.MonthsPerHalfyear * (offset + 1))));
}
}
@Test
public void momentTest() {
DateTime now = Times.now();
int currentYear = now.getYear();
assertThat(new HalfyearRange().getHalfyear()).isEqualTo(now.getMonthOfYear() < 7 ? Halfyear.First : Halfyear.Second);
assertThat(new HalfyearRange(asDate(currentYear, 1, 1)).getHalfyear()).isEqualTo(Halfyear.First);
assertThat(new HalfyearRange(asDate(currentYear, 6, 30)).getHalfyear()).isEqualTo(Halfyear.First);
assertThat(new HalfyearRange(asDate(currentYear, 7, 1)).getHalfyear()).isEqualTo(Halfyear.Second);
assertThat(new HalfyearRange(asDate(currentYear, 12, 31)).getHalfyear()).isEqualTo(Halfyear.Second);
}
@Test
public void startMonth() {
final DateTime now = Times.now();
final int currentYear = now.getYear();
Parallels.run(0, TimeSpec.MonthsPerYear, new Action1<Integer>() {
@Override
public void perform(Integer m) {
int month = m + 1;
assertThat(new HalfyearRange(currentYear, Halfyear.First).getStartMonthOfYear()).isEqualTo(1);
assertThat(new HalfyearRange(currentYear, Halfyear.Second).getStartMonthOfYear()).isEqualTo(7);
}
});
}
@Test
public void isMultipleCalendarYearsTest() {
final DateTime now = Times.now();
final int currentYear = now.getYear();
assertThat(new HalfyearRange(currentYear, Halfyear.First).isMultipleCalendarYears()).isFalse();
}
@Test
public void calendarHalfyear() {
final DateTime now = Times.now();
final int currentYear = now.getYear();
final TimeCalendar calendar = TimeCalendar.getEmptyOffset();
HalfyearRange h1 = new HalfyearRange(currentYear, Halfyear.First, calendar);
assertThat(h1.isReadonly()).isTrue();
assertThat(h1.getYearBaseMonth()).isEqualTo(TimeSpec.CalendarYearStartMonth);
assertThat(h1.getHalfyear()).isEqualTo(Halfyear.First);
assertThat(h1.getBaseYear()).isEqualTo(currentYear);
assertThat(h1.getStart()).isEqualTo(asDate(currentYear, 1, 1));
assertThat(h1.getEnd()).isEqualTo(asDate(currentYear, 7, 1));
HalfyearRange h2 = new HalfyearRange(currentYear, Halfyear.Second, calendar);
assertThat(h2.isReadonly()).isTrue();
assertThat(h2.getYearBaseMonth()).isEqualTo(TimeSpec.CalendarYearStartMonth);
assertThat(h2.getHalfyear()).isEqualTo(Halfyear.Second);
assertThat(h2.getBaseYear()).isEqualTo(currentYear);
assertThat(h2.getStart()).isEqualTo(asDate(currentYear, 7, 1));
assertThat(h2.getEnd()).isEqualTo(asDate(currentYear + 1, 1, 1));
}
@Test
public void getQuartersTest() {
final DateTime now = Times.now();
final int currentYear = now.getYear();
final TimeCalendar calendar = TimeCalendar.getEmptyOffset();
HalfyearRange h1 = new HalfyearRange(currentYear, Halfyear.First, calendar);
List<QuarterRange> h1Quarters = h1.getQuarters();
int h1Index = 0;
for (QuarterRange h1Quarter : h1Quarters) {
log.trace("h1Quarter[{}] = [{}]", h1Index, h1Quarter);
assertThat(h1Quarter.getBaseYear()).isEqualTo(h1.getBaseYear());
assertThat(h1Quarter.getQuarter()).isEqualTo(h1Index == 0 ? Quarter.First : Quarter.Second);
assertThat(h1Quarter.getStart()).isEqualTo(h1.getStart().plusMonths(h1Index * TimeSpec.MonthsPerQuarter));
assertThat(h1Quarter.getEnd()).isEqualTo(h1Quarter.getTimeCalendar().mapEnd(h1Quarter.getStart().plusMonths(TimeSpec.MonthsPerQuarter)));
h1Index++;
}
HalfyearRange h2 = new HalfyearRange(currentYear, Halfyear.Second, calendar);
List<QuarterRange> h2Quarters = h2.getQuarters();
int h2Index = 0;
for (QuarterRange h2Quarter : h2Quarters) {
log.trace("h2Quarter[{}] = [{}]", h2Index, h2Quarter);
assertThat(h2Quarter.getBaseYear()).isEqualTo(h2.getBaseYear());
assertThat(h2Quarter.getQuarter()).isEqualTo(h2Index == 0 ? Quarter.Third : Quarter.Fourth);
assertThat(h2Quarter.getStart()).isEqualTo(h2.getStart().plusMonths(h2Index * TimeSpec.MonthsPerQuarter));
assertThat(h2Quarter.getEnd()).isEqualTo(h2Quarter.getTimeCalendar().mapEnd(h2Quarter.getStart().plusMonths(TimeSpec.MonthsPerQuarter)));
h2Index++;
}
}
@Test
public void getMonthsTest() {
final DateTime now = Times.now();
final int currentYear = now.getYear();
final TimeCalendar calendar = TimeCalendar.getEmptyOffset();
HalfyearRange h1 = new HalfyearRange(currentYear, Halfyear.First, calendar);
List<MonthRange> months = h1.getMonths();
assertThat(months.size()).isEqualTo(TimeSpec.MonthsPerHalfyear);
int index = 0;
for (MonthRange month : months) {
assertThat(month.getStart()).isEqualTo(h1.getStart().plusMonths(index));
assertThat(month.getEnd()).isEqualTo(calendar.mapEnd(month.getStart().plusMonths(1)));
index++;
}
}
@Test
public void addHalfyearsTest() {
final DateTime now = Times.now();
final int currentYear = now.getYear();
final TimeCalendar calendar = TimeCalendar.getEmptyOffset();
HalfyearRange h1 = new HalfyearRange(currentYear, Halfyear.First, calendar);
HalfyearRange prevH1 = h1.addHalfyears(-1);
assertThat(prevH1.getHalfyear()).isEqualTo(Halfyear.Second);
assertThat(prevH1.getBaseYear()).isEqualTo(currentYear - 1);
assertThat(prevH1.getStart()).isEqualTo(h1.getStart().plusMonths(-TimeSpec.MonthsPerHalfyear));
assertThat(prevH1.getEnd()).isEqualTo(h1.getStart());
prevH1 = h1.addHalfyears(-2);
assertThat(prevH1.getHalfyear()).isEqualTo(Halfyear.First);
assertThat(prevH1.getBaseYear()).isEqualTo(currentYear - 1);
assertThat(prevH1.getStart()).isEqualTo(h1.getStart().plusMonths(-2 * TimeSpec.MonthsPerHalfyear));
assertThat(prevH1.getEnd()).isEqualTo(h1.getStart().plusMonths(-1 * TimeSpec.MonthsPerHalfyear));
prevH1 = h1.addHalfyears(-3);
assertThat(prevH1.getHalfyear()).isEqualTo(Halfyear.Second);
assertThat(prevH1.getBaseYear()).isEqualTo(currentYear - 2);
assertThat(prevH1.getStart()).isEqualTo(h1.getStart().plusMonths(-3 * TimeSpec.MonthsPerHalfyear));
assertThat(prevH1.getEnd()).isEqualTo(h1.getStart().plusMonths(-2 * TimeSpec.MonthsPerHalfyear));
HalfyearRange nextH1 = h1.addHalfyears(1);
assertThat(nextH1.getHalfyear()).isEqualTo(Halfyear.Second);
assertThat(nextH1.getBaseYear()).isEqualTo(currentYear);
assertThat(nextH1.getStart()).isEqualTo(h1.getStart().plusMonths(TimeSpec.MonthsPerHalfyear));
assertThat(nextH1.getEnd()).isEqualTo(h1.getStart().plusMonths(2 * TimeSpec.MonthsPerHalfyear));
nextH1 = h1.addHalfyears(2);
assertThat(nextH1.getHalfyear()).isEqualTo(Halfyear.First);
assertThat(nextH1.getBaseYear()).isEqualTo(currentYear + 1);
assertThat(nextH1.getStart()).isEqualTo(h1.getStart().plusMonths(2 * TimeSpec.MonthsPerHalfyear));
assertThat(nextH1.getEnd()).isEqualTo(h1.getStart().plusMonths(3 * TimeSpec.MonthsPerHalfyear));
nextH1 = h1.addHalfyears(3);
assertThat(nextH1.getHalfyear()).isEqualTo(Halfyear.Second);
assertThat(nextH1.getBaseYear()).isEqualTo(currentYear + 1);
assertThat(nextH1.getStart()).isEqualTo(h1.getStart().plusMonths(3 * TimeSpec.MonthsPerHalfyear));
assertThat(nextH1.getEnd()).isEqualTo(h1.getStart().plusMonths(4 * TimeSpec.MonthsPerHalfyear));
}
}