Tofu/tests/text/scoreTextSimilarity.test.js

51 lines
2.2 KiB
JavaScript

import test from 'node:test'
import assert from 'node:assert/strict'
import { scoreTextSimilarity } from '#tofu/tools/text/scoreTextSimilarity.js'
test('scores an exact match, accents and case aside, at 1', () => {
assert.equal(scoreTextSimilarity('crepes', 'Crêpes'), 1)
assert.equal(scoreTextSimilarity('GNOCCHIS À LA SAUGE', 'Gnocchis à la sauge'), 1)
})
test('scores an empty or blank query at 0', () => {
assert.equal(scoreTextSimilarity('', 'Gnocchis à la sauge'), 0)
assert.equal(scoreTextSimilarity(' ', 'Gnocchis à la sauge'), 0)
assert.equal(scoreTextSimilarity(null, 'Gnocchis à la sauge'), 0)
})
test('scores an empty candidate at 0', () => {
assert.equal(scoreTextSimilarity('gnocchis', ''), 0)
assert.equal(scoreTextSimilarity('gnocchis', null), 0)
})
test('ranks prefix above containment above approximation', () => {
const prefix = scoreTextSimilarity('gnocchis', 'Gnocchis à la sauge')
const contains = scoreTextSimilarity('sauge', 'Gnocchis à la sauge')
const approximate = scoreTextSimilarity('knoci', 'gnocchis')
assert.ok(prefix > contains, `prefix ${prefix} should beat contains ${contains}`)
assert.ok(prefix > 0.9 && prefix < 1)
assert.equal(contains, 0.75)
assert.ok(contains > approximate, `contains ${contains} should beat approximate ${approximate}`)
})
test('gives a longer prefix a higher score than a shorter one', () => {
const short = scoreTextSimilarity('gno', 'Gnocchis à la sauge')
const long = scoreTextSimilarity('gnocchis a la', 'Gnocchis à la sauge')
assert.ok(long > short, `${long} should beat ${short}`)
})
test('keeps a misspelled query close to its word', () => {
const misspelled = scoreTextSimilarity('knoci', 'gnocchis')
assert.ok(misspelled >= 0.2, `${misspelled} should stay above the suggestion threshold`)
assert.ok(misspelled < 0.75)
})
test('scores unrelated texts far below the suggestion threshold', () => {
assert.ok(scoreTextSimilarity('knoci', 'Poulet rôti') < 0.2)
assert.equal(scoreTextSimilarity('xyz', 'Crêpes'), 0)
})
test('stays within 0 and 1 when the query is longer than the candidate', () => {
const score = scoreTextSimilarity('gnocchis a la sauge maison', 'Gnocchis à la sauge')
assert.ok(score > 0 && score <= 1, `${score} should stay within 0 and 1`)
})