finitedomain
Version:
A fast feature rich finite domain solver
1,239 lines (1,092 loc) • 60.1 kB
JavaScript
import expect from '../fixtures/mocha_proxy.fixt';
import {
fixt_arrdom_range,
fixt_dom_empty,
fixt_dom_nums,
fixt_dom_range,
fixt_domainEql,
} from '../fixtures/domain.fixt';
import {
SUB,
SUP,
} from '../../src/helpers';
import {
config_addConstraint,
config_addVarAnonConstant,
config_addVarAnonNothing,
config_addVarAnonRange,
config_addVarConstant,
config_addVarDomain,
config_addVarNothing,
config_addVarRange,
config_clone,
config_create,
config_createVarStratConfig,
config_setOptions,
config_setOption,
} from '../../src/config';
import {
domain__debug,
} from '../../src/domain';
describe('src/config.spec', function() {
describe('config_addConstraint', function() {
it('should exist', function() {
expect(config_addConstraint).to.be.a('function');
});
it('should throw for unknown names', function() {
let config = config_create();
expect(_ => config_addConstraint(config, 'crap', [])).to.throw('UNKNOWN_PROPAGATOR');
});
describe('config_solvedAtCompileTime', function() {
describe('lt', function() {
it('should properly solve edge cases A<B', function() {
let config = config_create();
let A = config_addVarRange(config, 'A', 0, 10);
let B = config_addVarRange(config, 'B', 0, 10);
config_addConstraint(config, 'lt', ['A', 'B']);
fixt_domainEql(config.initialDomains[A], fixt_dom_range(0, 9));
fixt_domainEql(config.initialDomains[B], fixt_dom_range(1, 10));
});
});
describe('lte', function() {
it('should properly solve edge cases A<=B', function() {
let config = config_create();
let A = config_addVarRange(config, 'A', 0, 10);
let B = config_addVarRange(config, 'B', 0, 10);
config_addConstraint(config, 'lte', ['A', 'B']);
fixt_domainEql(config.initialDomains[A], fixt_dom_range(0, 10));
fixt_domainEql(config.initialDomains[B], fixt_dom_range(0, 10));
});
});
describe('gt', function() {
it('should properly solve edge cases A>B', function() {
let config = config_create();
let A = config_addVarRange(config, 'A', 0, 10);
let B = config_addVarRange(config, 'B', 0, 10);
config_addConstraint(config, 'gt', ['A', 'B']);
fixt_domainEql(config.initialDomains[A], fixt_dom_range(1, 10));
fixt_domainEql(config.initialDomains[B], fixt_dom_range(0, 9));
});
});
describe('gt', function() {
it('should properly solve edge cases A>=B', function() {
let config = config_create();
let A = config_addVarRange(config, 'A', 0, 10);
let B = config_addVarRange(config, 'B', 0, 10);
config_addConstraint(config, 'gte', ['A', 'B']);
fixt_domainEql(config.initialDomains[A], fixt_dom_range(0, 10));
fixt_domainEql(config.initialDomains[B], fixt_dom_range(0, 10));
});
});
describe('reifier', function() {
function test(op, desc, A, B, C, D, E, F) {
it(`${domain__debug(A)} ?${op} ${domain__debug(B)} = ${domain__debug(C)} -> ${domain__debug(D)}, ?${op} ${domain__debug(E)} -> ${domain__debug(F)}; ${desc}`, function() {
let config = config_create();
let a = config_addVarDomain(config, 'A', A);
let b = config_addVarDomain(config, 'B', B);
let c = config_addVarDomain(config, 'C', C);
config_addConstraint(config, 'reifier', ['A', 'B', 'C'], op);
fixt_domainEql(config.initialDomains[a], D, 'a=d');
fixt_domainEql(config.initialDomains[b], E, 'b=e');
fixt_domainEql(config.initialDomains[c], F, 'c=f');
});
}
describe('?lt', function() {
test(
'lt', 'should do nothing if unsolved',
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(0, 10), fixt_dom_range(0, 1)
);
test(
'lt', 'A < min(B): C becomes true',
fixt_arrdom_range(0, 0), fixt_arrdom_range(1, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(1, 10), fixt_dom_range(1, 1)
);
test(
'lt', 'A = min(B): nothing happens',
fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(0, 10), fixt_dom_range(0, 1)
);
test(
'lt', 'min(B) < A < max(B): nothing changes', // though B could be pruned...
fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(5, 5), fixt_dom_range(0, 10), fixt_dom_range(0, 1)
);
test(
'lt', 'A = max(B): C becomes false',
fixt_arrdom_range(10, 10), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(10, 10), fixt_dom_range(0, 10), fixt_dom_range(0, 0)
);
test(
'lt', 'A > max(B): C becomes false',
fixt_arrdom_range(11, 11), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(11, 11), fixt_dom_range(0, 10), fixt_dom_range(0, 0)
);
test(
'lt', 'B < min(A): C becomes false',
fixt_arrdom_range(1, 10), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(1, 10), fixt_dom_range(0, 0), fixt_dom_range(0, 0)
);
test(
'lt', 'B = min(A): C becomes false',
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(0, 0), fixt_dom_range(0, 0)
);
test(
'lt', 'min(A) < B < max(A): nothing changes', // though A could be pruned...
fixt_arrdom_range(0, 10), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(5, 5), fixt_dom_range(0, 1)
);
test(
'lt', 'B = max(A): no change',
fixt_arrdom_range(0, 10), fixt_arrdom_range(10, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(10, 10), fixt_dom_range(0, 1)
);
test(
'lt', 'B > max(A): C becomes true',
fixt_arrdom_range(0, 10), fixt_arrdom_range(11, 11), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(11, 11), fixt_dom_range(1, 1)
);
test(
'lt', 'C = 0: nothing changes', // could prune A and B...
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(0, 10), fixt_dom_range(0, 1)
);
test(
'lt', 'C = 1: nothing changes', // could prune A and B...
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1),
fixt_dom_range(0, 10), fixt_dom_range(0, 10), fixt_dom_range(1, 1)
);
// ## C = A ?< B
// A = 0, B = 0, C = bool -> C=0
// A = 1, B = 0, C = bool -> C=0
// A = 5, B = 0, C = bool -> C=0
// A = 0, B = 1, C = bool -> C=1
// A = 1, B = 1, C = bool -> C=0
// A = 5, B = 1, C = bool -> C=0
// A = 0, B = 5, C = bool -> C=1
// A = 1, B = 5, C = bool -> C=1
// A = 5, B = 5, C = bool -> C=0
// A = 0, B = ~, C = 0 -> b>=0
// A = 1, B = ~, C = 0 -> B>=0
// A = 5, B = ~, C = 0 -> B>=5
// A = 0, B = ~, C = 1 -> B>0
// A = 1, B = ~, C = 1 -> B>1
// A = 5, B = ~, C = 1 -> B>5
// A = ~, B = 0, C = 0 -> A>=0
// A = ~, B = 1, C = 0 -> A>=1
// A = ~, B = 5, C = 0 -> A>=5
// A = ~, B = 0, C = 1 -> fail
// A = ~, B = 1, C = 1 -> A<1
// A = ~, B = 5, C = 1 -> A<5
test(
'lt', 'A=0, B=0: C=0',
fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(0, 0), fixt_dom_range(0, 0)
);
test(
'lt', 'A=1, B=0: C=0',
fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(1, 1), fixt_dom_range(0, 0), fixt_dom_range(0, 0)
);
test(
'lt', 'A=5, B=0: C=0',
fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(5, 5), fixt_dom_range(0, 0), fixt_dom_range(0, 0)
);
test(
'lt', 'A=0, B=1: C=1',
fixt_arrdom_range(0, 0), fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(1, 1), fixt_dom_range(1, 1)
);
test(
'lt', 'A=1, B=1: C=0',
fixt_arrdom_range(1, 1), fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 1),
fixt_dom_range(1, 1), fixt_dom_range(1, 1), fixt_dom_range(0, 0)
);
test(
'lt', 'A=5, B=1: C=0',
fixt_arrdom_range(5, 5), fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 1),
fixt_dom_range(5, 5), fixt_dom_range(1, 1), fixt_dom_range(0, 0)
);
test(
'lt', 'A=0, B=5: C=1',
fixt_arrdom_range(0, 0), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(5, 5), fixt_dom_range(1, 1)
);
test(
'lt', 'A=1, B=5: C=1',
fixt_arrdom_range(1, 1), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 1),
fixt_dom_range(1, 1), fixt_dom_range(5, 5), fixt_dom_range(1, 1)
);
test(
'lt', 'A=5, B=5: C=0',
fixt_arrdom_range(5, 5), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 1),
fixt_dom_range(5, 5), fixt_dom_range(5, 5), fixt_dom_range(0, 0)
);
test(
'lt', 'A=0, C=0: B=0',
fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0),
fixt_dom_range(0, 0), fixt_dom_range(0, 0), fixt_dom_range(0, 0)
);
test(
'lt', 'A=1, C=0: B=0,1',
fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0),
fixt_dom_range(1, 1), fixt_dom_range(0, 1), fixt_dom_range(0, 0)
);
test(
'lt', 'A=5, C=0: B=0,5',
fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0),
fixt_dom_range(5, 5), fixt_dom_range(0, 5), fixt_dom_range(0, 0)
);
test(
'lt', 'A=0, C=1: B=[]',
fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1),
fixt_dom_range(0, 0), fixt_dom_range(1, 10), fixt_dom_range(1, 1)
);
test(
'lt', 'A=1, C=1: B=2,10',
fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1),
fixt_dom_range(1, 1), fixt_dom_range(2, 10), fixt_dom_range(1, 1)
);
test(
'lt', 'A=5, C=1: B=5,10',
fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1),
fixt_dom_range(5, 5), fixt_dom_range(6, 10), fixt_dom_range(1, 1)
);
test(
'lt', 'B=0, C=0: A=0,10',
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 0),
fixt_dom_range(0, 10), fixt_dom_range(0, 0), fixt_dom_range(0, 0)
);
test(
'lt', 'B=1, C=0: A=1,10',
fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 0),
fixt_dom_range(1, 10), fixt_dom_range(1, 1), fixt_dom_range(0, 0)
);
test(
'lt', 'B=5, C=0: A=5,10',
fixt_arrdom_range(0, 10), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 0),
fixt_dom_range(5, 10), fixt_dom_range(5, 5), fixt_dom_range(0, 0)
);
test(
'lt', 'B=0, C=1: A=[]',
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0), fixt_arrdom_range(1, 1),
fixt_dom_empty(), fixt_dom_range(0, 0), fixt_dom_range(1, 1)
);
test(
'lt', 'B=1, C=1: A=0,0',
fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1), fixt_arrdom_range(1, 1),
fixt_dom_range(0, 0), fixt_dom_range(1, 1), fixt_dom_range(1, 1)
);
test(
'lt', 'B=5, C=1: A=0,4',
fixt_arrdom_range(0, 10), fixt_arrdom_range(5, 5), fixt_arrdom_range(1, 1),
fixt_dom_range(0, 4), fixt_dom_range(5, 5), fixt_dom_range(1, 1)
);
});
describe('?lte', function() {
test(
'lte', 'should do nothing if unsolved',
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(0, 10), fixt_dom_range(0, 1)
);
test(
'lte', 'A < min(B): C becomes true',
fixt_arrdom_range(0, 0), fixt_arrdom_range(1, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(1, 10), fixt_dom_range(1, 1)
);
test(
'lte', 'A = min(B): C becomes true',
fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(0, 10), fixt_dom_range(1, 1)
);
test(
'lte', 'min(B) < A < max(B): nothing changes', // though B could be pruned...
fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(5, 5), fixt_dom_range(0, 10), fixt_dom_range(0, 1)
);
test(
'lte', 'A = max(B): no changes', // though B could become max(B)
fixt_arrdom_range(10, 10), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(10, 10), fixt_dom_range(0, 10), fixt_dom_range(0, 1)
);
test(
'lte', 'A > max(B): C becomes false',
fixt_arrdom_range(11, 11), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(11, 11), fixt_dom_range(0, 10), fixt_dom_range(0, 0)
);
test(
'lte', 'B < min(A): C becomes false',
fixt_arrdom_range(1, 10), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(1, 10), fixt_dom_range(0, 0), fixt_dom_range(0, 0)
);
test(
'lte', 'B = min(A): no change', // but A could be set to 0
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(0, 0), fixt_dom_range(0, 1)
);
test(
'lte', 'min(A) < B < max(A): nothing changes', // though A could be pruned...
fixt_arrdom_range(0, 10), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(5, 5), fixt_dom_range(0, 1)
);
test(
'lte', 'B = max(A): C becomes true', // there's no value in A that would invalidate lte
fixt_arrdom_range(0, 10), fixt_arrdom_range(10, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(10, 10), fixt_dom_range(1, 1)
);
test(
'lte', 'B > max(A): C becomes true',
fixt_arrdom_range(0, 10), fixt_arrdom_range(11, 11), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(11, 11), fixt_dom_range(1, 1)
);
test(
'lte', 'C = 0: nothing changes', // could prune A and B...
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(0, 10), fixt_dom_range(0, 1)
);
test(
'lte', 'C = 1: nothing changes', // could prune A and B...
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1),
fixt_dom_range(0, 10), fixt_dom_range(0, 10), fixt_dom_range(1, 1)
);
// ## C = A ?<= B
// A = 0, B = 0, C = bool -> C=1
// A = 1, B = 0, C = bool -> C=0
// A = 5, B = 0, C = bool -> C=0
// A = 0, B = 1, C = bool -> C=1
// A = 1, B = 1, C = bool -> C=1
// A = 5, B = 1, C = bool -> C=0
// A = 0, B = 5, C = bool -> C=0
// A = 1, B = 5, C = bool -> C=1
// A = 5, B = 5, C = bool -> C=1
// A = 0, B = ~, C = 0 -> fail
// A = 1, B = ~, C = 0 -> B=0
// A = 5, B = ~, C = 0 -> B<5
// A = 0, B = ~, C = 1 -> B>=0
// A = 1, B = ~, C = 1 -> B>=1
// A = 5, B = ~, C = 1 -> B>=5
// A = ~, B = 0, C = 0 -> A>0
// A = ~, B = 1, C = 0 -> A>1
// A = ~, B = 5, C = 0 -> A>5
// A = ~, B = 0, C = 1 -> A=0
// A = ~, B = 1, C = 1 -> A<=1
// A = ~, B = 5, C = 1 -> A<=5
test(
'lte', 'A=0, B=0: C=1',
fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(0, 0), fixt_dom_range(1, 1)
);
test(
'lte', 'A=1, B=0: C=0',
fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(1, 1), fixt_dom_range(0, 0), fixt_dom_range(0, 0)
);
test(
'lte', 'A=5, B=0: C=0',
fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(5, 5), fixt_dom_range(0, 0), fixt_dom_range(0, 0)
);
test(
'lte', 'A=0, B=1: C=1',
fixt_arrdom_range(0, 0), fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(1, 1), fixt_dom_range(1, 1)
);
test(
'lte', 'A=1, B=1: C=1',
fixt_arrdom_range(1, 1), fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 1),
fixt_dom_range(1, 1), fixt_dom_range(1, 1), fixt_dom_range(1, 1)
);
test(
'lte', 'A=5, B=1: C=0',
fixt_arrdom_range(5, 5), fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 1),
fixt_dom_range(5, 5), fixt_dom_range(1, 1), fixt_dom_range(0, 0)
);
test(
'lte', 'A=0, B=5: C=1',
fixt_arrdom_range(0, 0), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(5, 5), fixt_dom_range(1, 1)
);
test(
'lte', 'A=1, B=5: C=1',
fixt_arrdom_range(1, 1), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 1),
fixt_dom_range(1, 1), fixt_dom_range(5, 5), fixt_dom_range(1, 1)
);
test(
'lte', 'A=5, B=5: C=1',
fixt_arrdom_range(5, 5), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 1),
fixt_dom_range(5, 5), fixt_dom_range(5, 5), fixt_dom_range(1, 1)
);
test(
'lte', 'A=0, C=0: B=[]',
fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0),
fixt_dom_range(0, 0), fixt_dom_empty(), fixt_dom_range(0, 0)
);
test(
'lte', 'A=1, C=0: B=0',
fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0),
fixt_dom_range(1, 1), fixt_dom_range(0, 0), fixt_dom_range(0, 0)
);
test(
'lte', 'A=5, C=0: B=0,4',
fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0),
fixt_dom_range(5, 5), fixt_dom_range(0, 4), fixt_dom_range(0, 0)
);
test(
'lte', 'A=0, C=1: B=0,10',
fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1),
fixt_dom_range(0, 0), fixt_dom_range(0, 10), fixt_dom_range(1, 1)
);
test(
'lte', 'A=1, C=1: B=1,10',
fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1),
fixt_dom_range(1, 1), fixt_dom_range(1, 10), fixt_dom_range(1, 1)
);
test(
'lte', 'A=5, C=1: B=5,10',
fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1),
fixt_dom_range(5, 5), fixt_dom_range(5, 10), fixt_dom_range(1, 1)
);
test(
'lte', 'B=0, C=0: A=1,10',
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 0),
fixt_dom_range(1, 10), fixt_dom_range(0, 0), fixt_dom_range(0, 0)
);
test(
'lte', 'B=1, C=0: A=2,10',
fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 0),
fixt_dom_range(2, 10), fixt_dom_range(1, 1), fixt_dom_range(0, 0)
);
test(
'lte', 'B=5, C=0: A=6,10',
fixt_arrdom_range(0, 10), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 0),
fixt_dom_range(6, 10), fixt_dom_range(5, 5), fixt_dom_range(0, 0)
);
test(
'lte', 'B=0, C=1: A=0',
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0), fixt_arrdom_range(1, 1),
fixt_dom_range(0, 0), fixt_dom_range(0, 0), fixt_dom_range(1, 1)
);
test(
'lte', 'B=1, C=1: B=0,1',
fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1), fixt_arrdom_range(1, 1),
fixt_dom_range(0, 1), fixt_dom_range(1, 1), fixt_dom_range(1, 1)
);
test(
'lte', 'B=5, C=1: B=0,5',
fixt_arrdom_range(0, 10), fixt_arrdom_range(5, 5), fixt_arrdom_range(1, 1),
fixt_dom_range(0, 5), fixt_dom_range(5, 5), fixt_dom_range(1, 1)
);
});
describe('?gt', function() {
test(
'gt', 'should do nothing if unsolved',
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(0, 10), fixt_dom_range(0, 1)
);
test(
'gt', 'A < min(B): C becomes false',
fixt_arrdom_range(0, 0), fixt_arrdom_range(1, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(1, 10), fixt_dom_range(0, 0)
);
test(
'gt', 'A = min(B): C becomes false',
fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(0, 10), fixt_dom_range(0, 0)
);
test(
'gt', 'min(B) < A < max(B): nothing changes', // though B could be pruned...
fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(5, 5), fixt_dom_range(0, 10), fixt_dom_range(0, 1)
);
test(
'gt', 'A = max(B): no change',
fixt_arrdom_range(10, 10), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(10, 10), fixt_dom_range(0, 10), fixt_dom_range(0, 1)
);
test(
'gt', 'A > max(B): C becomes true',
fixt_arrdom_range(11, 11), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(11, 11), fixt_dom_range(0, 10), fixt_dom_range(1, 1)
);
test(
'gt', 'B < min(A): C becomes true',
fixt_arrdom_range(1, 10), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(1, 10), fixt_dom_range(0, 0), fixt_dom_range(1, 1)
);
test(
'gt', 'B = min(A): no change',
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(0, 0), fixt_dom_range(0, 1)
);
test(
'gt', 'min(A) < B < max(A): nothing changes', // though A could be pruned...
fixt_arrdom_range(0, 10), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(5, 5), fixt_dom_range(0, 1)
);
test(
'gt', 'B = max(A): C becomes false',
fixt_arrdom_range(0, 10), fixt_arrdom_range(10, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(10, 10), fixt_dom_range(0, 0)
);
test(
'gt', 'B > max(A): C becomes false',
fixt_arrdom_range(0, 10), fixt_arrdom_range(11, 11), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(11, 11), fixt_dom_range(0, 0)
);
test(
'gt', 'C = 0: nothing changes', // could prune A and B...
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(0, 10), fixt_dom_range(0, 1)
);
test(
'gt', 'C = 1: nothing changes', // could prune A and B...
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1),
fixt_dom_range(0, 10), fixt_dom_range(0, 10), fixt_dom_range(1, 1)
);
// ## C = A ?< B
// A = 0, B = 0, C = bool -> C=0
// A = 1, B = 0, C = bool -> C=1
// A = 5, B = 0, C = bool -> C=1
// A = 0, B = 1, C = bool -> C=0
// A = 1, B = 1, C = bool -> C=0
// A = 5, B = 1, C = bool -> C=1
// A = 0, B = 5, C = bool -> C=0
// A = 1, B = 5, C = bool -> C=0
// A = 5, B = 5, C = bool -> C=0
// A = 0, B = ~, C = 0 -> B>=0
// A = 1, B = ~, C = 0 -> B>=1
// A = 5, B = ~, C = 0 -> B>=5
// A = 0, B = ~, C = 1 -> fail
// A = 1, B = ~, C = 1 -> B=0
// A = 5, B = ~, C = 1 -> B<5
// A = ~, B = 0, C = 0 -> A=0
// A = ~, B = 1, C = 0 -> A<=1
// A = ~, B = 5, C = 0 -> A<=5
// A = ~, B = 0, C = 1 -> fail
// A = ~, B = 1, C = 1 -> A>1
// A = ~, B = 5, C = 1 -> A>5
test(
'gt', 'A=0, B=0: C=0',
fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(0, 0), fixt_dom_range(0, 0)
);
test(
'gt', 'A=1, B=0: C=1',
fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(1, 1), fixt_dom_range(0, 0), fixt_dom_range(1, 1)
);
test(
'gt', 'A=5, B=0: C=1',
fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(5, 5), fixt_dom_range(0, 0), fixt_dom_range(1, 1)
);
test(
'gt', 'A=0, B=1: C=0',
fixt_arrdom_range(0, 0), fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(1, 1), fixt_dom_range(0, 0)
);
test(
'gt', 'A=1, B=1: C=0',
fixt_arrdom_range(1, 1), fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 1),
fixt_dom_range(1, 1), fixt_dom_range(1, 1), fixt_dom_range(0, 0)
);
test(
'gt', 'A=5, B=1: C=1',
fixt_arrdom_range(5, 5), fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 1),
fixt_dom_range(5, 5), fixt_dom_range(1, 1), fixt_dom_range(1, 1)
);
test(
'gt', 'A=0, B=5: C=0',
fixt_arrdom_range(0, 0), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(5, 5), fixt_dom_range(0, 0)
);
test(
'gt', 'A=1, B=5: C=0',
fixt_arrdom_range(1, 1), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 1),
fixt_dom_range(1, 1), fixt_dom_range(5, 5), fixt_dom_range(0, 0)
);
test(
'gt', 'A=5, B=5: C=0',
fixt_arrdom_range(5, 5), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 1),
fixt_dom_range(5, 5), fixt_dom_range(5, 5), fixt_dom_range(0, 0)
);
test(
'gt', 'A=0, C=0: B=0,10',
fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0),
fixt_dom_range(0, 0), fixt_dom_range(0, 10), fixt_dom_range(0, 0)
);
test(
'gt', 'A=1, C=0: B=1,10',
fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0),
fixt_dom_range(1, 1), fixt_dom_range(1, 10), fixt_dom_range(0, 0)
);
test(
'gt', 'A=5, C=0: B=5,10',
fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0),
fixt_dom_range(5, 5), fixt_dom_range(5, 10), fixt_dom_range(0, 0)
);
test(
'gt', 'A=0, C=1: B=[]',
fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1),
fixt_dom_range(0, 0), fixt_dom_empty(), fixt_dom_range(1, 1)
);
test(
'gt', 'A=1, C=1: B=0',
fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1),
fixt_dom_range(1, 1), fixt_dom_range(0, 0), fixt_dom_range(1, 1)
);
test(
'gt', 'A=5, C=1: B=0,4',
fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1),
fixt_dom_range(5, 5), fixt_dom_range(0, 4), fixt_dom_range(1, 1)
);
test(
'gt', 'B=0, C=0: A=0,0',
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 0),
fixt_dom_range(0, 0), fixt_dom_range(0, 0), fixt_dom_range(0, 0)
);
test(
'gt', 'B=1, C=0: A=0,1',
fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 0),
fixt_dom_range(0, 1), fixt_dom_range(1, 1), fixt_dom_range(0, 0)
);
test(
'gt', 'B=5, C=0: A=0,5',
fixt_arrdom_range(0, 10), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 0),
fixt_dom_range(0, 5), fixt_dom_range(5, 5), fixt_dom_range(0, 0)
);
test(
'gt', 'B=0, C=1: A=1,10',
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0), fixt_arrdom_range(1, 1),
fixt_dom_range(1, 10), fixt_dom_range(0, 0), fixt_dom_range(1, 1)
);
test(
'gt', 'B=1, C=1: A=2,10',
fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1), fixt_arrdom_range(1, 1),
fixt_dom_range(2, 10), fixt_dom_range(1, 1), fixt_dom_range(1, 1)
);
test(
'gt', 'B=5, C=1: A=6,10',
fixt_arrdom_range(0, 10), fixt_arrdom_range(5, 5), fixt_arrdom_range(1, 1),
fixt_dom_range(6, 10), fixt_dom_range(5, 5), fixt_dom_range(1, 1)
);
});
describe('?gte', function() {
test(
'gte', 'should do nothing if unsolved',
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(0, 10), fixt_dom_range(0, 1)
);
test(
'gte', 'A < min(B): C becomes false',
fixt_arrdom_range(0, 0), fixt_arrdom_range(1, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(1, 10), fixt_dom_range(0, 0)
);
test(
'gte', 'A = min(B): no change',
fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(0, 10), fixt_dom_range(0, 1)
);
test(
'gte', 'min(B) < A < max(B): nothing changes', // though B could be pruned...
fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(5, 5), fixt_dom_range(0, 10), fixt_dom_range(0, 1)
);
test(
'gte', 'A = max(B): C becomes true',
fixt_arrdom_range(10, 10), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(10, 10), fixt_dom_range(0, 10), fixt_dom_range(1, 1)
);
test(
'gte', 'A > max(B): C becomes true',
fixt_arrdom_range(11, 11), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(11, 11), fixt_dom_range(0, 10), fixt_dom_range(1, 1)
);
test(
'gte', 'B < min(A): C becomes true',
fixt_arrdom_range(1, 10), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(1, 10), fixt_dom_range(0, 0), fixt_dom_range(1, 1)
);
test(
'gte', 'B = min(A): C becomes true',
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(0, 0), fixt_dom_range(1, 1)
);
test(
'gte', 'min(A) < B < max(A): nothing changes', // though A could be pruned...
fixt_arrdom_range(0, 10), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(5, 5), fixt_dom_range(0, 1)
);
test(
'gte', 'B = max(A): no change',
fixt_arrdom_range(0, 10), fixt_arrdom_range(10, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(10, 10), fixt_dom_range(0, 1)
);
test(
'gte', 'B > max(A): C becomes false',
fixt_arrdom_range(0, 10), fixt_arrdom_range(11, 11), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(11, 11), fixt_dom_range(0, 0)
);
test(
'gte', 'C = 0: nothing changes', // could prune A and B...
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 10), fixt_dom_range(0, 10), fixt_dom_range(0, 1)
);
test(
'gte', 'C = 1: nothing changes', // could prune A and B...
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1),
fixt_dom_range(0, 10), fixt_dom_range(0, 10), fixt_dom_range(1, 1)
);
// ## C = A ?< B
// A = 0, B = 0, C = bool -> C=1
// A = 1, B = 0, C = bool -> C=1
// A = 5, B = 0, C = bool -> C=1
// A = 0, B = 1, C = bool -> C=0
// A = 1, B = 1, C = bool -> C=1
// A = 5, B = 1, C = bool -> C=1
// A = 0, B = 5, C = bool -> C=0
// A = 1, B = 5, C = bool -> C=0
// A = 5, B = 5, C = bool -> C=1
// A = 0, B = ~, C = 0 -> B>0
// A = 1, B = ~, C = 0 -> B>1
// A = 5, B = ~, C = 0 -> B>5
// A = 0, B = ~, C = 1 -> B=0
// A = 1, B = ~, C = 1 -> B<=1
// A = 5, B = ~, C = 1 -> B<=5
// A = ~, B = 0, C = 0 -> fail
// A = ~, B = 1, C = 0 -> A<1
// A = ~, B = 5, C = 0 -> A<5
// A = ~, B = 0, C = 1 -> A=0
// A = ~, B = 1, C = 1 -> A>=1
// A = ~, B = 5, C = 1 -> A>=5
test(
'gte', 'A=0, B=0: C=1',
fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(0, 0), fixt_dom_range(1, 1)
);
test(
'gte', 'A=1, B=0: C=1',
fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(1, 1), fixt_dom_range(0, 0), fixt_dom_range(1, 1)
);
test(
'gte', 'A=5, B=0: C=1',
fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 1),
fixt_dom_range(5, 5), fixt_dom_range(0, 0), fixt_dom_range(1, 1)
);
test(
'gte', 'A=0, B=1: C=0',
fixt_arrdom_range(0, 0), fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(1, 1), fixt_dom_range(0, 0)
);
test(
'gte', 'A=1, B=1: C=1',
fixt_arrdom_range(1, 1), fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 1),
fixt_dom_range(1, 1), fixt_dom_range(1, 1), fixt_dom_range(1, 1)
);
test(
'gte', 'A=5, B=1: C=1',
fixt_arrdom_range(5, 5), fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 1),
fixt_dom_range(5, 5), fixt_dom_range(1, 1), fixt_dom_range(1, 1)
);
test(
'gte', 'A=0, B=5: C=0',
fixt_arrdom_range(0, 0), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 1),
fixt_dom_range(0, 0), fixt_dom_range(5, 5), fixt_dom_range(0, 0)
);
test(
'gte', 'A=1, B=5: C=0',
fixt_arrdom_range(1, 1), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 1),
fixt_dom_range(1, 1), fixt_dom_range(5, 5), fixt_dom_range(0, 0)
);
test(
'gte', 'A=5, B=5: C=1',
fixt_arrdom_range(5, 5), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 1),
fixt_dom_range(5, 5), fixt_dom_range(5, 5), fixt_dom_range(1, 1)
);
test(
'gte', 'A=0, C=0: B=1,10',
fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0),
fixt_dom_range(0, 0), fixt_dom_range(1, 10), fixt_dom_range(0, 0)
);
test(
'gte', 'A=1, C=0: B=2,10',
fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0),
fixt_dom_range(1, 1), fixt_dom_range(2, 10), fixt_dom_range(0, 0)
);
test(
'gte', 'A=5, C=0: B=6,10',
fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0),
fixt_dom_range(5, 5), fixt_dom_range(6, 10), fixt_dom_range(0, 0)
);
test(
'gte', 'A=0, C=1: B=0',
fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1),
fixt_dom_range(0, 0), fixt_dom_range(0, 0), fixt_dom_range(1, 1)
);
test(
'gte', 'A=1, C=1: B=0,1',
fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1),
fixt_dom_range(1, 1), fixt_dom_range(0, 1), fixt_dom_range(1, 1)
);
test(
'gte', 'A=5, C=1: B=0,5',
fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1),
fixt_dom_range(5, 5), fixt_dom_range(0, 5), fixt_dom_range(1, 1)
);
test(
'gte', 'B=0, C=0: A=[]',
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0), fixt_arrdom_range(0, 0),
fixt_dom_empty(), fixt_dom_range(0, 0), fixt_dom_range(0, 0)
);
test(
'gte', 'B=1, C=0: A=0,0',
fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1), fixt_arrdom_range(0, 0),
fixt_dom_range(0, 0), fixt_dom_range(1, 1), fixt_dom_range(0, 0)
);
test(
'gte', 'B=5, C=0: A=0,4',
fixt_arrdom_range(0, 10), fixt_arrdom_range(5, 5), fixt_arrdom_range(0, 0),
fixt_dom_range(0, 4), fixt_dom_range(5, 5), fixt_dom_range(0, 0)
);
test(
'gte', 'B=0, C=1: A=0,10',
fixt_arrdom_range(0, 10), fixt_arrdom_range(0, 0), fixt_arrdom_range(1, 1),
fixt_dom_range(0, 10), fixt_dom_range(0, 0), fixt_dom_range(1, 1)
);
test(
'gte', 'B=1, C=1: A=1,10',
fixt_arrdom_range(0, 10), fixt_arrdom_range(1, 1), fixt_arrdom_range(1, 1),
fixt_dom_range(1, 10), fixt_dom_range(1, 1), fixt_dom_range(1, 1)
);
test(
'gte', 'B=5, C=1: A=5,10',
fixt_arrdom_range(0, 10), fixt_arrdom_range(5, 5), fixt_arrdom_range(1, 1),
fixt_dom_range(5, 10), fixt_dom_range(5, 5), fixt_dom_range(1, 1)
);
});
});
});
});
describe('config_create', function() {
it('should return an object', function() {
expect(config_create()).to.be.an('object');
});
});
describe('config_addVarAnonConstant', function() {
it('should add the value', function() {
let config = config_create();
let varIndex = config_addVarAnonConstant(config, 15);
expect(config.allVarNames[varIndex]).to.be.a('string');
expect(config.initialDomains[varIndex]).to.eql(fixt_dom_nums(15));
});
it('should populate the constant cache', function() {
let config = config_create();
let varIndex = config_addVarAnonConstant(config, 15);
expect(config.constantCache[15]).to.equal(varIndex);
});
it('should reuse the constant cache if available', function() {
let config = config_create();
let index1 = config_addVarAnonConstant(config, 1);
let index2 = config_addVarAnonConstant(config, 2);
let index3 = config_addVarAnonConstant(config, 1);
expect(index1).to.not.equal(index2);
expect(index1).to.equal(index3);
});
});
describe('config_addVarAnonNothing', function() {
it('should exist', function() {
expect(config_addVarAnonNothing).to.be.a('function');
});
it('should create a new var with max range', function() {
let config = config_create();
config_addVarAnonNothing(config);
expect(config.allVarNames.length).to.equal(1);
expect(config.initialDomains[0]).to.eql(fixt_dom_range(SUB, SUP));
});
});
describe('config_addVarAnonRange', function() {
it('should exist', function() {
expect(config_addVarAnonRange).to.be.a('function');
});
it('should throw if hi is missing', function() {
let config = config_create();
expect(_ => config_addVarAnonRange(config, 15)).to.throw('A_HI_MUST_BE_NUMBER');
});
it('should throw if lo is missing', function() {
let config = config_create();
expect(_ => config_addVarAnonRange(config, undefined, 15)).to.throw('A_LO_MUST_BE_NUMBER');
});
it('should throw if lo is an array', function() {
let config = config_create();
expect(_ => config_addVarAnonRange(config, [15, 30], 15)).to.throw('A_LO_MUST_BE_NUMBER');
});
describe('with array', function() {
it('should create a new var with given range', function() {
let config = config_create();
let lo = 50;
let hi = 100;
config_addVarAnonRange(config, lo, hi);
expect(config.allVarNames.length).to.equal(1);
expect(config.initialDomains[0]).to.eql(fixt_dom_range(lo, hi));
});
it('should make a constant if lo=hi', function() {
let config = config_create();
let lo = 58778;
let hi = 58778;
let varIndex = config_addVarAnonRange(config, lo, hi);
expect(config.allVarNames.length).to.equal(1);
expect(config.initialDomains[0]).to.eql(fixt_dom_range(lo, hi));
expect(config.constantCache[lo]).to.eql(varIndex);
});
});
describe('with numbers', function() {
it('should create a new var with given range', function() {
let config = config_create();
let lo = 5;
let hi = 10;
config_addVarAnonRange(config, lo, hi);
expect(config.allVarNames.length).to.equal(1);
expect(config.initialDomains[0]).to.eql(fixt_dom_range(lo, hi));
});
it('should make a constant if lo=hi', function() {
let config = config_create();
let lo = 28;
let hi = 28;
let varIndex = config_addVarAnonRange(config, lo, hi);
expect(config.allVarNames.length).to.equal(1);
expect(config.initialDomains[0]).to.eql(fixt_dom_range(lo, hi));
expect(config.constantCache[lo]).to.eql(varIndex);
});
});
});
describe('config_addVarConstant', function() {
it('should exist', function() {
expect(config_addVarConstant).to.be.a('function');
});
it('should throw for passing on undefined', function() {
let config = config_create();
expect(_ => config_addVarConstant(config, 'A', undefined)).to.throw('A_VALUE_SHOULD_BE_NUMBER');
});
it('should throw for passing on an array', function() {
let config = config_create();
expect(_ => config_addVarConstant(config, 'A', [10, 15])).to.throw('A_VALUE_SHOULD_BE_NUMBER');
});
it('should throw for passing on a string', function() {
let config = config_create();
expect(_ => config_addVarConstant(config, 'A', '23')).to.throw('A_VALUE_SHOULD_BE_NUMBER');
});
describe('with array', function() {
it('should create a new var with given range', function() {
let config = config_create();
let value = 50;
config_addVarConstant(config, 'A', value);
expect(config.allVarNames.length).to.equal(1);
expect(config.initialDomains[0]).to.eql(fixt_dom_range(value, value));
});
});
describe('with numbers', function() {
it('should create a new var with given range', function() {
let config = config_create();
let value = 5;
config_addVarConstant(config, 'A', value);
expect(config.allVarNames.length).to.equal(1);
expect(config.initialDomains[0]).to.eql(fixt_dom_range(value, value));
});
});
});
describe('config_addVarDomain', function() {
it('should exist', function() {
expect(config_addVarDomain).to.be.a('function');
});
it('should throw for passing on undefined', function() {
let config = config_create();
expect(_ => config_addVarDomain(config, 'A', undefined)).to.throw('DOMAIN_MUST_BE_ARRAY_HERE');
});
it('should throw for passing on a string', function() {
let config = config_create();
expect(_ => config_addVarDomain(config, 'A', '23')).to.throw('DOMAIN_MUST_BE_ARRAY_HERE');
});
describe('with array', function() {
it('should create a new var with given range', function() {
let config = config_create();
config_addVarDomain(config, 'A', fixt_arrdom_range(50, 55));
expect(config.allVarNames.length).to.equal(1);
expect(config.initialDomains[0]).to.eql(fixt_dom_range(50, 55));
});
});
describe('with numbers', function() {
it('should create a new var with given range', function() {
let config = config_create();
config_addVarDomain(config, 'A', fixt_arrdom_range(5, 12));
expect(config.allVarNames.length).to.equal(1);
expect(config.initialDomains[0]).to.equal(fixt_dom_range(5, 12));
});
});
});
describe('config_addVarNothing', function() {
it('should exist', function() {
expect(config_addVarNothing).to.be.a('function');
});
it('should throw for missing the name', function() {
let config = config_create();
expect(_ => config_addVarNothing(config)).to.throw('Var names should be a string or anonymous');
});
it('should create a new var with max range', function() {
let config = config_create();
config_addVarNothing(config, 'A');
expect(config.allVarNames).to.eql(['A']);
expect(config.initialDomains[0]).to.eql(fixt_dom_range(SUB, SUP));
});
});
describe('config_addVarRange', function() {
it('should exist', function() {
expect(config_addVarRange).to.be.a('function');
});
it('should throw for passing on undefined', function() {
let config = config_create();
expect(_ => config_addVarRange(config, 'A', undefined)).to.throw('A_LO_MUST_BE_NUMBER');
});
it('should throw for passing on a string', function() {
let config = config_create();
expect(_ => config_addVarRange(config, 'A', '23')).to.throw('A_LO_MUST_BE_NUMBER');
});
it('should throw for missing lo', function() {
let config = config_create();
expect(_ => config_addVarRange(config, 'A', undefined, 12)).to.throw('A_LO_MUST_BE_NUMBER');
});
it('should throw for missing hi', function() {
let config = config_create();
expect(_ => config_addVarRange(config, 'A', 12, undefined)).to.throw('A_HI_MUST_BE_NUMBER');
});
it('should throw for bad lo', function() {
let config = config_create();
expect(_ => config_addVarRange(config, 'A', '10', 12)).to.throw('A_LO_MUST_BE_NUMBER');
});
it('should throw for bad hi', function() {
let config = config_create();
expect(_ => config_addVarRange(config, 'A', 12, '12')).to.throw('A_HI_MUST_BE_NUMBER');
});
it('should throw if hi is lower than lo', function() {
let config = config_create();
expect(_ => config_addVarRange(config, 'A', 12, 10)).to.throw('A_RANGES_SHOULD_ASCEND');
});
describe('with array', function() {
it('should create a new var with given range', function() {
let config = config_create();
config_addVarRange(config, 'A', 50, 55);
expect(config.allVarNames).to.eql(['A']);
expect(config.initialDomains[0]).to.eql(fixt_dom_range(50, 55));
});
});
describe('with numbers', function() {
it('should create a new var with given range', function() {
let config = config_create();
config_addVarRange(config, 'A', 5, 12);
expect(config.allVarNames).to.eql(['A']);
expect(config.initialDomains[0]).to.eql(fixt_dom_range(5, 12));
});
});
})