101 lines
2.9 KiB
JavaScript
101 lines
2.9 KiB
JavaScript
import test from 'tape'
|
|
import nlp from '../_lib.js'
|
|
const here = '[two/clone] '
|
|
|
|
test('clone root', function (t) {
|
|
const arr = [
|
|
'he eats the alligator',
|
|
'Jumanji is the best move. He eats cheese.',
|
|
'Uperman is wayyyy better than batman!',
|
|
]
|
|
arr.forEach(function (str) {
|
|
const doc = nlp(str)
|
|
t.equal(doc.out(), str, here + 'equals input - ' + doc.out())
|
|
|
|
const up = doc.clone().toUpperCase()
|
|
t.notEqual(str, up.out(), here + 'neg not equal - ' + str)
|
|
|
|
const adv = doc.clone().match('#Verb').append('really')
|
|
t.notEqual(str, adv.out(), here + 'adv not equal - ' + str)
|
|
|
|
const rm = doc.clone().match('#Verb').delete('#Verb')
|
|
t.notEqual(str, rm.out(), 'rm not equal - ' + str)
|
|
|
|
const tag = doc.clone().tag('#Verb')
|
|
t.notEqual(doc.match('#Verb').text(), tag.match('#Verb').text(), here + 'rm not equal - ' + str)
|
|
})
|
|
t.end()
|
|
})
|
|
|
|
test('clone tag-basic', function (t) {
|
|
const doc = nlp(`one two three. four five six`).tag('Value')
|
|
|
|
// clone/tag first sentence
|
|
const a = doc.eq(0).clone().tag('Person')
|
|
t.equal(a.if('#Person').length, 1, here + 'A has person')
|
|
t.equal(doc.if('#Person').length, 0, here + 'doc has no person')
|
|
|
|
t.end()
|
|
})
|
|
|
|
test('clone does not leak', function (t) {
|
|
const txt = 'one foo two three. four. foo five six. foo.'
|
|
const doc = nlp(txt)
|
|
let m = doc.clone()
|
|
// do all sorts of terrible things to the document
|
|
for (let i = 0; i < 5; i += 1) {
|
|
m = m.splitOn('two')
|
|
m = m.remove('foo')
|
|
m.match('three').remove()
|
|
m = m.match('five').insertAfter('after')
|
|
m.prepend('oh yeah')
|
|
m.unTag('Value')
|
|
m = m.map(p => p.toUpperCase())
|
|
m.eq(1).remove()
|
|
m = m.not('foo')
|
|
m = m.if('.')
|
|
m = m.eq(0).tag('Yeah')
|
|
m.compute(['normal', 'preTagger', 'postTagger', 'contractions'])
|
|
m = m.all()
|
|
}
|
|
// is it still unchanged?
|
|
t.notDeepEqual(doc.out('array'), m.out('array'), here + 'main-changed')
|
|
t.deepEqual(doc.out('array'), nlp(txt).out('array'), here + 'no-leak-json')
|
|
t.equal(doc.text(), txt, here + 'no-leak-text')
|
|
t.equal(doc.has('#Yeah'), false, here + 'no-leak-tags')
|
|
t.end()
|
|
})
|
|
|
|
|
|
test('clone share pointer', function (t) {
|
|
const doc = nlp('one two three')
|
|
const tmp = doc.clone()
|
|
const m = tmp.match('(one|three)')
|
|
|
|
t.deepEqual(doc.match(m).out('array'), ['one', 'three'], here + 'use cloned pointer')
|
|
|
|
// m.append('four')
|
|
// t.deepEqual(doc.match(m).out('array'), ['one', 'three'], here + 'only found in doc')
|
|
|
|
// mutate original
|
|
doc.remove('three')
|
|
t.deepEqual(doc.match(m).out('array'), ['one'], here + 'cloned pointer partial')
|
|
|
|
t.end()
|
|
})
|
|
|
|
|
|
|
|
// test('partial clone ', function (t) {
|
|
// let doc = nlp(`one two three. four five six`).tag('Value')
|
|
|
|
// // clone first sentence
|
|
// let a = doc.eq(0).clone()
|
|
// // tag the whole thing
|
|
// a = a.all().tag('Person')
|
|
// t.equal(a.if('#Person').length, 2, here + 'A has 2 sentences')
|
|
// t.equal(doc.if('#Person').length, 1, here + 'doc has 1 sentence')
|
|
|
|
// t.end()
|
|
// })
|