import test from 'brittle'
import { emojiSearch } from '../index.js'
const emojis = [
{ emoji: '🙂', shortCodes: ['slightly_smiling_face'], tags: ['face', 'smile'] },
{ emoji: '😍', shortCodes: ['heart_eyes', 'smiling_face_with_heart_eyes'], tags: ['eye', 'face', 'love', 'smile'] },
{ emoji: '😋', shortCodes: ['savoring_food', 'yum'], tags: ['delicious', 'face', 'savouring', 'smile', 'yum'] },
{ emoji: '😻', shortCodes: ['heart_eyes_cat', 'smiling_cat_with_heart_eyes'], tags: ['cat', 'eye', 'face', 'heart', 'love', 'smile'] },
{ emoji: '🐱', shortCodes: ['cat_face'], tags: ['cat', 'face', 'pet'] },
{ emoji: '🐈️', shortCodes: ['cat'], tags: ['pet'] },
{ emoji: '🪝', shortCodes: ['hook'], tags: ['catch', 'crook', 'curve', 'ensnare', 'selling point'] },
{ emoji: '❌', shortCodes: ['cross_mark', 'x'], tags: ['cancel', 'cross', 'mark', 'multiplication', 'multiply', 'x', '×'] },
{ emoji: '😂', shortCodes: ['lol', 'lmao', 'tears_of_joy'], tags: ['face', 'joy', 'laugh', 'tear'], emoticon: ':\')' }
]
const maxResults = 5
test('emojiSearch: no search returns all the data capped to maxResults', async (t) => {
const hits = emojiSearch(emojis, '', maxResults)
t.is(hits.length, maxResults)
t.is(hits[0].emoji, '🙂')
t.is(hits[1].emoji, '😍')
t.is(hits[2].emoji, '😋')
t.is(hits[3].emoji, '😻')
t.is(hits[4].emoji, '🐱')
})
test('emojiSearch: one exact match with no other results', async (t) => {
const hits = emojiSearch(emojis, 'slightly_smiling_face', maxResults)
t.is(hits.length, 1)
t.is(hits[0].emoji, '🙂')
})
test('emojiSearch: one exact match with no other results - case insensitive', async (t) => {
const hits = emojiSearch(emojis, 'SLIGHTLY_SMILING_FACE', maxResults)
t.is(hits.length, 1)
t.is(hits[0].emoji, '🙂')
})
test('emojiSearch: one exact match with more results in the right prio order', async (t) => {
const hits = emojiSearch(emojis, 'cat')
t.is(hits.length, 5)
t.is(hits[0].emoji, '🐈️', 'cat -> exact match')
t.is(hits[1].emoji, '🐱', 'cat_face -> startsWith shortCode')
t.is(hits[2].emoji, '😻', 'heart_eyes_cat -> includes shortCode')
t.is(hits[3].emoji, '🪝', 'hook -> startsWith tag')
t.is(hits[4].emoji, '❌', 'cross_mark -> includes tag')
})
test('emojiSearch: no exact match also gives results in the right prio order', async (t) => {
const hits = emojiSearch(emojis, 'ace', maxResults)
t.is(hits.length, 5)
t.is(hits[0].emoji, '🙂', 'slightly_smiling_face -> includes shortCode')
t.is(hits[1].emoji, '😍', 'smiling_face_with_heart_eyes -> includes shortCode')
t.is(hits[2].emoji, '🐱', 'cat_face -> includes shortCode')
t.is(hits[3].emoji, '😋', 'savoring_food -> includes tag')
t.is(hits[4].emoji, '😻', 'heart_eyes_cat -> includes tag')
})
test('emojiSearch: match emojis by typing emoticons', async (t) => {
const hits = emojiSearch(emojis, '\')', maxResults)
t.is(hits.length, 1)
t.is(hits[0].emoji, '😂')
})
test('emojiSearch: no match at all gives 0 results', async (t) => {
const hits = emojiSearch(emojis, 'asdfasdf', maxResults)
t.is(hits.length, 0)
})