Merge pull request #14213 from AW-UC/naturalsort_defaultcollator-patch-file-sorting
Update naturalsort_defaultcollator.php. Fixes #13982
This commit is contained in:
commit
fb87b746f0
|
@ -27,6 +27,19 @@ class NaturalSort {
|
|||
private $collator;
|
||||
private $cache = array();
|
||||
|
||||
/**
|
||||
* Instantiate a new \OC\NaturalSort instance.
|
||||
* @param object $injectedCollator
|
||||
*/
|
||||
public function __construct($injectedCollator = null) {
|
||||
// inject an instance of \Collator('en_US') to force using the php5-intl Collator
|
||||
// or inject an instance of \OC\NaturalSort_DefaultCollator to force using Owncloud's default collator
|
||||
if (isset($injectedCollator)) {
|
||||
$this->collator = $injectedCollator;
|
||||
\OC_Log::write('core', 'forced use of '.get_class($injectedCollator), \OC_Log::DEBUG);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Split the given string in chunks of numbers and strings
|
||||
* @param string $t string
|
||||
|
|
|
@ -22,9 +22,13 @@ namespace OC;
|
|||
|
||||
class NaturalSort_DefaultCollator {
|
||||
public function compare($a, $b) {
|
||||
$result = strcasecmp($a, $b);
|
||||
if ($result === 0) {
|
||||
if ($a === $b) {
|
||||
return 0;
|
||||
}
|
||||
return ($a < $b) ? -1 : 1;
|
||||
return ($a > $b) ? -1 : 1;
|
||||
}
|
||||
return ($result < 0) ? -1 : 1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,27 +8,32 @@
|
|||
|
||||
class Test_NaturalSort extends \Test\TestCase {
|
||||
|
||||
public function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
if(!class_exists('Collator')) {
|
||||
$this->markTestSkipped('The intl module is not available, natural sorting will not work as expected.');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider naturalSortDataProvider
|
||||
*/
|
||||
public function testNaturalSortCompare($array, $sorted)
|
||||
{
|
||||
if(!class_exists('Collator')) {
|
||||
$this->markTestSkipped('The intl module is not available, natural sorting might not work as expected.');
|
||||
return;
|
||||
}
|
||||
$comparator = \OC\NaturalSort::getInstance();
|
||||
usort($array, array($comparator, 'compare'));
|
||||
$this->assertEquals($sorted, $array);
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider for natural sort.
|
||||
* @dataProvider defaultCollatorDataProvider
|
||||
*/
|
||||
public function testDefaultCollatorCompare($array, $sorted)
|
||||
{
|
||||
$comparator = new \OC\NaturalSort(new \OC\NaturalSort_DefaultCollator());
|
||||
usort($array, array($comparator, 'compare'));
|
||||
$this->assertEquals($sorted, $array);
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider for natural sorting with php5-intl's Collator.
|
||||
* Must provide the same result as in core/js/tests/specs/coreSpec.js
|
||||
* @return array test cases
|
||||
*/
|
||||
|
@ -181,4 +186,85 @@ class Test_NaturalSort extends \Test\TestCase {
|
|||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider for natural sorting with \OC\NaturalSort_DefaultCollator.
|
||||
* Must provide the same result as in core/js/tests/specs/coreSpec.js
|
||||
* @return array test cases
|
||||
*/
|
||||
public function defaultCollatorDataProvider()
|
||||
{
|
||||
return array(
|
||||
// different casing
|
||||
array(
|
||||
// unsorted
|
||||
array(
|
||||
'aaa',
|
||||
'bbb',
|
||||
'BBB',
|
||||
'AAA'
|
||||
),
|
||||
// sorted
|
||||
array(
|
||||
'aaa',
|
||||
'AAA',
|
||||
'bbb',
|
||||
'BBB'
|
||||
)
|
||||
),
|
||||
// numbers
|
||||
array(
|
||||
// unsorted
|
||||
array(
|
||||
'124.txt',
|
||||
'abc1',
|
||||
'123.txt',
|
||||
'abc',
|
||||
'abc2',
|
||||
'def (2).txt',
|
||||
'ghi 10.txt',
|
||||
'abc12',
|
||||
'def.txt',
|
||||
'def (1).txt',
|
||||
'ghi 2.txt',
|
||||
'def (10).txt',
|
||||
'abc10',
|
||||
'def (12).txt',
|
||||
'z',
|
||||
'ghi.txt',
|
||||
'za',
|
||||
'ghi 1.txt',
|
||||
'ghi 12.txt',
|
||||
'zz',
|
||||
'15.txt',
|
||||
'15b.txt',
|
||||
),
|
||||
// sorted
|
||||
array(
|
||||
'15.txt',
|
||||
'15b.txt',
|
||||
'123.txt',
|
||||
'124.txt',
|
||||
'abc',
|
||||
'abc1',
|
||||
'abc2',
|
||||
'abc10',
|
||||
'abc12',
|
||||
'def.txt',
|
||||
'def (1).txt',
|
||||
'def (2).txt',
|
||||
'def (10).txt',
|
||||
'def (12).txt',
|
||||
'ghi.txt',
|
||||
'ghi 1.txt',
|
||||
'ghi 2.txt',
|
||||
'ghi 10.txt',
|
||||
'ghi 12.txt',
|
||||
'z',
|
||||
'za',
|
||||
'zz',
|
||||
)
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue