@@ -8,6 +8,7 @@ import 'package:zulip/api/model/initial_snapshot.dart';
88import 'package:zulip/api/model/model.dart' ;
99import 'package:zulip/api/route/channels.dart' ;
1010import 'package:zulip/model/autocomplete.dart' ;
11+ import 'package:zulip/model/emoji.dart' ;
1112import 'package:zulip/model/narrow.dart' ;
1213import 'package:zulip/model/store.dart' ;
1314import 'package:zulip/widgets/compose_box.dart' ;
@@ -89,12 +90,15 @@ void main() {
8990
9091 MentionAutocompleteQuery mention (String raw) => MentionAutocompleteQuery (raw, silent: false );
9192 MentionAutocompleteQuery silentMention (String raw) => MentionAutocompleteQuery (raw, silent: true );
93+ EmojiAutocompleteQuery emoji (String raw) => EmojiAutocompleteQuery (raw);
9294
9395 doTest ('' , null );
9496 doTest ('^' , null );
9597
9698 doTest ('!@#\$ %&*()_+' , null );
9799
100+ // @-mentions.
101+
98102 doTest ('^@' , null ); doTest ('^@_' , null );
99103 doTest ('^@abc' , null ); doTest ('^@_abc' , null );
100104 doTest ('@abc' , null ); doTest ('@_abc' , null ); // (no cursor)
@@ -169,6 +173,72 @@ void main() {
169173 doTest ('~@_Родион Романович Раскольнико^' , silentMention ('Родион Романович Раскольнико' ));
170174 doTest ('If @chris is around, please ask him.^' , null ); // @ sign is too far away from cursor
171175 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' ));
172242 });
173243
174244 test ('MentionAutocompleteView misc' , () async {
0 commit comments