/* * 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.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.tools.TimeSpec; import kr.debop4j.timeperiod.tools.Times; import kr.debop4j.timeperiod.tools.Weeks; 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.asDate; import static org.fest.assertions.Assertions.assertThat; /** * kr.debop4j.timeperiod.test.tools.WeeksTest * * @author 배성혁 sunghyouk.bae@gmail.com * @since 13. 5. 25. 오후 12:55 */ @Slf4j public class WeeksTest extends TimePeriodTestBase { public static final DateTime[] testTimes = new DateTime[] { asDate(2003, 12, 28) }; @Test public void getYearAndWeek() { for (DateTime moment : testTimes) { YearAndWeek yw = Weeks.getYearAndWeek(moment); assertThat(yw.getYear()).isEqualTo(moment.getWeekyear()); assertThat(yw.getWeekOfYear()).isEqualTo(moment.getWeekOfWeekyear()); } } @Test public void getYearAndWeekTest() { Parallels.run(2000, 2100, new Action1<Integer>() { @Override public void perform(Integer year) { DateTime startDay = Times.startTimeOfYear(year); DateTime endDay = Times.endTimeOfYear(year - 1); YearAndWeek startYW = Weeks.getYearAndWeek(startDay); YearAndWeek endYW = Weeks.getYearAndWeek(endDay); if (startDay.getDayOfWeek() == TimeSpec.FirstDayOfWeek.getValue()) assertThat(endYW.equals(startYW)).isFalse(); else assertThat(endYW.equals(startYW)).isTrue(); } }); } @Test public void getStartWeekRangeOfYear() { Parallels.run(2000, 2100, new Action1<Integer>() { @Override public void perform(Integer year) { WeekRange startWeekRange = Weeks.getStartWeekRangeOfYear(year); log.trace("year=[{}], startWeek=[{}]", year, startWeekRange.getStartDayStart()); assertThat(new Duration(asDate(year - 1, 12, 28), startWeekRange.getStartDayStart()).getStandardDays()).isGreaterThan(0); assertThat(new Duration(asDate(year, 1, 3), startWeekRange.getEndDayStart()).getStandardDays()).isGreaterThan(0); } }); } @Test public void getEndYearAndWeekTest() { Parallels.run(1980, 2200, new Action1<Integer>() { @Override public void perform(Integer year) { YearAndWeek yw = Weeks.getEndYearAndWeek(year); assertThat(year).isEqualTo(yw.getYear()); assertThat(yw.getWeekOfYear()).isGreaterThanOrEqualTo(52); } }); } @Test public void getEndWeekRangeOfYear() { Parallels.run(2000, 2100, new Action1<Integer>() { @Override public void perform(Integer year) { WeekRange startWeekRange = Weeks.getStartWeekRangeOfYear(year); WeekRange endWeekRange = Weeks.getEndWeekRangeOfYear(year - 1); log.trace("year=[{}], startWeek=[{}], endWeek=[{}]", year, startWeekRange.getStartDayStart(), endWeekRange.getStartDayStart()); assertThat(new Duration(asDate(year - 1, 12, 28), startWeekRange.getStartDayStart()).getStandardDays()).isGreaterThan(0); assertThat(new Duration(asDate(year, 1, 3), startWeekRange.getEndDayStart()).getStandardDays()).isGreaterThan(0); assertThat(endWeekRange.getStartDayStart().plusWeeks(1)).isEqualTo(startWeekRange.getStartDayStart()); assertThat(endWeekRange.getEndDayStart().plusDays(1)).isEqualTo(startWeekRange.getStartDayStart()); } }); } @Test public void getWeekRangeTest() { Parallels.run(2000, 2100, new Action1<Integer>() { @Override public void perform(Integer year) { DateTime endDay = Times.endTimeOfYear(year - 1); DateTime startDay = Times.startTimeOfYear(year); YearAndWeek endDayYearWeek = Weeks.getYearAndWeek(endDay); assertThat(endDayYearWeek.getYear()).isGreaterThanOrEqualTo(year - 1); YearAndWeek startDayYearWeek = Weeks.getYearAndWeek(startDay); assertThat(startDayYearWeek.getYear()).isLessThanOrEqualTo(year); // 해당일자가 속한 주차의 일자들을 구한다. 년말/년초 구간은 꼭 7일이 아닐 수 있다. WeekRange endDayWeekRange = Weeks.getWeekRange(endDayYearWeek); WeekRange startDayWeekRange = Weeks.getWeekRange(startDayYearWeek); assertThat(endDayWeekRange.hasPeriod()).isTrue(); assertThat(startDayWeekRange.hasPeriod()).isTrue(); log.trace("start day weeks=[{}]", startDayWeekRange); if (endDayYearWeek.equals(startDayYearWeek)) { assertThat(startDayWeekRange).isEqualTo(endDayWeekRange); } else { assertThat(startDayWeekRange).isNotEqualTo(endDayWeekRange); } } }); } @Test public void addWeekOfYearsTest() { Parallels.run(2000, 2100, new Action1<Integer>() { @Override public void perform(Integer year) { final int step = 2; final int maxAddWeeks = 40; YearAndWeek prevResult = null; YearAndWeek maxWeek = Weeks.getEndYearAndWeek(year); for (int week = 1; week < maxWeek.getWeekOfYear(); week += step) { for (int addWeeks = -maxAddWeeks; addWeeks <= maxAddWeeks; addWeeks += step) { YearAndWeek current = new YearAndWeek(year, week); YearAndWeek result = Weeks.addWeekOfYears(current, addWeeks); if (addWeeks != 0 && prevResult != null) { if (result.getYear().equals(prevResult.getYear())) assertThat(result.getWeekOfYear()).isEqualTo(prevResult.getWeekOfYear() + step); } assertThat(result.getWeekOfYear()).isGreaterThan(0); assertThat(result.getWeekOfYear()).isLessThanOrEqualTo(TimeSpec.MaxWeeksPerYear); prevResult = result; } } } }); } }