Completed
Push — qml ( 55213b...077131 )
by Olivier
01:01
created

TestTasks.test_due()   A

Complexity

Conditions 1

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
c 1
b 0
f 0
dl 0
loc 9
rs 9.6666
1
from datetime import date, datetime, timedelta
2
import unittest
3
from qtodotxt2.lib.tasklib import Task, RecursiveMode, dateString
4
5
6
class TestTasks(unittest.TestCase):
7
8 View Code Duplication
    def test_completeness_comparison(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
9
        self.assertEqual(Task('task1').is_complete, Task('task2').is_complete)
10
        self.assertEqual(Task('x task1').is_complete, Task('x task2').is_complete)
11
        self.assertNotEqual(Task('task').is_complete, Task('x task').is_complete)
12
        self.assertNotEqual(Task('x task').is_complete, Task('task').is_complete)
13
        self.assertLess(Task('task'), Task('x task'))
14
        self.assertGreater(Task('x task'), Task('task'))
15
16 View Code Duplication
    def test_priority_comparison(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
17
        # this tests are a bit broken now that priority is only a character
18
        self.assertEqual(Task('task1').priority, Task('task2').priority)
19
        self.assertEqual(Task('(A) task1').priority, Task('(A) task2').priority)
20
        self.assertNotEqual(Task('(A) task').priority, Task('task').priority)
21
        self.assertLess(Task('(A) task').priority, Task('(B) task').priority)
22
        self.assertGreater(Task('(B) task').priority, Task('(A) task').priority)
23
        self.assertNotEqual(Task('(A) task1').priority, Task('(AA) task2').priority)
24
        self.assertEqual(Task('(1) task1').priority, Task('(1) task2').priority)
25
26
    def test_comparisons_comparison(self):
27
        self.assertEqual(Task('task'), Task('task'))
28
        self.assertEqual(Task('(A) task'), Task('(A) task'))
29
30
        # self.assertGreater(Task('task1'), Task('task2'))
31
        self.assertGreater(Task('x task'), Task('task'))
32
        self.assertLess(Task('(A) task'), Task('(B) task'))
33
        self.assertLess(Task('(A) task'), Task('task'))
34
        self.assertLess(Task('(A) task'), Task('x (A) task'))
35
36
        # self.assertLess(Task('task2'), Task('task1'))
37
        self.assertGreater(Task('x task'), Task('task'))
38
        self.assertGreater(Task('(B) task'), Task('(A) task'))
39
        self.assertGreater(Task('task'), Task('(A) task'))
40
        self.assertGreater(Task('x (A) task'), Task('(A) task'))
41
42
    def test_task_ordering(self):
43
        task1 = Task('x task1')
44
        task2 = Task('task2')
45
        task3 = Task('abc task2')
46
        task4 = Task('(D) task2')
47
        task5 = Task('(C) b task')
48
        task6 = Task('(C) a task')
49
        task7 = Task('(B) task2')
50
        task8 = Task('(A) task2')
51
        self.assertTrue(task2 > task3)
52
        self.assertTrue(task1 > task2 > task3 > task4 > task5 > task6 > task7 > task8)
53
54
    def test_priority(self):
55
        self.assertEqual(Task("task").priority, "")
56
        self.assertEqual(Task("(a) task").priority, "")
57
        self.assertEqual(Task("x (a) task").priority, "")
58
        self.assertEqual(Task("x 2016-03-12 task").priority, "")
59
        self.assertEqual(Task("(A) task").priority, "A")
60
        t = Task("(A) task")
61
        self.assertEqual(t.priority, "A")
62
        t.increasePriority()
63
        self.assertEqual(t.priority, "A")
64
        t.decreasePriority()
65
        self.assertEqual(t.priority, "B")
66
        t.decreasePriority()
67
        t.decreasePriority()
68
        self.assertEqual(t.priority, "D")
69
        self.assertEqual(t.text, "(D) task")
70
        t.decreasePriority()
71
        self.assertEqual(t.priority, "")
72
        self.assertEqual(t.text, "task")
73
74
        t.increasePriority()
75
        t.increasePriority()
76
        self.assertEqual(t.priority, "C")
77
        for i in range(20):
78
            t.increasePriority()
79
        self.assertEqual(t.priority, "A")
80
        for i in range(20):
81
            t.decreasePriority()
82
        self.assertEqual(t.priority, "")
83
84
        # this task i wrongly formated, x should be followed by adate
85
        # self.assertEqual(Task("x (A) task").priority, Priority("A"))
86
87
        # A task with a priority lower than our default minimal priority
88
        t = Task("(M) task")
89
        t.increasePriority()
90
        self.assertEqual(t.priority, "L")
91
        t.decreasePriority()
92
        self.assertEqual(t.priority, "")
93
94
    def test_basic(self):
95
        task = Task('do something')
96
        self.assertEqual(task.text, 'do something')
97
        self.assertEqual(len(task.contexts), 0)
98
        self.assertFalse(len(task.projects), 0)
99
        self.assertFalse(task.is_complete)
100
        self.assertFalse(task.priority)
101
102
        task = Task('do something @context1 @context2')
103
        self.assertEqual(task.contexts, ['context1', 'context2'])
104
        self.assertEqual(task.projects, [])
105
        self.assertFalse(task.is_complete)
106
        self.assertFalse(task.priority)
107
108
        task = Task('do something +project1 +project2')
109
        self.assertEqual(task.contexts, [])
110
        self.assertEqual(task.projects, ['project1', 'project2'])
111
        self.assertFalse(task.is_complete)
112
        self.assertFalse(task.priority)
113
114
        task = Task('(E) do something +project1 @context1 +project2 rest of line @context2')
115
        self.assertEqual(task.contexts, ['context1', 'context2'])
116
        self.assertEqual(task.projects, ['project1', 'project2'])
117
        self.assertFalse(task.is_complete)
118
        self.assertTrue(task.priority)
119
        self.assertEqual(task.text, '(E) do something +project1 @context1 +project2 rest of line @context2')
120
121
        # task with + alone and complete
122
        task = Task('x 2016-01-23 do something +project1 @context1 +project2 rest + of line @context2')
123
        self.assertEqual(task.contexts, ['context1', 'context2'])
124
        self.assertEqual(task.projects, ['project1', 'project2'])
125
        self.assertTrue(task.is_complete)
126
        self.assertFalse(task.priority)
127
        self.assertEqual(task.completion_date, date(2016, 1, 23))
128
129
    def test_completion(self):
130
        task = Task('(B) something +project1 @context1 pri:C')
131
        self.assertEqual(task.contexts, ['context1'])
132
        self.assertEqual(task.projects, ['project1'])
133
        self.assertFalse(task.is_complete)
134
        self.assertEqual(task.priority, 'B')
135
        self.assertEqual(len(task.keywords), 1)
136
137
        task.setCompleted()
138
        self.assertTrue(task.is_complete)
139
        self.assertEqual(task.completion_date, date.today())
140
        self.assertTrue(task.text.startswith("x "))
141
142
        task.setPending()
143
        self.assertFalse(task.is_complete)
144
        self.assertFalse(task.completion_date)
145
146
    def test_future(self):
147
        dt_string = dateString(datetime.now() + timedelta(days=1))
148
        task = Task('(D) do something +project1 t:' + dt_string)
149
        self.assertEqual(task.contexts, [])
150
        self.assertEqual(task.projects, ['project1'])
151
        self.assertFalse(task.is_complete)
152
        self.assertTrue(task.priority)
153
        self.assertTrue(task.is_future)
154
155
        task.threshold -= timedelta(days=2)
156
        self.assertFalse(task.is_future)
157
158
    def test_custom_keywords(self):
159
        task = Task('(B) do something +project1 mykey:myval titi:toto @context1 rest + of line pri:C')
160
        self.assertEqual(task.contexts, ['context1'])
161
        self.assertEqual(task.projects, ['project1'])
162
        self.assertFalse(task.is_complete)
163
        self.assertEqual(task.priority, 'B')
164
        self.assertEqual(len(task.keywords), 3)
165
        self.assertIn("titi", task.keywords)
166
        self.assertEqual(task.keywords['pri'], "C")
167
168
    def test_creation_date(self):
169
        task = Task('(B) 2016-03-15 do something +project1 mykey:myval titi:toto @context1 rest + of line pri:C')
170
        self.assertTrue(task.creation_date)
171
        self.assertEqual(task.creation_date, date(2016, 3, 15))
172
        task = Task('2016-03-15 do something')
173
        self.assertTrue(task.creation_date)
174
        self.assertEqual(task.creation_date, date(2016, 3, 15))
175
        task = Task('do something')
176
        self.assertFalse(task.creation_date)
177
        task = Task('(A) do something')
178
        self.assertFalse(task.creation_date)
179
        task = Task('x 2017-08-12 2016-03-15 do something')
180
        self.assertTrue(task.creation_date)
181
        self.assertEqual(task.creation_date, date(2016, 3, 15))
182
        task = Task('x 2017-08-12 do something')
183
        self.assertFalse(task.creation_date)
184
185
    # Recurring tasks
186
    # Negative tests
187
    def test_recurring_task_wrong_interval(self):
188
        task = Task('(B) do something rec:2g')
189
        self.assertIsNone(task.recursion)
190
191
    def test_recurring_task_wrong_increment(self):
192
        task = Task('(B) do something rec:0d')
193
        self.assertIsNone(task.recursion)
194
195
    def test_recurring_task_wrong_keyword(self):
196
        task = Task('(B) do something rect:5d')
197
        self.assertIsNone(task.recursion)
198
199
    # Positive tests
200
    def test_recurring_task_input_days(self):
201
        task = Task('(C) do something due:2016-09-05 rec:5d')
202
        self.assertIsNotNone(task.recursion)
203
        self.assertTrue(task.recursion.mode == RecursiveMode.completitionDate)
204
        self.assertTrue(task.recursion.increment == str(5))
205
        self.assertTrue(task.recursion.interval == 'd')
206
207
    def test_recurring_task_input_weeks(self):
208
        task = Task('(C) do something due:2016-09-05 rec:+7w')
209
        self.assertIsNotNone(task.recursion)
210
        self.assertTrue(task.recursion.mode == RecursiveMode.originalDueDate)
211
        self.assertTrue(task.recursion.increment == str(7))
212
        self.assertTrue(task.recursion.interval == 'w')
213
214
    def test_recurring_task_input_months(self):
215
        task = Task('(C) do something due:2016-09-05 rec:3m')
216
        self.assertIsNotNone(task.recursion)
217
        self.assertTrue(task.recursion.mode == RecursiveMode.completitionDate)
218
        self.assertTrue(task.recursion.increment == str(3))
219
        self.assertTrue(task.recursion.interval == 'm')
220
221
    def test_recurring_task_input_years(self):
222
        task = Task('(C) do something due:2016-09-05 rec:+1y')
223
        self.assertIsNotNone(task.recursion)
224
        self.assertTrue(task.recursion.mode == RecursiveMode.originalDueDate)
225
        self.assertTrue(task.recursion.increment == str(1))
226
        self.assertTrue(task.recursion.interval == 'y')
227
228
    def test_due(self):
229
        task = Task('(D) do something +project1 due:2030-10-06')
230
        other = Task('(D) do something +project1 due:2030-10-08')
231
        self.assertIsInstance(task.due, datetime)
232
        task.due += timedelta(days=2)
233
        self.assertIsInstance(task.due, datetime)
234
        self.assertEqual(task.due, other.due)
235
        self.assertEqual(task.text, other.text)
236
        self.assertEqual(task, other)
237