chr
Version:
Interpreter for Constraint Handling Rules (CHR) in JavaScript
160 lines (115 loc) • 3.25 kB
JavaScript
const test = require('tape')
const CHR = require('../../src/index')
test('chr.Rules.Add()', function (t) {
t.test('chr.Rules.Add() is a function', function (t) {
const chr = new CHR()
const rules = chr.Rules
t.equal(typeof rules.Add, 'function', 'chr.Rules.Add() is a function')
t.end()
})
t.test('chr.Rules.Add() gives rule name if not specified', function (t) {
const chr = new CHR()
chr('a ==> b')
t.equal(chr.Rules.Order.length, 1)
const ruleName = chr.Rules.Order[0]
t.ok(ruleName)
t.ok(chr.Rules[ruleName])
t.equal(ruleName, chr.Rules[ruleName].Name)
t.end()
})
t.test('chr.Rules.Add() throws for identical rule name', function (t) {
const chr = new CHR()
chr('first @ a ==> b')
t.throws(function () {
chr('first @ c ==> d')
}, 'chr.Rules.Add() throws for identical rule name')
t.end()
})
t.end()
})
test('chr.Rules.Order', function (t) {
const chr = new CHR()
const rules = chr.Rules
t.equal(typeof rules.Order, 'object', 'chr.Rules.Order is defined')
t.ok(rules.Order instanceof Array, 'chr.Rules.Order is an Array')
t.end()
})
test('chr.Rules.ForEach()', function (t) {
t.test('chr.Rules.ForEach() is a function', function (t) {
const chr = new CHR()
const rules = chr.Rules
t.equal(typeof rules.ForEach, 'function', 'chr.Rules.ForEach() is a function')
t.end()
})
t.test('chr.Rules.ForEach() loops through all rules', function (t) {
const chr = new CHR()
chr('first @ a ==> b')
chr('second @ c ==> d')
chr('third @ e ==> f')
const rules = chr.Rules
const found = {}
const order = []
rules.ForEach(function (rule) {
found[rule.Name] = 1
order.push(rule.Name)
})
const expected = {
first: 1,
second: 1,
third: 1
}
t.deepEqual(found, expected, 'all rules examined')
t.deepEqual(order, ['first', 'second', 'third'], 'examined in order as defined')
t.end()
})
t.test('chr.Rules.ForEach() loops in order', function (t) {
const chr = new CHR()
chr('first @ a ==> b')
chr('second @ c ==> d')
chr('third @ e ==> f')
const rules = chr.Rules
const order = [
'third',
'first',
'second'
]
rules.Order = order
const found = []
rules.ForEach(function (rule) {
found.push(rule.Name)
})
t.deepEqual(found, order, 'examined in specified order')
t.end()
})
t.end()
})
test('chr.Rules.Reset()', function (t) {
t.test('chr.Rules.Reset() is a function', function (t) {
const chr = new CHR()
const rules = chr.Rules
t.equal(typeof rules.Reset, 'function', 'chr.Rules.Reset() is a function')
t.end()
})
t.test('chr.Rules.Reset() deletes existing rules', function (t) {
const chr = new CHR()
const rules = chr.Rules
chr('first @ a ==> b')
chr('second @ c ==> d')
t.ok(rules.first)
t.ok(rules.second)
t.ok(chr.a)
t.ok(chr.b)
t.ok(chr.c)
t.ok(chr.d)
rules.Reset()
t.notOk(rules.first)
t.notOk(rules.second)
t.notOk(chr.a)
t.notOk(chr.b)
t.notOk(chr.c)
t.notOk(chr.d)
t.deepEqual(chr.Constraints, {})
t.end()
})
t.end()
})