Skip to content

Commit

Permalink
[se] Fixed
Browse files Browse the repository at this point in the history
  • Loading branch information
GoshaZotov committed Feb 7, 2024
1 parent 6152898 commit 82e07ad
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 44 deletions.
11 changes: 9 additions & 2 deletions cell/model/FormulaObjects/parserFormula.js
Original file line number Diff line number Diff line change
Expand Up @@ -4120,7 +4120,14 @@ parserHelp.setDigitSeparator(AscCommon.g_oDefaultCultureInfo.NumberDecimalSepara
cMultOperator.prototype.Calculate = function (arg, opt_bbox, opt_defName, ws, bIsSpecialFunction) {
var arg0 = arg[0], arg1 = arg[1];

if(!bIsSpecialFunction){
let isRangesOperation = cElementType.cellsRange === arg0.type && cElementType.cellsRange === arg1.type;
if(bIsSpecialFunction && !isRangesOperation){
var convertArgs = this._convertAreaToArray([arg0, arg1]);
arg0 = convertArgs[0];
arg1 = convertArgs[1];
}

if (!isRangesOperation) {
if (arg0 instanceof cArea) {
arg0 = arg0.cross(arguments[1]);
} else if (arg0 instanceof cArea3D) {
Expand All @@ -4134,7 +4141,7 @@ parserHelp.setDigitSeparator(AscCommon.g_oDefaultCultureInfo.NumberDecimalSepara
arg0 = arg0.tocNumber();
arg1 = arg1.tocNumber();
}

return _func[arg0.type][arg1.type](arg0, arg1, "*", arguments[1], bIsSpecialFunction);
};

Expand Down
84 changes: 42 additions & 42 deletions tests/cell/spreadsheet-calculation/FormulaTests.js
Original file line number Diff line number Diff line change
Expand Up @@ -11630,19 +11630,19 @@ $(function () {

oParser = new parserFormula("SUMPRODUCT({2,3})", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 5);
assert.strictEqual(oParser.calculate().getValue(), 5, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT({2,3},{4,5})", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 23);
assert.strictEqual(oParser.calculate().getValue(), 23, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT({2,3},{4,5},{2,2})", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 46);
assert.strictEqual(oParser.calculate().getValue(), 46, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT({2,3;4,5},{2,2;3,4})", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 42);
assert.strictEqual(oParser.calculate().getValue(), 42, "Formula: " + oParser.Formula);

ws.getRange2("N44").setValue("1");
ws.getRange2("N45").setValue("2");
Expand All @@ -11665,143 +11665,143 @@ $(function () {

oParser = new parserFormula("SUMPRODUCT(N44:N47,O44:O47,P44:P47)", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 780);
assert.strictEqual(oParser.calculate().getValue(), 780, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(N44:N47*O44:O47)", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 70);
assert.strictEqual(oParser.calculate().getValue(), 70, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(SUM(N44:N47*O44:O47))", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 70);
assert.strictEqual(oParser.calculate().getValue(), 70, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT({1,2,TRUE,3})", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 6);
assert.strictEqual(oParser.calculate().getValue(), 6, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT({1,2,FALSE,3})", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 6);
assert.strictEqual(oParser.calculate().getValue(), 6, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT({TRUE,TRUE,FALSE,3})", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 3);
assert.strictEqual(oParser.calculate().getValue(), 3, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(P48)", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), "#VALUE!");
assert.strictEqual(oParser.calculate().getValue(), "#VALUE!", "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(P48, P44:P47)", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), "#VALUE!");
assert.strictEqual(oParser.calculate().getValue(), "#VALUE!", "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(P48:P49)", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 0);
assert.strictEqual(oParser.calculate().getValue(), 0, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUM(SUMPRODUCT(N44:N47*O44:O47))", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 70);
assert.strictEqual(oParser.calculate().getValue(), 70, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(N44:O47*P44:P47)", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 388);
assert.strictEqual(oParser.calculate().getValue(), 388, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUM(SUMPRODUCT(N44:O47*P44:P47))", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 388);
assert.strictEqual(oParser.calculate().getValue(), 388, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUM(SUMPRODUCT(N44:O47))", "A2", ws);
assert.ok(oParser.parse());
assert.ok(oParser.assemble() == "SUM(SUMPRODUCT(N44:O47))");
assert.strictEqual(oParser.calculate().getValue(), 36);
assert.strictEqual(oParser.calculate().getValue(), 36, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(YEAR(N45:O47))", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 11400);
assert.strictEqual(oParser.calculate().getValue(), 11400, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(MONTH(N45:O47))", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 6);
assert.strictEqual(oParser.calculate().getValue(), 6, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(DAY(N45:O47))", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 30);
assert.strictEqual(oParser.calculate().getValue(), 30, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(HOUR(N45:P48))", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 12);
assert.strictEqual(oParser.calculate().getValue(), 12, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(MINUTE(N45:P48))", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 113);
assert.strictEqual(oParser.calculate().getValue(), 113, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(SECOND(N45:P48))", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 64);
assert.strictEqual(oParser.calculate().getValue(), 64, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(DAY(N44:P49))", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 78);
assert.strictEqual(oParser.calculate().getValue(), 78, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(MONTH(N44:P49))", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 18);
assert.strictEqual(oParser.calculate().getValue(), 18, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(YEAR(N44:P49))", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 34200);
assert.strictEqual(oParser.calculate().getValue(), 34200, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(({1,2,3})*({TRUE,TRUE,TRUE}))", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 6);
assert.strictEqual(oParser.calculate().getValue(), 6, "Formula: " + oParser.Formula);

/*oParser = new parserFormula( "SUMPRODUCT(({1,2,3})*({TRUE;TRUE;TRUE;TRUE}))", "A2", ws );
assert.ok( oParser.parse() );
assert.strictEqual( oParser.calculate().getValue(), 24 );*/

oParser = new parserFormula("SUMPRODUCT({TRUE,TRUE,FALSE})", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 0);
assert.strictEqual(oParser.calculate().getValue(), 0, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT({1,2,3,3,TRUE})", "A2", ws);
assert.ok(oParser.parse());
assert.strictEqual(oParser.calculate().getValue(), 9);
assert.strictEqual(oParser.calculate().getValue(), 9, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT({1,2,3,3,TRUE})+SUMPRODUCT({1,2,3,3,TRUE})", "A2", ws);
assert.ok(oParser.parse());
assert.ok(oParser.assemble() == "SUMPRODUCT({1,2,3,3,TRUE})+SUMPRODUCT({1,2,3,3,TRUE})");
assert.strictEqual(oParser.calculate().getValue(), 18);
assert.strictEqual(oParser.calculate().getValue(), 18, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT({1,2,3,3,TRUE})*SUMPRODUCT({1,2,3,3,TRUE})", "A2", ws);
assert.ok(oParser.parse());
assert.ok(oParser.assemble() == "SUMPRODUCT({1,2,3,3,TRUE})*SUMPRODUCT({1,2,3,3,TRUE})");
assert.strictEqual(oParser.calculate().getValue(), 81);
assert.strictEqual(oParser.calculate().getValue(), 81, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(SUMPRODUCT({1,2,3,3,TRUE})*SUMPRODUCT({1,2,3,3,TRUE}))", "A2", ws);
assert.ok(oParser.parse());
assert.ok(oParser.assemble() == "SUMPRODUCT(SUMPRODUCT({1,2,3,3,TRUE})*SUMPRODUCT({1,2,3,3,TRUE}))");
assert.strictEqual(oParser.calculate().getValue(), 81);
assert.strictEqual(oParser.calculate().getValue(), 81, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUM(SUMPRODUCT({1,2,3,3,TRUE})*SUMPRODUCT({1,2,3,3,TRUE}))", "A2", ws);
assert.ok(oParser.parse());
assert.ok(oParser.assemble() == "SUM(SUMPRODUCT({1,2,3,3,TRUE})*SUMPRODUCT({1,2,3,3,TRUE}))");
assert.strictEqual(oParser.calculate().getValue(), 81);
assert.strictEqual(oParser.calculate().getValue(), 81, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUM(SUMPRODUCT({1,2,3,3,TRUE})*SUMPRODUCT({1,2,3,3,TRUE}),1,2,3)", "A2", ws);
assert.ok(oParser.parse());
assert.ok(oParser.assemble() == "SUM(SUMPRODUCT({1,2,3,3,TRUE})*SUMPRODUCT({1,2,3,3,TRUE}),1,2,3)");
assert.strictEqual(oParser.calculate().getValue(), 87);
assert.strictEqual(oParser.calculate().getValue(), 87, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUM(SUMPRODUCT(N44:O47))+SUM(SUMPRODUCT(N44:O47))", "A2", ws);
assert.ok(oParser.parse());
assert.ok(oParser.assemble() == "SUM(SUMPRODUCT(N44:O47))+SUM(SUMPRODUCT(N44:O47))");
assert.strictEqual(oParser.calculate().getValue(), 72);
assert.strictEqual(oParser.calculate().getValue(), 72, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUM(SUMPRODUCT({1,2,3,3,TRUE})*SUMPRODUCT({1,2,3,3,TRUE}),SUMPRODUCT({1,2,3,3,TRUE}),2,SUMPRODUCT({1,2,3,3}))", "A2", ws);
assert.ok(oParser.parse());
assert.ok(oParser.assemble() == "SUM(SUMPRODUCT({1,2,3,3,TRUE})*SUMPRODUCT({1,2,3,3,TRUE}),SUMPRODUCT({1,2,3,3,TRUE}),2,SUMPRODUCT({1,2,3,3}))");
assert.strictEqual(oParser.calculate().getValue(), 101);
assert.strictEqual(oParser.calculate().getValue(), 101, "Formula: " + oParser.Formula);

ws.getRange2("A101").setValue("5");
ws.getRange2("A102").setValue("6");
Expand All @@ -11818,32 +11818,32 @@ $(function () {
oParser = new parserFormula("SUMPRODUCT((A101:A105)*((B101:B105)=1))", "A2", ws);
assert.ok(oParser.parse());
assert.ok(oParser.assemble() == "SUMPRODUCT((A101:A105)*((B101:B105)=1))");
assert.strictEqual(oParser.calculate().getValue(), 28);
assert.strictEqual(oParser.calculate().getValue(), 28, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT((A101:A105)*((B101:B105)=1))+SUMPRODUCT((A101:A104)*((B101:B104)=1))+SUMPRODUCT((A101:A103)*((B101:B103)=1))", "A2", ws);
assert.ok(oParser.parse());
assert.ok(oParser.assemble() == "SUMPRODUCT((A101:A105)*((B101:B105)=1))+SUMPRODUCT((A101:A104)*((B101:B104)=1))+SUMPRODUCT((A101:A103)*((B101:B103)=1))");
assert.strictEqual(oParser.calculate().getValue(), 58);
assert.strictEqual(oParser.calculate().getValue(), 58, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(({3})*({TRUE,TRUE,TRUE,TRUE}))", "A2", ws);
assert.ok(oParser.parse());
assert.ok(oParser.assemble() == "SUMPRODUCT(({3})*({TRUE,TRUE,TRUE,TRUE}))");
assert.strictEqual(oParser.calculate().getValue(), 12);
assert.strictEqual(oParser.calculate().getValue(), 12, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(({3;2;2;2})*({TRUE;TRUE;TRUE;TRUE}))", "A2", ws);
assert.ok(oParser.parse());
assert.ok(oParser.assemble() == "SUMPRODUCT(({3;2;2;2})*({TRUE;TRUE;TRUE;TRUE}))");
assert.strictEqual(oParser.calculate().getValue(), 9);
assert.strictEqual(oParser.calculate().getValue(), 9, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(--ISNUMBER({5;6;7;1;2;3;4}))", "A2", ws);
assert.ok(oParser.parse());
assert.ok(oParser.assemble() == "SUMPRODUCT(--ISNUMBER({5;6;7;1;2;3;4}))");
assert.strictEqual(oParser.calculate().getValue(), 7);
assert.strictEqual(oParser.calculate().getValue(), 7, "Formula: " + oParser.Formula);

oParser = new parserFormula("SUMPRODUCT(--ISNUMBER(SEARCH({5;6;7;1;2;3;4},123)))", "A2", ws);
assert.ok(oParser.parse());
assert.ok(oParser.assemble() == "SUMPRODUCT(--ISNUMBER(SEARCH({5;6;7;1;2;3;4},123)))");
assert.strictEqual(oParser.calculate().getValue(), 3);
assert.strictEqual(oParser.calculate().getValue(), 3, "Formula: " + oParser.Formula);


testArrayFormula2(assert, "SUMPRODUCT", 1, 8, null, true);
Expand Down

0 comments on commit 82e07ad

Please sign in to comment.