/* * 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.calendars; import com.google.common.collect.Lists; import kr.debop4j.core.tools.StringTool; import kr.debop4j.timeperiod.*; import kr.debop4j.timeperiod.calendars.CalendarPeriodCollector; import kr.debop4j.timeperiod.calendars.CalendarPeriodCollectorFilter; import kr.debop4j.timeperiod.test.TimePeriodTestBase; import kr.debop4j.timeperiod.timerange.*; 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 static org.fest.assertions.Assertions.assertThat; /** * kr.debop4j.timeperiod.test.calendars.CalendarPeriodCollectorTest * * @author 배성혁 sunghyouk.bae@gmail.com * @since 13. 5. 27. 오후 3:23 */ @Slf4j public class CalendarPeriodCollectorTest extends TimePeriodTestBase { @Test public void collectYearsTest() { CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter(); filter.getYears().addAll(Lists.newArrayList(2006, 2007, 2012)); ITimePeriod limits = new CalendarTimeRange(Times.asDate(2001, 1, 1), Times.asDate(2019, 12, 31)); CalendarPeriodCollector collector = new CalendarPeriodCollector(filter, limits); collector.collectYears(); log.trace("Collect years... periods=[{}]", StringTool.listToString(collector.getPeriods())); for (int i = 0; i < collector.getPeriods().size(); i++) { ITimePeriod period = collector.getPeriods().get(i); log.trace("period=[{}]", period); assertThat(period.isSamePeriod(new YearRange(filter.getYears().get(i)))).isTrue(); } } @Test public void collectMonthsTest() { CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter(); filter.getMonthOfYears().addAll(Lists.newArrayList(Month.January.getValue())); ITimePeriod limits = new CalendarTimeRange(Times.asDate(2010, 1, 1), Times.asDate(2011, 12, 31)); CalendarPeriodCollector collector = new CalendarPeriodCollector(filter, limits); collector.collectMonths(); log.trace("Collect months... periods=[{}]", StringTool.listToString(collector.getPeriods())); assertThat(collector.getPeriods().size()).isEqualTo(2); assertThat(collector.getPeriods().get(0).isSamePeriod(new MonthRange(2010, 1))).isTrue(); assertThat(collector.getPeriods().get(1).isSamePeriod(new MonthRange(2011, 1))).isTrue(); } @Test public void collectDaysTest() { CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter(); // 1월의 금요일만 추출 filter.getMonthOfYears().addAll(Lists.newArrayList(Month.January.getValue())); filter.getWeekDays().add(DayOfWeek.FriDay); ITimePeriod limits = new CalendarTimeRange(Times.asDate(2010, 1, 1), Times.asDate(2011, 12, 31)); CalendarPeriodCollector collector = new CalendarPeriodCollector(filter, limits); collector.collectDays(); for (ITimePeriod period : collector.getPeriods()) { log.trace("Day=[{}]", period); } assertThat(collector.getPeriods().size()).isEqualTo(9); assertThat(collector.getPeriods().get(0).isSamePeriod(new DayRange(2010, 1, 1))).isTrue(); assertThat(collector.getPeriods().get(1).isSamePeriod(new DayRange(2010, 1, 8))).isTrue(); assertThat(collector.getPeriods().get(2).isSamePeriod(new DayRange(2010, 1, 15))).isTrue(); assertThat(collector.getPeriods().get(3).isSamePeriod(new DayRange(2010, 1, 22))).isTrue(); assertThat(collector.getPeriods().get(4).isSamePeriod(new DayRange(2010, 1, 29))).isTrue(); assertThat(collector.getPeriods().get(5).isSamePeriod(new DayRange(2011, 1, 7))).isTrue(); assertThat(collector.getPeriods().get(6).isSamePeriod(new DayRange(2011, 1, 14))).isTrue(); assertThat(collector.getPeriods().get(7).isSamePeriod(new DayRange(2011, 1, 21))).isTrue(); assertThat(collector.getPeriods().get(8).isSamePeriod(new DayRange(2011, 1, 28))).isTrue(); } @Test public void collectHoursTest() { CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter(); // 1월의 금요일의 08:00~18:00 추출 filter.getMonthOfYears().addAll(Lists.newArrayList(Month.January.getValue())); filter.getWeekDays().add(DayOfWeek.FriDay); filter.getCollectingHours().add(new HourRangeInDay(8, 18)); ITimePeriod limits = new CalendarTimeRange(Times.asDate(2010, 1, 1), Times.asDate(2011, 12, 31)); CalendarPeriodCollector collector = new CalendarPeriodCollector(filter, limits); collector.collectHours(); for (ITimePeriod period : collector.getPeriods()) { log.trace("Hours=[{}]", period); } assertThat(collector.getPeriods().size()).isEqualTo(9); assertThat(collector.getPeriods().get(0).isSamePeriod(new HourRangeCollection(2010, 1, 1, 8, 10))).isTrue(); assertThat(collector.getPeriods().get(1).isSamePeriod(new HourRangeCollection(2010, 1, 8, 8, 10))).isTrue(); assertThat(collector.getPeriods().get(2).isSamePeriod(new HourRangeCollection(2010, 1, 15, 8, 10))).isTrue(); assertThat(collector.getPeriods().get(3).isSamePeriod(new HourRangeCollection(2010, 1, 22, 8, 10))).isTrue(); assertThat(collector.getPeriods().get(4).isSamePeriod(new HourRangeCollection(2010, 1, 29, 8, 10))).isTrue(); assertThat(collector.getPeriods().get(5).isSamePeriod(new HourRangeCollection(2011, 1, 7, 8, 10))).isTrue(); assertThat(collector.getPeriods().get(6).isSamePeriod(new HourRangeCollection(2011, 1, 14, 8, 10))).isTrue(); assertThat(collector.getPeriods().get(7).isSamePeriod(new HourRangeCollection(2011, 1, 21, 8, 10))).isTrue(); assertThat(collector.getPeriods().get(8).isSamePeriod(new HourRangeCollection(2011, 1, 28, 8, 10))).isTrue(); } @Test public void collectHoursWithMinutes() { CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter(); // 1월의 금요일의 08:30~18:30 추출 filter.getMonthOfYears().addAll(Lists.newArrayList(Month.January.getValue())); filter.getWeekDays().add(DayOfWeek.FriDay); filter.getCollectingHours().add(new HourRangeInDay(new Timepart(8, 30), new Timepart(18, 50))); ITimePeriod limits = new CalendarTimeRange(Times.asDate(2010, 1, 1), Times.asDate(2011, 12, 31)); CalendarPeriodCollector collector = new CalendarPeriodCollector(filter, limits); collector.collectHours(); for (ITimePeriod period : collector.getPeriods()) { log.trace("Hours=[{}]", period); } assertThat(collector.getPeriods().size()).isEqualTo(9); assertThat(collector.getPeriods().get(0).isSamePeriod(new CalendarTimeRange(new DateTime(2010, 1, 1, 8, 30), new DateTime(2010, 1, 1, 18, 50)))).isTrue(); assertThat(collector.getPeriods().get(1).isSamePeriod(new CalendarTimeRange(new DateTime(2010, 1, 8, 8, 30), new DateTime(2010, 1, 8, 18, 50)))).isTrue(); assertThat(collector.getPeriods().get(2).isSamePeriod(new CalendarTimeRange(new DateTime(2010, 1, 15, 8, 30), new DateTime(2010, 1, 15, 18, 50)))).isTrue(); assertThat(collector.getPeriods().get(3).isSamePeriod(new CalendarTimeRange(new DateTime(2010, 1, 22, 8, 30), new DateTime(2010, 1, 22, 18, 50)))).isTrue(); assertThat(collector.getPeriods().get(4).isSamePeriod(new CalendarTimeRange(new DateTime(2010, 1, 29, 8, 30), new DateTime(2010, 1, 29, 18, 50)))).isTrue(); assertThat(collector.getPeriods().get(5).isSamePeriod(new CalendarTimeRange(new DateTime(2011, 1, 7, 8, 30), new DateTime(2011, 1, 7, 18, 50)))).isTrue(); assertThat(collector.getPeriods().get(6).isSamePeriod(new CalendarTimeRange(new DateTime(2011, 1, 14, 8, 30), new DateTime(2011, 1, 14, 18, 50)))).isTrue(); assertThat(collector.getPeriods().get(7).isSamePeriod(new CalendarTimeRange(new DateTime(2011, 1, 21, 8, 30), new DateTime(2011, 1, 21, 18, 50)))).isTrue(); assertThat(collector.getPeriods().get(8).isSamePeriod(new CalendarTimeRange(new DateTime(2011, 1, 28, 8, 30), new DateTime(2011, 1, 28, 18, 50)))).isTrue(); } @Test public void collectExcludePeriod() { final int workingDays2011 = 365 - 2 - (51 * 2) - 1; final int workingDaysMarch2011 = 31 - 8; // total days - weekend days YearRange year2011 = new YearRange(2011); CalendarPeriodCollectorFilter filter1 = new CalendarPeriodCollectorFilter(); filter1.addWorkingWeekdays(); CalendarPeriodCollector collector1 = new CalendarPeriodCollector(filter1, year2011); collector1.collectDays(); assertThat(collector1.getPeriods().size()).isEqualTo(workingDays2011); // 3월 제외 (23일 제외) CalendarPeriodCollectorFilter filter2 = new CalendarPeriodCollectorFilter(); filter2.addWorkingWeekdays(); filter2.getExcludePeriods().add(new MonthRange(2011, 3)); CalendarPeriodCollector collector2 = new CalendarPeriodCollector(filter2, year2011); collector2.collectDays(); assertThat(collector2.getPeriods().size()).isEqualTo(workingDays2011 - workingDaysMarch2011); // 2011 년 26주차 ~ 27주차 (여름휴가) CalendarPeriodCollectorFilter filter3 = new CalendarPeriodCollectorFilter(); filter3.addWorkingWeekdays(); filter3.getExcludePeriods().add(new MonthRange(2011, 3)); filter3.getExcludePeriods().add(new WeekRangeCollection(2011, 26, 2)); CalendarPeriodCollector collector3 = new CalendarPeriodCollector(filter3, year2011); collector3.collectDays(); assertThat(collector3.getPeriods().size()).isEqualTo(workingDays2011 - workingDaysMarch2011 - 2 * TimeSpec.WeekDaysPerWeek); } }