Files
2026-07-13 12:48:55 +08:00

186 lines
5.9 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import test from 'tape'
import nlp from '../_lib.js'
const here = '[two/contraction] '
test('tricky contractions', function (t) {
let doc = nlp(`Im `)
doc.contractions().expand()
t.equal(doc.text(), 'I am ', here + "i'm")
doc = nlp(` i cant `)
doc.contractions().expand()
t.equal(doc.text(), ' i can not ', here + "i can't")
doc = nlp(`spencers clean`)
doc.contractions().expand()
t.equal(doc.text(), 'spencer is clean', here + "spencer's")
doc = nlp(`wouldnt be good`)
doc.contractions().expand()
t.equal(doc.text(), 'would not be good', here + 'wouldnt')
doc = nlp(`whatd you see`)
doc.contractions().expand()
t.equal(doc.text(), 'what did you see', here + 'whatd')
doc = nlp(`spencerd go see`)
doc.contractions().expand()
t.equal(doc.text(), 'spencer would go see', here + 'spencerd')
doc = nlp(`I ain't gettin' picked last`)
doc.contractions().expand()
t.equal(doc.text(), 'I am not gettin\' picked last', here + 'aint')
t.end()
})
test('contractions v possessive', function (t) {
let doc = nlp("spencer's not cool")
doc.contractions().expand()
t.equal(doc.text(), 'spencer is not cool', 'adj contraction')
doc = nlp("spencer's walk")
doc.contractions().expand()
t.equal(doc.text(), "spencer's walk", 'noun not contraction')
doc = nlp("spencer's runs")
doc.contractions().expand()
t.equal(doc.text(), "spencer's runs", 'present-tense not contraction')
t.end()
})
test('match contractions/possessives', function (t) {
const doc = nlp(`i think it's spencer's`)
t.equal(doc.has('it'), true, here + 'has it')
t.equal(doc.has('spencer'), true, here + 'has spencer')
t.equal(doc.has(`spencer's`), true, here + "has spencer's")
t.equal(doc.has(`i'm`), false, here + 'not false-positive')
t.equal(doc.has(`it'll`), false, here + 'not false-positive-2')
t.end()
})
test('contraction whitespace', function (t) {
let doc = nlp(`i didn't know.`)
t.equal(doc.text(), `i didn't know.`, here + 'init-whitespace')
doc.contractions().expand()
t.equal(doc.text(), `i did not know.`, here + 'expanded-whitespace')
doc = nlp(`i didn't.`)
t.equal(doc.text(), `i didn't.`, here + 'init-period')
doc.contractions().expand()
t.equal(doc.text(), `i did not.`, here + 'expanded-period')
t.end()
})
test('number-range', function (t) {
let doc = nlp(`between 5-7.`)
t.equal(doc.has('5 to 7'), true, here + 'range-preposition-match')
t.equal(doc.has('#NumberRange'), true, here + 'has NumberRange tag')
t.equal(doc.has('#Value'), true, here + 'has Value tag')
let arr = nlp('1-2').contractions().expand().match('#Value').out('array')
t.equal(arr.length, 2, here + 'found numbers')
doc = nlp('20th-21st')
t.equal(doc.has('#NumberRange'), true, 'ordinal has NumberRange tag')
t.equal(doc.has('#Ordinal'), true, 'has Ordinal tag')
arr = doc.contractions().expand().terms().out('array')
t.deepEqual(arr, ['20th', 'to', '21st'], here + 'num-range expand')
doc = nlp('4-5pm')
t.equal(doc.has('#NumberRange'), true, 'time has NumberRange tag')
t.equal(doc.has('#Ordinal'), false, 'time is not an Ordinal tag')
arr = doc.contractions().expand().terms().out('array')
t.deepEqual(arr, ['4', 'to', '5pm'], here + 'time-range expand')
doc = nlp('3:45-11pm')
t.equal(doc.has('#NumberRange'), true, 'time has NumberRange tag')
t.equal(doc.has('#Time'), true, 'time tag')
arr = doc.contractions().expand().terms().out('array')
t.deepEqual(arr, ['3:45', 'to', '11pm'], here + 'time-range expand2')
t.end()
})
test('number-range with spaces', function (t) {
let doc = nlp('12 - 14')
t.equal(doc.has('#Value to #NumberRange'), true, here + 'has NumberRange tags')
t.equal(doc.text(), '12 - 14', here + 'text is normal')
t.equal(doc.contractions().expand().text(), '12 to 14', here + 'contraction expands')
doc = nlp('4 - 5pm')
t.equal(doc.has('#Value to #NumberRange'), true, here + 'has NumberRange tags #2')
t.equal(doc.text(), '4 - 5pm', here + 'text is proper #2')
t.equal(doc.contractions().expand().text(), '4 to 5pm', here + 'contraction expands #2')
t.end()
})
test('french-contraction', function (t) {
const doc = nlp(`oh j'aime ca`)
t.equal(doc.has('aime'), true, here + 'has verb')
t.equal(doc.has('je'), true, here + 'has je')
t.end()
})
test('replace-contraction', function (t) {
const doc = nlp(`i'd walked`)
doc.replace('had', 'foo')
t.equal(doc.text(), `i foo walked`, here + 'replace-contraction')
t.end()
})
test('remove-contraction', function (t) {
const doc = nlp(`i'd walked`)
doc.remove('had')
t.equal(doc.text(), `i walked`, here + 'remove-contraction')
t.end()
})
test('insert-contraction', function (t) {
let doc = nlp(`i'd walked`)
let m = doc.match('had')
m.insertBefore('really')
t.equal(doc.text(), `i really had walked`, here + 'insertBefore-contraction')
doc = nlp(`i'd walked`)
m = doc.match('i')
m.insertAfter('really')
t.equal(doc.text(), `i really had walked`, here + 'insertAfter-contraction')
t.end()
})
test('insert does not trigger contractions', function (t) {
const doc = nlp(`we've walked`)
doc.insertAfter('cool')
t.equal(doc.text(), `we've walked cool`, here + 'insert-no-contraction')
t.end()
})
test('split-contraction', function (t) {
// let doc = nlp(`i'd walked`)
// let m = doc.splitOn('had')
// t.deepEqual(m.out('array'), ['i', 'had', 'walked'], here + 'splitOn-contraction')
// doc = nlp(`i'd walked`)
// m = doc.splitAfter('i')
// t.deepEqual(m.out('array'), ['i', 'had walked'], here + 'splitAfter-contraction')
// doc = nlp(`i'd walked`)
// m = doc.splitBefore('had')
// t.deepEqual(m.out('array'), ['i', 'had walked'], here + 'splitBefore-contraction')
const doc = nlp(`i've walked`)
const m = doc.splitAfter('walked')
t.deepEqual(m.out('array'), [`i've walked`], here + 'split-contraction-miss-1')
// doc = nlp(`i'd walked`)
// m = doc.splitAfter('had')
// t.deepEqual(m.out('array'), [`i've`, 'walked'], here + 'split-contraction-miss')
t.end()
})