Skip to content
Snippets Groups Projects
Commit fb87b746 authored by Vincent Petry's avatar Vincent Petry
Browse files

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

Update naturalsort_defaultcollator.php. Fixes #13982
parents 7e7e0c51 0066c6f0
No related branches found
No related tags found
No related merge requests found
......@@ -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',
)
),
);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment