]> git.immae.eu Git - github/shaarli/Shaarli.git/commitdiff
Fix autoLocale error and cover it with unit tests 790/head
authorArthurHoaro <arthur@hoa.ro>
Tue, 7 Mar 2017 18:27:17 +0000 (19:27 +0100)
committerArthurHoaro <arthur@hoa.ro>
Tue, 7 Mar 2017 18:27:17 +0000 (19:27 +0100)
application/Utils.php
tests/languages/de/UtilsDeTest.php
tests/languages/en/UtilsEnTest.php
tests/languages/fr/UtilsFrTest.php

index a936b09fa87710ef86df5ffd9f28a8584b9ac09c..5c077450e3a65016f55b0ede559dad4552b47e2b 100644 (file)
@@ -216,22 +216,30 @@ function is_session_id_valid($sessionId)
 function autoLocale($headerLocale)
 {
     // Default if browser does not send HTTP_ACCEPT_LANGUAGE
-    $attempts = array('en_US', 'en_US.utf8', 'en_US.UTF-8');
-    if (isset($headerLocale)) {
-        // (It's a bit crude, but it works very well. Preferred language is always presented first.)
-        if (preg_match('/([a-z]{2,3})[-_]?([a-z]{2})?/i', $headerLocale, $matches)) {
-            $first = [strtolower($matches[1]), strtoupper($matches[1])];
-            $separators = ['_', '-'];
-            $encodings = ['utf8', 'UTF-8'];
-            if (!empty($matches[2])) {
-                $second = [strtoupper($matches[2]), strtolower($matches[2])];
-                $attempts = cartesian_product_generator([$first, $separators, $second, ['.'], $encodings]);
-            } else {
-                $attempts = cartesian_product_generator([$first, $separators, $first, ['.'], $encodings]);
+    $locales = array('en_US', 'en_US.utf8', 'en_US.UTF-8');
+    if (! empty($headerLocale)) {
+        if (preg_match_all('/([a-z]{2,3})[-_]?([a-z]{2})?,?/i', $headerLocale, $matches, PREG_SET_ORDER)) {
+            $attempts = [];
+            foreach ($matches as $match) {
+                $first = [strtolower($match[1]), strtoupper($match[1])];
+                $separators = ['_', '-'];
+                $encodings = ['utf8', 'UTF-8'];
+                if (!empty($match[2])) {
+                    $second = [strtoupper($match[2]), strtolower($match[2])];
+                    $items = [$first, $separators, $second, ['.'], $encodings];
+                } else {
+                    $items = [$first, $separators, $first, ['.'], $encodings];
+                }
+                $attempts = array_merge($attempts, iterator_to_array(cartesian_product_generator($items)));
+            }
+
+            if (! empty($attempts)) {
+                $locales = array_merge(array_map('implode', $attempts), $locales);
             }
         }
     }
-    setlocale(LC_ALL, implode('implode', iterator_to_array($attempts)));
+
+    setlocale(LC_ALL, $locales);
 }
 
 /**
index 8a740389ac19b9edd0acc8f713ddfd53d466bf4d..545fa572e46dbdeaf40db50a0da942a5f49169dd 100644 (file)
@@ -22,4 +22,80 @@ class UtilsDeTest extends UtilsTest
         $date = DateTime::createFromFormat('Ymd_His', '20170101_101112');
         $this->assertEquals('So 01 Jan 2017 10:11:12 EAT', format_date($date, false));
     }
+
+    /**
+     * Test autoLocale with a simple value
+     */
+    public function testAutoLocaleValid()
+    {
+        $current = setlocale(LC_ALL, 0);
+        $header = 'en-us';
+        autoLocale($header);
+        $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
+
+    /**
+     * Test autoLocale with an alternative locale value
+     */
+    public function testAutoLocaleValidAlternative()
+    {
+        $current = setlocale(LC_ALL, 0);
+        $header = 'en_us.UTF8';
+        autoLocale($header);
+        $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
+
+    /**
+     * Test autoLocale with multiples value, the first one is valid
+     */
+    public function testAutoLocaleMultipleFirstValid()
+    {
+        $current = setlocale(LC_ALL, 0);
+        $header = 'en-us,de-de';
+        autoLocale($header);
+        $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
+
+    /**
+     * Test autoLocale with multiples value, the second one is valid
+     */
+    public function testAutoLocaleMultipleSecondValid()
+    {
+        $current = setlocale(LC_ALL, 0);
+        $header = 'pt_BR,fr-fr';
+        autoLocale($header);
+        $this->assertEquals('fr_FR.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
+
+    /**
+     * Test autoLocale without value: defaults to en_US.
+     */
+    public function testAutoLocaleBlank()
+    {
+        $current = setlocale(LC_ALL, 0);
+        autoLocale('');
+        $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
+
+    /**
+     * Test autoLocale with an invalid value: defaults to en_US.
+     */
+    public function testAutoLocaleInvalid()
+    {
+        $current = setlocale(LC_ALL, 0);
+        autoLocale('pt_BR');
+        $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
 }
index 60bcb65333be454c296f8732ee5d71bd85eb44e4..7c829ac7e5856cd003e979949572d7c1551397da 100644 (file)
@@ -22,4 +22,80 @@ class UtilsEnTest extends UtilsTest
         $date = DateTime::createFromFormat('Ymd_His', '20170101_101112');
         $this->assertEquals('Sun 01 Jan 2017 10:11:12 AM EAT', format_date($date, false));
     }
+
+    /**
+     * Test autoLocale with a simple value
+     */
+    public function testAutoLocaleValid()
+    {
+        $current = setlocale(LC_ALL, 0);
+        $header = 'de-de';
+        autoLocale($header);
+        $this->assertEquals('de_DE.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
+
+    /**
+     * Test autoLocale with an alternative locale value
+     */
+    public function testAutoLocaleValidAlternative()
+    {
+        $current = setlocale(LC_ALL, 0);
+        $header = 'de_de.UTF8';
+        autoLocale($header);
+        $this->assertEquals('de_DE.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
+
+    /**
+     * Test autoLocale with multiples value, the first one is valid
+     */
+    public function testAutoLocaleMultipleFirstValid()
+    {
+        $current = setlocale(LC_ALL, 0);
+        $header = 'de-de;en-us';
+        autoLocale($header);
+        $this->assertEquals('de_DE.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
+
+    /**
+     * Test autoLocale with multiples value, the second one is valid
+     */
+    public function testAutoLocaleMultipleSecondValid()
+    {
+        $current = setlocale(LC_ALL, 0);
+        $header = 'pt_BR,fr-fr';
+        autoLocale($header);
+        $this->assertEquals('fr_FR.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
+
+    /**
+     * Test autoLocale without value: defaults to en_US.
+     */
+    public function testAutoLocaleBlank()
+    {
+        $current = setlocale(LC_ALL, 0);
+        autoLocale('');
+        $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
+
+    /**
+     * Test autoLocale with an invalid value: defaults to en_US.
+     */
+    public function testAutoLocaleInvalid()
+    {
+        $current = setlocale(LC_ALL, 0);
+        autoLocale('pt_BR');
+        $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
 }
index 890308d34967ae52c84be79264b97e27a1307d6b..45996ee27318c37c6e0e3db2ef76d58ca990a636 100644 (file)
@@ -22,4 +22,80 @@ class UtilsFrTest extends UtilsTest
         $date = DateTime::createFromFormat('Ymd_His', '20170101_101112');
         $this->assertEquals('dim. 01 janv. 2017 10:11:12 EAT', format_date($date, false));
     }
+
+    /**
+     * Test autoLocale with a simple value
+     */
+    public function testAutoLocaleValid()
+    {
+        $current = setlocale(LC_ALL, 0);
+        $header = 'de-de';
+        autoLocale($header);
+        $this->assertEquals('de_DE.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
+
+    /**
+     * Test autoLocale with an alternative locale value
+     */
+    public function testAutoLocaleValidAlternative()
+    {
+        $current = setlocale(LC_ALL, 0);
+        $header = 'de_de.UTF8';
+        autoLocale($header);
+        $this->assertEquals('de_DE.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
+
+    /**
+     * Test autoLocale with multiples value, the first one is valid
+     */
+    public function testAutoLocaleMultipleFirstValid()
+    {
+        $current = setlocale(LC_ALL, 0);
+        $header = 'de-de;en-us';
+        autoLocale($header);
+        $this->assertEquals('de_DE.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
+
+    /**
+     * Test autoLocale with multiples value, the second one is valid
+     */
+    public function testAutoLocaleMultipleSecondValid()
+    {
+        $current = setlocale(LC_ALL, 0);
+        $header = 'pt_BR,de-de';
+        autoLocale($header);
+        $this->assertEquals('de_DE.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
+
+    /**
+     * Test autoLocale without value: defaults to en_US.
+     */
+    public function testAutoLocaleBlank()
+    {
+        $current = setlocale(LC_ALL, 0);
+        autoLocale('');
+        $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
+
+    /**
+     * Test autoLocale with an invalid value: defaults to en_US.
+     */
+    public function testAutoLocaleInvalid()
+    {
+        $current = setlocale(LC_ALL, 0);
+        autoLocale('pt_BR');
+        $this->assertEquals('en_US.utf8', setlocale(LC_ALL, 0));
+
+        setlocale(LC_ALL, $current);
+    }
 }