elliptical
Version:
Interactive natural-language interfaces
72 lines (59 loc) • 1.71 kB
JSX
/** @jsx createElement */
/* eslint-env mocha */
import createElement from '../src/element'
import {compileAndTraverse, text} from './_util'
import chai, {expect} from 'chai'
import {spy} from 'sinon'
import sinonChai from 'sinon-chai'
chai.use(sinonChai)
describe('filter', () => {
it('filters result', () => {
function filter (option) {
return option.result === 'b'
}
const grammar = (
<filter outbound={filter}>
<list items={[{text: 'a', value: 'a'}, {text: 'b', value: 'b'}]} />
</filter>
)
const options = compileAndTraverse(grammar, '')
expect(options).to.have.length(1)
expect(text(options[0])).to.equal('b')
expect(options[0].result).to.equal('b')
})
it('does not filter with placeholders', () => {
const filterSpy = spy()
function filter (option) {
filterSpy()
return true
}
const grammar = (
<filter outbound={filter} skipIncomplete>
<placeholder label='test'>
<literal text='s' />
</placeholder>
</filter>
)
const options = compileAndTraverse(grammar, '')
expect(options).to.have.length(1)
expect(filterSpy).to.not.have.been.called
expect(text(options[0])).to.equal('test')
expect(options[0].result).to.be.undefined
})
it('filters inbound', () => {
const tapSpy = spy()
function filter (option) {
return false
}
const grammar = (
<filter inbound={filter}>
<tap inbound={tapSpy}>
<literal text='test' />
</tap>
</filter>
)
const options = compileAndTraverse(grammar, '')
expect(options).to.have.length(0)
expect(tapSpy).to.not.have.been.called
})
})