import assert from 'node:assert/strict'
import test from 'node:test'
import {
extractEntities,
extractTags,
inferKind,
scoreHaystack,
summarize,
} from './kinds.ts'
test('inferKind maps reminders, contacts, instructions, and facts', () => {
assert.equal(inferKind('Remind me to call the dentist'), 'reminder')
assert.equal(inferKind('Need to follow up tomorrow'), 'reminder')
assert.equal(inferKind("Sam's phone is 555-0100"), 'contact')
assert.equal(inferKind('How to reset the garage keypad'), 'instruction')
assert.equal(inferKind('Projector bulb is 250W'), 'fact')
assert.equal(inferKind('Grocery list: milk'), 'note')
})
test('extractTags keeps hashtags, explicit tags, and inferred kind tags', () => {
assert.deepEqual(
extractTags('Garage code 1234 #home', ['house'], 'note'),
['home', 'house', 'note'],
)
})
test('extractEntities finds emails and title phrases', () => {
const entities = extractEntities('Email Sam Smith at sam@example.com')
assert.ok(entities.includes('sam@example.com'))
assert.ok(entities.some((entity) => entity.includes('sam')))
})
test('summarize uses the first line and truncates long text', () => {
assert.equal(summarize('First line\nSecond'), 'First line')
assert.equal(summarize('x'.repeat(120)).endsWith('...'), true)
})
test('scoreHaystack ranks exact phrase matches above unrelated text', () => {
assert.ok(
scoreHaystack('garage door code 1234', 'garage code') >
scoreHaystack('unrelated recipe', 'garage code'),
)
})