/*
* 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.Quarter;
import kr.debop4j.timeperiod.TimeCalendar;
import kr.debop4j.timeperiod.test.TimePeriodTestBase;
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.startTimeOfQuarter;
import static org.fest.assertions.Assertions.assertThat;
/**
* kr.debop4j.timeperiod.test.timeranges.QuarterRangeTest
*
* @author 배성혁 sunghyouk.bae@gmail.com
* @since 13. 5. 25. 오후 11:18
*/
@Slf4j
public class QuarterRangeTest extends TimePeriodTestBase {
@Test
public void initValues() {
DateTime now = Times.now();
DateTime firstHalfyear = startTimeOfQuarter(now.getYear(), Quarter.First);
DateTime secondHalfyear = startTimeOfQuarter(now.getYear(), Quarter.Second);
QuarterRange quarterRange = new QuarterRange(now.getYear(), Quarter.First, TimeCalendar.getEmptyOffset());
assertThat(quarterRange.getStart().getYear()).isEqualTo(firstHalfyear.getYear());
assertThat(quarterRange.getStart().getMonthOfYear()).isEqualTo(firstHalfyear.getMonthOfYear());
assertThat(quarterRange.getStart().getDayOfMonth()).isEqualTo(firstHalfyear.getDayOfMonth());
assertThat(quarterRange.getStart().getHourOfDay()).isEqualTo(0);
assertThat(quarterRange.getStart().getMinuteOfHour()).isEqualTo(0);
assertThat(quarterRange.getStart().getMinuteOfHour()).isEqualTo(0);
assertThat(quarterRange.getStart().getSecondOfMinute()).isEqualTo(0);
assertThat(quarterRange.getStart().getMillisOfSecond()).isEqualTo(0);
assertThat(quarterRange.getEnd().getYear()).isEqualTo(secondHalfyear.getYear());
assertThat(quarterRange.getEnd().getMonthOfYear()).isEqualTo(secondHalfyear.getMonthOfYear());
assertThat(quarterRange.getEnd().getDayOfMonth()).isEqualTo(secondHalfyear.getDayOfMonth());
assertThat(quarterRange.getEnd().getHourOfDay()).isEqualTo(0);
assertThat(quarterRange.getEnd().getMinuteOfHour()).isEqualTo(0);
assertThat(quarterRange.getEnd().getMinuteOfHour()).isEqualTo(0);
assertThat(quarterRange.getEnd().getSecondOfMinute()).isEqualTo(0);
assertThat(quarterRange.getEnd().getMillisOfSecond()).isEqualTo(0);
}
@Test
public void defaultCalendarTest() {
DateTime yearStart = Times.startTimeOfYear(Times.currentYear());
for (Quarter quarter : Quarter.values()) {
int offset = quarter.getValue() - 1;
QuarterRange quarterRange = new QuarterRange(yearStart.plusMonths(TimeSpec.MonthsPerQuarter * offset));
assertThat(quarterRange.getYearBaseMonth()).isEqualTo(1);
assertThat(quarterRange.getBaseYear()).isEqualTo(yearStart.getYear());
assertThat(quarterRange.getStart())
.isEqualTo(quarterRange.getTimeCalendar().mapStart(yearStart.plusMonths(TimeSpec.MonthsPerQuarter * offset)));
assertThat(quarterRange.getEnd())
.isEqualTo(quarterRange.getTimeCalendar().mapEnd(yearStart.plusMonths(TimeSpec.MonthsPerQuarter * (offset + 1))));
}
}
@Test
public void momentTest() {
DateTime now = Times.now();
int currentYear = now.getYear();
assertThat(new QuarterRange(asDate(currentYear, 1, 1)).getQuarter()).isEqualTo(Quarter.First);
assertThat(new QuarterRange(asDate(currentYear, 3, 31)).getQuarter()).isEqualTo(Quarter.First);
assertThat(new QuarterRange(asDate(currentYear, 4, 1)).getQuarter()).isEqualTo(Quarter.Second);
assertThat(new QuarterRange(asDate(currentYear, 6, 30)).getQuarter()).isEqualTo(Quarter.Second);
assertThat(new QuarterRange(asDate(currentYear, 7, 1)).getQuarter()).isEqualTo(Quarter.Third);
assertThat(new QuarterRange(asDate(currentYear, 9, 30)).getQuarter()).isEqualTo(Quarter.Third);
assertThat(new QuarterRange(asDate(currentYear, 10, 1)).getQuarter()).isEqualTo(Quarter.Fourth);
assertThat(new QuarterRange(asDate(currentYear, 12, 31)).getQuarter()).isEqualTo(Quarter.Fourth);
}
@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 QuarterRange(currentYear, Quarter.First).getStartMonthOfYear()).isEqualTo(1);
assertThat(new QuarterRange(currentYear, Quarter.Second).getStartMonthOfYear()).isEqualTo(4);
assertThat(new QuarterRange(currentYear, Quarter.Third).getStartMonthOfYear()).isEqualTo(7);
assertThat(new QuarterRange(currentYear, Quarter.Fourth).getStartMonthOfYear()).isEqualTo(10);
}
});
}
@Test
public void isMultipleCalendarYearsTest() {
final DateTime now = Times.now();
final int currentYear = now.getYear();
assertThat(new QuarterRange(currentYear, Quarter.First).isMultipleCalendarYears()).isFalse();
}
@Test
public void calendarQuarter() {
final DateTime now = Times.now();
final int currentYear = now.getYear();
final TimeCalendar calendar = TimeCalendar.getEmptyOffset();
QuarterRange q1 = new QuarterRange(currentYear, Quarter.First, calendar);
assertThat(q1.isReadonly()).isTrue();
assertThat(q1.getYearBaseMonth()).isEqualTo(TimeSpec.CalendarYearStartMonth);
assertThat(q1.getQuarter()).isEqualTo(Quarter.First);
assertThat(q1.getBaseYear()).isEqualTo(currentYear);
assertThat(q1.getStart()).isEqualTo(asDate(currentYear, 1, 1));
assertThat(q1.getEnd()).isEqualTo(asDate(currentYear, 4, 1));
QuarterRange q2 = new QuarterRange(currentYear, Quarter.Second, calendar);
assertThat(q2.isReadonly()).isTrue();
assertThat(q2.getYearBaseMonth()).isEqualTo(TimeSpec.CalendarYearStartMonth);
assertThat(q2.getQuarter()).isEqualTo(Quarter.Second);
assertThat(q2.getBaseYear()).isEqualTo(currentYear);
assertThat(q2.getStart()).isEqualTo(asDate(currentYear, 4, 1));
assertThat(q2.getEnd()).isEqualTo(asDate(currentYear, 7, 1));
QuarterRange q3 = new QuarterRange(currentYear, Quarter.Third, calendar);
assertThat(q3.isReadonly()).isTrue();
assertThat(q3.getYearBaseMonth()).isEqualTo(TimeSpec.CalendarYearStartMonth);
assertThat(q3.getQuarter()).isEqualTo(Quarter.Third);
assertThat(q3.getBaseYear()).isEqualTo(currentYear);
assertThat(q3.getStart()).isEqualTo(asDate(currentYear, 7, 1));
assertThat(q3.getEnd()).isEqualTo(asDate(currentYear, 10, 1));
QuarterRange q4 = new QuarterRange(currentYear, Quarter.Fourth, calendar);
assertThat(q4.isReadonly()).isTrue();
assertThat(q4.getYearBaseMonth()).isEqualTo(TimeSpec.CalendarYearStartMonth);
assertThat(q4.getQuarter()).isEqualTo(Quarter.Fourth);
assertThat(q4.getBaseYear()).isEqualTo(currentYear);
assertThat(q4.getStart()).isEqualTo(asDate(currentYear, 10, 1));
assertThat(q4.getEnd()).isEqualTo(asDate(currentYear + 1, 1, 1));
}
@Test
public void getMonthsTest() {
final DateTime now = Times.now();
final int currentYear = now.getYear();
final TimeCalendar calendar = TimeCalendar.getEmptyOffset();
QuarterRange q1 = new QuarterRange(currentYear, Quarter.First, calendar);
List<MonthRange> months = q1.getMonths();
assertThat(months.size()).isEqualTo(TimeSpec.MonthsPerQuarter);
int index = 0;
for (MonthRange month : months) {
assertThat(month.getStart()).isEqualTo(q1.getStart().plusMonths(index));
assertThat(month.getEnd()).isEqualTo(calendar.mapEnd(month.getStart().plusMonths(1)));
index++;
}
}
@Test
public void addQuatersTest() {
final DateTime now = Times.now();
final int currentYear = now.getYear();
final TimeCalendar calendar = TimeCalendar.getEmptyOffset();
QuarterRange q1 = new QuarterRange(currentYear, Quarter.First, calendar);
QuarterRange prevQ1 = q1.addQuarters(-1);
assertThat(prevQ1.getQuarter()).isEqualTo(Quarter.Fourth);
assertThat(prevQ1.getBaseYear()).isEqualTo(currentYear - 1);
assertThat(prevQ1.getStart()).isEqualTo(q1.getStart().plusMonths(-TimeSpec.MonthsPerQuarter));
assertThat(prevQ1.getEnd()).isEqualTo(q1.getStart());
prevQ1 = q1.addQuarters(-2);
assertThat(prevQ1.getQuarter()).isEqualTo(Quarter.Third);
assertThat(prevQ1.getBaseYear()).isEqualTo(currentYear - 1);
assertThat(prevQ1.getStart()).isEqualTo(q1.getStart().plusMonths(-2 * TimeSpec.MonthsPerQuarter));
assertThat(prevQ1.getEnd()).isEqualTo(q1.getStart().plusMonths(-1 * TimeSpec.MonthsPerQuarter));
prevQ1 = q1.addQuarters(-3);
assertThat(prevQ1.getQuarter()).isEqualTo(Quarter.Second);
assertThat(prevQ1.getBaseYear()).isEqualTo(currentYear - 1);
assertThat(prevQ1.getStart()).isEqualTo(q1.getStart().plusMonths(-3 * TimeSpec.MonthsPerQuarter));
assertThat(prevQ1.getEnd()).isEqualTo(q1.getStart().plusMonths(-2 * TimeSpec.MonthsPerQuarter));
prevQ1 = q1.addQuarters(-4);
assertThat(prevQ1.getQuarter()).isEqualTo(Quarter.First);
assertThat(prevQ1.getBaseYear()).isEqualTo(currentYear - 1);
assertThat(prevQ1.getStart()).isEqualTo(q1.getStart().plusMonths(-4 * TimeSpec.MonthsPerQuarter));
assertThat(prevQ1.getEnd()).isEqualTo(q1.getStart().plusMonths(-3 * TimeSpec.MonthsPerQuarter));
QuarterRange nextQ1 = q1.addQuarters(1);
assertThat(nextQ1.getQuarter()).isEqualTo(Quarter.Second);
assertThat(nextQ1.getBaseYear()).isEqualTo(currentYear);
assertThat(nextQ1.getStart()).isEqualTo(q1.getStart().plusMonths(TimeSpec.MonthsPerQuarter));
assertThat(nextQ1.getEnd()).isEqualTo(q1.getStart().plusMonths(2 * TimeSpec.MonthsPerQuarter));
nextQ1 = q1.addQuarters(2);
assertThat(nextQ1.getQuarter()).isEqualTo(Quarter.Third);
assertThat(nextQ1.getBaseYear()).isEqualTo(currentYear);
assertThat(nextQ1.getStart()).isEqualTo(q1.getStart().plusMonths(2 * TimeSpec.MonthsPerQuarter));
assertThat(nextQ1.getEnd()).isEqualTo(q1.getStart().plusMonths(3 * TimeSpec.MonthsPerQuarter));
nextQ1 = q1.addQuarters(3);
assertThat(nextQ1.getQuarter()).isEqualTo(Quarter.Fourth);
assertThat(nextQ1.getBaseYear()).isEqualTo(currentYear);
assertThat(nextQ1.getStart()).isEqualTo(q1.getStart().plusMonths(3 * TimeSpec.MonthsPerQuarter));
assertThat(nextQ1.getEnd()).isEqualTo(q1.getStart().plusMonths(4 * TimeSpec.MonthsPerQuarter));
nextQ1 = q1.addQuarters(4);
assertThat(nextQ1.getQuarter()).isEqualTo(Quarter.First);
assertThat(nextQ1.getBaseYear()).isEqualTo(currentYear + 1);
assertThat(nextQ1.getStart()).isEqualTo(q1.getStart().plusMonths(4 * TimeSpec.MonthsPerQuarter));
assertThat(nextQ1.getEnd()).isEqualTo(q1.getStart().plusMonths(5 * TimeSpec.MonthsPerQuarter));
}
}