/*
* 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.seekers;
import kr.debop4j.core.Action1;
import kr.debop4j.core.parallelism.Parallels;
import kr.debop4j.timeperiod.SeekDirection;
import kr.debop4j.timeperiod.calendars.CalendarVisitorFilter;
import kr.debop4j.timeperiod.calendars.seeker.DaySeeker;
import kr.debop4j.timeperiod.test.TimePeriodTestBase;
import kr.debop4j.timeperiod.timerange.DayRange;
import kr.debop4j.timeperiod.timerange.DayRangeCollection;
import kr.debop4j.timeperiod.tools.TimeSpec;
import kr.debop4j.timeperiod.tools.Times;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import static org.fest.assertions.Assertions.assertThat;
/**
* kr.debop4j.timeperiod.test.calendars.seekers.DaySeekerTest
*
* @author 배성혁 sunghyouk.bae@gmail.com
* @since 13. 5. 27. 오후 6:16
*/
@Slf4j
public class DaySeekerTest extends TimePeriodTestBase {
@Test
public void simpleForward() {
final DayRange start = new DayRange();
final DaySeeker daySeeker = new DaySeeker();
DayRange day1 = daySeeker.findDay(start, 0);
assertThat(day1.isSamePeriod(start)).isTrue();
DayRange day2 = daySeeker.findDay(start, 1);
assertThat(day2.isSamePeriod(start.nextDay())).isTrue();
Parallels.run(-10, 20, new Action1<Integer>() {
@Override
public void perform(Integer i) {
Integer offset = i * 5;
DayRange day = daySeeker.findDay(start, offset);
assertThat(day.isSamePeriod(start.addDays(offset))).isTrue();
}
});
}
@Test
public void simpleBackward() {
final DayRange start = new DayRange();
final DaySeeker daySeeker = new DaySeeker(SeekDirection.Backward);
DayRange day1 = daySeeker.findDay(start, 0);
assertThat(day1.isSamePeriod(start)).isTrue();
DayRange day2 = daySeeker.findDay(start, 1);
assertThat(day2.isSamePeriod(start.previousDay())).isTrue();
Parallels.run(-10, 20, new Action1<Integer>() {
@Override
public void perform(Integer i) {
Integer offset = i * 5;
DayRange day = daySeeker.findDay(start, offset);
assertThat(day.isSamePeriod(start.addDays(-offset))).isTrue();
}
});
}
@Test
public void seekDirectionTest() {
final DayRange start = new DayRange();
final DaySeeker daySeeker = new DaySeeker();
Parallels.run(-10, 20, new Action1<Integer>() {
@Override
public void perform(Integer i) {
Integer offset = i * 5;
DayRange day = daySeeker.findDay(start, offset);
assertThat(day.isSamePeriod(start.addDays(offset))).isTrue();
}
});
final DaySeeker backwardSeeker = new DaySeeker(SeekDirection.Backward);
Parallels.run(-10, 20, new Action1<Integer>() {
@Override
public void perform(Integer i) {
Integer offset = i * 5;
DayRange day = backwardSeeker.findDay(start, offset);
assertThat(day.isSamePeriod(start.addDays(-offset))).isTrue();
}
});
}
@Test
public void minDateTest() {
DaySeeker daySeeker = new DaySeeker();
DayRange day = daySeeker.findDay(new DayRange(TimeSpec.MinPeriodTime), -10);
assertThat(day).isNull();
}
@Test
public void maxDateTest() {
DaySeeker daySeeker = new DaySeeker();
DayRange day = daySeeker.findDay(new DayRange(TimeSpec.MaxPeriodTime), 10);
assertThat(day).isNull();
}
@Test
public void seekWeekendHolidayTest() {
DayRange start = new DayRange(Times.asDate(2011, 2, 15));
CalendarVisitorFilter filter = new CalendarVisitorFilter();
filter.addWorkingWeekdays();
filter.getExcludePeriods().add(new DayRangeCollection(2011, 2, 27, 14)); // 14 days -> week 9 and week 10
DaySeeker daySeeker = new DaySeeker(filter);
DayRange day1 = daySeeker.findDay(start, 3);
assertThat(day1).isEqualTo(new DayRange(2011, 2, 18));
DayRange day2 = daySeeker.findDay(start, 4); // 주말 (19, 20) 제외
assertThat(day2).isEqualTo(new DayRange(2011, 2, 21));
DayRange day3 = daySeeker.findDay(start, 10); // 주말 (19, 20) 제외, 2.27부터 14일간 휴가
assertThat(day3).isEqualTo(new DayRange(2011, 3, 15));
}
}