chr
Version:
Interpreter for Constraint Handling Rules (CHR) in JavaScript
88 lines (57 loc) • 1.96 kB
JavaScript
const test = require('tape')
const CHR = require('../../src/index')
test('chr.Store', function (t) {
const chr = new CHR()
t.equal(typeof chr.Store, 'object', 'chr.Store is object')
t.end()
})
test('chr.History', function (t) {
const chr = new CHR()
t.equal(typeof chr.History, 'object', 'chr.History is object')
t.end()
})
test('chr.Rules', function (t) {
const chr = new CHR()
t.equal(typeof chr.Rules, 'object', 'chr.Rules is object')
t.end()
})
test('chr.Constraints', function (t) {
t.test('chr.Constraints is object', function (t) {
const chr = new CHR()
t.equal(typeof chr.Constraints, 'object')
t.end()
})
t.test('chr.Constraints saves defined constraints and their occurences', function (t) {
const chr = new CHR()
t.deepEqual(chr.Constraints, {}, 'chr.Constraints is initially empty')
chr('first @ a ==> b, a(1)')
;['a/0', 'a/1', 'b/0'].forEach(function (functor) {
t.equal(typeof chr.Constraints[functor], 'object')
t.ok(chr.Constraints[functor] instanceof Array)
})
t.deepEqual(chr.Constraints['a/0'], ['first'], 'a/0 is only in the head of rule "first"')
t.deepEqual(chr.Constraints['a/1'], [], 'a/1 is in no rule head')
t.deepEqual(chr.Constraints['b/0'], [], 'b/0 is in no rule head')
t.end()
})
t.end()
})
test('chr()', function (t) {
t.test('CHR instance is a function', function (t) {
const chr = new CHR()
t.equal(typeof chr, 'function', 'CHR instance is a function')
t.end()
})
t.test('chr() adds callers for constraints', function (t) {
const chr = new CHR()
chr('a, b ==> c')
;['a', 'b', 'c'].forEach(function (constraintName) {
t.equal(typeof chr[constraintName], 'function', 'constraint caller is a function')
})
t.equal(typeof chr.d, 'undefined', 'constraint d not yet defined')
chr('d ==> a')
t.ok(chr.d, 'constraint d now defined')
t.end()
})
t.end()
})