Skip to content

Commit fa4434c

Browse files
committed
autocomplete: Add and test MentionAutocompleteQuery
This is a small step toward zulip#49, without changing any UI. Here we have a simple function `testUser` to test whether a given User matches a query. Related: zulip#49
1 parent b2c89b7 commit fa4434c

File tree

2 files changed

+86
-0
lines changed

2 files changed

+86
-0
lines changed

lib/model/autocomplete.dart

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import '../api/model/model.dart';
2+
3+
class MentionAutocompleteQuery {
4+
MentionAutocompleteQuery(this.raw)
5+
: _lowercaseWords = raw.toLowerCase().split(' ');
6+
7+
final String raw;
8+
9+
final List<String> _lowercaseWords;
10+
11+
bool testUser(User user) {
12+
// TODO test email too, not just name
13+
// TODO test with diacritics stripped, where appropriate
14+
15+
// TODO cache, elsewhere
16+
final List<String> nameWords = user.fullName.toLowerCase().split(' ');
17+
18+
int nameWordsIndex = 0;
19+
int queryWordsIndex = 0;
20+
while (true) {
21+
if (queryWordsIndex == _lowercaseWords.length) {
22+
return true;
23+
}
24+
if (nameWordsIndex == nameWords.length) {
25+
return false;
26+
}
27+
28+
if (nameWords[nameWordsIndex].startsWith(_lowercaseWords[queryWordsIndex])) {
29+
queryWordsIndex++;
30+
}
31+
nameWordsIndex++;
32+
}
33+
}
34+
35+
@override
36+
bool operator ==(Object other) {
37+
return other is MentionAutocompleteQuery && other.raw == raw;
38+
}
39+
40+
@override
41+
int get hashCode => Object.hash('MentionAutocompleteQuery', raw);
42+
}

test/model/autocomplete_test.dart

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import 'package:checks/checks.dart';
2+
import 'package:test/scaffolding.dart';
3+
import 'package:zulip/api/model/model.dart';
4+
import 'package:zulip/model/autocomplete.dart';
5+
6+
import '../example_data.dart' as eg;
7+
8+
void main() {
9+
test('MentionAutocompleteQuery.testUser', () {
10+
doCheck(String rawQuery, User user, bool expected) {
11+
final result = MentionAutocompleteQuery(rawQuery).testUser(user);
12+
expected ? check(result).isTrue() : check(result).isFalse();
13+
}
14+
15+
doCheck('', eg.user(fullName: 'Full Name'), true);
16+
doCheck('', eg.user(fullName: ''), true); // Unlikely case, but should not crash
17+
doCheck('Full Name', eg.user(fullName: 'Full Name'), true);
18+
doCheck('full name', eg.user(fullName: 'Full Name'), true);
19+
doCheck('Full Name', eg.user(fullName: 'full name'), true);
20+
doCheck('Full', eg.user(fullName: 'Full Name'), true);
21+
doCheck('Name', eg.user(fullName: 'Full Name'), true);
22+
doCheck('Full Name', eg.user(fullName: 'Fully Named'), true);
23+
doCheck('Full Four', eg.user(fullName: 'Full Name Four Words'), true);
24+
doCheck('Name Words', eg.user(fullName: 'Full Name Four Words'), true);
25+
doCheck('Full F', eg.user(fullName: 'Full Name Four Words'), true);
26+
doCheck('F Four', eg.user(fullName: 'Full Name Four Words'), true);
27+
doCheck('full full', eg.user(fullName: 'Full Full Name'), true);
28+
doCheck('full full', eg.user(fullName: 'Full Name Full'), true);
29+
30+
doCheck('F', eg.user(fullName: ''), false); // Unlikely case, but should not crash
31+
doCheck('Fully Named', eg.user(fullName: 'Full Name'), false);
32+
doCheck('Full Name', eg.user(fullName: 'Full'), false);
33+
doCheck('Full Name', eg.user(fullName: 'Name'), false);
34+
doCheck('ull ame', eg.user(fullName: 'Full Name'), false);
35+
doCheck('ull Name', eg.user(fullName: 'Full Name'), false);
36+
doCheck('Full ame', eg.user(fullName: 'Full Name'), false);
37+
doCheck('Full Full', eg.user(fullName: 'Full Name'), false);
38+
doCheck('Name Name', eg.user(fullName: 'Full Name'), false);
39+
doCheck('Name Full', eg.user(fullName: 'Full Name'), false);
40+
doCheck('Name Four Full Words', eg.user(fullName: 'Full Name Four Words'), false);
41+
doCheck('F Full', eg.user(fullName: 'Full Name Four Words'), false);
42+
doCheck('Four F', eg.user(fullName: 'Full Name Four Words'), false);
43+
});
44+
}

0 commit comments

Comments
 (0)