Skip to content

Commit eaa1096

Browse files
committed
Handle edge cases
1 parent b2eef74 commit eaa1096

5 files changed

Lines changed: 54 additions & 2 deletions

File tree

lib/src/query/grammar.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ class OrgQueryGrammarDefinition extends GrammarDefinition {
5555
.plusLazy(ref0(op))
5656
.flatten(message: 'Property name expected');
5757

58+
// TODO(aaron): Support the optional "*" suffix that only matches when the
59+
// tested property is present
5860
Parser op() =>
5961
string('<=') |
6062
string('=>') |

lib/src/query/model.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ class OrgQueryPropertyMatcher extends OrgQueryMatcher {
6868
if (value is String) {
6969
return evaluateString(actual, operator, value);
7070
} else if (actual != null && value is num) {
71-
return evaluateNumber(num.parse(actual), operator, value);
71+
// Real Org Mode calls `string-to-number` on the actual value, which
72+
// returns 0 on failure
73+
return evaluateNumber(num.tryParse(actual) ?? 0, operator, value);
7274
}
7375
}
7476
return false;

lib/src/todo/model.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class OrgTodoStates {
4242
bool contains(String keyword) =>
4343
todo.contains(keyword) || done.contains(keyword);
4444
bool isEndState(String keyword) =>
45-
done.contains(keyword) || done.isEmpty && todo.last == keyword;
45+
done.contains(keyword) || done.isEmpty && todo.lastOrNull == keyword;
4646

4747
@override
4848
String toString() => 'TodoStates[${todo.join(' ')} | ${done.join(' ')}]';

test/query/model_test.dart

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,48 @@ void main() {
147147
rejectsSection('* blah'),
148148
);
149149
});
150+
test('missing property with ordering operators', () {
151+
expect(
152+
OrgQueryPropertyMatcher(
153+
property: 'TODO',
154+
operator: '>',
155+
value: 'A',
156+
),
157+
acceptsSection('* blah'),
158+
);
159+
expect(
160+
OrgQueryPropertyMatcher(
161+
property: 'lorem',
162+
operator: '<',
163+
value: 'ipsum',
164+
),
165+
rejectsSection('* blah'),
166+
);
167+
});
168+
test('non-numeric property with numeric comparison', () {
169+
expect(
170+
OrgQueryPropertyMatcher(
171+
property: 'lorem',
172+
operator: '>',
173+
value: 1,
174+
),
175+
rejectsSection('''* blah
176+
:PROPERTIES:
177+
:lorem: ipsum
178+
:END:'''),
179+
);
180+
expect(
181+
OrgQueryPropertyMatcher(
182+
property: 'lorem',
183+
operator: '=',
184+
value: 0,
185+
),
186+
acceptsSection('''* blah
187+
:PROPERTIES:
188+
:lorem: ipsum
189+
:END:'''),
190+
);
191+
});
150192
test('case-insensitive key', () {
151193
expect(
152194
OrgQueryPropertyMatcher(property: 'todo', operator: '=', value: 'DONE'),

test/todo_test.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,4 +310,10 @@ void main() {
310310
expect(result, <OrgTodoStates>[]);
311311
});
312312
});
313+
group('states', () {
314+
test('isEndState empty definitions', () {
315+
final states = OrgTodoStates();
316+
expect(states.isEndState('DONE'), isFalse);
317+
});
318+
});
313319
}

0 commit comments

Comments
 (0)