From aad244be7a84965da49ee4061cfc8634dfe4064e Mon Sep 17 00:00:00 2001 From: David Greenspan Date: Wed, 24 Dec 2014 12:20:17 -0800 Subject: [PATCH] Finish xor tests --- packages/logic-solver/logic.js | 17 ++++---- packages/logic-solver/logic_tests.js | 65 +++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 10 deletions(-) diff --git a/packages/logic-solver/logic.js b/packages/logic-solver/logic.js index 3988f89146..d51151be26 100644 --- a/packages/logic-solver/logic.js +++ b/packages/logic-solver/logic.js @@ -491,6 +491,13 @@ var group = function (array, N) { }; Logic._defineFormula(Logic.XorFormula, 'xor', { + _grouped: function () { + return new Logic.XorFormula( + _.map(group(this.operands, 3), function (group) { + return (group.length === 1 ? + group[0] : new Logic.XorFormula(group)); + })); + }, _genTrue: function (makeClause) { var args = this.operands; var not = Logic.not; @@ -509,10 +516,7 @@ Logic._defineFormula(Logic.XorFormula, 'xor', { makeClause(not(A), B, not(C)), // -A v B v -C makeClause(not(A), not(B), C)]; // -A v -B v C } else { - return (new Logic.XorFormula( - _.map(group(args, 3), function (group) { - return new Logic.XorFormula(group); - })))._genTrue(makeClause); + return this._grouped()._genTrue(makeClause); } }, _genFalse: function (makeClause) { @@ -533,10 +537,7 @@ Logic._defineFormula(Logic.XorFormula, 'xor', { makeClause(A, not(B), C), // A v -B v C makeClause(A, B, not(C))]; // A v B v -C } else { - return (new Logic.XorFormula( - _.map(group(args, 3), function (group) { - return new Logic.XorFormula(group); - })))._genFalse(makeClause); + return this._grouped()._genFalse(makeClause); } } }); diff --git a/packages/logic-solver/logic_tests.js b/packages/logic-solver/logic_tests.js index 96d8516269..28c6f4c9ec 100644 --- a/packages/logic-solver/logic_tests.js +++ b/packages/logic-solver/logic_tests.js @@ -297,7 +297,68 @@ Tinytest.add("logic-solver - Logic.xor", function (test) { ["A v -B", "-A v B"], function (s) { s.require(Logic.xor(["A", []], ["B"], [])); }, - ["A v B", "-A v -B"] - // XXX test 3 and 4 args + ["A v B", "-A v -B"], + function (s) { + s.require(Logic.xor("A", "B", "C")); }, + ["A v B v C", "A v -B v -C", "-A v B v -C", "-A v -B v C"], + function (s) { + s.forbid(Logic.xor("A", "B", "C")); }, + ["-A v -B v -C", "-A v B v C", "A v -B v C", "A v B v -C"], + function (s) { + s.require(Logic.xor("A", "B", "C", "D")); }, + ["A v B v C v -$xor1", + "A v -B v -C v -$xor1", + "-A v B v -C v -$xor1", + "-A v -B v C v -$xor1", + "$xor1 v D", + "-A v -B v -C v $xor1", + "-A v B v C v $xor1", + "A v -B v C v $xor1", + "A v B v -C v $xor1", + "-$xor1 v -D"], + function (s) { + s.forbid(Logic.xor("A", "B", "C", "D")); }, + ["A v B v C v -$xor1", + "A v -B v -C v -$xor1", + "-A v B v -C v -$xor1", + "-A v -B v C v -$xor1", + "$xor1 v -D", + "-A v -B v -C v $xor1", + "-A v B v C v $xor1", + "A v -B v C v $xor1", + "A v B v -C v $xor1", + "-$xor1 v D"], + function (s) { + s.require(Logic.xor("A", "B", "C", "D", "E")); }, + ["A v B v C v -$xor1", + "A v -B v -C v -$xor1", + "-A v B v -C v -$xor1", + "-A v -B v C v -$xor1", + "D v E v -$xor2", + "-D v -E v -$xor2", + "$xor1 v $xor2", + "-A v -B v -C v $xor1", + "-A v B v C v $xor1", + "A v -B v C v $xor1", + "A v B v -C v $xor1", + "D v -E v $xor2", + "-D v E v $xor2", + "-$xor1 v -$xor2"], + function (s) { + s.forbid(Logic.xor("A", "B", "C", "D", "E")); }, + ["A v B v C v -$xor1", + "A v -B v -C v -$xor1", + "-A v B v -C v -$xor1", + "-A v -B v C v -$xor1", + "D v -E v $xor2", + "-D v E v $xor2", + "$xor1 v -$xor2", + "-A v -B v -C v $xor1", + "-A v B v C v $xor1", + "A v -B v C v $xor1", + "A v B v -C v $xor1", + "D v E v -$xor2", + "-D v -E v -$xor2", + "-$xor1 v $xor2"] ]); });