From f384178b5321e197bb857f3ec2de95ed51d2de6d Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 1 Nov 2023 06:41:26 +0200 Subject: [PATCH] ! operator with async expressions causes error fix #7268 (#7272) * ! operator with async expressions causes error fix #7268 * Typo in unit test #7268 --- src/expressions/expressions.ts | 10 +++++++++- tests/surveytests.ts | 28 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/expressions/expressions.ts b/src/expressions/expressions.ts index c1f2304e44..054079eccf 100644 --- a/src/expressions/expressions.ts +++ b/src/expressions/expressions.ts @@ -166,11 +166,19 @@ export class UnaryOperand extends Operand { const uOp = op; return uOp.operator == this.operator && this.areOperatorsEquals(this.expression, uOp.expression); } + public hasFunction(): boolean { + return this.expression.hasFunction(); + } + public hasAsyncFunction(): boolean { + return this.expression.hasAsyncFunction(); + } + public addToAsyncList(list: Array): void { + this.expression.addToAsyncList(list); + } public evaluate(processValue?: ProcessValue): boolean { let value = this.expression.evaluate(processValue); return this.consumer.call(this, value); } - public setVariables(variables: Array) { this.expression.setVariables(variables); } diff --git a/tests/surveytests.ts b/tests/surveytests.ts index 6e9f2388fe..e61e02f5eb 100644 --- a/tests/surveytests.ts +++ b/tests/surveytests.ts @@ -13748,6 +13748,34 @@ QUnit.test( SurveyElement.FocusElement = oldFunc; } ); +QUnit.test("Async function with negative result, Bug#7268", + function (assert) { + let returnResult: (res: any) => void = (res: any): void => { + res = false; + }; + function asyncFunc(params: any): any { + returnResult = this.returnResult; + return false; + } + FunctionFactory.Instance.register("asyncFunc", asyncFunc, true); + const survey = new SurveyModel({ + elements: [ + { type: "text", name: "q1", isRequired: true }, + { + type: "text", name: "q2", visibleIf: "!asyncFunc({q1})" + } + ], + }); + const q1 = survey.getQuestionByName("q1"); + const q2 = survey.getQuestionByName("q2"); + returnResult(true); + assert.equal(q2.isVisible, false, "visible #1"); + q1.value = 1; + returnResult(false); + assert.equal(q2.isVisible, true, "visible #2"); + FunctionFactory.Instance.unregister("asyncFunc"); + } +); QUnit.test( "Focus errored question when checkErrorsMode: `onComplete` + onServerValidateQuestions, Bug#2466",