/*
* 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.TimeCalendar;
import kr.debop4j.timeperiod.test.TimePeriodTestBase;
import kr.debop4j.timeperiod.timerange.HourRange;
import kr.debop4j.timeperiod.timerange.HourRangeCollection;
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 org.fest.assertions.Assertions.assertThat;
/**
* kr.debop4j.timeperiod.test.timeranges.HourRangeCollectionTest
*
* @author 배성혁 sunghyouk.bae@gmail.com
* @since 13. 5. 25. 오후 6:33
*/
@Slf4j
public class HourRangeCollectionTest extends TimePeriodTestBase {
@Test
public void singleHour() {
DateTime startTime = new DateTime(2004, 2, 22, 17, 0);
HourRangeCollection hours = new HourRangeCollection(startTime, 1, TimeCalendar.getEmptyOffset());
assertThat(hours.getHourCount()).isEqualTo(1);
assertThat(hours.getStartYear()).isEqualTo(startTime.getYear());
assertThat(hours.getStartMonthOfYear()).isEqualTo(startTime.getMonthOfYear());
assertThat(hours.getStartDayOfMonth()).isEqualTo(startTime.getDayOfMonth());
assertThat(hours.getStartHourOfDay()).isEqualTo(startTime.getHourOfDay());
assertThat(hours.getEndYear()).isEqualTo(startTime.getYear());
assertThat(hours.getEndMonthOfYear()).isEqualTo(startTime.getMonthOfYear());
assertThat(hours.getEndDayOfMonth()).isEqualTo(startTime.getDayOfMonth());
assertThat(hours.getEndHourOfDay()).isEqualTo(startTime.getHourOfDay() + 1);
List<HourRange> hourList = hours.getHours();
assertThat(hourList.size()).isEqualTo(1);
assertThat(hourList.get(0).isSamePeriod(new HourRange(startTime, TimeCalendar.getEmptyOffset()))).isTrue();
}
@Test
public void calendarHoursTeset() {
final DateTime startTime = new DateTime(2004, 2, 11, 22, 0);
final int hourCount = 4;
HourRangeCollection hours = new HourRangeCollection(startTime, hourCount, TimeCalendar.getEmptyOffset());
assertThat(hours.getHourCount()).isEqualTo(hourCount);
assertThat(hours.getStartYear()).isEqualTo(startTime.getYear());
assertThat(hours.getStartMonthOfYear()).isEqualTo(startTime.getMonthOfYear());
assertThat(hours.getStartDayOfMonth()).isEqualTo(startTime.getDayOfMonth());
assertThat(hours.getStartHourOfDay()).isEqualTo(startTime.getHourOfDay());
assertThat(hours.getEndYear()).isEqualTo(startTime.getYear());
assertThat(hours.getEndMonthOfYear()).isEqualTo(startTime.getMonthOfYear());
assertThat(hours.getEndDayOfMonth()).isEqualTo(startTime.getDayOfMonth() + 1);
assertThat(hours.getEndHourOfDay()).isEqualTo((startTime.getHourOfDay() + hourCount) % 24);
List<HourRange> hourList = hours.getHours();
assertThat(hourList.size()).isEqualTo(hourCount);
for (int h = 0; h < hourCount; h++) {
assertThat(hourList.get(h).isSamePeriod(new HourRange(startTime.plusHours(h), TimeCalendar.getEmptyOffset()))).isTrue();
}
}
@Test
public void hoursTest() {
final int[] hourCounts = new int[] { 1, 24, 48, 64, 128 };
final DateTime now = Times.now();
for (int hourCount : hourCounts) {
final HourRangeCollection hourRanges = new HourRangeCollection(now, hourCount);
final DateTime startTime = Times.trimToMinute(now).plus(hourRanges.getTimeCalendar().getStartOffset());
final DateTime endTime = startTime.plusHours(hourCount).plus(hourRanges.getTimeCalendar().getEndOffset());
assertThat(hourRanges.getStart()).isEqualTo(startTime);
assertThat(hourRanges.getEnd()).isEqualTo(endTime);
assertThat(hourRanges.getHourCount()).isEqualTo(hourCount);
final List<HourRange> items = hourRanges.getHours();
assertThat(items.size()).isEqualTo(hourCount);
Parallels.run(hourCount, new Action1<Integer>() {
@Override
public void perform(Integer h) {
assertThat(items.get(h).getStart()).isEqualTo(startTime.plusHours(h));
assertThat(items.get(h).getEnd()).isEqualTo(hourRanges.getTimeCalendar().mapEnd(startTime.plusHours(h + 1)));
assertThat(items.get(h).getUnmappedEnd()).isEqualTo(startTime.plusHours(h + 1));
}
});
}
}
}