@@ -3,6 +3,7 @@ import 'package:test/scaffolding.dart';
33import 'package:zulip/api/model/events.dart' ;
44import 'package:zulip/api/model/model.dart' ;
55import 'package:zulip/api/route/realm.dart' ;
6+ import 'package:zulip/model/autocomplete.dart' ;
67import 'package:zulip/model/emoji.dart' ;
78import 'package:zulip/model/store.dart' ;
89
@@ -203,6 +204,74 @@ void main() {
203204 });
204205 });
205206
207+ group ('EmojiAutocompleteView' , () {
208+ Condition <Object ?> isUnicodeResult ({String ? emojiCode, List <String >? names}) {
209+ return (it) => it.isA <EmojiAutocompleteResult >().candidate.which (
210+ isUnicodeCandidate (emojiCode, names));
211+ }
212+
213+ Condition <Object ?> isRealmResult ({String ? emojiCode, String ? emojiName}) {
214+ return (it) => it.isA <EmojiAutocompleteResult >().candidate.which (
215+ isRealmCandidate (emojiCode: emojiCode, emojiName: emojiName));
216+ }
217+
218+ Condition <Object ?> isZulipResult () {
219+ return (it) => it.isA <EmojiAutocompleteResult >().candidate.which (
220+ isZulipCandidate ());
221+ }
222+
223+ PerAccountStore prepare ({
224+ Map <String , String > realmEmoji = const {},
225+ Map <String , List <String >>? unicodeEmoji,
226+ }) {
227+ final store = eg.store (
228+ initialSnapshot: eg.initialSnapshot (realmEmoji: {
229+ for (final MapEntry (: key, : value) in realmEmoji.entries)
230+ key: eg.realmEmojiItem (emojiCode: key, emojiName: value),
231+ }));
232+ if (unicodeEmoji != null ) {
233+ store.setServerEmojiData (ServerEmojiData (codeToNames: unicodeEmoji));
234+ }
235+ return store;
236+ }
237+
238+ test ('results can include all three emoji types' , () async {
239+ final store = prepare (
240+ realmEmoji: {'1' : 'happy' }, unicodeEmoji: {'1f642' : ['smile' ]});
241+ final view = EmojiAutocompleteView .init (store: store,
242+ query: EmojiAutocompleteQuery ('' ));
243+ bool done = false ;
244+ view.addListener (() { done = true ; });
245+ await Future (() {});
246+ check (done).isTrue ();
247+ check (view.results).deepEquals ([
248+ isUnicodeResult (names: ['smile' ]),
249+ isRealmResult (emojiName: 'happy' ),
250+ isZulipResult (),
251+ ]);
252+ });
253+
254+ test ('results update after query change' , () async {
255+ final store = prepare (
256+ realmEmoji: {'1' : 'happy' }, unicodeEmoji: {'1f642' : ['smile' ]});
257+ final view = EmojiAutocompleteView .init (store: store,
258+ query: EmojiAutocompleteQuery ('h' ));
259+ bool done = false ;
260+ view.addListener (() { done = true ; });
261+ await Future (() {});
262+ check (done).isTrue ();
263+ check (view.results).single.which (
264+ isRealmResult (emojiName: 'happy' ));
265+
266+ done = false ;
267+ view.query = EmojiAutocompleteQuery ('s' );
268+ await Future (() {});
269+ check (done).isTrue ();
270+ check (view.results).single.which (
271+ isUnicodeResult (names: ['smile' ]));
272+ });
273+ });
274+
206275 group ('EmojiAutocompleteQuery.matches' , () {
207276 EmojiCandidate unicode (List <String > names, {String ? emojiCode}) {
208277 emojiCode ?? = '10ffff' ;
@@ -369,3 +438,7 @@ extension EmojiCandidateChecks on Subject<EmojiCandidate> {
369438 Subject <Iterable <String >> get aliases => has ((x) => x.aliases, 'aliases' );
370439 Subject <EmojiDisplay > get emojiDisplay => has ((x) => x.emojiDisplay, 'emojiDisplay' );
371440}
441+
442+ extension EmojiAutocompleteResultChecks on Subject <EmojiAutocompleteResult > {
443+ Subject <EmojiCandidate > get candidate => has ((x) => x.candidate, 'candidate' );
444+ }
0 commit comments