/*
* 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.YearAndWeek;
import kr.debop4j.timeperiod.test.TimePeriodTestBase;
import kr.debop4j.timeperiod.timerange.WeekRange;
import kr.debop4j.timeperiod.timerange.WeekRangeCollection;
import kr.debop4j.timeperiod.tools.Times;
import kr.debop4j.timeperiod.tools.Weeks;
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.WeekRangeCollectionTest
*
* @author 배성혁 sunghyouk.bae@gmail.com
* @since 13. 5. 25. 오후 11:49
*/
@Slf4j
public class WeekRangeCollectionTest extends TimePeriodTestBase {
@Test
public void singleMonths() {
final int startYear = 2004;
final int startWeek = 22;
WeekRangeCollection weekRanges = new WeekRangeCollection(startYear, startWeek, 1);
assertThat(weekRanges.getWeekCount()).isEqualTo(1);
assertThat(weekRanges.getStartYear()).isEqualTo(startYear);
assertThat(weekRanges.getEndYear()).isEqualTo(startYear);
assertThat(weekRanges.getStartWeekOfYear()).isEqualTo(startWeek);
assertThat(weekRanges.getEndWeekOfYear()).isEqualTo(startWeek);
List<WeekRange> weeks = weekRanges.getWeeks();
assertThat(weeks.size()).isEqualTo(1);
assertThat(weeks.get(0).isSamePeriod(new WeekRange(startYear, startWeek))).isTrue();
}
@Test
public void calenarWeeks() {
final int startYear = 2004;
final int startWeek = 22;
final int weekCount = 5;
WeekRangeCollection weekRanges = new WeekRangeCollection(startYear, startWeek, weekCount);
assertThat(weekRanges.getWeekCount()).isEqualTo(weekCount);
assertThat(weekRanges.getStartYear()).isEqualTo(startYear);
assertThat(weekRanges.getStartWeekOfYear()).isEqualTo(startWeek);
assertThat(weekRanges.getEndYear()).isEqualTo(startYear);
assertThat(weekRanges.getEndWeekOfYear()).isEqualTo((startWeek + weekCount - 1));
}
@Test
public void weeksCountsTest() {
int[] weekCounts = new int[] { 1, 6, 48, 180, 365 };
final DateTime now = Times.now();
final DateTime today = Times.today();
for (int weekCount : weekCounts) {
final WeekRangeCollection weekRanges = new WeekRangeCollection(now, weekCount);
final DateTime startTime = weekRanges.getTimeCalendar().mapStart(Times.startTimeOfWeek(today));
final DateTime endTime = weekRanges.getTimeCalendar().mapEnd(startTime.plusWeeks(weekCount));
assertThat(weekRanges.getStart()).isEqualTo(startTime);
assertThat(weekRanges.getEnd()).isEqualTo(endTime);
final List<WeekRange> items = weekRanges.getWeeks();
Parallels.run(weekCount, new Action1<Integer>() {
@Override
public void perform(Integer w) {
final WeekRange item = items.get(w);
assertThat(item.getStart()).isEqualTo(startTime.plusWeeks(w));
assertThat(item.getEnd()).isEqualTo(weekRanges.getTimeCalendar().mapEnd(startTime.plusWeeks(w + 1)));
assertThat(item.getUnmappedStart()).isEqualTo(startTime.plusWeeks(w));
assertThat(item.getUnmappedEnd()).isEqualTo(startTime.plusWeeks(w + 1));
assertThat(item.isSamePeriod(new WeekRange(weekRanges.getStart().plusWeeks(w)))).isTrue();
YearAndWeek yw = Weeks.addWeekOfYears(now.getYear(), now.getWeekOfWeekyear(), w);
assertThat(item.isSamePeriod(new WeekRange(yw.getYear(), yw.getWeekOfYear()))).isTrue();
}
});
}
}
}