/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
// www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation; version 3 of the License.
//
// This community edition is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
// Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////
package org.projectforge.gantt;
import static org.junit.Assert.assertEquals;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import org.apache.commons.io.FileUtils;
import org.junit.BeforeClass;
import org.junit.Test;
import org.projectforge.calendar.DayHolder;
import org.projectforge.core.ConfigXmlTest;
import org.projectforge.core.Configuration;
import org.projectforge.renderer.BatikImageRenderer;
import org.projectforge.renderer.ImageFormat;
import org.projectforge.test.TestConfiguration;
public class GanttTest
{
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(GanttTest.class);
@BeforeClass
public static void setUp()
{
// Needed if this tests runs before the ConfigurationTest.
ConfigXmlTest.createTestConfiguration();
Configuration.init4TestMode();
}
@Test
public void createImage() throws IOException
{
final GanttTask root = createTestChart();
final GanttChartStyle style = new GanttChartStyle();
final GanttChartSettings settings = new GanttChartSettings();
final GanttChart diagram = new GanttChart(root, style, settings, "test-chart");
writeFile("ganttTest.jpg", BatikImageRenderer.getByteArray(diagram.create(), 800, ImageFormat.JPEG));
writeFile("ganttTest.png", BatikImageRenderer.getByteArray(diagram.create(), 800, ImageFormat.PNG));
writeFile("ganttTest.svg", BatikImageRenderer.getByteArray(diagram.create(), 800, ImageFormat.SVG));
writeFile("ganttTest.pdf", BatikImageRenderer.getByteArray(diagram.create(), 800, ImageFormat.PDF));
}
private void writeFile(final String filename, final byte[] ba) throws IOException {
final File file = TestConfiguration.getWorkFile(filename);
log.info("Writing Gantt test image to work directory: " + file.getAbsolutePath());
FileUtils.writeByteArrayToFile(file, ba);
}
@Test
public void testTestDiagram()
{
final GanttTask root = createTestChart();
assertDate(2010, Calendar.JUNE, 1, root.getCalculatedStartDate());
assertDate(2010, Calendar.JUNE, 1, root.findByWorkpackageCode("001").getCalculatedStartDate());
// 2010-06-03 is an holiday.
assertDate(2010, Calendar.JUNE, 16, root.findByWorkpackageCode("001").getCalculatedEndDate()); // Duration of 10 working days
assertDate(2010, Calendar.JUNE, 30, root.findByWorkpackageCode("002").getCalculatedStartDate()); // 10 days after EB.
}
private GanttTask createTestChart()
{
// final GanttObjectImpl root = createGanttObject(null, "--", "rootNode", "0");
final GanttTaskImpl phase1 = createGanttObject(null, "P1", "Phase 1", "5");
final GanttTaskImpl task1 = createGanttObject(phase1, "001", "Task 1", "10");
final DayHolder day = new DayHolder();
day.setDate(2010, Calendar.JUNE, 1);
task1.setStartDate(day.getDate());
createGanttObject(phase1, "002", "Task 2 (finish-start)", "10", task1, GanttRelationType.FINISH_START, 10);
final GanttTaskImpl task3 = createGanttObject(phase1, "003", "Task 3 (finish-start II)", "5", task1, null, 0);
createGanttObject(phase1, "004", "Task 4 (finish-start, depth = 2)", "5", task3, null, -3);
final GanttTaskImpl task5 = createGanttObject(phase1, "005", "Task 5", "5");
day.add(Calendar.MONTH, 1);
task5.setStartDate(day.getDate());
createGanttObject(phase1, "006", "Task 6 (finish-finish)", "3", task5, GanttRelationType.FINISH_FINISH, 0);
createGanttObject(phase1, "007", "Task 7 (finish_finish)", "3", task5, GanttRelationType.FINISH_FINISH, -8);
final GanttTaskImpl task8 = createGanttObject(phase1, "008", "Task 8 (finish_finish)", "3", task5, GanttRelationType.FINISH_FINISH, 3);
createGanttObject(phase1, "009", "Task 9 (start-start)", "3", task8, GanttRelationType.START_START, 0);
createGanttObject(phase1, "010", "Task 10 (start-start)", "3", task8, GanttRelationType.START_START, 5);
createGanttObject(phase1, "011", "Task 11 (start-start)", "3", task8, GanttRelationType.START_START, -5);
final GanttTaskImpl task12 = createGanttObject(phase1, "012", "Task 12", "5");
day.add(Calendar.WEEK_OF_YEAR, 3);
task12.setStartDate(day.getDate());
createGanttObject(phase1, "013", "Task 13 (start-finish)", "3", task12, GanttRelationType.START_FINISH, -5);
createGanttObject(phase1, "014", "Task 14 (start-finish)", "3", task12, GanttRelationType.START_FINISH, 5);
createGanttObject(phase1, "015", "Task 15 (start-finish)", "3", task12, GanttRelationType.START_FINISH, 0);
final GanttTaskImpl task16 = createGanttObject(phase1, "016", "Task 16", "6");
day.add(Calendar.WEEK_OF_YEAR, 1);
task16.setStartDate(day.getDate());
return phase1;
}
private GanttTaskImpl createGanttObject(final GanttTaskImpl parent, final String workpackageCode, final String name,
final String durationDays)
{
return createGanttObject(parent, workpackageCode, name, durationDays, null, null, 0);
}
private GanttTaskImpl createGanttObject(final GanttTaskImpl parent, final String workpackageCode, final String title,
final String durationDays, final GanttTask dependsOnGanttObject, final GanttRelationType type, final int dependDayOffset)
{
final GanttTaskImpl node = new GanttTaskImpl();
node.setTitle(title);
node.setWorkpackageCode(workpackageCode);
node.setDuration(new BigDecimal(durationDays));
node.setVisible(true);
if (dependsOnGanttObject != null) {
node.setPredecessor(dependsOnGanttObject);
}
if (type != null) {
node.setRelationType(type);
}
if (dependDayOffset != 0) {
node.setPredecessorOffset(dependDayOffset);
}
if (parent != null) {
parent.addChild(node);
}
node.setPredecessor(dependsOnGanttObject);
return node;
}
private void assertDate(final int year, final int month, final int day, final Date date)
{
final DayHolder dh = new DayHolder(date);
assertEquals(year, dh.getYear());
assertEquals(month, dh.getMonth());
assertEquals(day, dh.getDayOfMonth());
}
}