atagen

malice

public
Star0
Watch0
35a820422568f7c14365c307cb9fa13dcedce3da
2
ssh://brewery@pls.lobotomise.me:33/atagen/malice.git

Blame: web/test/twemoji.test.ts

544a170ead2catagen2026-10-20 11:47 UTC1
import assert from 'node:assert/strict';
544a170ead2catagen2026-10-20 11:47 UTC2
import { test } from 'node:test';
544a170ead2catagen2026-10-20 11:47 UTC3
import { isJumbo, segmentEmoji, twemojiUrl } from '../src/lib/twemoji.ts';
544a170ead2catagen2026-10-20 11:47 UTC4
544a170ead2catagen2026-10-20 11:47 UTC5
const emojiOf = (text: string) => segmentEmoji(text).filter((s) => s.emoji).map((s) => s.text);
544a170ead2catagen2026-10-20 11:47 UTC6
544a170ead2catagen2026-10-20 11:47 UTC7
test('plain text takes the fast path', () => {
544a170ead2catagen2026-10-20 11:47 UTC8
  assert.deepEqual(segmentEmoji('hello world 123 #1 *'), [{ text: 'hello world 123 #1 *', emoji: false }]);
544a170ead2catagen2026-10-20 11:47 UTC9
});
544a170ead2catagen2026-10-20 11:47 UTC10
544a170ead2catagen2026-10-20 11:47 UTC11
test('splits text and emoji', () => {
544a170ead2catagen2026-10-20 11:47 UTC12
  assert.deepEqual(segmentEmoji('hi ๐ŸŽ‰ there'), [
544a170ead2catagen2026-10-20 11:47 UTC13
    { text: 'hi ', emoji: false },
544a170ead2catagen2026-10-20 11:47 UTC14
    { text: '๐ŸŽ‰', emoji: true },
544a170ead2catagen2026-10-20 11:47 UTC15
    { text: ' there', emoji: false }
544a170ead2catagen2026-10-20 11:47 UTC16
  ]);
544a170ead2catagen2026-10-20 11:47 UTC17
});
544a170ead2catagen2026-10-20 11:47 UTC18
544a170ead2catagen2026-10-20 11:47 UTC19
test('keeps ZWJ sequences whole', () => {
544a170ead2catagen2026-10-20 11:47 UTC20
  assert.deepEqual(emojiOf('a ๐Ÿ‘ฉโ€๐Ÿ’ป b ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ'), ['๐Ÿ‘ฉโ€๐Ÿ’ป', '๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ']);
544a170ead2catagen2026-10-20 11:47 UTC21
});
544a170ead2catagen2026-10-20 11:47 UTC22
544a170ead2catagen2026-10-20 11:47 UTC23
test('keeps skin tones whole', () => {
544a170ead2catagen2026-10-20 11:47 UTC24
  assert.deepEqual(emojiOf('๐Ÿ‘๐Ÿฝ'), ['๐Ÿ‘๐Ÿฝ']);
544a170ead2catagen2026-10-20 11:47 UTC25
});
544a170ead2catagen2026-10-20 11:47 UTC26
544a170ead2catagen2026-10-20 11:47 UTC27
test('treats a regional indicator pair as one flag', () => {
544a170ead2catagen2026-10-20 11:47 UTC28
  assert.deepEqual(emojiOf('๐Ÿ‡ณ๐Ÿ‡ฟ and ๐Ÿ‡ฏ๐Ÿ‡ต'), ['๐Ÿ‡ณ๐Ÿ‡ฟ', '๐Ÿ‡ฏ๐Ÿ‡ต']);
544a170ead2catagen2026-10-20 11:47 UTC29
});
544a170ead2catagen2026-10-20 11:47 UTC30
544a170ead2catagen2026-10-20 11:47 UTC31
test('keycaps need FE0F and 20E3', () => {
544a170ead2catagen2026-10-20 11:47 UTC32
  assert.deepEqual(emojiOf('1๏ธโƒฃ #๏ธโƒฃ'), ['1๏ธโƒฃ', '#๏ธโƒฃ']);
544a170ead2catagen2026-10-20 11:47 UTC33
  assert.deepEqual(emojiOf('1 # *'), []);
544a170ead2catagen2026-10-20 11:47 UTC34
});
544a170ead2catagen2026-10-20 11:47 UTC35
544a170ead2catagen2026-10-20 11:47 UTC36
test('text presentation symbols stay text without FE0F', () => {
544a170ead2catagen2026-10-20 11:47 UTC37
  assert.deepEqual(emojiOf('ยฉ ยฎ โ˜บ'), []);
544a170ead2catagen2026-10-20 11:47 UTC38
  assert.deepEqual(emojiOf('โ˜บ๏ธ'), ['โ˜บ๏ธ']);
544a170ead2catagen2026-10-20 11:47 UTC39
});
544a170ead2catagen2026-10-20 11:47 UTC40
544a170ead2catagen2026-10-20 11:47 UTC41
test('jumbo only for one to three emoji', () => {
544a170ead2catagen2026-10-20 11:47 UTC42
  assert.equal(isJumbo(segmentEmoji('๐ŸŽ‰')), true);
544a170ead2catagen2026-10-20 11:47 UTC43
  assert.equal(isJumbo(segmentEmoji('๐ŸŽ‰ ๐ŸŽ‰๐ŸŽ‰')), true);
544a170ead2catagen2026-10-20 11:47 UTC44
  assert.equal(isJumbo(segmentEmoji('๐ŸŽ‰๐ŸŽ‰๐ŸŽ‰๐ŸŽ‰')), false);
544a170ead2catagen2026-10-20 11:47 UTC45
  assert.equal(isJumbo(segmentEmoji('hi ๐ŸŽ‰')), false);
544a170ead2catagen2026-10-20 11:47 UTC46
  assert.equal(isJumbo(segmentEmoji('hello')), false);
544a170ead2catagen2026-10-20 11:47 UTC47
});
544a170ead2catagen2026-10-20 11:47 UTC48
544a170ead2catagen2026-10-20 11:47 UTC49
test('twemojiUrl follows the filename rule', () => {
544a170ead2catagen2026-10-20 11:47 UTC50
  assert.equal(twemojiUrl('๐ŸŽ‰'), '/twemoji/1f389.svg');
544a170ead2catagen2026-10-20 11:47 UTC51
  assert.equal(twemojiUrl('โค๏ธ'), '/twemoji/2764.svg');
544a170ead2catagen2026-10-20 11:47 UTC52
  assert.equal(twemojiUrl('๐Ÿ‘จโ€โš•๏ธ'), '/twemoji/1f468-200d-2695-fe0f.svg');
544a170ead2catagen2026-10-20 11:47 UTC53
  assert.equal(twemojiUrl('1๏ธโƒฃ'), '/twemoji/31-20e3.svg');
544a170ead2catagen2026-10-20 11:47 UTC54
});