9dfa06ffee
Docker image / Build (linux/amd64) (push) Has been cancelled
Docker image / Build (linux/arm64) (push) Has been cancelled
Docker image / Merge release multi-arch manifest (push) Has been cancelled
Docker image / Merge debug multi-arch manifest (push) Has been cancelled
Docker image / Build public push gateway (linux/amd64) (push) Has been cancelled
Docker image / Build public push gateway (linux/arm64) (push) Has been cancelled
Docker image / Publish public push gateway image (push) Has been cancelled
Sprig image / Build (linux/amd64) (push) Has been cancelled
Sprig image / Build (linux/arm64) (push) Has been cancelled
Sprig image / Merge multi-arch manifest (push) Has been cancelled
Harbor Buzz Orchestra / Python tests and lint (push) Has been cancelled
CI / Detect Changed Paths (push) Has been cancelled
CI / Rust Lint (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Desktop Core (push) Has been cancelled
CI / Desktop Smoke E2E (1) (push) Has been cancelled
CI / Desktop Smoke E2E (2) (push) Has been cancelled
CI / Desktop Smoke E2E (3) (push) Has been cancelled
CI / Desktop Smoke E2E (4) (push) Has been cancelled
CI / Desktop (push) Has been cancelled
CI / Desktop E2E Relay (push) Has been cancelled
CI / Desktop E2E Integration (1/2) (push) Has been cancelled
CI / Desktop E2E Integration (2/2) (push) Has been cancelled
CI / Desktop E2E Integration (push) Has been cancelled
CI / Backend Integration (relay e2e) (push) Has been cancelled
CI / Relay E2E (push) Has been cancelled
CI / Web (push) Has been cancelled
CI / Mobile (push) Has been cancelled
CI / Security (push) Has been cancelled
CI / Dead Token Reference Guard (push) Has been cancelled
CI / Server Cross-Compile (aarch64-unknown-linux-musl) (push) Has been cancelled
CI / Server Cross-Compile (x86_64-unknown-linux-musl) (push) Has been cancelled
CI / Windows Rust (x86_64-pc-windows-msvc) (push) Has been cancelled
CI / Desktop Build (macOS) (push) Has been cancelled
helm chart / lint + unittest + render matrix (push) Has been cancelled
helm chart / install on kind (gated) (push) Has been cancelled
helm chart / publish chart to GHCR (push) Has been cancelled
Mesh Lifecycle / Relay-Driven Mesh Lifecycle Smoke (push) Has been cancelled
Sprig / Build (aarch64-unknown-linux-musl) (push) Has been cancelled
Sprig / Build (x86_64-unknown-linux-musl) (push) Has been cancelled
Sprig / Publish rolling release (push) Has been cancelled
Sprig / Publish tagged release (push) Has been cancelled
Signed-off-by: cls_宁波本机 <908705107@qq.com>
82 lines
2.8 KiB
Dart
82 lines
2.8 KiB
Dart
import 'package:buzz/shared/custom_emoji/custom_emoji.dart';
|
||
import 'package:buzz/shared/emoji/emoji_only.dart';
|
||
import 'package:flutter_test/flutter_test.dart';
|
||
|
||
const _customEmoji = [
|
||
CustomEmoji(shortcode: 'buzz', url: 'https://example.test/buzz.png'),
|
||
];
|
||
|
||
/// Keycaps carry no `Extended_Pictographic` code point of their own, so they
|
||
/// only pass via the dataset's glyph set — the one case that needs it.
|
||
const _keycapOne = '1\u{FE0F}\u{20E3}';
|
||
|
||
bool emojiOnly(
|
||
String content, {
|
||
Set<String> nativeEmoji = const {},
|
||
List<CustomEmoji> customEmoji = const [],
|
||
}) => isEmojiOnlyMessage(
|
||
content,
|
||
nativeEmoji: nativeEmoji,
|
||
customEmoji: customEmoji,
|
||
);
|
||
|
||
void main() {
|
||
group('isEmojiOnlyMessage', () {
|
||
test('accepts emoji, alone and in runs', () {
|
||
// Mirrors the cases in desktop's emojiOnly.test.mjs.
|
||
expect(emojiOnly('\u{1F600}'), isTrue);
|
||
expect(
|
||
emojiOnly('\u{1F600} \u{1F44D}\u{1F3FD}\n\u{2764}\u{FE0F}'),
|
||
isTrue,
|
||
);
|
||
expect(emojiOnly('\u{1F3F3}\u{FE0F}\u{200D}\u{1F308}'), isTrue);
|
||
expect(
|
||
emojiOnly(
|
||
'\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F466}',
|
||
),
|
||
isTrue,
|
||
);
|
||
});
|
||
|
||
test('rejects anything with text in it', () {
|
||
expect(emojiOnly('hi \u{1F600}'), isFalse);
|
||
expect(emojiOnly('\u{1F600}!'), isFalse);
|
||
expect(emojiOnly('nice'), isFalse);
|
||
});
|
||
|
||
test('rejects empty and whitespace-only bodies', () {
|
||
expect(emojiOnly(''), isFalse);
|
||
expect(emojiOnly(' \n '), isFalse);
|
||
});
|
||
|
||
test('counts a known custom shortcode as emoji', () {
|
||
expect(emojiOnly(':buzz:', customEmoji: _customEmoji), isTrue);
|
||
expect(emojiOnly(':buzz: \u{1F600}', customEmoji: _customEmoji), isTrue);
|
||
expect(emojiOnly('hi :buzz:', customEmoji: _customEmoji), isFalse);
|
||
});
|
||
|
||
test('an unknown shortcode is just text', () {
|
||
// Desktop behaves the same: without the palette it renders literally, so
|
||
// it must not be scaled up as if it were a glyph.
|
||
expect(emojiOnly(':buzz:'), isFalse);
|
||
expect(emojiOnly(':nope:', customEmoji: _customEmoji), isFalse);
|
||
expect(emojiOnly(':', customEmoji: _customEmoji), isFalse);
|
||
expect(emojiOnly('::', customEmoji: _customEmoji), isFalse);
|
||
});
|
||
|
||
test('keycaps need the dataset glyph set', () {
|
||
expect(emojiOnly(_keycapOne), isFalse);
|
||
expect(emojiOnly(_keycapOne, nativeEmoji: {_keycapOne}), isTrue);
|
||
});
|
||
});
|
||
|
||
group('emoji-only sizing', () {
|
||
test('matches desktop’s step up from body text', () {
|
||
// Desktop goes text-sm (14px) to text-4xl; mobile body is the same 14px.
|
||
expect(kEmojiOnlyFontSize, 36.0);
|
||
// Desktop sizes inline custom emoji at 1.45em of the surrounding text.
|
||
expect(kEmojiOnlyCustomEmojiSize, closeTo(36.0 * 1.45, 0.001));
|
||
});
|
||
});
|
||
}
|