@@ -8,6 +8,7 @@ import 'package:zulip/api/model/initial_snapshot.dart';
8
8
import 'package:zulip/api/model/model.dart' ;
9
9
import 'package:zulip/api/route/channels.dart' ;
10
10
import 'package:zulip/model/autocomplete.dart' ;
11
+ import 'package:zulip/model/emoji.dart' ;
11
12
import 'package:zulip/model/narrow.dart' ;
12
13
import 'package:zulip/model/store.dart' ;
13
14
import 'package:zulip/widgets/compose_box.dart' ;
@@ -89,12 +90,15 @@ void main() {
89
90
90
91
MentionAutocompleteQuery mention (String raw) => MentionAutocompleteQuery (raw, silent: false );
91
92
MentionAutocompleteQuery silentMention (String raw) => MentionAutocompleteQuery (raw, silent: true );
93
+ EmojiAutocompleteQuery emoji (String raw) => EmojiAutocompleteQuery (raw);
92
94
93
95
doTest ('' , null );
94
96
doTest ('^' , null );
95
97
96
98
doTest ('!@#\$ %&*()_+' , null );
97
99
100
+ // @-mentions.
101
+
98
102
doTest ('^@' , null ); doTest ('^@_' , null );
99
103
doTest ('^@abc' , null ); doTest ('^@_abc' , null );
100
104
doTest ('@abc' , null ); doTest ('@_abc' , null ); // (no cursor)
@@ -169,6 +173,72 @@ void main() {
169
173
doTest ('~@_Родион Романович Раскольнико^' , silentMention ('Родион Романович Раскольнико' ));
170
174
doTest ('If @chris is around, please ask him.^' , null ); // @ sign is too far away from cursor
171
175
doTest ('If @_chris is around, please ask him.^' , null ); // @ sign is too far away from cursor
176
+
177
+ // Emoji (":smile:").
178
+
179
+ // Basic positive examples, to contrast with all the negative examples below.
180
+ doTest ('~:^' , emoji ('' ));
181
+ doTest ('~:a^' , emoji ('a' ));
182
+ doTest ('~:a ^' , emoji ('a ' ));
183
+ doTest ('~:a_^' , emoji ('a_' ));
184
+ doTest ('~:a b^' , emoji ('a b' ));
185
+ doTest ('ok ~:s^' , emoji ('s' ));
186
+ doTest ('this: ~:s^' , emoji ('s' ));
187
+
188
+ doTest ('^:' , null );
189
+ doTest ('^:abc' , null );
190
+ doTest (':abc' , null ); // (no cursor)
191
+
192
+ // Avoid interpreting colons in normal prose as queries.
193
+ doTest (': ^' , null );
194
+ doTest (':\n ^' , null );
195
+ doTest ('this:^' , null );
196
+ doTest ('this: ^' , null );
197
+ doTest ('là ~:^' , emoji ('' )); // ambiguous in French prose, tant pis
198
+ doTest ('là : ^' , null );
199
+ doTest ('8:30^' , null );
200
+
201
+ // Avoid interpreting already-entered `:foo:` syntax as queries.
202
+ doTest (':smile:^' , null );
203
+
204
+ // Avoid interpreting emoticons as queries.
205
+ doTest (':-^' , null );
206
+ doTest (':)^' , null ); doTest (':-)^' , null );
207
+ doTest (':(^' , null ); doTest (':-(^' , null );
208
+ doTest (':/^' , null ); doTest (':-/^' , null );
209
+ doTest ('~:p^' , emoji ('p' )); // ambiguously an emoticon
210
+ doTest (':-p^' , null );
211
+
212
+ // Avoid interpreting as queries some ways colons appear in source code.
213
+ doTest ('::^' , null );
214
+ doTest (':<^' , null );
215
+ doTest (':=^' , null );
216
+
217
+ // Emoji names may have letters and numbers in various scripts.
218
+ // (A few appear in the server's list of Unicode emoji;
219
+ // many more might be in a given realm's custom emoji.)
220
+ doTest ('~:コ^' , emoji ('コ' ));
221
+ doTest ('~:空^' , emoji ('空' ));
222
+ doTest ('~:φ^' , emoji ('φ' ));
223
+ doTest ('~:100^' , emoji ('100' ));
224
+ doTest ('~:1^' , emoji ('1' )); // U+FF11 FULLWIDTH DIGIT ONE
225
+ doTest ('~:٢^' , emoji ('٢' )); // U+0662 ARABIC-INDIC DIGIT TWO
226
+
227
+ // Accept punctuation before the emoji: opening…
228
+ doTest ('(~:^' , emoji ('' )); doTest ('(~:a^' , emoji ('a' ));
229
+ doTest ('[~:^' , emoji ('' )); doTest ('[~:a^' , emoji ('a' ));
230
+ doTest ('«~:^' , emoji ('' )); doTest ('«~:a^' , emoji ('a' ));
231
+ doTest ('(~:^' , emoji ('' )); doTest ('(~:a^' , emoji ('a' ));
232
+ // … closing…
233
+ doTest (')~:^' , emoji ('' )); doTest (')~:a^' , emoji ('a' ));
234
+ doTest (']~:^' , emoji ('' )); doTest (']~:a^' , emoji ('a' ));
235
+ doTest ('»~:^' , emoji ('' )); doTest ('»~:a^' , emoji ('a' ));
236
+ doTest (')~:^' , emoji ('' )); doTest (')~:a^' , emoji ('a' ));
237
+ // … and other.
238
+ doTest ('.~:^' , emoji ('' )); doTest ('.~:a^' , emoji ('a' ));
239
+ doTest (',~:^' , emoji ('' )); doTest (',~:a^' , emoji ('a' ));
240
+ doTest (',~:^' , emoji ('' )); doTest (',~:a^' , emoji ('a' ));
241
+ doTest ('。~:^' , emoji ('' )); doTest ('。~:a^' , emoji ('a' ));
172
242
});
173
243
174
244
test ('MentionAutocompleteView misc' , () async {
0 commit comments