feat: import Chinese-localized Buzz source snapshot
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>
This commit is contained in:
2026-08-13 18:34:25 +08:00
parent 61c3fa1df9
commit 9dfa06ffee
3785 changed files with 1085458 additions and 2 deletions
@@ -0,0 +1,81 @@
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 desktops 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));
});
});
}