Merge pull request #14213 from AW-UC/naturalsort_defaultcollator-patch-file-sorting

Update naturalsort_defaultcollator.php. Fixes #13982
remotes/origin/log-external-deletes
Vincent Petry 2015-02-25 10:30:14 +07:00
commit fb87b746f0
3 changed files with 115 additions and 12 deletions

@ -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) {
if ($a === $b) {
return 0;
$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();
/**
* @dataProvider naturalSortDataProvider
*/
public function testNaturalSortCompare($array, $sorted)
{
if(!class_exists('Collator')) {
$this->markTestSkipped('The intl module is not available, natural sorting will not work as expected.');
$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);
}
/**
* @dataProvider naturalSortDataProvider
*/
public function testNaturalSortCompare($array, $sorted)
* @dataProvider defaultCollatorDataProvider
*/
public function testDefaultCollatorCompare($array, $sorted)
{
$comparator = \OC\NaturalSort::getInstance();
$comparator = new \OC\NaturalSort(new \OC\NaturalSort_DefaultCollator());
usort($array, array($comparator, 'compare'));
$this->assertEquals($sorted, $array);
}
/**
* Data provider for natural sort.
* 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',
)
),
);
}
}