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

151 lines
4.2 KiB
JavaScript

import test from 'tape'
import nlp from '../_lib.js'
const here = '[one/negative] '
test('! negative match syntax :', function (t) {
let doc = nlp.tokenize('one two three')
let m = doc.match('one !two three')
t.equal(m.text(), '', here + 'ban-not')
doc = nlp.tokenize('one two three')
m = doc.match('one !foo three')
t.equal(m.text(), 'one two three', here + 'swap-not')
doc = nlp.tokenize('one two three')
m = doc.match('one !foo? two three')
t.equal(m.text(), 'one two three', here + 'optional-not-missing')
doc = nlp("before bar")
m = doc.match("before !foo?")
t.equal(m.text(), 'before bar', here + 'optional-not-end')
doc = nlp("before")
m = doc.match("before !foo?")
t.equal(m.text(), 'before', here + 'optional-not-end-missing')
m = "i will !foo .{0,9}? send"
doc = nlp("i will then send him")
t.equal(doc.has(m), true, here + 'neg1')
doc = nlp("before bar after")
m = doc.match("before !foo? after")
t.equal(m.text(), 'before bar after', here + 'optional-not-found')
m = "i will !foo? send"
doc = nlp("I will then send him")
t.equal(doc.has(m), true, here + 'neg4')
m = "i will !foo{0,9}? send"
doc = nlp("I will then send him")
t.equal(doc.has(m), true, here + 'neg5')
m = "i will !."
doc = nlp("I will then send him") //never negative anything
t.equal(doc.has(m), false, here + 'neg-anything')
// m = "i will !not? .{0,9}? send"
// doc = nlp("i will send him")
// t.equal(doc.has(m), true, here + 'neg-optional')
// m = "i will !foo? !foo? !foo? !foo? !foo? send"
// doc = nlp("I will send her.")
// t.equal(doc.has(m), true, here + 'multi-optional')
t.end()
})
test('negative optional logic', function (t) {
let doc = nlp.tokenize(`one after`)
let m = doc.match(`one !foo? moo? after`)
t.equal(m.text(), 'one after', here + 'optional-after')
m = doc.match(`one !foo? after`)
t.equal(m.text(), 'one after', here + 'not-optional-after')
doc = nlp(`I have not booked`)
// -make sure we do not find 'not'
m = doc.match(`have !not? booked`)
t.equal(m.found, false, here + 'neg-missing')
// make sure we do not find 'not'
// but with tricky next-term greedy
m = doc.match(`have !not? * booked`)
t.equal(m.found, false, here + 'neg-then-astrix')
t.end()
})
test('negative greedy-max', function (t) {
const check = (doc) => doc.has('before !(not|no|maybe|perhaps){0,3} after')
let doc = nlp('before after')
t.equal(check(doc), true, 'no middle')
doc = nlp('before one after')
t.equal(check(doc), true, 'one middle')
doc = nlp('before one two after')
t.equal(check(doc), true, 'two middle')
doc = nlp('before one two three after')
t.equal(check(doc), true, 'three middle')
doc = nlp('before one two three four after')
t.equal(check(doc), false, 'four middle')
doc = nlp('before one two three maybe')
let m = doc.match('before !maybe{1}')
t.equal(m.text(), 'before one', 'greedy-max-one')
doc = nlp('before one two three maybe')
m = doc.match('before !maybe{1,2}')
t.equal(m.text(), 'before one two', 'greedy-max-two')
doc = nlp('before one two three maybe')
m = doc.match('before !maybe{4,5}')
t.equal(m.text(), '', 'greedy-unmet-min')
t.end()
})
test('negative greedy-end', function (t) {
// simpler version
let doc = nlp('before one after')
t.equal(doc.has('before !maybe+ after'), true, 'greedy-not-one')
doc = nlp('before one two after')
t.equal(doc.has('before !maybe+ after'), true, 'greedy-not-two')
// greedyEnd
doc = nlp('before one two')
let m = doc.match('before !maybe+')
t.equal(m.text(), 'before one two', 'greedy-end')
doc = nlp('before maybe')
m = doc.match('before !maybe+')
t.equal(m.text(), '', 'greedy-zero-fail')
doc = nlp('before one maybe')
m = doc.match('before !maybe+')
t.equal(m.text(), 'before one', 'greedy-one-stop')
doc = nlp('before one two maybe')
m = doc.match('before !maybe+')
t.equal(m.text(), 'before one two', 'greedy-two-stop')
t.end()
})
test('negative greedy-to', function (t) {
let doc = nlp('before one after end')
let m = doc.match('before !maybe+ after')
t.equal(m.text(), 'before one after', 'greedy-to-pos')
doc = nlp('before one after end')
m = doc.match('before !maybe+ none')
t.equal(m.text(), '', 'greedy-no-after')
t.end()
})