UNPKG

finitedomain

Version:

A fast feature rich finite domain solver

664 lines (581 loc) 25.6 kB
import expect from '../../fixtures/mocha_proxy.fixt'; import { fixt_arrdom_range, fixt_arrdom_ranges, fixt_arrdom_nums, fixt_dom_empty, fixt_dom_range, fixt_dom_ranges, fixt_dom_solved, fixt_domainEql, } from '../../fixtures/domain.fixt'; import { LOG_FLAG_PROPSTEPS, LOG_FLAG_NONE, SUB, SUP, ASSERT_SET_LOG, } from '../../../src/helpers'; import { domain__debug, } from '../../../src/domain'; import { config_addVarDomain, config_addVarRange, config_create, } from '../../../src/config'; import { space_createRoot, space_initFromConfig, } from '../../../src/space'; import { propagator_gteStepWouldReject, propagator_lteStepBare, propagator_lteStepWouldReject, } from '../../../src/propagators/lte'; describe('propagators/lte.spec', function() { // in general after call, max(v1) should be < max(v2) and min(v2) should be > min(v1) // it makes sure v1 and v2 have no values that can't possibly result in fulfilling < it('should exist', function() { expect(propagator_lteStepBare).to.be.a('function'); }); it('should require two vars', function() { let space = space_createRoot(); expect(() => propagator_lteStepBare(space, 'A')).to.throw('VAR_INDEX_SHOULD_BE_NUMBER'); expect(() => propagator_lteStepBare(space, undefined, 'B')).to.throw('VAR_INDEX_SHOULD_BE_NUMBER'); }); describe('with array', function() { it('should throw for empty domain', function() { let config = config_create(); config_addVarDomain(config, 'A', fixt_arrdom_range(90, 100)); config_addVarDomain(config, 'B', fixt_arrdom_range(200, 300)); config_addVarDomain(config, 'C', fixt_arrdom_nums(100)); config_addVarDomain(config, 'D', fixt_arrdom_nums(100)); let space = space_createRoot(); space_initFromConfig(space, config); space.vardoms[config.allVarNames.indexOf('C')] = fixt_dom_empty(); space.vardoms[config.allVarNames.indexOf('D')] = fixt_dom_empty(); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); let C = config.allVarNames.indexOf('C'); let D = config.allVarNames.indexOf('D'); expect(_ => propagator_lteStepBare(space, config, A, B)).not.to.throw(); expect(_ => propagator_lteStepBare(space, config, A, D)).to.throw('SHOULD_NOT_BE_REJECTED'); expect(_ => propagator_lteStepBare(space, config, C, B)).to.throw('SHOULD_NOT_BE_REJECTED'); expect(_ => propagator_lteStepBare(space, config, C, D)).to.throw('SHOULD_NOT_BE_REJECTED'); }); it('should remove any value from v1 that is gt to max(v2)', function() { let config = config_create(); config_addVarDomain(config, 'A', fixt_arrdom_range(90, 100)); config_addVarDomain(config, 'B', fixt_arrdom_range(95, 99)); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); expect(space.vardoms[A]).to.eql(fixt_dom_range(90, 99)); expect(space.vardoms[B]).to.eql(fixt_dom_range(95, 99)); }); it('should keep SUP if both ranges end there', function() { let config = config_create(); config_addVarDomain(config, 'A', fixt_arrdom_range(90, SUP)); config_addVarDomain(config, 'B', fixt_arrdom_range(95, SUP)); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); expect(space.vardoms[A]).to.eql(fixt_dom_range(90, SUP)); expect(space.vardoms[B]).to.eql(fixt_dom_range(95, SUP)); }); it('should not affect domains when v1 < v2', function() { let config = config_create(); config_addVarDomain(config, 'A', fixt_arrdom_range(90, 100)); config_addVarDomain(config, 'B', fixt_arrdom_range(101, 101)); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); fixt_domainEql(space.vardoms[A], fixt_dom_range(90, 100)); fixt_domainEql(space.vardoms[B], fixt_dom_range(101, 101)); }); it('should not affect overlapping ranges when max(v1) < max(v2)', function() { let config = config_create(); config_addVarDomain(config, 'A', fixt_arrdom_range(90, 150)); config_addVarDomain(config, 'B', fixt_arrdom_range(100, 200)); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); fixt_domainEql(space.vardoms[A], fixt_dom_range(90, 150)); fixt_domainEql(space.vardoms[B], fixt_dom_range(100, 200)); }); it('should reject if min(v1) > max(v2)', function() { let config = config_create(); config_addVarDomain(config, 'A', fixt_arrdom_range(190, 200)); config_addVarDomain(config, 'B', fixt_arrdom_range(100, 150)); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); fixt_domainEql(space.vardoms[A], fixt_dom_empty()); fixt_domainEql(space.vardoms[B], fixt_dom_empty()); }); it('should reduce v2 if v1 is solved and > min(v2)', function() { let config = config_create(); config_addVarDomain(config, 'A', fixt_arrdom_range(200, 200)); config_addVarDomain(config, 'B', fixt_arrdom_range(100, 300)); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); fixt_domainEql(space.vardoms[A], fixt_dom_range(200, 200)); fixt_domainEql(space.vardoms[B], fixt_dom_range(200, 300)); }); it('should not change if v1 is solved and == min(v2)', function() { let config = config_create(); config_addVarDomain(config, 'A', fixt_arrdom_range(200, 200)); config_addVarDomain(config, 'B', fixt_arrdom_range(200, 300)); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); fixt_domainEql(space.vardoms[A], fixt_dom_range(200, 200)); fixt_domainEql(space.vardoms[B], fixt_dom_range(200, 300)); }); it('should be able to drop last range in v1', function() { let config = config_create(); config_addVarDomain(config, 'A', fixt_arrdom_ranges([10, 20], [30, 40], [50, 60], [70, 98], [120, 150])); config_addVarDomain(config, 'B', fixt_arrdom_range(0, 100)); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); fixt_domainEql(space.vardoms[A], fixt_dom_ranges([10, 20], [30, 40], [50, 60], [70, 98])); fixt_domainEql(space.vardoms[B], fixt_dom_range(10, 100)); config = config_create(); config_addVarDomain(config, 'A', fixt_arrdom_ranges([10, 20], [30, 40], [50, 60], [70, 98], [100, 150])); config_addVarDomain(config, 'B', fixt_arrdom_range(0, 100)); space = space_createRoot(); space_initFromConfig(space, config); A = config.allVarNames.indexOf('A'); B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); fixt_domainEql(space.vardoms[A], fixt_dom_ranges([10, 20], [30, 40], [50, 60], [70, 98], [100, 100])); fixt_domainEql(space.vardoms[B], fixt_dom_range(10, 100)); config = config_create(); config_addVarDomain(config, 'A', fixt_arrdom_ranges([10, 20], [30, 40], [50, 60], [70, 98], [100, 100])); config_addVarDomain(config, 'B', fixt_arrdom_range(0, 100)); space = space_createRoot(); space_initFromConfig(space, config); A = config.allVarNames.indexOf('A'); B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); fixt_domainEql(space.vardoms[A], fixt_dom_ranges([10, 20], [30, 40], [50, 60], [70, 98], [100, 100])); fixt_domainEql(space.vardoms[B], fixt_dom_range(10, 100)); }); it('should be able to drop first range in v1', function() { let config = config_create(); config_addVarDomain(config, 'A', fixt_arrdom_ranges([10, 20], [30, 40], [50, 60])); config_addVarDomain(config, 'B', fixt_arrdom_ranges([0, 10], [20, 100])); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); fixt_domainEql(space.vardoms[A], fixt_dom_ranges([10, 20], [30, 40], [50, 60])); fixt_domainEql(space.vardoms[B], fixt_dom_ranges([10, 10], [20, 100])); config = config_create(); config_addVarDomain(config, 'A', fixt_arrdom_ranges([10, 20], [30, 40], [50, 60])); config_addVarDomain(config, 'B', fixt_arrdom_ranges([0, 5], [20, 100])); space = space_createRoot(); space_initFromConfig(space, config); A = config.allVarNames.indexOf('A'); B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); fixt_domainEql(space.vardoms[A], fixt_dom_ranges([10, 20], [30, 40], [50, 60])); fixt_domainEql(space.vardoms[B], fixt_dom_ranges([20, 100])); config = config_create(); config_addVarDomain(config, 'A', fixt_arrdom_ranges([10, 20], [30, 40], [50, 60])); config_addVarDomain(config, 'B', fixt_arrdom_ranges([10, 10], [20, 100])); space = space_createRoot(); A = config.allVarNames.indexOf('A'); B = config.allVarNames.indexOf('B'); space_initFromConfig(space, config); propagator_lteStepBare(space, config, A, B); fixt_domainEql(space.vardoms[A], fixt_dom_ranges([10, 20], [30, 40], [50, 60])); fixt_domainEql(space.vardoms[B], fixt_dom_ranges([10, 10], [20, 100])); }); describe('edge of space', function() { function test(domainA, domainB, domainC, domainD) { let desc = 'should not crash with edge cases: ' + domain__debug(domainA) + ' < ' + domain__debug(domainB) + ' <= ' + domain__debug(domainB) + ' -> ' + domain__debug(domainC) + ' <= ' + domain__debug(domainD); it(desc, function() { let config = config_create(); config_addVarDomain(config, 'A', domainA); config_addVarDomain(config, 'B', domainB); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); fixt_domainEql(space.vardoms[A], domainC, 'C'); fixt_domainEql(space.vardoms[B], domainD, 'D'); }); } test(fixt_arrdom_nums(0), fixt_arrdom_nums(0), fixt_arrdom_nums(0), fixt_arrdom_nums(0)); test(fixt_arrdom_nums(0), fixt_arrdom_nums(SUP), fixt_arrdom_nums(0), fixt_arrdom_nums(SUP)); test(fixt_arrdom_nums(SUP), fixt_arrdom_nums(0), fixt_dom_empty(), fixt_dom_empty()); test(fixt_arrdom_nums(SUP), fixt_arrdom_nums(SUP), fixt_arrdom_nums(SUP), fixt_arrdom_nums(SUP)); test(fixt_arrdom_range(0, SUP), fixt_arrdom_nums(0), fixt_arrdom_nums(0), fixt_arrdom_nums(0)); test(fixt_arrdom_nums(SUP), fixt_arrdom_range(0, SUP), fixt_arrdom_nums(SUP), fixt_arrdom_nums(SUP)); }); }); describe('with numbers', function() { it('should throw for empty domain', function() { let config = config_create(); config_addVarRange(config, 'A', 9, 10); config_addVarRange(config, 'B', 11, 15); config_addVarDomain(config, 'C', fixt_arrdom_nums(100)); config_addVarDomain(config, 'D', fixt_arrdom_nums(100)); let space = space_createRoot(); space_initFromConfig(space, config); space.vardoms[config.allVarNames.indexOf('C')] = fixt_dom_empty(); space.vardoms[config.allVarNames.indexOf('D')] = fixt_dom_empty(); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); let C = config.allVarNames.indexOf('C'); let D = config.allVarNames.indexOf('D'); expect(_ => propagator_lteStepBare(space, config, A, B)).not.to.throw(); expect(_ => propagator_lteStepBare(space, config, A, D)).to.throw('SHOULD_NOT_BE_REJECTED'); expect(_ => propagator_lteStepBare(space, config, C, B)).to.throw('SHOULD_NOT_BE_REJECTED'); expect(_ => propagator_lteStepBare(space, config, C, D)).to.throw('SHOULD_NOT_BE_REJECTED'); }); it('should remove any value from v1 that is gte to max(v2)', function() { let config = config_create(); config_addVarRange(config, 'A', 0, 10); config_addVarRange(config, 'B', 5, 9); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); expect(space.vardoms[A]).to.eql(fixt_dom_range(0, 9)); expect(space.vardoms[B]).to.eql(fixt_dom_range(5, 9)); }); it('should not remove SUP if both ranges end there', function() { let config = config_create(); config_addVarRange(config, 'A', 0, 15); config_addVarRange(config, 'B', 5, 15); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); expect(space.vardoms[A]).to.eql(fixt_dom_range(0, 15)); expect(space.vardoms[B]).to.eql(fixt_dom_range(5, 15)); }); it('should not affect domains when v1 < v2', function() { let config = config_create(); config_addVarRange(config, 'A', 0, 10); config_addVarRange(config, 'B', 11, 15); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); expect(space.vardoms[A]).to.eql(fixt_dom_range(0, 10)); expect(space.vardoms[B]).to.eql(fixt_dom_range(11, 15)); }); it('should not affect overlapping ranges when min(v2) <= max(v1) < max(v2)', function() { let config = config_create(); config_addVarRange(config, 'A', 0, 13); config_addVarRange(config, 'B', 10, 15); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); expect(space.vardoms[A]).to.eql(fixt_dom_range(0, 13)); expect(space.vardoms[B]).to.eql(fixt_dom_range(10, 15)); }); it('should reject if min(v1) > max(v2)', function() { let config = config_create(); config_addVarRange(config, 'A', 11, 15); config_addVarRange(config, 'B', 5, 8); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); expect(space.vardoms[A]).to.eql(fixt_dom_empty()); expect(space.vardoms[B]).to.eql(fixt_dom_empty()); }); it('should reduce v2 if v1 is solved and > min(v2)', function() { let config = config_create(); config_addVarRange(config, 'A', 8, 8); config_addVarRange(config, 'B', 5, 10); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); fixt_domainEql(space.vardoms[A], fixt_dom_range(8, 8)); fixt_domainEql(space.vardoms[B], fixt_dom_range(8, 10)); }); it('should not change if v1 is solved and == min(v2)', function() { let config = config_create(); config_addVarRange(config, 'A', 7, 7); config_addVarRange(config, 'B', 7, 13); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); fixt_domainEql(space.vardoms[A], fixt_dom_range(7, 7)); fixt_domainEql(space.vardoms[B], fixt_dom_range(7, 13)); }); }); describe('with LOG', function() { before(function() { ASSERT_SET_LOG(LOG_FLAG_PROPSTEPS); }); it('should improve test coverage by enabling logging', function() { let config = config_create(); config_addVarDomain(config, 'A', fixt_arrdom_range(SUB, SUP)); config_addVarDomain(config, 'B', fixt_arrdom_ranges([0, 10], [20, 300])); let space = space_createRoot(); space_initFromConfig(space, config); let A = config.allVarNames.indexOf('A'); let B = config.allVarNames.indexOf('B'); propagator_lteStepBare(space, config, A, B); expect(true).to.eql(true); }); it('propagator_ltStepWouldReject', function() { propagator_lteStepWouldReject(fixt_dom_solved(0), fixt_dom_solved(1)); expect(true).to.eql(true); }); it('propagator_gtStepWouldReject', function() { propagator_gteStepWouldReject(fixt_dom_solved(0), fixt_dom_solved(1)); expect(true).to.eql(true); }); after(function() { ASSERT_SET_LOG(LOG_FLAG_NONE); }); }); }); // TOFIX: migrate and dedupe these tests //describe('fdvar_removeLteInline', function() { // // it('should exist', function() { // expect(fdvar_removeLteInline).to.be.a('function'); // }); // // describe('with array', function() { // // it('should remove all elements lte to value', function() { // let fdvar = fdvar_create('A', specDomainCreateRanges([10, 20], [30, 40])); // let R = fdvar_removeLteInline(fdvar, 25); // // expect(fdvar.dom).to.eql(specDomainCreateRange(30, 40)); // expect(R).to.equal(SOME_CHANGES); // }); // // it('should be able to split up a range', function() { // let fdvar = fdvar_create('A', specDomainCreateRanges([10, 20])); // let R = fdvar_removeLteInline(fdvar, 15); // // expect(fdvar.dom).to.eql(specDomainCreateRanges([16, 20])); // expect(R).to.equal(SOME_CHANGES); // }); // // it('should accept zero', function() { // let fdvar = fdvar_create('A', specDomainCreateRanges([10, 20])); // let R = fdvar_removeLteInline(fdvar, 0); // // expect(fdvar.dom).to.eql(specDomainCreateRanges([10, 20])); // expect(R).to.equal(NO_CHANGES); // }); // // it('should accept empty array', function() { // let fdvar = fdvar_create('A', specDomainCreateEmpty()); // let R = fdvar_removeLteInline(fdvar, 35); // // expect(fdvar.dom).to.eql(specDomainSmallEmpty()); // expect(R).to.equal(NO_CHANGES); // }); // // it('should remove SUP from SUP', function() { // let fdvar = fdvar_create('A', specDomainCreateRanges([SUP, SUP])); // let R = fdvar_removeLteInline(fdvar, SUP); // // expect(fdvar.dom).to.eql(specDomainSmallEmpty()); // expect(R).to.equal(SOME_CHANGES); // }); // }); // // describe('with number', function() { // // it('should remove all elements lte to value', function() { // let fdvar = fdvar_create('A', specDomainSmallRange(5, 12)); // let R = fdvar_removeLteInline(fdvar, 9); // // expect(fdvar.dom).to.eql(specDomainSmallNums(10, 11, 12)); // expect(R).to.equal(SOME_CHANGES); // }); // // it('should remove an element equal to value as well', function() { // let fdvar = fdvar_create('A', specDomainSmallNums(1, 2, 3, 6, 7, 8)); // let R = fdvar_removeLteInline(fdvar, 6); // // expect(fdvar.dom).to.eql(specDomainSmallNums(7, 8)); // expect(R).to.equal(SOME_CHANGES); // }); // // it('should be able to split up a range', function() { // let fdvar = fdvar_create('A', specDomainSmallNums(1, 2, 3, 4, 5, 6)); // let R = fdvar_removeLteInline(fdvar, 4); // // expect(fdvar.dom).to.eql(specDomainSmallNums(5, 6)); // expect(R).to.equal(SOME_CHANGES); // }); // // it('should accept zero', function() { // let fdvar = fdvar_create('A', specDomainSmallNums(1, 2, 3, 4)); // let R = fdvar_removeLteInline(fdvar, 0); // // expect(fdvar.dom).to.eql(specDomainSmallNums(1, 2, 3, 4)); // expect(R).to.equal(NO_CHANGES); // }); // // it('should accept empty array', function() { // let fdvar = fdvar_create('A', specDomainSmallEmpty()); // let R = fdvar_removeLteInline(fdvar, 35); // // expect(fdvar.dom).to.eql(specDomainSmallEmpty()); // expect(R).to.equal(NO_CHANGES); // }); // // it('should remove 0 from 0', function() { // let fdvar = fdvar_create('A', specDomainSmallNums(0)); // let R = fdvar_removeLteInline(fdvar, 0); // // expect(fdvar.dom).to.eql(specDomainSmallEmpty()); // expect(R).to.equal(SOME_CHANGES); // }); // }); //}); // TOFIX: migrate and dedupe these tests //describe('fdvar_removeGteInline', function() { // // it('should exist', function() { // expect(fdvar_removeGteInline).to.be.a('function'); // }); // // describe('with array', function() { // // it('should remove all elements gte to value', function() { // let fdvar = fdvar_create('A', specDomainCreateRanges([10, 20], [30, 40])); // let R = fdvar_removeGteInline(fdvar, 25); // // expect(fdvar.dom).to.eql(specDomainCreateRange(10, 20)); // expect(R).to.equal(SOME_CHANGES); // }); // // it('should remove an element equal to value as well', function() { // let fdvar = fdvar_create('A', specDomainCreateRanges([10, 20], [30, 40])); // let R = fdvar_removeGteInline(fdvar, 30); // // expect(fdvar.dom).to.eql(specDomainCreateRange(10, 20)); // expect(R).to.equal(SOME_CHANGES); // }); // // it('should be able to split up a range', function() { // let fdvar = fdvar_create('A', specDomainCreateRanges([10, 20])); // let R = fdvar_removeGteInline(fdvar, 15); // // expect(fdvar.dom).to.eql(specDomainSmallRange(10, 14)); // expect(R).to.equal(SOME_CHANGES); // }); // // it('should accept zero', function() { // let fdvar = fdvar_create('A', specDomainCreateRanges([10, 20])); // let R = fdvar_removeGteInline(fdvar, 0); // // expect(fdvar.dom).to.eql(specDomainSmallEmpty()); // expect(R).to.equal(SOME_CHANGES); // }); // // it('should accept empty array', function() { // let fdvar = fdvar_create('A', specDomainCreateEmpty()); // let R = fdvar_removeGteInline(fdvar, 35); // // expect(fdvar.dom).to.eql(specDomainSmallEmpty()); // expect(R).to.equal(NO_CHANGES); // }); // // it('should remove SUP from SUP', function() { // let fdvar = fdvar_create('A', specDomainCreateRanges([SUP, SUP])); // let R = fdvar_removeGteInline(fdvar, SUP); // // expect(fdvar.dom).to.eql(specDomainSmallEmpty()); // expect(R).to.equal(SOME_CHANGES); // }); // }); // // describe('with number', function() { // // it('should remove all elements gte to value', function() { // let fdvar = fdvar_create('A', specDomainSmallRange(5, 12)); // let R = fdvar_removeGteInline(fdvar, 9); // // expect(fdvar.dom).to.eql(specDomainSmallNums(5, 6, 7, 8)); // expect(R).to.equal(SOME_CHANGES); // }); // // it('should remove an element equal to value as well', function() { // let fdvar = fdvar_create('A', specDomainSmallNums(1, 2, 3, 6, 7, 8)); // let R = fdvar_removeGteInline(fdvar, 6); // // expect(fdvar.dom).to.eql(specDomainSmallNums(1, 2, 3)); // expect(R).to.equal(SOME_CHANGES); // }); // // it('should be able to split up a range', function() { // let fdvar = fdvar_create('A', specDomainSmallNums(1, 2, 3, 4, 5, 6)); // let R = fdvar_removeGteInline(fdvar, 4); // // expect(fdvar.dom).to.eql(specDomainSmallNums(1, 2, 3)); // expect(R).to.equal(SOME_CHANGES); // }); // // it('should accept zero', function() { // let fdvar = fdvar_create('A', specDomainSmallNums(1, 2, 3, 4)); // let R = fdvar_removeGteInline(fdvar, 0); // // expect(fdvar.dom).to.eql(specDomainSmallEmpty()); // expect(R).to.equal(SOME_CHANGES); // }); // // it('should accept empty array', function() { // let fdvar = fdvar_create('A', specDomainSmallEmpty()); // let R = fdvar_removeGteInline(fdvar, 35); // // expect(fdvar.dom).to.eql(specDomainSmallEmpty()); // expect(R).to.equal(NO_CHANGES); // }); // // it('should remove 0 from 0', function() { // let fdvar = fdvar_create('A', specDomainSmallNums(0)); // let R = fdvar_removeGteInline(fdvar, 0); // // expect(fdvar.dom).to.eql(specDomainSmallEmpty()); // expect(R).to.equal(SOME_CHANGES); // }); // }); //});