001 /**
002 * Copyright 2004-2012 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.hr.time.timeblock;
017
018 import java.math.BigDecimal;
019 import java.sql.Timestamp;
020 import java.util.ArrayList;
021 import java.util.Collections;
022 import java.util.List;
023
024 import org.joda.time.DateTime;
025 import org.joda.time.DateTimeZone;
026 import org.joda.time.Interval;
027 import org.junit.Assert;
028 import org.junit.Test;
029 import org.kuali.hr.test.KPMETestCase;
030 import org.kuali.hr.time.calendar.Calendar;
031 import org.kuali.hr.time.calendar.CalendarEntries;
032 import org.kuali.hr.time.util.TKUtils;
033 import org.kuali.hr.time.util.TkTimeBlockAggregate;
034
035 public class TimeBlockTest extends KPMETestCase {
036
037 @Test
038 public void testTimeBlockComparison() throws Exception {
039 TimeBlock timeBlock = new TimeBlock();
040 timeBlock.setJobNumber(2L);
041 timeBlock.setWorkArea(1234L);
042 timeBlock.setTask(1L);
043 timeBlock.setEarnCode("REG");
044 Timestamp beginTimestamp = new Timestamp(System.currentTimeMillis());
045 timeBlock.setBeginTimestamp(beginTimestamp);
046 Timestamp endTimestamp = new Timestamp(System.currentTimeMillis());
047 timeBlock.setEndTimestamp(endTimestamp);
048 TimeHourDetail timeHourDetail = new TimeHourDetail();
049 timeHourDetail.setEarnCode("REG");
050 timeHourDetail.setHours(new BigDecimal(2.0));
051 timeBlock.getTimeHourDetails().add(timeHourDetail);
052
053 TimeBlock timeBlock2 = new TimeBlock();
054 timeBlock2.setJobNumber(2L);
055 timeBlock2.setWorkArea(1234L);
056 timeBlock2.setTask(1L);
057 timeBlock2.setEarnCode("REG");
058 timeBlock2.setBeginTimestamp(beginTimestamp);
059 timeBlock2.setEndTimestamp(endTimestamp);
060 TimeHourDetail timeHourDetail2 = new TimeHourDetail();
061 timeHourDetail2.setEarnCode("REG");
062 timeHourDetail2.setHours(new BigDecimal(2.0));
063 timeBlock2.getTimeHourDetails().add(timeHourDetail);
064
065 Assert.assertTrue("Timeblock has been equal", timeBlock.equals(timeBlock2));
066 }
067
068 @Test
069 public void testTimeBlockBuilding() throws Exception {
070 CalendarEntries payCalendarEntry = new CalendarEntries();
071 java.util.Date beginDateTime = new java.util.Date((new DateTime(2010, 1, 1, 12, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
072 java.util.Date endDateTime = new java.util.Date((new DateTime(2010, 1, 15, 12, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
073 payCalendarEntry.setBeginPeriodDateTime(beginDateTime);
074 payCalendarEntry.setEndPeriodDateTime(endDateTime);
075
076 List<Interval> dayInterval = TKUtils.getDaySpanForCalendarEntry(payCalendarEntry);
077 Timestamp beginTimeStamp = new Timestamp((new DateTime(2010, 1, 1, 13, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
078 Timestamp endTimeStamp = new Timestamp((new DateTime(2010, 1, 2, 14, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
079
080 Interval firstDay = null;
081 List<TimeBlock> lstTimeBlocks = new ArrayList<TimeBlock>();
082 for(Interval dayInt : dayInterval){
083 //on second day of span so safe to assume doesnt go furthur than this
084 if(firstDay != null){
085 TimeBlock tb = new TimeBlock();
086 tb.setBeginTimestamp(new Timestamp(dayInt.getStartMillis()));
087 tb.setEndTimestamp(endTimeStamp);
088 lstTimeBlocks.add(tb);
089 break;
090 }
091 if(dayInt.contains(beginTimeStamp.getTime()) ){
092 firstDay = dayInt;
093 if(dayInt.contains(endTimeStamp.getTime())){
094 //create one timeblock if contained in one day interval
095 TimeBlock tb = new TimeBlock();
096 tb.setBeginTimestamp(beginTimeStamp);
097 tb.setEndTimestamp(endTimeStamp);
098 lstTimeBlocks.add(tb);
099 break;
100 } else {
101 //create a timeblock that wraps the 24 hr day
102 TimeBlock tb = new TimeBlock();
103 tb.setBeginTimestamp(beginTimeStamp);
104 tb.setEndTimestamp(new Timestamp(firstDay.getEndMillis()));
105 lstTimeBlocks.add(tb);
106 }
107 }
108 }
109 Assert.assertTrue("Two timeblocks created", lstTimeBlocks.size() == 2);
110
111 lstTimeBlocks.clear();
112
113 beginTimeStamp = new Timestamp((new DateTime(2010, 1, 1, 13, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
114 endTimeStamp = new Timestamp((new DateTime(2010, 1, 1, 15, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
115
116 firstDay = null;
117 for(Interval dayInt : dayInterval){
118 //on second day of span so safe to assume doesnt go furthur than this
119 if(firstDay != null){
120 TimeBlock tb = new TimeBlock();
121 tb.setBeginTimestamp(new Timestamp(dayInt.getStartMillis()));
122 tb.setEndTimestamp(endTimeStamp);
123 lstTimeBlocks.add(tb);
124 break;
125 }
126 if(dayInt.contains(beginTimeStamp.getTime()) ){
127 firstDay = dayInt;
128 if(dayInt.contains(endTimeStamp.getTime())){
129 //create one timeblock if contained in one day interval
130 TimeBlock tb = new TimeBlock();
131 tb.setBeginTimestamp(beginTimeStamp);
132 tb.setEndTimestamp(endTimeStamp);
133 lstTimeBlocks.add(tb);
134 break;
135 } else {
136 //create a timeblock that wraps the 24 hr day
137 TimeBlock tb = new TimeBlock();
138 tb.setBeginTimestamp(beginTimeStamp);
139 tb.setEndTimestamp(new Timestamp(firstDay.getEndMillis()));
140 lstTimeBlocks.add(tb);
141 }
142 }
143 }
144 Assert.assertTrue("One time block creation", lstTimeBlocks.size() == 1);
145 }
146
147 @Test
148 public void testTimeBlockAggregate() throws Exception {
149 DateTime beginTime = new DateTime(2010, 1, 1, 12, 0, 0, 0, TKUtils.getSystemDateTimeZone());
150 DateTime endTime = new DateTime(2010, 1, 16, 12, 0, 0, 0, TKUtils.getSystemDateTimeZone());
151
152 Calendar payCalendar = new Calendar();
153
154 CalendarEntries payCalendarEntry = new CalendarEntries();
155 java.util.Date beginDateTime = new java.util.Date(beginTime.getMillis());
156 java.util.Date endDateTime = new java.util.Date(endTime.getMillis());
157 payCalendarEntry.setBeginPeriodDateTime(beginDateTime);
158 payCalendarEntry.setEndPeriodDateTime(endDateTime);
159
160 List<TimeBlock> lstTimeBlocks = setupTimeBlocks(beginTime, endTime, payCalendarEntry);
161 TkTimeBlockAggregate tkTimeBlockAggregate = new TkTimeBlockAggregate(lstTimeBlocks, payCalendarEntry, payCalendar);
162 Assert.assertTrue("Aggregate built correctly ", tkTimeBlockAggregate!= null && tkTimeBlockAggregate.getWeekTimeBlocks(0).size() == 7);
163 Assert.assertTrue("Total number of days is correct",tkTimeBlockAggregate.getDayTimeBlockList().size()==15);
164 }
165
166 @Test
167 public void testTimeBlockSorting() throws Exception {
168 List<TimeBlock> tbList = new ArrayList<TimeBlock>();
169 TimeBlock tb1 = new TimeBlock();
170 // time block with 2010 time
171 tb1.setBeginTimestamp(new Timestamp((new DateTime(2010, 1, 1, 13, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis()));
172 tb1.setEndTimestamp(new Timestamp((new DateTime(2010, 1, 2, 14, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis()));
173 tbList.add(tb1);
174 //time block with 2009 time
175 TimeBlock tb2 = new TimeBlock();
176 tb2.setBeginTimestamp(new Timestamp((new DateTime(2009, 1, 1, 13, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis()));
177 tb2.setEndTimestamp(new Timestamp((new DateTime(2009, 1, 2, 14, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis()));
178 tbList.add(tb2);
179
180 Assert.assertTrue(tbList.get(0) == tb1);
181 Assert.assertTrue(tbList.get(1) == tb2);
182 // after sort
183 Collections.sort(tbList);
184 Assert.assertTrue(tbList.get(0) == tb2);
185 Assert.assertTrue(tbList.get(1) == tb1);
186 }
187 private List<TimeBlock> setupTimeBlocks(DateTime startTime, DateTime endTime, CalendarEntries payCalendarEntry){
188 List<Interval> dayInterval = TKUtils.getDaySpanForCalendarEntry(payCalendarEntry);
189 Timestamp beginTimeStamp = new Timestamp((new DateTime(2010, 1, 1, 13, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
190 Timestamp endTimeStamp = new Timestamp((new DateTime(2010, 1, 2, 14, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
191
192 Interval firstDay = null;
193 List<TimeBlock> lstTimeBlocks = new ArrayList<TimeBlock>();
194 for(Interval dayInt : dayInterval){
195 //on second day of span so safe to assume doesnt go furthur than this
196 if(firstDay != null){
197 TimeBlock tb = new TimeBlock();
198 tb.setBeginTimestamp(new Timestamp(dayInt.getStartMillis()));
199 tb.setEndTimestamp(endTimeStamp);
200 lstTimeBlocks.add(tb);
201 break;
202 }
203 if(dayInt.contains(beginTimeStamp.getTime()) ){
204 firstDay = dayInt;
205 if(dayInt.contains(endTimeStamp.getTime())){
206 //create one timeblock if contained in one day interval
207 TimeBlock tb = new TimeBlock();
208 tb.setBeginTimestamp(beginTimeStamp);
209 tb.setEndTimestamp(endTimeStamp);
210 lstTimeBlocks.add(tb);
211 break;
212 } else {
213 //create a timeblock that wraps the 24 hr day
214 TimeBlock tb = new TimeBlock();
215 tb.setBeginTimestamp(beginTimeStamp);
216 tb.setEndTimestamp(new Timestamp(firstDay.getEndMillis()));
217 lstTimeBlocks.add(tb);
218 }
219 }
220 }
221 Assert.assertTrue("Two timeblocks created", lstTimeBlocks.size() == 2);
222
223 lstTimeBlocks.clear();
224
225 beginTimeStamp = new Timestamp((new DateTime(2010, 1, 1, 13, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
226 endTimeStamp = new Timestamp((new DateTime(2010, 1, 1, 15, 0, 0, 0, TKUtils.getSystemDateTimeZone())).getMillis());
227
228 firstDay = null;
229 for(Interval dayInt : dayInterval){
230 //on second day of span so safe to assume doesnt go furthur than this
231 if(firstDay != null){
232 TimeBlock tb = new TimeBlock();
233 tb.setBeginTimestamp(new Timestamp(dayInt.getStartMillis()));
234 tb.setEndTimestamp(endTimeStamp);
235 lstTimeBlocks.add(tb);
236 break;
237 }
238 if(dayInt.contains(beginTimeStamp.getTime()) ){
239 firstDay = dayInt;
240 if(dayInt.contains(endTimeStamp.getTime())){
241 //create one timeblock if contained in one day interval
242 TimeBlock tb = new TimeBlock();
243 tb.setBeginTimestamp(beginTimeStamp);
244 tb.setEndTimestamp(endTimeStamp);
245 lstTimeBlocks.add(tb);
246 break;
247 } else {
248 //create a timeblock that wraps the 24 hr day
249 TimeBlock tb = new TimeBlock();
250 tb.setBeginTimestamp(beginTimeStamp);
251 tb.setEndTimestamp(new Timestamp(firstDay.getEndMillis()));
252 lstTimeBlocks.add(tb);
253 }
254 }
255 }
256 return lstTimeBlocks;
257 }
258 }