/**
* Licensed to Jasig under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Jasig licenses this file to you 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 org.jasig.schedassist.model;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import junit.framework.Assert;
import org.junit.Test;
/**
* Tests for {@link VisibleSchedule}.
*
* @author Nicholas Blair, nblair@doit.wisc.edu
* @version $Id: VisibleScheduleTest.java 2298 2010-07-28 15:23:04Z npblair $
*/
public class VisibleScheduleTest {
@Test
public void testLocateConflicting() throws Exception {
AvailableBlock block = AvailableBlockBuilder.createBlock("20091105-1100", "20091105-1130");
VisibleSchedule schedule = new VisibleSchedule(MeetingDurations.THIRTY);
schedule.addFreeBlock(block);
Assert.assertEquals(0,
schedule.locateConflicting(AvailableBlockBuilder.createBlock("20091105-1055", "20091105-1059")).size());
Set<AvailableBlock> conflicts = schedule.locateConflicting(AvailableBlockBuilder.createBlock("20091105-1100", "20091105-1101"));
Assert.assertTrue(conflicts.contains(block));
conflicts = schedule.locateConflicting(AvailableBlockBuilder.createBlock("20091105-1101", "20091105-1103"));
Assert.assertTrue(conflicts.contains(block));
conflicts = schedule.locateConflicting(AvailableBlockBuilder.createBlock("20091105-1101", "20091105-1129"));
Assert.assertTrue(conflicts.contains(block));
conflicts = schedule.locateConflicting(AvailableBlockBuilder.createBlock("20091105-1100", "20091105-1130"));
Assert.assertTrue(conflicts.contains(block));
conflicts = schedule.locateConflicting(AvailableBlockBuilder.createBlock("20091105-1101", "20091105-1131"));
Assert.assertTrue(conflicts.contains(block));
conflicts = schedule.locateConflicting(AvailableBlockBuilder.createBlock("20091105-1125", "20091105-1130"));
Assert.assertTrue(conflicts.contains(block));
conflicts = schedule.locateConflicting(AvailableBlockBuilder.createBlock("20091105-1129", "20091105-1130"));
Assert.assertTrue(conflicts.contains(block));
conflicts = schedule.locateConflicting(AvailableBlockBuilder.createBlock("20091105-1129", "20091105-1131"));
Assert.assertTrue(conflicts.contains(block));
conflicts = schedule.locateConflicting(AvailableBlockBuilder.createBlock("20091105-1129", "20091105-1330"));
Assert.assertTrue(conflicts.contains(block));
conflicts = schedule.locateConflicting(AvailableBlockBuilder.createBlock("20091105-1131", "20091105-1200"));
Assert.assertFalse(conflicts.contains(block));
}
/**
*
* @throws Exception
*/
@Test
public void testAddFree() throws Exception {
AvailableBlock block = AvailableBlockBuilder.createBlock("20091105-1100", "20091105-1130");
VisibleSchedule schedule = new VisibleSchedule(MeetingDurations.THIRTY);
schedule.addFreeBlock(block);
Assert.assertEquals(CommonDateOperations.parseDateTimePhrase("20091105-1100"), schedule.getScheduleStart());
Assert.assertEquals(CommonDateOperations.parseDateTimePhrase("20091105-1130"), schedule.getScheduleEnd());
Assert.assertEquals(0, schedule.getAttendingCount());
Assert.assertEquals(0, schedule.getBusyCount());
Assert.assertEquals(1, schedule.getFreeCount());
List<AvailableBlock> list = schedule.getFreeList();
Assert.assertFalse(list.isEmpty());
AvailableBlock returned = list.get(0);
Assert.assertEquals(block, returned);
}
/**
*
* @throws Exception
*/
@Test
public void testAddFreeMultiple() throws Exception {
SortedSet<AvailableBlock> blocks = AvailableBlockBuilder.createBlocks("9:00 AM", "5:00 PM", "MWF",
CommonDateOperations.parseDatePhrase("20091101"),
CommonDateOperations.parseDatePhrase("20091130"),
1);
// reinitialize schedule, this time expand the blocks into 30 minute increments
VisibleSchedule schedule = new VisibleSchedule(MeetingDurations.THIRTY);
schedule.addFreeBlocks(blocks);
Assert.assertEquals(CommonDateOperations.parseDateTimePhrase("20091102-0900"), schedule.getScheduleStart());
Assert.assertEquals(CommonDateOperations.parseDateTimePhrase("20091130-1700"), schedule.getScheduleEnd());
Assert.assertEquals(0, schedule.getAttendingCount());
Assert.assertEquals(0, schedule.getBusyCount());
Assert.assertEquals(208, schedule.getFreeCount());
}
/**
*
* @throws Exception
*/
@Test
public void testAddBusy() throws Exception {
AvailableBlock block = AvailableBlockBuilder.createBlock("20091105-1100", "20091105-1130");
VisibleSchedule schedule = new VisibleSchedule(MeetingDurations.THIRTY);
schedule.addFreeBlock(block);
schedule.setBusyBlock(block);
Assert.assertEquals(CommonDateOperations.parseDateTimePhrase("20091105-1100"), schedule.getScheduleStart());
Assert.assertEquals(CommonDateOperations.parseDateTimePhrase("20091105-1130"), schedule.getScheduleEnd());
Assert.assertEquals(0, schedule.getAttendingCount());
Assert.assertEquals(0, schedule.getFreeCount());
Assert.assertEquals(1, schedule.getBusyCount());
List<AvailableBlock> list = schedule.getBusyList();
Assert.assertFalse(list.isEmpty());
AvailableBlock returned = list.get(0);
Assert.assertEquals(block, returned);
}
/**
*
* @throws Exception
*/
@Test
public void testAddBusyMultiple() throws Exception {
SortedSet<AvailableBlock> blocks = AvailableBlockBuilder.createBlocks("9:00 AM", "5:00 PM", "MWF",
CommonDateOperations.parseDatePhrase("20091101"),
CommonDateOperations.parseDatePhrase("20091130"),
1);
// reinitialize schedule, this time expand the blocks into 30 minute increments
VisibleSchedule schedule = new VisibleSchedule(MeetingDurations.THIRTY);
schedule.addFreeBlocks(blocks);
schedule.setBusyBlocks(blocks);
Assert.assertEquals(CommonDateOperations.parseDateTimePhrase("20091102-0900"), schedule.getScheduleStart());
Assert.assertEquals(CommonDateOperations.parseDateTimePhrase("20091130-1700"), schedule.getScheduleEnd());
Assert.assertEquals(0, schedule.getAttendingCount());
Assert.assertEquals(0, schedule.getFreeCount());
Assert.assertEquals(208, schedule.getBusyCount());
}
/**
*
* @throws Exception
*/
@Test
public void testAddAttending() throws Exception {
AvailableBlock block = AvailableBlockBuilder.createBlock("20091105-1100", "20091105-1130");
VisibleSchedule schedule = new VisibleSchedule(MeetingDurations.THIRTY);
schedule.addFreeBlock(block);
schedule.setAttendingBlock(block);
Assert.assertEquals(CommonDateOperations.parseDateTimePhrase("20091105-1100"), schedule.getScheduleStart());
Assert.assertEquals(CommonDateOperations.parseDateTimePhrase("20091105-1130"), schedule.getScheduleEnd());
Assert.assertEquals(0, schedule.getBusyCount());
Assert.assertEquals(0, schedule.getFreeCount());
Assert.assertEquals(1, schedule.getAttendingCount());
List<AvailableBlock> list = schedule.getAttendingList();
Assert.assertFalse(list.isEmpty());
AvailableBlock returned = list.get(0);
Assert.assertEquals(block, returned);
}
/**
* Attending blocks
* @throws Exception
*/
@Test
public void testAddAttendingMultiple() throws Exception {
SortedSet<AvailableBlock> blocks = AvailableBlockBuilder.createBlocks("9:00 AM", "5:00 PM", "MWF",
CommonDateOperations.parseDatePhrase("20091101"),
CommonDateOperations.parseDatePhrase("20091130"),
1);
VisibleSchedule schedule = new VisibleSchedule(MeetingDurations.THIRTY);
schedule.addFreeBlocks(blocks);
schedule.setAttendingBlocks(blocks);
Assert.assertEquals(CommonDateOperations.parseDateTimePhrase("20091102-0900"), schedule.getScheduleStart());
Assert.assertEquals(CommonDateOperations.parseDateTimePhrase("20091130-1700"), schedule.getScheduleEnd());
Assert.assertEquals(0, schedule.getBusyCount());
Assert.assertEquals(0, schedule.getFreeCount());
Assert.assertEquals(13, schedule.getAttendingCount());
}
/**
*
*/
@Test
public void testOverwriteBlocks() throws Exception {
SortedSet<AvailableBlock> blocks = AvailableBlockBuilder.createBlocks("9:00 AM", "5:00 PM", "MWF",
CommonDateOperations.parseDatePhrase("20091101"),
CommonDateOperations.parseDatePhrase("20091130"),
1);
VisibleSchedule schedule = new VisibleSchedule(MeetingDurations.THIRTY);
schedule.addFreeBlocks(blocks);
Assert.assertEquals(CommonDateOperations.parseDateTimePhrase("20091102-0900"), schedule.getScheduleStart());
Assert.assertEquals(CommonDateOperations.parseDateTimePhrase("20091130-1700"), schedule.getScheduleEnd());
Assert.assertEquals(0, schedule.getAttendingCount());
Assert.assertEquals(0, schedule.getBusyCount());
Assert.assertEquals(208, schedule.getFreeCount());
// overwrite a block in the schedule with a BUSY block
AvailableBlock busySingle = AvailableBlockBuilder.createBlock("20091102-1130", "20091102-1200");
schedule.setBusyBlock(busySingle);
Assert.assertEquals(0, schedule.getAttendingCount());
Assert.assertEquals(1, schedule.getBusyCount());
Assert.assertEquals(207, schedule.getFreeCount());
// overwrite a block in the schedule with a ATTENDING block
AvailableBlock busyAttending = AvailableBlockBuilder.createBlock("20091109-1100", "20091109-1130");
schedule.setAttendingBlock(busyAttending);
Assert.assertEquals(1, schedule.getAttendingCount());
Assert.assertEquals(1, schedule.getBusyCount());
Assert.assertEquals(206, schedule.getFreeCount());
// overwrite several hours
AvailableBlock busyMultiple = AvailableBlockBuilder.createBlock("20091125-0900", "20091125-1400");
schedule.setBusyBlock(busyMultiple);
Assert.assertEquals(1, schedule.getAttendingCount());
Assert.assertEquals(11, schedule.getBusyCount());
Assert.assertEquals(196, schedule.getFreeCount());
}
/**
*
* @throws Exception
*/
@Test
public void testSubset() throws Exception {
SortedSet<AvailableBlock> blocks = AvailableBlockBuilder.createBlocks("9:00 AM", "5:00 PM", "MWF",
CommonDateOperations.parseDatePhrase("20100801"),
CommonDateOperations.parseDatePhrase("20100828"),
1);
VisibleSchedule schedule = new VisibleSchedule(MeetingDurations.THIRTY);
schedule.addFreeBlocks(blocks);
Assert.assertEquals(CommonDateOperations.parseDateTimePhrase("20100802-0900"), schedule.getScheduleStart());
Assert.assertEquals(CommonDateOperations.parseDateTimePhrase("20100827-1700"), schedule.getScheduleEnd());
Assert.assertEquals(0, schedule.getAttendingCount());
Assert.assertEquals(0, schedule.getBusyCount());
Assert.assertEquals(192, schedule.getFreeCount());
// first test just with free blocks
VisibleSchedule subset = schedule.subset(CommonDateOperations.parseDatePhrase("20100801"), CommonDateOperations.parseDatePhrase("20100807"));
Assert.assertEquals(48, subset.getFreeCount());
Assert.assertEquals(0, subset.getBusyCount());
Assert.assertEquals(0, subset.getAttendingCount());
subset = schedule.subset(CommonDateOperations.parseDatePhrase("20100803"), CommonDateOperations.parseDatePhrase("20100819"));
Assert.assertEquals(112, subset.getFreeCount());
Assert.assertEquals(0, subset.getBusyCount());
Assert.assertEquals(0, subset.getAttendingCount());
// add 1 busy to original schedule
AvailableBlock busySingle = AvailableBlockBuilder.createBlock("20100806-1000", "20100806-1030");
schedule.setBusyBlock(busySingle);
Assert.assertEquals(0, schedule.getAttendingCount());
Assert.assertEquals(1, schedule.getBusyCount());
Assert.assertEquals(191, schedule.getFreeCount());
// find subset that includes the busy
subset = schedule.subset(CommonDateOperations.parseDatePhrase("20100801"), CommonDateOperations.parseDatePhrase("20100807"));
Assert.assertEquals(47, subset.getFreeCount());
Assert.assertEquals(1, subset.getBusyCount());
Assert.assertEquals(0, subset.getAttendingCount());
// verify subset not including busy
subset = schedule.subset(CommonDateOperations.parseDatePhrase("20100808"), CommonDateOperations.parseDatePhrase("20100814"));
Assert.assertEquals(48, subset.getFreeCount());
Assert.assertEquals(0, subset.getBusyCount());
Assert.assertEquals(0, subset.getAttendingCount());
// add 1 attending to original schedule
AvailableBlock busyAttending = AvailableBlockBuilder.createBlock("20100818-1100", "20100818-1130");
schedule.setAttendingBlock(busyAttending);
Assert.assertEquals(1, schedule.getAttendingCount());
Assert.assertEquals(1, schedule.getBusyCount());
Assert.assertEquals(190, schedule.getFreeCount());
// find subset including attending
subset = schedule.subset(CommonDateOperations.parseDatePhrase("20100815"), CommonDateOperations.parseDatePhrase("20100821"));
Assert.assertEquals(47, subset.getFreeCount());
Assert.assertEquals(0, subset.getBusyCount());
Assert.assertEquals(1, subset.getAttendingCount());
// find subset including both
subset = schedule.subset(CommonDateOperations.parseDatePhrase("20100801"), CommonDateOperations.parseDatePhrase("20100821"));
Assert.assertEquals(1, subset.getAttendingCount());
Assert.assertEquals(1, subset.getBusyCount());
Assert.assertEquals(142, subset.getFreeCount());
}
}