From 86298cbdb66f0f21a18b5efc668398d9aed89cca Mon Sep 17 00:00:00 2001 From: Amy Tang Date: Fri, 13 Jan 2012 16:28:54 -0800 Subject: [PATCH] Added unit tests to titleparser --- astrid/.classpath | 2 +- .../todoroo/astrid/utility/TitleParser.java | 84 +-- .../andlib/utility/TitleParserTest.java | 509 ++++++++++++++++++ 3 files changed, 561 insertions(+), 34 deletions(-) create mode 100644 tests/src/com/todoroo/andlib/utility/TitleParserTest.java diff --git a/astrid/.classpath b/astrid/.classpath index 45881c26b..225598cab 100644 --- a/astrid/.classpath +++ b/astrid/.classpath @@ -28,6 +28,6 @@ - + diff --git a/astrid/src/com/todoroo/astrid/utility/TitleParser.java b/astrid/src/com/todoroo/astrid/utility/TitleParser.java index 8970cb03e..e3608e8e4 100644 --- a/astrid/src/com/todoroo/astrid/utility/TitleParser.java +++ b/astrid/src/com/todoroo/astrid/utility/TitleParser.java @@ -69,7 +69,7 @@ public class TitleParser { private static void priorityHelper(Task task) { String inputText = task.getValue(Task.TITLE); String[] importanceStrings = { - "()((^|[^\\w!])!+|(^|[^\\w!])0|(^|[^\\w!])!\\d)($|[^\\w!])", + "()((^|[^\\w!])!+|(^|[^\\w!])!\\d)($|[^\\w!])", "()(?i)((\\s?bang){1,})$", "(?i)(\\spriority\\s?(\\d)$)", "(?i)(\\sbang\\s?(\\d)$)", @@ -92,12 +92,12 @@ public class TitleParser { //helper for dayHelper. Converts am/pm to an int 0/1. private static int ampm_to_number(String am_pm_string) { - int time = 0; + int time = Calendar.PM; if (am_pm_string == null){ return time; } String text = am_pm_string.toLowerCase().trim(); - if (text.equals ("am") || text.equals ("a.m.") || text.equals("a")) + if (text.equals ("am") || text.equals ("a.m") || text.equals("a")) time = Calendar.AM; if (text.equals ("pm") || text.equals ("p.m") || text.equals("p")) time = Calendar.PM; @@ -116,13 +116,12 @@ public class TitleParser { "(?i)\\b(today)\\b", "(?i)\\b(tomorrow)\\b", "(?i)\\b(mon(day\\b|\\.))", - "(?i)\\b(tues(day\\b|\\.))", + "(?i)\\b(tue(sday\\b|\\.))", "(?i)\\b(wed(nesday\\b|\\.))", "(?i)\\b(thu(rsday\\b|\\.))", "(?i)\\b(fri(day\\b|\\.))", "(?i)\\b(sat(urday\\b|\\.))", - "(?i)\\b(sun(day\\b|\\.))", - "(?i)\\b(next (month|week|year))\\b" }; + "(?i)\\b(sun(day\\b|\\.))" }; for (String date : days_of_week){ Pattern pattern = Pattern.compile(date); @@ -136,18 +135,18 @@ public class TitleParser { String ds = "3[0-1]|[0-2]?[0-9]"; //day string for date regexes String[] dates = { - "(?i)\\b(jan(\\.|uary))(\\s(3[0-1]|[0-2]?[0-9])),? (\\d{4}|\\d{2})?", - "(?i)\\b(feb(\\.|ruary))(\\s(3[0-1]|[0-2]?[0-9])),? (\\d{4}|\\d{2})?", - "(?i)\\b(mar(\\.|ch))(\\s(3[0-1]|[0-2]?[0-9])),? (\\d{4}|\\d{2})?", - "(?i)\\b(apr(\\.|il))(\\s(3[0-1]|[0-2]?[0-9])),? (\\d{4}|\\d{2})?", - "(?i)\\b(may)(\\s(3[0-1]|[0-2]?[0-9])),? (\\d{4}|\\d{2})?", - "(?i)\\b(jun(\\.|e))(\\s(3[0-1]|[0-2]?[0-9])),? (\\d{4}|\\d{2})?", - "(?i)\\b(jul(\\.|y))(\\s(3[0-1]|[0-2]?[0-9])),? (\\d{4}|\\d{2})?", - "(?i)\\b(aug(\\.|ust))(\\s(3[0-1]|[0-2]?[0-9])),? (\\d{4}|\\d{2})?", - "(?i)\\b(sep(\\.|tember))(\\s(3[0-1]|[0-2]?[0-9])),? (\\d{4}|\\d{2})?", - "(?i)\\b(oct(\\.|ober))(\\s(3[0-1]|[0-2]?[0-9])),? (\\d{4}|\\d{2})?", - "(?i)\\b(nov(\\.|ember))(\\s(3[0-1]|[0-2]?[0-9])),? (\\d{4}|\\d{2})?", - "(?i)\\b(dec(\\.|ember))(\\s(3[0-1]|[0-2]?[0-9])),? (\\d{4}|\\d{2})?"}; + "(?i)\\b(jan(\\.|uary))(\\s(3[0-1]|[0-2]?[0-9])),?( (\\d{4}|\\d{2}))?", + "(?i)\\b(feb(\\.|ruary))(\\s(3[0-1]|[0-2]?[0-9])),?( (\\d{4}|\\d{2}))?", + "(?i)\\b(mar(\\.|ch))(\\s(3[0-1]|[0-2]?[0-9])),?( (\\d{4}|\\d{2}))?", + "(?i)\\b(apr(\\.|il))(\\s(3[0-1]|[0-2]?[0-9])),?( (\\d{4}|\\d{2}))?", + "(?i)\\b(may())(\\s(3[0-1]|[0-2]?[0-9])),?( (\\d{4}|\\d{2}))?", + "(?i)\\b(jun(\\.|e))(\\s(3[0-1]|[0-2]?[0-9])),?( (\\d{4}|\\d{2}))?", + "(?i)\\b(jul(\\.|y))(\\s(3[0-1]|[0-2]?[0-9])),?( (\\d{4}|\\d{2}))?", + "(?i)\\b(aug(\\.|ust))(\\s(3[0-1]|[0-2]?[0-9])),?( (\\d{4}|\\d{2}))?", + "(?i)\\b(sep(\\.|tember))(\\s(3[0-1]|[0-2]?[0-9])),?( (\\d{4}|\\d{2}))?", + "(?i)\\b(oct(\\.|ober))(\\s(3[0-1]|[0-2]?[0-9])),?( (\\d{4}|\\d{2}))?", + "(?i)\\b(nov(\\.|ember))(\\s(3[0-1]|[0-2]?[0-9])),?( (\\d{4}|\\d{2}))?", + "(?i)\\b(dec(\\.|ember))(\\s(3[0-1]|[0-2]?[0-9])),?( (\\d{4}|\\d{2}))?"}; // m.group(1) = "month" //m.group(4) = "day" @@ -157,17 +156,17 @@ public class TitleParser { if (m.find()){ Calendar dateCal = Chronic.parse(m.group(1)).getBeginCalendar(); - if (m.group(4)!= null){ + if (m.group(4) != null){ dateCal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(m.group(4))); } Calendar today = Calendar.getInstance(); - if (m.group(5)!=null){ - dateCal.set(Calendar.YEAR, Integer.parseInt(m.group(5))); + if (m.group(5) != null){ + dateCal.set(Calendar.YEAR, Integer.parseInt(m.group(5).trim())); } else if (today.get(Calendar.MONTH) - dateCal.get(Calendar.MONTH) > 1){ //if more than a month in the past dateCal.set(Calendar.YEAR, dateCal.get(Calendar.YEAR)+1); } - if (cal==null){ + if (cal == null){ cal = dateCal; } else{ @@ -179,7 +178,7 @@ public class TitleParser { } // for dates in the format MM/DD - Pattern p = Pattern.compile("(?i)\\b(1[0-2]|[1-9])(\\/|-)(3[0-1]|[0-2]?[0-9])(\\/|-)?(\\d{4}|\\d{2})?"); + Pattern p = Pattern.compile("(?i)\\b(1[0-2]|0?[1-9])(\\/|-)(3[0-1]|[0-2]?[0-9])(\\/|-)?(\\d{4}|\\d{2})?"); Matcher match = p.matcher(inputText); if (match.find()){ Calendar dCal = Calendar.getInstance(); @@ -210,13 +209,13 @@ public class TitleParser { dayTimes.put("(?i)\\bsupper\\b" ,18); dayTimes.put("(?i)\\bdinner\\b",18); dayTimes.put("(?i)\\bbrunch\\b", 10); + dayTimes.put("(?i)\\bmorning\\b", 8); dayTimes.put("(?i)\\bafternoon\\b", 15); dayTimes.put("(?i)\\bevening\\b" , 19); dayTimes.put("(?i)\\bnight\\b" , 19); dayTimes.put("(?i)\\bmidnight\\b" , 24); dayTimes.put("(?i)\\bnoon\\b" , 12); - for (String dayTime: dayTimes.keySet()){ Pattern pattern = Pattern.compile(dayTime); Matcher m = pattern.matcher(inputText); @@ -237,10 +236,10 @@ public class TitleParser { } String[] times = { + //[time] am/pm + "(?i)(\\b)([01]?\\d):?([0-5]\\d)? ?([ap]\\.?m?\\.?)\\b", //army time "(?i)\\b(([0-2]?[0-9]):([0-5][0-9]))(\\b)", - //[time] am/pm - "(\\b)([01]?\\d)(:[0-5]\\d)? ?([ap]\\.?m\\.?)\\b", //[int] o'clock "(?i)\\b(([01]?\\d)() ?o'? ?clock) ?([ap]\\.?m\\.?)?\\b", //at [int] @@ -256,16 +255,32 @@ public class TitleParser { Matcher m = pattern.matcher(inputText); if (m.find()){ containsSpecificTime = true; + Calendar today = Calendar.getInstance(); Calendar timeCal = Calendar.getInstance(); setCalendarToDefaultTime(timeCal); timeCal.set(Calendar.HOUR, Integer.parseInt(m.group(2))); + if (m.group(3) != null && !m.group(3).trim().equals("")) timeCal.set(Calendar.MINUTE, Integer.parseInt(m.group(3))); else timeCal.set(Calendar.MINUTE, 0); - System.err.println(m.group(4)); - System.err.println(ampm_to_number(m.group(4))); - timeCal.set(Calendar.AM_PM, ampm_to_number(m.group(4))); + if (Integer.parseInt(m.group(2)) <= 12) + timeCal.set(Calendar.AM_PM, ampm_to_number(m.group(4))); + + //sets it to the next occurrence of that hour if no am/pm is provided. doesn't include military time + if ( Integer.parseInt(m.group(2))<= 12 && (m.group(4)==null || (m.group(4).trim()).equals(""))) { + while (timeCal.getTime().getTime() < today.getTime().getTime()){ + timeCal.set(Calendar.HOUR_OF_DAY, timeCal.get(Calendar.HOUR_OF_DAY)+12); + } + } + else { //if am/pm is provided and the time is in the past, set it to the next day. Military time included. + if (timeCal.get(Calendar.HOUR) !=0 && (timeCal.getTime().getTime() < today.getTime().getTime())) { + timeCal.set(Calendar.DAY_OF_MONTH, timeCal.get(Calendar.DAY_OF_MONTH) + 1); + } + if (timeCal.get(Calendar.HOUR) == 0){ + timeCal.set(Calendar.HOUR, 12); + } + } if (cal == null){ cal = timeCal; @@ -276,7 +291,6 @@ public class TitleParser { cal.set(Calendar.SECOND, timeCal.get(Calendar.SECOND)); cal.set(Calendar.AM_PM, timeCal.get(Calendar.AM_PM)); } - break; } } @@ -291,7 +305,6 @@ public class TitleParser { task.setValue(Task.DUE_DATE, dueDate); } } - } //---------------------DATE-------------------------- @@ -299,7 +312,11 @@ public class TitleParser { private static void repeatHelper(Task task) { String inputText = task.getValue(Task.TITLE); HashMap repeatTimes = new HashMap(); - repeatTimes.put("(?i)\\bevery ?\\w{0,6} ?days?\\b" , Frequency.DAILY); + repeatTimes.put("(?i)\\bevery ?\\w{0,6} days?\\b" , Frequency.DAILY); + repeatTimes.put("(?i)\\bevery ?\\w{0,6} nights?\\b" , Frequency.DAILY); + repeatTimes.put("(?i)\\bevery ?\\w{0,6} ?mornings?\\b" , Frequency.DAILY); + repeatTimes.put("(?i)\\bevery ?\\w{0,6} ?evenings?\\b" , Frequency.DAILY); + repeatTimes.put("(?i)\\bevery ?\\w{0,6} ?afternoons?\\b" , Frequency.DAILY); repeatTimes.put("(?i)\\bevery \\w{0,6} ?weeks?\\b", Frequency.WEEKLY); repeatTimes.put("(?i)\\bevery \\w{0,6} ?(mon|tues|wednes|thurs|fri|satur|sun)days?\\b", Frequency.WEEKLY); repeatTimes.put("(?i)\\bevery \\w{0,6} ?months?\\b", Frequency.MONTHLY); @@ -308,6 +325,7 @@ public class TitleParser { HashMap repeatTimesIntervalOne = new HashMap(); //pre-determined intervals of 1 repeatTimesIntervalOne.put( "(?i)\\bdaily\\b" , Frequency.DAILY); + repeatTimesIntervalOne.put( "(?i)\\beveryday\\b" , Frequency.DAILY); repeatTimesIntervalOne.put( "(?i)\\bweekly\\b" , Frequency.WEEKLY); repeatTimesIntervalOne.put( "(?i)\\bmonthly\\b" ,Frequency.MONTHLY); repeatTimesIntervalOne.put( "(?i)\\byearly\\b" , Frequency.YEARLY); @@ -327,7 +345,6 @@ public class TitleParser { for (String repeatTimeIntervalOne:repeatTimesIntervalOne.keySet()){ Pattern pattern = Pattern.compile(repeatTimeIntervalOne); Matcher m = pattern.matcher(inputText); - //if (m.find() && map.get("time")==null){ if (m.find()) { Frequency rtime = repeatTimesIntervalOne.get(repeatTimeIntervalOne); RRule rrule = new RRule(); @@ -366,6 +383,7 @@ public class TitleParser { //helper method for DayHelper. Resets the time on the calendar to 00:00:00 am private static void setCalendarToDefaultTime(Calendar cal){ cal.set(Calendar.HOUR, 0); + cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.AM_PM, Calendar.AM); diff --git a/tests/src/com/todoroo/andlib/utility/TitleParserTest.java b/tests/src/com/todoroo/andlib/utility/TitleParserTest.java new file mode 100644 index 000000000..27ab7a4ed --- /dev/null +++ b/tests/src/com/todoroo/andlib/utility/TitleParserTest.java @@ -0,0 +1,509 @@ +package com.todoroo.andlib.utility; + + +import java.util.Calendar; +import java.util.Date; + +import com.google.ical.values.Frequency; +import com.google.ical.values.RRule; +import com.timsu.astrid.R; +import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.service.TaskService; +import com.todoroo.astrid.test.DatabaseTestCase; + +public class TitleParserTest extends DatabaseTestCase { + + @Override + protected void setUp() throws Exception { + super.setUp(); + Preferences.setStringFromInteger(R.string.p_default_urgency_key, 0); + } + + + + /** test that completing a task w/ no regular expressions creates a simple task with no date, no repeat, no lists*/ + public void testNoRegexes() throws Exception{ + TaskService taskService = new TaskService(); + Task task = new Task(); + Task nothing = new Task(); + task.setValue(Task.TITLE, "Jog"); + taskService.quickAdd(task); + assertFalse(task.hasDueTime()); + assertFalse(task.hasDueDate()); + assertEquals(task.getValue(Task.RECURRENCE), nothing.getValue(Task.RECURRENCE)); + } + + /** Tests correct date is parsed **/ + public void testMonthDate() { + TaskService taskService = new TaskService(); + Task task = new Task(); + Task nothing = new Task(); + String[] titleMonthStrings = { + "Jan.", "January", + "Feb.", "February", + "Mar.", "March", + "Apr.", "April", + "May", "May", + "Jun.", "June", + "Jul.", "July", + "Aug.", "August", + "Sep.", "September", + "Oct.", "October", + "Nov.", "November", + "Dec.", "December" + }; + for (int i = 0; i < 23; i++) { + String testTitle = "Jog on " + titleMonthStrings[i] + " 12."; + insertTitleAddTask(testTitle, task, taskService); + Date date = new Date(task.getValue(Task.DUE_DATE)); + assertEquals(date.getMonth(), i/2); + assertEquals(date.getDate(), 12); + } + } + + public void testMonthSlashDay() { + TaskService taskService = new TaskService(); + Task task = new Task(); + Task nothing = new Task(); + for (int i = 1; i < 13; i++) { + String testTitle = "Jog on " + i + "/12/13"; + insertTitleAddTask(testTitle, task, taskService); + Date date = new Date(task.getValue(Task.DUE_DATE)); + assertEquals(date.getMonth(), i-1); + assertEquals(date.getDate(), 12); + assertEquals(date.getYear(), 113); + } + } + + public void testArmyTime() { + TaskService taskService = new TaskService(); + Task task = new Task(); + Task nothing = new Task(); + String testTitle = "Jog on 23:21."; + insertTitleAddTask(testTitle, task, taskService); + Date date = new Date(task.getValue(Task.DUE_DATE)); + assertEquals(date.getMinutes(), 21); + assertEquals(date.getHours(), 23); + } + + public void test_AM_PM() { + TaskService taskService = new TaskService(); + Task task = new Task(); + Task nothing = new Task(); + String testTitle = "Jog at 8:33 PM."; + insertTitleAddTask(testTitle, task, taskService); + Date date = new Date(task.getValue(Task.DUE_DATE)); + assertEquals(date.getMinutes(), 33); + assertEquals(date.getHours(), 20); + } + + public void test_at_hour() { + TaskService taskService = new TaskService(); + Task task = new Task(); + Task nothing = new Task(); + String testTitle = "Jog at 8 PM."; + insertTitleAddTask(testTitle, task, taskService); + Date date = new Date(task.getValue(Task.DUE_DATE)); + assertEquals(date.getMinutes(), 0); + assertEquals(date.getHours(), 20); + } + + public void test_oclock_AM() { + TaskService taskService = new TaskService(); + Task task = new Task(); + Task nothing = new Task(); + String testTitle = "Jog at 8 o'clock AM."; + insertTitleAddTask(testTitle, task, taskService); + Date date = new Date(task.getValue(Task.DUE_DATE)); + assertEquals(date.getMinutes(), 0); + assertEquals(date.getHours(), 8); + } + + public void test_several_forms_of_eight() { + TaskService taskService = new TaskService(); + Task task = new Task(); + Task nothing = new Task(); + String[] testTitles = { + "Jog 8 AM", + "Jog 8 o'clock AM", + "at 8:00 AM" + }; + for (String testTitle: testTitles) { + insertTitleAddTask(testTitle, task, taskService); + Date date = new Date(task.getValue(Task.DUE_DATE)); + assertEquals(date.getMinutes(), 0); + assertEquals(date.getHours(), 8); + } + } + + public void test_several_forms_of_1230PM() { + TaskService taskService = new TaskService(); + Task task = new Task(); + Task nothing = new Task(); + String[] testTitles = { + "Jog 12:30 PM", + "at 12:30 PM", + "Do something on 12:30 PM", + "Jog at 12:30 PM Friday" + + }; + for (String testTitle: testTitles) { + insertTitleAddTask(testTitle, task, taskService); + Date date = new Date(task.getValue(Task.DUE_DATE)); + assertEquals(date.getMinutes(), 30); + assertEquals(date.getHours(), 12); + } + } + + private void insertTitleAddTask(String title, Task task, TaskService taskService) { + task.setValue(Task.TITLE, title); + taskService.quickAdd(task); + } + + + // ----------------Days begin----------------// + public void testDays() throws Exception{ + Calendar today = Calendar.getInstance(); + TaskService taskService = new TaskService(); + Task task = new Task(); + + task.setValue(Task.TITLE, "Jog today"); + taskService.quickAdd(task); + Date date = new Date(task.getValue(Task.DUE_DATE)); + assertEquals(date.getDay()+1, today.get(Calendar.DAY_OF_WEEK)); + //Calendar starts 1-6, date.getDay() starts at 0 + + task = new Task(); + task.setValue(Task.TITLE, "Jog tomorrow"); + taskService.quickAdd(task); + date = new Date(task.getValue(Task.DUE_DATE)); + assertEquals(date.getDay()+1, today.get(Calendar.DAY_OF_WEEK)+1); + + String[] days = { + "sunday", + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday", + }; + String[] abrevDays = { + "sun.", + "mon.", + "tue.", + "wed.", + "thu.", + "fri.", + "sat." + }; + + for (int i = 1; i <= 6; i++){ + task = new Task(); + task.setValue(Task.TITLE, "Jog "+ days[i]); + taskService.quickAdd(task); + date = new Date(task.getValue(Task.DUE_DATE)); + assertEquals(date.getDay(), i); + + task = new Task(); + task.setValue(Task.TITLE, "Jog "+ abrevDays[i]); + taskService.quickAdd(task); + date = new Date(task.getValue(Task.DUE_DATE)); + assertEquals(date.getDay(), i); + } + + } + + //----------------Days end----------------// + + + //----------------Priority begin----------------// + /** tests all words using priority 0 */ + public void testPriority0() throws Exception { + String[] acceptedStrings = { + "priority 0", + "least priority", + "lowest priority", + "bang 0" + }; + TaskService taskService = new TaskService(); + Task task = new Task(); + for (String acceptedString:acceptedStrings){ + task = new Task(); + task.setValue(Task.TITLE, "Jog " + acceptedString); //test at end of task. should set importance. + taskService.quickAdd(task); + assertEquals((int)task.getValue(Task.IMPORTANCE), (int)Task.IMPORTANCE_LEAST); + } + for (String acceptedString:acceptedStrings){ + task = new Task(); + task.setValue(Task.TITLE, acceptedString + " jog"); //test at beginning of task. should not set importance. + taskService.quickAdd(task); + assertNotSame((int)task.getValue(Task.IMPORTANCE),(int)Task.IMPORTANCE_LEAST); + } + } + + public void testPriority1() throws Exception { + String[] acceptedStringsAtEnd = { + "priority 1", + "low priority", + "bang", + "bang 1" + }; + String[] acceptedStringsAnywhere = { + "!1", + "!" + }; + TaskService taskService = new TaskService(); + Task task = new Task(); + for (String acceptedStringAtEnd:acceptedStringsAtEnd){ + task = new Task(); + task.setValue(Task.TITLE, "Jog " + acceptedStringAtEnd); //test at end of task. should set importance. + taskService.quickAdd(task); + assertEquals((int)task.getValue(Task.IMPORTANCE), (int)Task.IMPORTANCE_SHOULD_DO); + } + for (String acceptedStringAtEnd:acceptedStringsAtEnd){ + task = new Task(); + task.setValue(Task.TITLE, acceptedStringAtEnd + " jog"); //test at beginning of task. should not set importance. + taskService.quickAdd(task); + assertEquals((int)task.getValue(Task.IMPORTANCE), (int)Task.IMPORTANCE_SHOULD_DO); + } + for (String acceptedStringAnywhere:acceptedStringsAnywhere){ + task = new Task(); + task.setValue(Task.TITLE, "Jog " + acceptedStringAnywhere); //test at end of task. should set importance. + taskService.quickAdd(task); + assertEquals((int)task.getValue(Task.IMPORTANCE), (int)Task.IMPORTANCE_SHOULD_DO); + + task.setValue(Task.TITLE, acceptedStringAnywhere + " jog"); //test at beginning of task. should set importance. + taskService.quickAdd(task); + assertEquals((int)task.getValue(Task.IMPORTANCE), (int)Task.IMPORTANCE_SHOULD_DO); + } + } + + public void testPriority2() throws Exception { + String[] acceptedStringsAtEnd = { + "priority 2", + "high priority", + "bang bang", + "bang 2" + }; + String[] acceptedStringsAnywhere = { + "!2", + "!!" + }; + TaskService taskService = new TaskService(); + Task task = new Task(); + for (String acceptedStringAtEnd:acceptedStringsAtEnd){ + task = new Task(); + task.setValue(Task.TITLE, "Jog " + acceptedStringAtEnd); //test at end of task. should set importance. + taskService.quickAdd(task); + assertEquals((int)task.getValue(Task.IMPORTANCE), (int)Task.IMPORTANCE_MUST_DO); + + task = new Task(); + task.setValue(Task.TITLE, acceptedStringAtEnd + " jog"); //test at beginning of task. should not set importance. + taskService.quickAdd(task); + assertNotSame((int)task.getValue(Task.IMPORTANCE), (int)Task.IMPORTANCE_MUST_DO); + } + for (String acceptedStringAnywhere:acceptedStringsAnywhere){ + task = new Task(); + task.setValue(Task.TITLE, "Jog " + acceptedStringAnywhere); //test at end of task. should set importance. + taskService.quickAdd(task); + assertEquals((int)task.getValue(Task.IMPORTANCE), (int)Task.IMPORTANCE_MUST_DO); + + task.setValue(Task.TITLE, acceptedStringAnywhere + " jog"); //test at beginning of task. should set importance. + taskService.quickAdd(task); + assertEquals((int)task.getValue(Task.IMPORTANCE), (int)Task.IMPORTANCE_MUST_DO); + } + } + + public void testPriority3() throws Exception { + String[] acceptedStringsAtEnd = { + "priority 3", + "highest priority", + "bang bang bang", + "bang 3", + "bang bang bang bang bang bang bang" + }; + String[] acceptedStringsAnywhere = { + "!3", + "!!!", + "!6", + "!!!!!!!!!!!!!" + }; + TaskService taskService = new TaskService(); + Task task = new Task(); + for (String acceptedStringAtEnd:acceptedStringsAtEnd){ + task = new Task(); + task.setValue(Task.TITLE, "Jog " + acceptedStringAtEnd); //test at end of task. should set importance. + taskService.quickAdd(task); + assertEquals((int)task.getValue(Task.IMPORTANCE), (int)Task.IMPORTANCE_DO_OR_DIE); + + task = new Task(); + task.setValue(Task.TITLE, acceptedStringAtEnd + " jog"); //test at beginning of task. should not set importance. + taskService.quickAdd(task); + assertNotSame((int)task.getValue(Task.IMPORTANCE), (int)Task.IMPORTANCE_DO_OR_DIE); + } + for (String acceptedStringAnywhere:acceptedStringsAnywhere){ + task = new Task(); + task.setValue(Task.TITLE, "Jog " + acceptedStringAnywhere); //test at end of task. should set importance. + taskService.quickAdd(task); + assertEquals((int)task.getValue(Task.IMPORTANCE), (int)Task.IMPORTANCE_DO_OR_DIE); + + task.setValue(Task.TITLE, acceptedStringAnywhere + " jog"); //test at beginning of task. should set importance. + taskService.quickAdd(task); + assertEquals((int)task.getValue(Task.IMPORTANCE), (int)Task.IMPORTANCE_DO_OR_DIE); + } + } + + + + //----------------Priority end----------------// + + + //----------------Repeats begin----------------// + /** test daily repeat from due date, but with no due date set */ + public void testDailyWithNoDueDate() throws Exception { + TaskService taskService = new TaskService(); + Task task = new Task(); + task.setValue(Task.TITLE, "Jog daily"); + taskService.quickAdd(task); + RRule rrule = new RRule(); + rrule.setFreq(Frequency.DAILY); + rrule.setInterval(1); + assertEquals(task.getValue(Task.RECURRENCE), rrule.toIcal()); + assertFalse(task.hasDueTime()); + assertFalse(task.hasDueDate()); + + task.setValue(Task.TITLE, "Jog every day"); + taskService.quickAdd(task); + assertEquals(task.getValue(Task.RECURRENCE), rrule.toIcal()); + assertFalse(task.hasDueTime()); + assertFalse(task.hasDueDate()); + + for (int i = 1; i <= 12; i++){ + task.setValue(Task.TITLE, "Jog every " + i + " days."); + rrule.setInterval(i); + taskService.quickAdd(task); + assertEquals(task.getValue(Task.RECURRENCE), rrule.toIcal()); + assertFalse(task.hasDueTime()); + assertFalse(task.hasDueDate()); + task = new Task(); + } + + } + + /** test weekly repeat from due date, with no due date & time set */ + public void testWeeklyWithNoDueDate() throws Exception { + TaskService taskService = new TaskService(); + Task task = new Task(); + task.setValue(Task.TITLE, "Jog weekly"); + taskService.quickAdd(task); + RRule rrule = new RRule(); + rrule.setFreq(Frequency.WEEKLY); + rrule.setInterval(1); + assertEquals(task.getValue(Task.RECURRENCE), rrule.toIcal()); + assertFalse(task.hasDueTime()); + assertFalse(task.hasDueDate()); + + task.setValue(Task.TITLE, "Jog every week"); + taskService.quickAdd(task); + assertEquals(task.getValue(Task.RECURRENCE), rrule.toIcal()); + assertFalse(task.hasDueTime()); + assertFalse(task.hasDueDate()); + + for (int i = 1; i <= 12; i++){ + task.setValue(Task.TITLE, "Jog every " + i + " weeks"); + rrule.setInterval(i); + taskService.quickAdd(task); + assertEquals(task.getValue(Task.RECURRENCE), rrule.toIcal()); + assertFalse(task.hasDueTime()); + assertFalse(task.hasDueDate()); + task = new Task(); + } + } + + /** test hourly repeat from due date, with no due date but no time */ + public void testMonthlyFromNoDueDate() throws Exception { + TaskService taskService = new TaskService(); + Task task = new Task(); + task.setValue(Task.TITLE, "Jog monthly"); + taskService.quickAdd(task); + RRule rrule = new RRule(); + rrule.setFreq(Frequency.MONTHLY); + rrule.setInterval(1); + assertEquals(task.getValue(Task.RECURRENCE), rrule.toIcal()); + assertFalse(task.hasDueTime()); + assertFalse(task.hasDueDate()); + + task.setValue(Task.TITLE, "Jog every month"); + taskService.quickAdd(task); + assertEquals(task.getValue(Task.RECURRENCE), rrule.toIcal()); + assertFalse(task.hasDueTime()); + assertFalse(task.hasDueDate()); + + for (int i = 1; i <= 12; i++){ + task.setValue(Task.TITLE, "Jog every " + i + " months"); + rrule.setInterval(i); + taskService.quickAdd(task); + assertEquals(task.getValue(Task.RECURRENCE), rrule.toIcal()); + assertFalse(task.hasDueTime()); + assertFalse(task.hasDueDate()); + task = new Task(); + } + } + + public void testDailyFromDueDate() throws Exception { TaskService taskService = new TaskService(); + Task task = new Task(); + task.setValue(Task.TITLE, "Jog daily starting from today"); + taskService.quickAdd(task); + RRule rrule = new RRule(); + rrule.setFreq(Frequency.DAILY); + rrule.setInterval(1); + assertEquals(task.getValue(Task.RECURRENCE), rrule.toIcal()); + assertTrue(task.hasDueDate()); + + task.setValue(Task.TITLE, "Jog every day starting from today"); + taskService.quickAdd(task); + assertEquals(task.getValue(Task.RECURRENCE), rrule.toIcal()); + assertTrue(task.hasDueDate()); + + for (int i = 1; i <= 12; i++){ + task.setValue(Task.TITLE, "Jog every " + i + " days starting from today"); + rrule.setInterval(i); + taskService.quickAdd(task); + assertEquals(task.getValue(Task.RECURRENCE), rrule.toIcal()); + assertTrue(task.hasDueDate()); + task = new Task(); + } +} + + public void testWeeklyFromDueDate() throws Exception { TaskService taskService = new TaskService(); + Task task = new Task(); + task.setValue(Task.TITLE, "Jog weekly starting from today"); + taskService.quickAdd(task); + RRule rrule = new RRule(); + rrule.setFreq(Frequency.WEEKLY); + rrule.setInterval(1); + assertEquals(task.getValue(Task.RECURRENCE), rrule.toIcal()); + assertTrue(task.hasDueDate()); + + task.setValue(Task.TITLE, "Jog every week starting from today"); + taskService.quickAdd(task); + assertEquals(task.getValue(Task.RECURRENCE), rrule.toIcal()); + assertTrue(task.hasDueDate()); + + for (int i = 1; i <= 12; i++){ + task.setValue(Task.TITLE, "Jog every " + i + " weeks starting from today"); + rrule.setInterval(i); + taskService.quickAdd(task); + assertEquals(task.getValue(Task.RECURRENCE), rrule.toIcal()); + assertTrue(task.hasDueDate()); + task = new Task(); + } + } + +//----------------Repeats end----------------// + + + + +}