/* * 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.Function1; import kr.debop4j.timeperiod.ITimePeriod; import kr.debop4j.timeperiod.PeriodUnit; import kr.debop4j.timeperiod.TimeRange; import kr.debop4j.timeperiod.test.TimePeriodTestBase; import kr.debop4j.timeperiod.tools.TimeSpec; import kr.debop4j.timeperiod.tools.Times; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.junit.Test; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import static org.fest.assertions.Assertions.assertThat; /** * kr.debop4j.timeperiod.test.tools.TimesForEachTest * * @author 배성혁 sunghyouk.bae@gmail.com * @since 13. 5. 24. 오전 12:22 */ @Slf4j public class TimesForEachTest extends TimePeriodTestBase { private DateTime startTime = new DateTime(2008, 4, 10, 5, 33, 24, 345); private DateTime endTime = new DateTime(2012, 10, 20, 13, 43, 12, 599); @Getter private TimeRange period = new TimeRange(startTime, endTime); @Test public void foreachYearsTest() { int count = 0; for (ITimePeriod p : Times.foreachYears(period)) { log.trace("year [{}] = [{}]", count++, p.getStart().getYear()); } assertThat(count).isEqualTo(period.getEnd().getYear() - period.getStart().getYear() + 1); } @Test public void foreachMonthsTest() { int count = 0; for (ITimePeriod p : Times.foreachMonths(period)) { log.trace("month [{}] = [{}]", count++, p.getStart().getMonthOfYear()); } int months = (int) (period.getDuration().getMillis() / (TimeSpec.MaxDaysPerMonth * TimeSpec.MillisPerDay)) + 2; assertThat(count).isEqualTo(months); } @Test public void foreachWeeksTest() { int count = 0; DateTimeFormatter shortDate = DateTimeFormat.shortDate(); List<ITimePeriod> weeks = Times.foreachWeeks(period); for (ITimePeriod p : weeks) { log.trace("week[{}] = [{}]~[{}], WeekOfYear=({},{})", count++, shortDate.print(p.getStart()), shortDate.print(p.getEnd()), p.getStart().getWeekyear(), p.getStart().getWeekOfWeekyear()); } assertThat(weeks.get(0).getStart()).isEqualTo(period.getStart()); assertThat(weeks.get(weeks.size() - 1).getEnd()).isEqualTo(period.getEnd()); } @Test public void foreachDaysTest() { int count = 0; List<ITimePeriod> days = Times.foreachDays(period); for (ITimePeriod p : days) count++; assertThat(days.get(0).getStart()).isEqualTo(period.getStart()); assertThat(days.get(days.size() - 1).getEnd()).isEqualTo(period.getEnd()); log.trace("end-1=[{}]", days.get(days.size() - 2)); log.trace("end =[{}]", days.get(days.size() - 1)); } @Test public void foreachHoursTest() { int count = 0; List<ITimePeriod> hours = Times.foreachHours(period); for (ITimePeriod p : hours) count++; assertThat(hours.size()).isEqualTo(count); assertThat(hours.get(0).getStart()).isEqualTo(period.getStart()); assertThat(hours.get(hours.size() - 1).getEnd()).isEqualTo(period.getEnd()); assertThat(hours.get(hours.size() - 1).getStart().getMillis()).isGreaterThan(hours.get(hours.size() - 2).getEnd().getMillis()); } @Test public void foreachMinuteTest() { int count = 0; List<ITimePeriod> minutes = Times.foreachMinutes(period); for (ITimePeriod p : minutes) count++; assertThat(minutes.size()).isEqualTo(count); assertThat(minutes.get(0).getStart()).isEqualTo(period.getStart()); assertThat(minutes.get(minutes.size() - 1).getEnd()).isEqualTo(period.getEnd()); assertThat(minutes.get(minutes.size() - 1).getStart().getMillis()).isGreaterThan(minutes.get(minutes.size() - 2).getEnd().getMillis()); } @Test public void foreachPeriodsTest() { for (PeriodUnit periodUnit : PeriodUnit.values()) { if (periodUnit == PeriodUnit.Second || periodUnit == PeriodUnit.Millisecond) continue; int count = 0; for (ITimePeriod p : Times.foreachPeriods(period, periodUnit)) { count++; if (count == 1000) break; } } } @Test public void runPeriodTest() { for (PeriodUnit periodUnit : PeriodUnit.values()) { if (periodUnit == PeriodUnit.Second || periodUnit == PeriodUnit.Millisecond) continue; final int[] count = { 0 }; List<Integer> results = Times.runPeriods(period, periodUnit, new Function1<ITimePeriod, Integer>() { @Override public Integer execute(ITimePeriod arg) { return count[0]++; } }); assertThat(results.size()).isEqualTo(count[0]); } } @Test public void runPeriodAsParallelTest() { for (PeriodUnit periodUnit : PeriodUnit.values()) { if (periodUnit == PeriodUnit.Second || periodUnit == PeriodUnit.Millisecond) continue; final AtomicInteger count = new AtomicInteger(0); List<Integer> results = Times.runPeriodsAsParallel(period, periodUnit, new Function1<ITimePeriod, Integer>() { @Override public Integer execute(ITimePeriod arg) { return count.incrementAndGet(); } }); assertThat(results.size()).isEqualTo(count.get()); } } }