Add tests for the LOOKUP function
We were performing operations to patch for missing $result_vector even when one was defined, this was causing bugs on edge cases. Fixes #796 Closes #816
This commit is contained in:
parent
f0e69408ca
commit
db2621c4fe
|
@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
|
||||||
|
|
||||||
- Improve XLSX parsing speed if no readFilter is applied - [#772](https://github.com/PHPOffice/PhpSpreadsheet/issues/772)
|
- Improve XLSX parsing speed if no readFilter is applied - [#772](https://github.com/PHPOffice/PhpSpreadsheet/issues/772)
|
||||||
- Fix column names if read filter calls in XLSX reader skip columns - [#777](https://github.com/PHPOffice/PhpSpreadsheet/pull/777)
|
- Fix column names if read filter calls in XLSX reader skip columns - [#777](https://github.com/PHPOffice/PhpSpreadsheet/pull/777)
|
||||||
|
- Fix LOOKUP function which was breaking on edge cases - [#796](https://github.com/PHPOffice/PhpSpreadsheet/issues/796)
|
||||||
|
|
||||||
## [1.5.2] - 2018-11-25
|
## [1.5.2] - 2018-11-25
|
||||||
|
|
||||||
|
|
|
@ -811,11 +811,13 @@ class LookupRef
|
||||||
if (!is_array($lookup_vector)) {
|
if (!is_array($lookup_vector)) {
|
||||||
return Functions::NA();
|
return Functions::NA();
|
||||||
}
|
}
|
||||||
|
$hasResultVector = isset($result_vector);
|
||||||
$lookupRows = count($lookup_vector);
|
$lookupRows = count($lookup_vector);
|
||||||
$l = array_keys($lookup_vector);
|
$l = array_keys($lookup_vector);
|
||||||
$l = array_shift($l);
|
$l = array_shift($l);
|
||||||
$lookupColumns = count($lookup_vector[$l]);
|
$lookupColumns = count($lookup_vector[$l]);
|
||||||
if ((($lookupRows == 1) && ($lookupColumns > 1)) || (($lookupRows == 2) && ($lookupColumns != 2))) {
|
// we correctly orient our results
|
||||||
|
if (($lookupRows === 1 && $lookupColumns > 1) || (!$hasResultVector && $lookupRows === 2 && $lookupColumns !== 2)) {
|
||||||
$lookup_vector = self::TRANSPOSE($lookup_vector);
|
$lookup_vector = self::TRANSPOSE($lookup_vector);
|
||||||
$lookupRows = count($lookup_vector);
|
$lookupRows = count($lookup_vector);
|
||||||
$l = array_keys($lookup_vector);
|
$l = array_keys($lookup_vector);
|
||||||
|
@ -829,18 +831,20 @@ class LookupRef
|
||||||
$l = array_keys($result_vector);
|
$l = array_keys($result_vector);
|
||||||
$l = array_shift($l);
|
$l = array_shift($l);
|
||||||
$resultColumns = count($result_vector[$l]);
|
$resultColumns = count($result_vector[$l]);
|
||||||
if ((($resultRows == 1) && ($resultColumns > 1)) || (($resultRows == 2) && ($resultColumns != 2))) {
|
// we correctly orient our results
|
||||||
|
if ($resultRows === 1 && $resultColumns > 1) {
|
||||||
$result_vector = self::TRANSPOSE($result_vector);
|
$result_vector = self::TRANSPOSE($result_vector);
|
||||||
$resultRows = count($result_vector);
|
$resultRows = count($result_vector);
|
||||||
$r = array_keys($result_vector);
|
$r = array_keys($result_vector);
|
||||||
$resultColumns = count($result_vector[array_shift($r)]);
|
$resultColumns = count($result_vector[array_shift($r)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($lookupRows == 2) {
|
if ($lookupRows === 2 && !$hasResultVector) {
|
||||||
$result_vector = array_pop($lookup_vector);
|
$result_vector = array_pop($lookup_vector);
|
||||||
$lookup_vector = array_shift($lookup_vector);
|
$lookup_vector = array_shift($lookup_vector);
|
||||||
}
|
}
|
||||||
if ($lookupColumns != 2) {
|
|
||||||
|
if ($lookupColumns !== 2) {
|
||||||
foreach ($lookup_vector as &$value) {
|
foreach ($lookup_vector as &$value) {
|
||||||
if (is_array($value)) {
|
if (is_array($value)) {
|
||||||
$k = array_keys($value);
|
$k = array_keys($value);
|
||||||
|
|
|
@ -51,6 +51,22 @@ class LookupRefTest extends TestCase
|
||||||
return require 'data/Calculation/LookupRef/VLOOKUP.php';
|
return require 'data/Calculation/LookupRef/VLOOKUP.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider providerLOOKUP
|
||||||
|
*
|
||||||
|
* @param mixed $expectedResult
|
||||||
|
*/
|
||||||
|
public function testLOOKUP($expectedResult, ...$args)
|
||||||
|
{
|
||||||
|
$result = LookupRef::LOOKUP(...$args);
|
||||||
|
self::assertEquals($expectedResult, $result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function providerLOOKUP()
|
||||||
|
{
|
||||||
|
return require 'data/Calculation/LookupRef/LOOKUP.php';
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dataProvider providerMATCH
|
* @dataProvider providerMATCH
|
||||||
*
|
*
|
||||||
|
|
|
@ -0,0 +1,111 @@
|
||||||
|
<?php
|
||||||
|
return [
|
||||||
|
|
||||||
|
[ // Office reference example #1
|
||||||
|
'orange',
|
||||||
|
4.19,
|
||||||
|
[
|
||||||
|
[4.14],
|
||||||
|
[4.19],
|
||||||
|
[5.17],
|
||||||
|
[5.77],
|
||||||
|
[6,39],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
['red'],
|
||||||
|
['orange'],
|
||||||
|
['yellow'],
|
||||||
|
['green'],
|
||||||
|
['blue'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
[ // Office reference example #2
|
||||||
|
'yellow',
|
||||||
|
5.75,
|
||||||
|
[
|
||||||
|
[4.14],
|
||||||
|
[4.19],
|
||||||
|
[5.17],
|
||||||
|
[5.77],
|
||||||
|
[6,39],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
['red'],
|
||||||
|
['orange'],
|
||||||
|
['yellow'],
|
||||||
|
['green'],
|
||||||
|
['blue'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
[ // Office reference example #3
|
||||||
|
'blue',
|
||||||
|
7.66,
|
||||||
|
[
|
||||||
|
[4.14],
|
||||||
|
[4.19],
|
||||||
|
[5.17],
|
||||||
|
[5.77],
|
||||||
|
[6,39],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
['red'],
|
||||||
|
['orange'],
|
||||||
|
['yellow'],
|
||||||
|
['green'],
|
||||||
|
['blue'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
[ // Office reference example #4
|
||||||
|
'#N/A',
|
||||||
|
0,
|
||||||
|
[
|
||||||
|
[4.14],
|
||||||
|
[4.19],
|
||||||
|
[5.17],
|
||||||
|
[5.77],
|
||||||
|
[6,39],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
['red'],
|
||||||
|
['orange'],
|
||||||
|
['yellow'],
|
||||||
|
['green'],
|
||||||
|
['blue'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
|
||||||
|
[ // Array form test
|
||||||
|
'orange',
|
||||||
|
4.2,
|
||||||
|
[
|
||||||
|
[4.14, 'red'],
|
||||||
|
[4.19, 'orange'],
|
||||||
|
[5.17, 'yellow'],
|
||||||
|
[5.77, 'green'],
|
||||||
|
[6,39, 'blue'],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
|
||||||
|
[
|
||||||
|
5,
|
||||||
|
'x',
|
||||||
|
[
|
||||||
|
[0, 0, 0, 'x', 'x'],
|
||||||
|
[1, 2, 3, 4, 5]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
|
||||||
|
[
|
||||||
|
'author_100',
|
||||||
|
100,
|
||||||
|
[
|
||||||
|
[100],
|
||||||
|
[101]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
['author_100'],
|
||||||
|
['author_101']
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
];
|
Loading…
Reference in New Issue