Skip to content

Commit

Permalink
Result of expression question is stringified fix #7050 (#7090)
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewtelnov committed Oct 6, 2023
1 parent c9603f1 commit 6cfbbd1
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 16 deletions.
4 changes: 0 additions & 4 deletions src/question_expression.ts
Original file line number Diff line number Diff line change
Expand Up @@ -241,10 +241,6 @@ export class QuestionExpressionModel extends Question {
}
return val.toString();
}
protected convertToCorrectValue(val: any): any {
if(Array.isArray(val)) return val.join(", ");
return val;
}
}

export function getCurrecyCodes(): Array<string> {
Expand Down
28 changes: 20 additions & 8 deletions tests/expressions/expressionParserTest.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
import {
parse,
SyntaxError,
ParseFunction,
} from "../../src/expressions/expressionParser";

import { parse } from "../../src/expressions/expressionParser";
import { ConditionRunner, ExpressionRunner } from "../../src/conditions";

import { ConditionsParser } from "../../src/conditionsParser";
import { ConsoleWarnings } from "../../src/console-warnings";
import {
Expand Down Expand Up @@ -1496,4 +1490,22 @@ QUnit.test("Warn in console if the expression is invalid", function(assert) {
runner.run({});
assert.notOk(reportText);
ConsoleWarnings.warn = prev;
});
});
QUnit.test("Custom function returns object&array, #7050", function(assert) {
function func1(params: any[]): any {
return { a: 1, b: 2 };
}
function func2(params: any[]): any {
return [{ a: 1 }, { b: 2 }];
}
FunctionFactory.Instance.register("func1", func1);
FunctionFactory.Instance.register("func2", func2);

let runner = new ExpressionRunner("func1()");
assert.deepEqual(runner.run({}, {}), { a: 1, b: 2 }, "function returns object");
runner.expression = "func2()";
assert.deepEqual(runner.run({}, {}), [{ a: 1 }, { b: 2 }], "function returns array");

FunctionFactory.Instance.unregister("func1");
FunctionFactory.Instance.unregister("func2");
});
32 changes: 32 additions & 0 deletions tests/question_expressiontests.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { SurveyModel } from "../src/survey";
import { QuestionExpressionModel } from "../src/question_expression";
import { FunctionFactory } from "../src/functionsfactory";

export default QUnit.module("QuestionExpression");

Expand Down Expand Up @@ -264,3 +265,34 @@ QUnit.test("Handle Infinity", function (assert) {
assert.equal(counter, 1, "updated one time");
assert.equal(q3.value, 4, "calculated correctly");
});
QUnit.test("Custom function returns object&array, #7050", function (assert) {
function func1(params: any[]): any {
return { a: 1, b: 2 };
}
function func2(params: any[]): any {
return [{ a: 1 }, { b: 2 }];
}
FunctionFactory.Instance.register("func1", func1);
FunctionFactory.Instance.register("func2", func2);
const survey = new SurveyModel({
elements: [
{
"name": "q1",
"type": "expression",
"expression": "func1()",
},
{
"name": "q2",
"type": "expression",
"expression": "func2()",
}
]
});
const q1 = survey.getQuestionByName("q1");
const q2 = survey.getQuestionByName("q2");
assert.deepEqual(q1.value, { a: 1, b: 2 }, "function returns object");
assert.deepEqual(q2.value, [{ a: 1 }, { b: 2 }], "function returns array");

FunctionFactory.Instance.unregister("func1");
FunctionFactory.Instance.unregister("func2");
});
21 changes: 17 additions & 4 deletions tests/surveyquestiontests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7215,19 +7215,32 @@ QUnit.test("Set array and convert it to a string, bug#6886", function (assert) {
const survey = new SurveyModel({
elements: [
{ type: "text", name: "q1" },
{ type: "comment", name: "q2" },
{ type: "expression", name: "q3" }
{ type: "comment", name: "q2" }
]
});
const q1 = survey.getQuestionByName("q1");
const q2 = survey.getQuestionByName("q2");
const q3 = survey.getQuestionByName("q3");
q1.value = ["item1", "item2", "item3"];
q2.value = ["item1", "item2", "item3"];
q3.value = ["item1", "item2", "item3"];
assert.equal(q1.value, "item1, item2, item3", "q1");
assert.equal(q2.value, "item1\nitem2\nitem3", "q2");
assert.equal(q3.value, "item1, item2, item3", "q3");
});
QUnit.test("Set array and convert it to a string & defaultValueExpression, bug#6886", function (assert) {
const survey = new SurveyModel({
elements: [
{ type: "checkbox", name: "q1", choices: ["a", "b", "c", "d"] },
{ type: "comment", name: "q2", defaultValueExpression: "{q1}" },
{ type: "text", name: "q3", defaultValueExpression: "{q1}" }
]
});
const q1 = survey.getQuestionByName("q1");
const q2 = survey.getQuestionByName("q2");
const q3 = survey.getQuestionByName("q3");
q1.value = ["a", "b", "c"];
assert.deepEqual(q1.value, ["a", "b", "c"], "q1");
assert.equal(q2.value, "a\nb\nc", "q2");
assert.equal(q3.value, "a, b, c", "q3");
});
QUnit.test("question.resetValueIf, basic functionality", function (assert) {
const survey = new SurveyModel({
Expand Down

0 comments on commit 6cfbbd1

Please sign in to comment.