From 8287f568aa7b9239081cafa6346e53f9ba3ea15e Mon Sep 17 00:00:00 2001 From: Clint Tseng Date: Tue, 12 Feb 2019 21:21:54 -0800 Subject: [PATCH 1/2] bug #4: open-ended range constraints incorrectly handled. --- lib/convert.js | 10 +++++++++- spec/src/convert-question-spec.ls | 8 ++++++++ src/convert.ls | 8 ++++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/convert.js b/lib/convert.js index e433325..c7332a8 100644 --- a/lib/convert.js +++ b/lib/convert.js @@ -81,8 +81,16 @@ }; }; genRange = function(range, self){ + var result; self == null && (self = '.'); - return [self + " >" + (range.minInclusive === true ? '=' : '') + " " + exprValue(range.min), self + " <" + (range.maxInclusive === true ? '=' : '') + " " + exprValue(range.max)]; + result = []; + if (!isNonsense(range.min)) { + result.push(self + " >" + (range.minInclusive === true ? '=' : '') + " " + exprValue(range.min)); + } + if (!isNonsense(range.max)) { + result.push(self + " <" + (range.maxInclusive === true ? '=' : '') + " " + exprValue(range.max)); + } + return result; }; convertQuestion = function(question, context, prefix){ var choiceId, frm, ref$, too, ref1$, key, value, length, range, count, successorRelevance, other, selectRange, destination, res$, i$, len$, child, this$ = this; diff --git a/spec/src/convert-question-spec.ls b/spec/src/convert-question-spec.ls index c3a8505..d12646a 100644 --- a/spec/src/convert-question-spec.ls +++ b/spec/src/convert-question-spec.ls @@ -186,6 +186,14 @@ describe \constraint -> result = { type: \inputNumber, range: { min: 3, max: 9, maxInclusive: true } } |> convert-simple expect(result.constraint).toBe('(. > 3) and (. <= 9)') + test 'build number/date range constraint generation (min-only)' -> + result = { type: \inputNumber, range: { min: 3, minInclusive: true } } |> convert-simple + expect(result.constraint).toBe('(. >= 3)') + + test 'build number/date range constraint generation (max)' -> + result = { type: \inputNumber, range: { max: 3, maxInclusive: true } } |> convert-simple + expect(result.constraint).toBe('(. <= 3)') + test 'build number/date range false pruning' -> result = { type: \inputText, range: false } |> convert-simple expect(result.constraint).toBe(undefined) diff --git a/src/convert.ls b/src/convert.ls index 52df457..ded9fec 100644 --- a/src/convert.ls +++ b/src/convert.ls @@ -74,8 +74,12 @@ new-context = -> { seen-fields: {}, choices: {}, warnings: [] } # creates a range expression. gen-range = (range, self = \.) -> - [ "#self >#{if range.minInclusive is true then \= else ''} #{expr-value(range.min)}", - "#self <#{if range.maxInclusive is true then \= else ''} #{expr-value(range.max)}" ] + result = [] + unless is-nonsense(range.min) + result.push("#self >#{if range.minInclusive is true then \= else ''} #{expr-value(range.min)}") + unless is-nonsense(range.max) + result.push("#self <#{if range.maxInclusive is true then \= else ''} #{expr-value(range.max)}") + result # returns an intermediate-formatted question clone (purely functional), but mutates context. convert-question = (question, context, prefix = []) -> From f71c08b5128ead0a1dd4a1f2ad194b33e1dece4f Mon Sep 17 00:00:00 2001 From: Clint Tseng Date: Tue, 12 Feb 2019 21:33:34 -0800 Subject: [PATCH 2/2] bug #4: empty-string successor relevance values emitted () relevant. --- lib/convert.js | 20 +++++++++++--------- spec/src/convert-question-spec.ls | 6 ++++++ src/convert.ls | 3 ++- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/convert.js b/lib/convert.js index c7332a8..7fbc1ed 100644 --- a/lib/convert.js +++ b/lib/convert.js @@ -144,15 +144,17 @@ question.constraint)); } if ((successorRelevance = (ref$ = context.successorRelevance, delete context.successorRelevance, ref$)) != null) { - question.relevant = function(it){ - return it.join(' and '); - }( - map(function(it){ - return "(" + it + ")"; - })( - ((ref$ = question.relevant) != null - ? ref$ - : []).concat([successorRelevance]))); + if (!isNonsense(successorRelevance)) { + question.relevant = function(it){ + return it.join(' and '); + }( + map(function(it){ + return "(" + it + ")"; + })( + ((ref$ = question.relevant) != null + ? ref$ + : []).concat([successorRelevance]))); + } } if ((other = (ref$ = question.other, delete question.other, ref$)) != null) { context.successorRelevance = join(' or ')( diff --git a/spec/src/convert-question-spec.ls b/spec/src/convert-question-spec.ls index d12646a..a56ee8c 100644 --- a/spec/src/convert-question-spec.ls +++ b/spec/src/convert-question-spec.ls @@ -262,6 +262,12 @@ describe 'followup question' -> expect(result.relevant).toBe("(selected(testquestion, 'testvalue'))") expect(context.successor-relevance).toBe(undefined) + test 'blank values are ignored' -> + context = new-context() with successor-relevance: "" + result = convert-question({ type: \inputText }, context) + expect(result.relevant).toBe(undefined) + expect(context.successor-relevance).toBe(undefined) + test 'context is cleared at the end of group scope' -> context = new-context() convert-question({ type: \group, children: [{ type: \inputSelectOne, name: \test, other: [ \test ] }] }, context) diff --git a/src/convert.ls b/src/convert.ls index ded9fec..f88e3e2 100644 --- a/src/convert.ls +++ b/src/convert.ls @@ -122,7 +122,8 @@ convert-question = (question, context, prefix = []) -> ## merge in convenience relevant logic definitions: if (successor-relevance = delete context.successor-relevance)? - question.relevant = (question.relevant ? []) ++ [ successor-relevance ] |> map(-> "(#it)") |> (.join(' and ')) + unless is-nonsense(successor-relevance) + question.relevant = (question.relevant ? []) ++ [ successor-relevance ] |> map(-> "(#it)") |> (.join(' and ')) ## drop successor information into context: if (other = delete question.other)?