Skip to content

Commit

Permalink
add emoji selection and skintone tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Fintasys committed Jan 28, 2024
1 parent 4742fe4 commit 501936f
Show file tree
Hide file tree
Showing 4 changed files with 152 additions and 33 deletions.
1 change: 0 additions & 1 deletion lib/src/emoji_picker_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,6 @@ class EmojiPickerUtils {
/// Returns the emoji regex
/// Based on https://unicode.org/reports/tr51/
RegExp getEmojiRegex() {
print(EmojiRegex);
return _emojiRegExp ?? RegExp(EmojiRegex, unicode: true);
}
}
1 change: 1 addition & 0 deletions lib/src/emoji_view/default_emoji_picker_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ class _DefaultEmojiPickerViewState extends State<DefaultEmojiPickerView>
}
// Build page normally
return GridView.builder(
key: const Key('emojiScrollView'),
scrollDirection: Axis.vertical,
controller: _scrollController,
primary: false,
Expand Down
40 changes: 8 additions & 32 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -184,30 +184,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.6.7"
leak_tracker:
dependency: transitive
description:
name: leak_tracker
sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa"
url: "https://pub.dev"
source: hosted
version: "10.0.0"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0
url: "https://pub.dev"
source: hosted
version: "2.0.1"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47
url: "https://pub.dev"
source: hosted
version: "2.0.1"
lints:
dependency: transitive
description:
Expand All @@ -228,26 +204,26 @@ packages:
dependency: transitive
description:
name: matcher
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
url: "https://pub.dev"
source: hosted
version: "0.12.16+1"
version: "0.12.16"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
url: "https://pub.dev"
source: hosted
version: "0.8.0"
version: "0.5.0"
meta:
dependency: transitive
description:
name: meta
sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
url: "https://pub.dev"
source: hosted
version: "1.11.0"
version: "1.10.0"
mime:
dependency: transitive
description:
Expand Down Expand Up @@ -276,10 +252,10 @@ packages:
dependency: transitive
description:
name: path
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
url: "https://pub.dev"
source: hosted
version: "1.9.0"
version: "1.8.3"
path_provider_linux:
dependency: transitive
description:
Expand Down
143 changes: 143 additions & 0 deletions test/emoji_picker_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
import 'package:emoji_picker_flutter/emoji_picker_flutter.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

// Use for golden tests, helpful in debugging
// await expectLater(
// find.byType(MaterialApp),
// matchesGoldenFile('overlay.png'),
// );

void main() {
group('EmojiPicker Tests', () {
testWidgets('Should allow user to select an emoji',
(WidgetTester tester) async {
final _controller = TextEditingController();
Emoji? _emojiSelected;
Category? _categorySelected;

// Build our app and trigger a frame.
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: EmojiPicker(
textEditingController: _controller,
onEmojiSelected: (category, emoji) {
_emojiSelected = emoji;
_categorySelected = category;
},
config: const Config(
height: 256,
categoryViewConfig: CategoryViewConfig(
recentTabBehavior: RecentTabBehavior.NONE,
)),
),
),
),
);

// Wait for the emojis to load if they are being loaded asynchronously
await tester.pumpAndSettle();

// Find an emoji in the picker
final emoji = find.text('🙂').hitTestable();

// Verify if we can find the emoji
expect(emoji, findsOneWidget);

// Tap on the emoji, this should trigger the selection action
await tester.tap(emoji);

// Call pumpAndSettle in case the UI needs to settle after an interaction
await tester.pumpAndSettle();

// Check if the emoji is added to the text controller
expect(_controller.text, contains('🙂'));

// Check if the emoji been passed to the 'onEmojiSelected' callback
expect(
_emojiSelected, equals(const Emoji('🙂', 'Slightly Smiling Face')));

// Check if the category been passed to the 'onEmojiSelected' callback
expect(_categorySelected, equals(Category.SMILEYS));
});

testWidgets('Should allow to select an emoji with skintone on longPress',
(WidgetTester tester) async {
final _controller = TextEditingController();
final _utils = EmojiPickerUtils();
final emoji = const Emoji('👍', 'Thumbs Up', hasSkinTone: true);
Emoji? _emojiSelected;
Category? _categorySelected;

// Build our app and trigger a frame.
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: Padding(
padding: const EdgeInsets.only(top: 64.0),
child: EmojiPicker(
textEditingController: _controller,
onEmojiSelected: (category, emoji) {
_emojiSelected = emoji;
_categorySelected = category;
},
config: const Config(
height: 500,
categoryViewConfig: CategoryViewConfig(
recentTabBehavior: RecentTabBehavior.NONE,
),
),
),
),
),
),
);

// Wait for the emojis to load if they are being loaded asynchronously
await tester.pumpAndSettle();

// Find an emoji in the picker
final emojiToFind = find.text(emoji.emoji);

// Scroll until the emoji to be found appears.
await tester.dragUntilVisible(
emojiToFind,
find.byKey(const Key('emojiScrollView')),
const Offset(0, -300),
);

// Verify if we can find the emoji
expect(emojiToFind, findsOneWidget);

// Tap on the emoji, this should trigger the skintone overlay
await tester.longPress(emojiToFind);

// Call pumpAndSettle in case the UI needs to settle after an interaction
await tester.pumpAndSettle();

/// Check if all skin tones are rendered in overlay
Finder? skinToneVariantToFind;
for (var i = 0; i < SkinTone.values.length; i++) {
skinToneVariantToFind =
find.text(_utils.applySkinTone(emoji, SkinTone.values[i]).emoji);
// Verify if we can find the skintone variant
expect(skinToneVariantToFind, findsOneWidget);
}

// Tap on the emoji, this should trigger the selection action
await tester.tap(skinToneVariantToFind!);

// Check if the emoji is added to the text controller
expect(_controller.text, contains('👍🏿'));

// Check if the emoji been passed to the 'onEmojiSelected' callback
expect(_emojiSelected?.emoji, equals('👍🏿'));
expect(_emojiSelected?.name, equals('Thumbs Up'));
expect(_emojiSelected?.hasSkinTone, equals(true));

// Check if the category been passed to the 'onEmojiSelected' callback
expect(_categorySelected, equals(Category.SMILEYS));
});
});
}

0 comments on commit 501936f

Please sign in to comment.