def test_contexts(self):
     """Test that the next action can be limited to a set of contexts."""
     task1 = todotxt.Task("Todo 1 @work @computer")
     task2 = todotxt.Task("(B) Todo 2 @work @computer")
     task3 = todotxt.Task("(A) Todo 3 @home @computer")
     self.namespace.contexts = {"work", "computer"}
     self.assertEqual([task2, task1], pick_action.next_actions([task1, task2, task3], self.namespace))
 def test_creation_dates(self):
     """Test that a task with an older creation date takes precedence."""
     no_creation_date = todotxt.Task("Task 1")
     newer_task = todotxt.Task("2018-02-02 Task 2")
     older_task = todotxt.Task("2017-01-01 Task 3")
     self.assertEqual([older_task, newer_task, no_creation_date],
                      pick_action.next_actions([no_creation_date, newer_task, older_task], self.namespace))
 def test_due_dates(self):
     """Test that a task with an earlier due date takes precedence."""
     no_due_date = todotxt.Task("Task 1")
     earlier_task = todotxt.Task("Task 2 due:2018-02-02")
     later_task = todotxt.Task("Task 3 due:2019-01-01")
     self.assertEqual([earlier_task, later_task, no_due_date],
                      pick_action.next_actions([no_due_date, later_task, earlier_task], self.namespace))
 def test_project(self):
     """Test that the next action can be limited to a specific project."""
     task1 = todotxt.Task("Todo 1 +ProjectX")
     task2 = todotxt.Task("(B) Todo 2 +ProjectX")
     task3 = todotxt.Task("(A) Todo 3 +ProjectY")
     self.namespace.projects = {"ProjectX"}
     self.assertEqual([task2, task1], pick_action.next_actions([task1, task2, task3], self.namespace))
 def test_priority_and_creation_date(self):
     """Test that priority takes precedence over creation date."""
     priority = todotxt.Task("(C) Task 1")
     newer_task = todotxt.Task("2018-02-02 Task 2")
     older_task = todotxt.Task("2017-01-01 Task 3")
     self.assertEqual([priority, older_task, newer_task],
                      pick_action.next_actions([priority, newer_task, older_task], self.namespace))
 def test_priority(self):
     """Test that tasks without priority are filtered."""
     no_priority = todotxt.Task("Task")
     high_priority = todotxt.Task("(A) Task")
     low_priority = todotxt.Task("(Z) Task")
     self.namespace.priority = "K"
     self.assertEqual(
         [high_priority], pick_action.next_actions([no_priority, low_priority, high_priority], self.namespace))
 def test_priority_of_blocked_task(self):
     """Test that a task that blocks a task with a higher priority takes precendence."""
     high_prio_but_blocked = todotxt.Task("(A) Task id:1")
     blocking_task = todotxt.Task("Blocking before:1")
     second_prio = todotxt.Task("(B) Task")
     high_prio_but_blocked.set_is_blocked()
     blocking_task.add_blocked_task(high_prio_but_blocked)
     tasks = todotxt.Tasks([second_prio, blocking_task])
     self.assertEqual([blocking_task, second_prio], pick_action.next_actions(tasks, self.namespace))
 def test_due_date_of_blocked_task(self):
     """Test that a task that blocks a task with an earlier due date takes precendence."""
     tasks = todotxt.Tasks()
     due_first_but_blocked = todotxt.Task("Task id:1 due:2018-01-01")
     blocking_task = todotxt.Task("Blocking before:1")
     due_second = todotxt.Task("Task due:2018-02-01")
     due_first_but_blocked.set_is_blocked()
     blocking_task.add_blocked_task(due_first_but_blocked)
     tasks.extend([blocking_task, due_second])
     self.assertEqual([blocking_task, due_second], pick_action.next_actions(tasks, self.namespace))
 def test_overdue_tasks(self):
     """Test that tasks that not overdue are filtered."""
     self.namespace.overdue = True
     self.namespace.time_travel = None
     self.assertEqual([self.overdue], pick_action.next_actions(self.tasks, self.namespace))
 def test_no_tasks(self):
     """Test that no tasks means no next action."""
     self.assertEqual([], pick_action.next_actions([], self.namespace))
 def test_higher_prio_goes_first(self):
     """Test that a task with higher priority takes precedence."""
     task1 = todotxt.Task("Todo 1")
     task2 = todotxt.Task("(B) Todo 2")
     task3 = todotxt.Task("(A) Todo 3")
     self.assertEqual([task3, task2, task1], pick_action.next_actions([task1, task2, task3], self.namespace))
 def test_multiple_tasks(self):
     """If there are multiple tasks, the first is the next action."""
     task1 = todotxt.Task("Todo 1")
     task2 = todotxt.Task("Todo 2")
     self.assertEqual([task1, task2], pick_action.next_actions([task1, task2], self.namespace))
 def test_excluded_projects(self):
     """Test that projects can be excluded."""
     task = todotxt.Task("(A) Todo +DogHouse +PaintHouse")
     self.namespace.excluded_projects = {"DogHouse"}
     self.assertEqual([], pick_action.next_actions([task], self.namespace))
 def test_not_excluded_context(self):
     """Test that a task is not excluded if it doesn't belong to the excluded category."""
     task = todotxt.Task("(A) Todo @computer")
     self.namespace.excluded_contexts = {"phone"}
     self.assertEqual([task], pick_action.next_actions([task], self.namespace))
 def test_project(self):
     """Test that a task with a project takes precedence over a task without a project."""
     task1 = todotxt.Task("Task 1 without project")
     task2 = todotxt.Task("Task 2 +Project")
     self.assertEqual([task2, task1], pick_action.next_actions([task1, task2], self.namespace))
 def test_not_excluded_project(self):
     """Test that a task is not excluded if it doesn't belong to the excluded project."""
     task = todotxt.Task("(A) Todo +DogHouse")
     self.namespace.excluded_projects = {"PaintHouse"}
     self.assertEqual([task], pick_action.next_actions([task], self.namespace))
 def test_only_future_tasks(self):
     """If all tasks are future tasks, there's no next action."""
     future_task1 = todotxt.Task("(A) 9999-01-01 Start preparing for five-digit years")
     future_task2 = todotxt.Task("(A) Start preparing for five-digit years t:9999-01-01")
     self.assertEqual([], pick_action.next_actions([future_task1, future_task2], self.namespace))
 def test_one_task(self):
     """If there is one task, that one is the next action."""
     task = todotxt.Task("Todo")
     self.assertEqual([task], pick_action.next_actions([task], self.namespace))
 def test_ignore_future_task(self):
     """Ignore tasks with a start date in the future."""
     future_task = todotxt.Task("(A) 9999-01-01 Start preparing for five-digit years")
     regular_task = todotxt.Task("(B) Look busy")
     self.assertEqual([regular_task], pick_action.next_actions([future_task, regular_task], self.namespace))
 def test_due_and_creation_dates(self):
     """Test that a task with a due date takes precedence over creation date."""
     task1 = todotxt.Task("2018-1-1 Task 1")
     task2 = todotxt.Task("Task 2 due:2018-1-1")
     self.assertEqual([task2, task1], pick_action.next_actions([task1, task2], self.namespace))
 def test_due_tasks(self):
     """Test that tasks that are not due are filtered."""
     self.namespace.due = datetime.date(2000, 1, 1)
     self.assertEqual([self.overdue], pick_action.next_actions(self.tasks, self.namespace))
 def test_projects(self):
     """Test that a task with more projects takes precedence over a task with less projects."""
     task1 = todotxt.Task("Task 1 +Project")
     task2 = todotxt.Task("Task 2 +Project1 +Project2")
     self.assertEqual([task2, task1], pick_action.next_actions([task1, task2], self.namespace))
 def test_any_due_tasks(self):
     """Test that tasks that are not due are filtered."""
     self.namespace.due = datetime.date.max
     self.assertEqual([self.overdue, self.future_duedate], pick_action.next_actions(self.tasks, self.namespace))
 def test_excluded_context(self):
     """Test that contexts can be excluded."""
     task = todotxt.Task("(A) Todo @computer")
     self.namespace.excluded_contexts = {"computer"}
     self.assertEqual([], pick_action.next_actions([task], self.namespace))
 def test_excluded_contexts(self):
     """Test that contexts can be excluded."""
     task1 = todotxt.Task("(A) Todo @home @work")
     task2 = todotxt.Task("(A) Todo @home")
     self.namespace.excluded_contexts = {"home"}
     self.assertEqual([], pick_action.next_actions([task1, task2], self.namespace))