// Path: src/main/java/org/psidnell/omnifocus/ApplicationContextFactory.java
// public class ApplicationContextFactory {
// 
//     public static final String CONFIG_XML = "/config.xml";
//     private static final String CONFIG_PROPERTIES = "/config.properties";
// 
//     public static ApplicationContext getContext() {
//         return new ClassPathXmlApplicationContext(CONFIG_XML);
//     }
// 
//     public static Properties getConfigProperties() throws IOException {
//         try (
//             InputStream in = ApplicationContextFactory.class.getResourceAsStream(CONFIG_PROPERTIES)) {
//             if (in == null) {
//                 throw new IOException("config not found");
//             }
//             Properties config = new Properties();
//             config.load(in);
//             return config;
//         }
//     }
// }
// 
// Path: src/main/java/org/psidnell/omnifocus/ConfigParams.java
// public class ConfigParams {
// 
//     private String dueSoon;
//     private String flattenedRootName;
//     private String expressionDateFormat;
//     private int icsAlarmMinutes;
//     private boolean icsAlarm;
//     private String icsStart;
//     private String icsEnd;
//     private boolean icsAllDay;
// 
//     public void setDueSoon(String dueSoon) {
//         this.dueSoon = dueSoon;
//     }
// 
//     public String getDueSoon() {
//         return dueSoon;
//     }
// 
//     public void setFlattenedRootName(String name) {
//         this.flattenedRootName = name;
//     }
// 
//     public String getFlattenedRootName() {
//         return flattenedRootName;
//     }
// 
//     public void setExpressionDateFormat(String format) {
//         this.expressionDateFormat = format;
//     }
// 
//     public String getExpressionDateFormat() {
//         return expressionDateFormat;
//     }
// 
//     public int getIcsAlarmMinutes() {
//         return icsAlarmMinutes;
//     }
// 
//     public void setIcsAlarmMinutes(int icsAlarmMinutes) {
//         this.icsAlarmMinutes = icsAlarmMinutes;
//     }
// 
//     public boolean getIcsAlarm() {
//         return icsAlarm;
//     }
// 
//     public void setIcsAlarm(boolean icsAlarm) {
//         this.icsAlarm = icsAlarm;
//     }
// 
//     public String getIcsStart() {
//         return icsStart;
//     }
// 
//     public void setIcsStart(String icsStart) {
//         this.icsStart = icsStart;
//     }
// 
//     public String getIcsEnd() {
//         return icsEnd;
//     }
// 
//     public void setIcsEnd(String icsEnd) {
//         this.icsEnd = icsEnd;
//     }
// 
//     public boolean getIcsAllDay() {
//         return icsAllDay;
//     }
// 
//     public void setIcsAllDay(boolean icsAllDay) {
//         this.icsAllDay = icsAllDay;
//     }
// 
// }


import static org.junit.Assert.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import org.junit.Before;
import org.junit.Test;
import org.psidnell.omnifocus.ApplicationContextFactory;
import org.psidnell.omnifocus.ConfigParams;
import org.springframework.context.ApplicationContext;
        cal.setTime(date);

        assertEquals ("2014-11-20", date("+1d", cal));
        assertEquals ("2014-11-20", date("1d", cal));
        assertEquals ("2014-11-22", date("3d", cal));
        assertEquals ("2014-11-18", date("-1d", cal));
        assertEquals ("2014-11-16", date("-3d", cal));

        assertEquals ("2014-11-20", date("+1day", cal));
        assertEquals ("2014-11-20", date("+1days", cal));
    }

    @Test
    public void testRelativeWeek () throws ParseException {

        Date date = fn.date("2014-11-07");
        Calendar cal = new GregorianCalendar();
        cal.setTime(date);

        assertEquals ("2014-11-14", date("+1w", cal));
        assertEquals ("2014-11-14", date("1w", cal));
        assertEquals ("2014-11-28", date("3w", cal));
        assertEquals ("2014-10-31", date("-1w", cal));
        assertEquals ("2014-10-17", date("-3w", cal));

        assertEquals ("2014-11-14", date("+1week", cal));
        assertEquals ("2014-11-14", date("+1weeks", cal));
    }

    @Test
