[BUGFIX] Get current locale without changing environment 16/48416/2
authorChristian Kuhn <lolli@schwarzbu.ch>
Tue, 31 May 2016 10:19:22 +0000 (12:19 +0200)
committerMorton Jonuschat <m.jonuschat@mojocode.de>
Tue, 31 May 2016 15:24:52 +0000 (17:24 +0200)
Two tests in ext:form change the environment when they try to
back up the current locale:
setlocale(LC_NUMERIC, null): "the locale names will be set from
the values of environment variables", should be
setlocale(LC_NUMERIC, 0): "the locale setting is not affected,
only the current setting is returned"
In my case my default LC_NUMERIC is "C" and after call with 'null'
it is set to and returns 'de_DE.utf8', so it changes the internal
state to something else than before and the reset from backup does
not work properly. This leads to hard to debug problems if other
locale depending tests are executed later.
As a fun fact, phpunit suffers from the same issue and its
api method "setlocale()" that should take care of proper reset
messes this up, too. A pull request is pending to fix that.

The patch fixes the affected unit tests and cleans them up
along the way. Another patch to improve the overall situation
regarding locale handling in unit tests will follow later.

Change-Id: I2295b46cc6934a48e4d71ef5170deb83fb9264b6
Resolves: #76389
Releases: master
Reviewed-on: https://review.typo3.org/48416
Reviewed-by: Markus Klein <markus.klein@typo3.org>
Tested-by: Markus Klein <markus.klein@typo3.org>
Reviewed-by: Morton Jonuschat <m.jonuschat@mojocode.de>
Tested-by: Morton Jonuschat <m.jonuschat@mojocode.de>
typo3/sysext/form/Tests/Unit/Validator/FloatValidatorTest.php
typo3/sysext/form/Tests/Unit/Validator/IntegerValidatorTest.php

index 1382956..55dbd33 100644 (file)
@@ -34,8 +34,7 @@ class FloatValidatorTest extends AbstractValidatorTest
      */
     protected function setUp()
     {
-        parent::setUp();
-        $this->currentLocale = setlocale(LC_NUMERIC, null);
+        $this->currentLocale = setlocale(LC_NUMERIC, 0);
     }
 
     /**
@@ -43,8 +42,8 @@ class FloatValidatorTest extends AbstractValidatorTest
      */
     protected function tearDown()
     {
-        parent::tearDown();
         setlocale(LC_NUMERIC, $this->currentLocale);
+        parent::tearDown();
     }
 
     /**
@@ -52,26 +51,34 @@ class FloatValidatorTest extends AbstractValidatorTest
      */
     public function validFloatProvider()
     {
-        return array(
-            '12.1 for en_US locale' => array(array('12.1', ['en_US', 'en_US.utf8', 'english'])),
+        return [
+            '12.1 for en_US locale' => [
+                '12.1',
+                'en_US.utf8',
+            ],
             // @todo de_DE disabled currently, works locally but not on travis-ci.org
-            // '12,1 for de_DE locale' => array(array('12,1', ['de_DE', 'german'])),
-        );
+            /**
+            '12,1 for de_DE locale' => [
+                '12,1',
+                'de_DE.utf8',
+            ],
+             */
+        ];
     }
 
     /**
      * @test
      * @dataProvider validFloatProvider
      */
-    public function validateForValidInputHasEmptyErrorResult($input)
+    public function validateForValidInputHasEmptyErrorResult($inputValue, $locale)
     {
-        setlocale(LC_NUMERIC, $input[1]);
+        setlocale(LC_NUMERIC, $locale);
 
         $options = array('element' => uniqid('test'), 'errorMessage' => uniqid('error'));
         $subject = $this->createSubject($options);
 
         $this->assertEmpty(
-            $subject->validate($input[0])->getErrors()
+            $subject->validate($inputValue)->getErrors()
         );
     }
 }
index e2d8fd1..a98cfeb 100644 (file)
@@ -34,8 +34,7 @@ class IntegerValidatorTest extends AbstractValidatorTest
      */
     protected function setUp()
     {
-        parent::setUp();
-        $this->currentLocale = setlocale(LC_NUMERIC, null);
+        $this->currentLocale = setlocale(LC_NUMERIC, 0);
     }
 
     /**
@@ -43,55 +42,66 @@ class IntegerValidatorTest extends AbstractValidatorTest
      */
     protected function tearDown()
     {
-        parent::tearDown();
         setlocale(LC_NUMERIC, $this->currentLocale);
+        parent::tearDown();
     }
 
-    public function validIntegerProvider()
-    {
-        return array(
-            '12 for de locale'    => array(array(12, 'de')),
-        );
-    }
-
-    public function invalidIntegerProvider()
+    public function validateForValidInputHasEmptyErrorResultDataProvider()
     {
-        return array(
-            '12.1 for en_US locale' => array(array(12.1, 'en_US')),
-            // @todo de_DE disabled currently, works locally but not on travis-ci.org
-            // '12,1 for de_DE locale' => array(array('12,1', 'de_DE'))
-        );
+        return [
+            '12 for de locale' => [
+                12,
+                'de_DE.utf8'
+            ],
+        ];
     }
 
     /**
      * @test
-     * @dataProvider validIntegerProvider
+     * @dataProvider validateForValidInputHasEmptyErrorResultDataProvider
      */
-    public function validateForValidInputHasEmptyErrorResult($input)
+    public function validateForValidInputHasEmptyErrorResult($value, $locale)
     {
-        setlocale(LC_NUMERIC, $input[1]);
+        setlocale(LC_NUMERIC, $locale);
 
         $options = array('element' => uniqid('test'), 'errorMessage' => uniqid('error'));
         $subject = $this->createSubject($options);
 
         $this->assertEmpty(
-            $subject->validate($input[0])->getErrors()
+            $subject->validate($value)->getErrors()
         );
     }
 
+    public function validateForInvalidInputHasNotEmptyErrorResultDataProvider()
+    {
+        return [
+            '12.1 for en_US locale' => [
+                12.1,
+                'en_US.utf8'
+            ],
+            // @todo de_DE disabled currently, works locally but not on travis-ci.org
+            /**
+            '12,1 for de_DE locale' => [
+                '12,1',
+                'de_DE.utf8'
+            ],
+             */
+        ];
+    }
+
     /**
      * @test
-     * @dataProvider invalidIntegerProvider
+     * @dataProvider validateForInvalidInputHasNotEmptyErrorResultDataProvider
      */
-    public function validateForInvalidInputHasNotEmptyErrorResult($input)
+    public function validateForInvalidInputHasNotEmptyErrorResult($value, $locale)
     {
-        setlocale(LC_NUMERIC, $input[1]);
+        setlocale(LC_NUMERIC, $locale);
 
         $options = array('element' => uniqid('test'), 'errorMessage' => uniqid('error'));
         $subject = $this->createSubject($options);
 
         $this->assertNotEmpty(
-            $subject->validate($input[0])->getErrors()
+            $subject->validate($value)->getErrors()
         );
     }
 }