PhpSpreadsheet/tests/PhpSpreadsheetTests
Owen Leibman c4895b9468
MATCH with a static array should return the position of the found value based on the values submitted.
Returns #N/A, unless the element searched for is at the end of the array.

The problem is in Calculation.php line 4231:
                    if (!is_array($functionCall)) {
                        foreach ($args as &$arg) {
                            $arg = Functions::flattenSingleValue($arg);
                        }
                        unset($arg);
                    }

I believe this code is intended to handle functions where PhpSpreadsheet just passes
the call on to PHP without implementing the code on its own, e.g. for atan or acos.
In the bug report, the following code fails:
  $flat_rate = "=MATCH(6,{4,5,6,2}, 0)";
  $sheet->getCell('A1')->setValue($flat_rate);
The expected value is 3, but the actual result is "#N/A".
The reason for this result is that the parser replaces the braces with calls
to the MKMATRIX internal function, whose value for functioncall was:
'self::MKMATRIX'. Since this isn't an array, the flattening code is executed,
and the unintended result occurs. The fix is to change the definition for
functioncall in that case to [__CLASS__, 'mkMatrix'], avoiding the flattening.

However, there is also another part to this bug. The flattening should be
returning the first entry in the array, but is in fact returning the last.
This explains why the bug report specified "unless ... end of the array".
I confirmed that Excel does use the first item in the array rather than the last,
e.g. =atan({1,2,3}) entered into a cell will return atan(1), not atan(3).
The problem here is that flattenSingleValue, which says in its comments that
it is supposed to be returning the first item, uses array_pop rather than array_shift.
I have changed that as well. The same mistake was also present in
Cell.php function getCalculatedValue. The correct behavior can be verified
by entering =minverse({-2.5,1.5;2,-1}) into an Excel cell'
Excel flattens the result ({2,3;4,5}) to 2, and so should PhpSpreadsheet.

Fixes #1271
Closes #1332
2020-04-26 22:09:31 +09:00
..
Calculation MATCH with a static array should return the position of the found value based on the values submitted. 2020-04-26 22:09:31 +09:00
Cell Addition cell datatype tests (#1303) 2020-01-03 23:44:38 +01:00
Chart Custom color for pie and donut charts 2018-12-10 18:43:55 +11:00
Collection - Create unit test (#944) 2019-04-15 21:39:11 +02:00
Custom Test fixes for PHP 7.4 stricter behaviour 2019-09-20 16:22:08 -07:00
Functional Fix active cell when freeze pane is used 2020-03-02 18:11:37 +07:00
Helper Upgrade to phpunit 7.5 2019-07-24 23:45:43 -07:00
Reader Support whitespaces in CSS style in Xlsx 2020-04-05 19:50:57 +09:00
Shared Upgrade to phpunit 7.5 2019-07-24 23:45:43 -07:00
Style Chained operations on cell ranges involving borders are now possible 2018-07-15 12:19:54 +09:00
Worksheet Fix removing last row incorrect behavior 2020-04-26 11:00:43 +09:00
Writer Handle Error in Formula Processing Better for Xls (#1267) 2020-01-04 18:34:21 +01:00
DocumentGeneratorTest.php phpcs fix 2020-02-25 10:41:00 +09:00
IOFactoryTest.php Add test for IOFactory::load 2019-11-17 18:39:38 +01:00
ReferenceHelperTest.php Add ReferenceHelper::cellSort and ReferenceHelper::cellReverseSort tests 2019-11-17 20:50:55 +01:00
SettingsTest.php Use PHPUnit\Framework\TestCase instead of PHPUnit_Framework_TestCase (#271) 2017-11-09 00:48:01 +09:00
SpreadsheetTest.php Cover getSheetByName() with tests for name with quote and spaces 2019-07-27 22:46:41 -07:00