// Path: src/main/java/org/psidnell/omnifocus/ApplicationContextFactory.java
// public class ApplicationContextFactory {
// 
//     public static final String CONFIG_XML = "/config.xml";
//     private static final String CONFIG_PROPERTIES = "/config.properties";
// 
//     public static ApplicationContext getContext() {
//         return new ClassPathXmlApplicationContext(CONFIG_XML);
//     }
// 
//     public static Properties getConfigProperties() throws IOException {
//         try (
//             InputStream in = ApplicationContextFactory.class.getResourceAsStream(CONFIG_PROPERTIES)) {
//             if (in == null) {
//                 throw new IOException("config not found");
//             }
//             Properties config = new Properties();
//             config.load(in);
//             return config;
//         }
//     }
// }
// 
// Path: src/main/java/org/psidnell/omnifocus/ConfigParams.java
// public class ConfigParams {
// 
//     private String dueSoon;
//     private String flattenedRootName;
//     private String expressionDateFormat;
//     private int icsAlarmMinutes;
//     private boolean icsAlarm;
//     private String icsStart;
//     private String icsEnd;
//     private boolean icsAllDay;
// 
//     public void setDueSoon(String dueSoon) {
//         this.dueSoon = dueSoon;
//     }
// 
//     public String getDueSoon() {
//         return dueSoon;
//     }
// 
//     public void setFlattenedRootName(String name) {
//         this.flattenedRootName = name;
//     }
// 
//     public String getFlattenedRootName() {
//         return flattenedRootName;
//     }
// 
//     public void setExpressionDateFormat(String format) {
//         this.expressionDateFormat = format;
//     }
// 
//     public String getExpressionDateFormat() {
//         return expressionDateFormat;
//     }
// 
//     public int getIcsAlarmMinutes() {
//         return icsAlarmMinutes;
//     }
// 
//     public void setIcsAlarmMinutes(int icsAlarmMinutes) {
//         this.icsAlarmMinutes = icsAlarmMinutes;
//     }
// 
//     public boolean getIcsAlarm() {
//         return icsAlarm;
//     }
// 
//     public void setIcsAlarm(boolean icsAlarm) {
//         this.icsAlarm = icsAlarm;
//     }
// 
//     public String getIcsStart() {
//         return icsStart;
//     }
// 
//     public void setIcsStart(String icsStart) {
//         this.icsStart = icsStart;
//     }
// 
//     public String getIcsEnd() {
//         return icsEnd;
//     }
// 
//     public void setIcsEnd(String icsEnd) {
//         this.icsEnd = icsEnd;
//     }
// 
//     public boolean getIcsAllDay() {
//         return icsAllDay;
//     }
// 
//     public void setIcsAllDay(boolean icsAllDay) {
//         this.icsAllDay = icsAllDay;
//     }
// 
// }


// Path: src/test/java/org/psidnell/omnifocus/expr/ExpressionFunctionsTest.java
import static org.junit.Assert.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import org.junit.Before;
import org.junit.Test;
import org.psidnell.omnifocus.ApplicationContextFactory;
import org.psidnell.omnifocus.ConfigParams;
import org.springframework.context.ApplicationContext;

        cal.setTime(date);

        assertEquals ("2014-11-20", date("+1d", cal));
        assertEquals ("2014-11-20", date("1d", cal));
        assertEquals ("2014-11-22", date("3d", cal));
        assertEquals ("2014-11-18", date("-1d", cal));
        assertEquals ("2014-11-16", date("-3d", cal));

        assertEquals ("2014-11-20", date("+1day", cal));
        assertEquals ("2014-11-20", date("+1days", cal));
    }

    @Test
    public void testRelativeWeek () throws ParseException {

        Date date = fn.date("2014-11-07");
        Calendar cal = new GregorianCalendar();
        cal.setTime(date);

        assertEquals ("2014-11-14", date("+1w", cal));
        assertEquals ("2014-11-14", date("1w", cal));
        assertEquals ("2014-11-28", date("3w", cal));
        assertEquals ("2014-10-31", date("-1w", cal));
        assertEquals ("2014-10-17", date("-3w", cal));

        assertEquals ("2014-11-14", date("+1week", cal));
        assertEquals ("2014-11-14", date("+1weeks", cal));
    }

    @Test
    public void testRelativeMonth () throws ParseException {