From 3e06e04aa6706c87444ff6503596738b8b5bdf57 Mon Sep 17 00:00:00 2001
From: Daniel Lorenz <info@extco.de>
Date: Wed, 15 Jun 2016 12:42:57 +0200
Subject: [PATCH] [BUGFIX] EXT:form - Fix broken inArray validator

Handle different configuration types and multiselect values.

Resolves: #75576
Releases: master, 7.6
Change-Id: I42c0bcbc5f5307d125484149108495ea971a692e
Reviewed-on: https://review.typo3.org/47661
Reviewed-by: Bjoern Jacob <bjoern.jacob@tritum.de>
Tested-by: Bjoern Jacob <bjoern.jacob@tritum.de>
Reviewed-by: Daniel Lorenz <info@extco.de>
Tested-by: Daniel Lorenz <info@extco.de>
Reviewed-by: Daniel Goerz <ervaude@gmail.com>
Reviewed-by: Morton Jonuschat <m.jonuschat@mojocode.de>
Tested-by: Morton Jonuschat <m.jonuschat@mojocode.de>
---
 .../Domain/Validator/InArrayValidator.php     |  66 ++-
 .../Unit/Validator/InArrayValidatorTest.php   | 557 ++++++++++++++++--
 2 files changed, 563 insertions(+), 60 deletions(-)

diff --git a/typo3/sysext/form/Classes/Domain/Validator/InArrayValidator.php b/typo3/sysext/form/Classes/Domain/Validator/InArrayValidator.php
index 92c7fc4e78df..a96bc414db74 100755
--- a/typo3/sysext/form/Classes/Domain/Validator/InArrayValidator.php
+++ b/typo3/sysext/form/Classes/Domain/Validator/InArrayValidator.php
@@ -25,7 +25,8 @@ class InArrayValidator extends AbstractValidator
     protected $supportedOptions = array(
         'element' => array('', 'The name of the element', 'string', true),
         'errorMessage' => array('', 'The error message', 'array', true),
-        'array' => array('', 'The array value', 'array', true),
+        'array' => array('', 'The array values from the wizard configuration (array = test1,test2)', 'string', false),
+        'array.' => array('', 'The array values from the documented configuration', 'array', false),
         'strict' => array('', 'Compare types', 'boolean', false),
         'ignorecase' => array('', 'Ignore cases', 'boolean', false)
     );
@@ -36,9 +37,9 @@ class InArrayValidator extends AbstractValidator
     protected $charsetConverter;
 
     /**
-     * constructor
+     * Constructor
      *
-     * creates charsetConverter object if option ignorecase is set
+     * Creates charsetConverter object if option ignorecase is set
      *
      * @param array $options
      * @throws \TYPO3\CMS\Extbase\Validation\Exception\InvalidValidationOptionsException
@@ -59,34 +60,65 @@ class InArrayValidator extends AbstractValidator
     const LOCALISATION_OBJECT_NAME = 'tx_form_system_validate_inarray';
 
     /**
-     * Check if $value is valid. If it is not valid, needs to add an error
-     * to result.
+     * Check if $value is valid. If it is not valid, add an error to result.
      *
      * @param mixed $value
      * @return void
      */
     public function isValid($value)
     {
-        if (empty($value) || !is_string($value)) {
+        if (empty($value)) {
             return;
         }
-        $allowedOptionsArray = GeneralUtility::trimExplode(',', $this->options['array'], true);
+
+        /**
+         * A single select results in a string,
+         * a multiselect in an array.
+         * In both cases, the operations will be processed on an array.
+         */
+        if (is_string($value)) {
+            $value = array($value);
+        }
+
+        /**
+         * The form wizard generates the following configuration:
+         *   array = test1,test2
+         * In this case the string has to be exploded.
+         * The following configuration was documented:
+         *   array {
+         *     1 = TYPO3 4.5 LTS
+         *     2 = TYPO3 6.2 LTS
+         *     3 = TYPO3 7 LTS
+         *   }
+         * In this case there is already an array but the "options" key differs.
+         */
+        $allowedOptionsArray = array();
+        if (!empty($this->options['array']) && is_string($this->options['array'])) {
+            $allowedOptionsArray = GeneralUtility::trimExplode(',', $this->options['array'], true);
+        } elseif (!empty($this->options['array.']) && is_array($this->options['array.'])) {
+            $allowedOptionsArray = $this->options['array.'];
+        }
+
         if (!empty($this->options['ignorecase'])) {
-            $value = $this->charsetConverter->conv_case('utf-8', $value, 'toLower');
+            foreach ($value as &$incomingArrayValue) {
+                $incomingArrayValue = $this->charsetConverter->conv_case('utf-8', $incomingArrayValue, 'toLower');
+            }
             foreach ($allowedOptionsArray as &$option) {
                 $option = $this->charsetConverter->conv_case('utf-8', $option, 'toLower');
             }
         }
 
-        if (!in_array($value, $allowedOptionsArray, !empty($this->options['strict']))) {
-            $this->addError(
-                $this->renderMessage(
-                    $this->options['errorMessage'][0],
-                    $this->options['errorMessage'][1],
-                    'error'
-                ),
-                1442002594
-            );
+        foreach ($value as $incomingArrayValue) {
+            if (!in_array($incomingArrayValue, $allowedOptionsArray, !empty($this->options['strict']))) {
+                $this->addError(
+                    $this->renderMessage(
+                        $this->options['errorMessage'][0],
+                        $this->options['errorMessage'][1],
+                        'error'
+                    ),
+                    1442002594
+                );
+            }
         }
     }
 }
diff --git a/typo3/sysext/form/Tests/Unit/Validator/InArrayValidatorTest.php b/typo3/sysext/form/Tests/Unit/Validator/InArrayValidatorTest.php
index 96d9484bf3f3..40a8be95ad19 100644
--- a/typo3/sysext/form/Tests/Unit/Validator/InArrayValidatorTest.php
+++ b/typo3/sysext/form/Tests/Unit/Validator/InArrayValidatorTest.php
@@ -31,25 +31,87 @@ class InArrayValidatorTest extends AbstractValidatorTest
      *
      * @return array
      */
-    public function validArrayProvider()
+    public function validArrayForStringConfigurationProvider()
     {
         return [
-            '12 in (12, 13)' => [
+            '12 in (12, 13, 14)' => [
                 '12',
-                '12,13',
+                '12,13,14',
             ],
             '1 in (5, 3234, oOIUoi8, 3434, 343, 34, 3, 1, 333434, 1234, ssd, ysdfsa)' => [
                 '1',
                 '5,3234,oOIUoi8,3434,343,34,3,1,333434,1234,ssd,ysdfsa',
             ],
+            'Pizza in (Pizza, Lasange, Strogonvo)' => [
+                'Pizza',
+                'Pizza,Lasange,Strogonvo',
+            ],
             'Rißtissen in (Rißtissen, Überligen, Karlsruhe)' => [
                 'Rißtissen',
                 'Rißtissen,Überligen,Karlsruhe',
             ],
-            'Pizza in (Pizza, Lasange, Strogonvo)' => [
-                'Pizza',
+
+            '[12 and 14] in (12, 13, 14)' => [
+                ['12', '14'],
+                '12,13,14',
+            ],
+            '[1 and ssd] in (5, 3234, oOIUoi8, 3434, 343, 34, 3, 1, 333434, 1234, ssd, ysdfsa)' => [
+                ['1', 'ssd'],
+                '5,3234,oOIUoi8,3434,343,34,3,1,333434,1234,ssd,ysdfsa',
+            ],
+            '[Pizza and Strogonvo] in (Pizza, Lasange, Strogonvo)' => [
+                ['Pizza', 'Strogonvo'],
                 'Pizza,Lasange,Strogonvo',
             ],
+            '[Rißtissen and Karlsruhe] in (Rißtissen, Überligen, Karlsruhe)' => [
+                ['Rißtissen', 'Karlsruhe'],
+                'Rißtissen,Überligen,Karlsruhe',
+            ],
+        ];
+    }
+
+    /**
+     * used for tests with valid input
+     * will result in no errors returned
+     *
+     * @return array
+     */
+    public function validArrayForArrayConfigurationProvider()
+    {
+        return [
+            '12 in [12, 13, 14]' => [
+                '12',
+                ['12', '13', '14'],
+            ],
+            '1 in [5, 3234, oOIUoi8, 3434, 343, 34, 3, 1, 333434, 1234, ssd, ysdfsa]' => [
+                '1',
+                ['5', '3234', 'oOIUoi8', '3434', '343', '34', '3', '1', '333434', '1234', 'ssd', 'ysdfsa'],
+            ],
+            'Pizza in [Pizza, Lasange, Strogonvo]' => [
+                ['Pizza', 'Strogonvo'],
+                ['Pizza', 'Lasange', 'Strogonvo'],
+            ],
+            'Rißtissen in [Rißtissen, Überligen, Karlsruhe]' => [
+                ['Rißtissen', 'Karlsruhe'],
+                ['Rißtissen', 'Überligen', 'Karlsruhe'],
+            ],
+
+            '[12 and 14] in [12, 13, 14]' => [
+                ['12', '14'],
+                ['12', '13', '14'],
+            ],
+            '[1 and ssd] in [5, 3234, oOIUoi8, 3434, 343, 34, 3, 1, 333434, 1234, ssd, ysdfsa]' => [
+                ['1', 'ssd'],
+                ['5', '3234', 'oOIUoi8', '3434', '343', '34', '3', '1', '333434', '1234', 'ssd', 'ysdfsa'],
+            ],
+            '[Pizza and Strogonvo] in [Pizza, Lasange, Strogonvo]' => [
+                'Pizza',
+                ['Pizza', 'Lasange', 'Strogonvo'],
+            ],
+            '[Rißtissen and Karlsruhe] in [Rißtissen, Überligen, Karlsruhe]' => [
+                'Rißtissen',
+                ['Rißtissen', 'Überligen', 'Karlsruhe'],
+            ],
         ];
     }
 
@@ -59,24 +121,102 @@ class InArrayValidatorTest extends AbstractValidatorTest
      *
      * @return array
      */
-    public function invalidArrayProvider()
+    public function invalidArrayForStringConfigurationProvider()
     {
         return [
-            '12 in (11, 13)' => [
+            '12 in (11, 13, 14)' => [
                 '12',
-                '11,13',
+                '11,13,14',
             ],
             '1 in (5, 3234, oOIUoi8, 3434, 343, 34, 3, 333434, 1234, ssd, ysdfsa)' => [
                 '1',
                 '5,3234,oOIUoi8,3434,343,34,3,333434,1234,ssd,ysdfsa',
             ],
+            'pizza in (Pizza, Lasange, Strogonvo)' => [
+                'pizza',
+                'Pizza,Lasange,Strogonvo',
+            ],
             'Eimeldingen in (Rißtissen, Überligen, Karlsruhe)' => [
                 'Eimeldingen',
                 'Rißtissen,Überligen,Karlsruhe',
             ],
+            'überligen in (Rißtissen, Überligen, Karlsruhe)' => [
+                'überligen',
+                'Rißtissen,Überligen,Karlsruhe',
+            ],
+
+            '[12 and 14] in (11, 13, 14)' => [
+                ['12', '14'],
+                '11,13,14',
+            ],
+            '[1 and ssd] in (5, 3234, oOIUoi8, 3434, 343, 34, 3, 333434, 1234, ssd, ysdfsa)' => [
+                ['1', 'ssd'],
+                '5,3234,oOIUoi8,3434,343,34,3,333434,1234,ssd,ysdfsa',
+            ],
+            '[pizza and Lasange] in (Pizza, Lasange, Strogonvo)' => [
+                ['pizza', 'Lasange'],
+                'Pizza,Lasange,Strogonvo',
+            ],
+            '[Eimeldingen and Überligen] in (Rißtissen, Überligen, Karlsruhe)' => [
+                ['Eimeldingen', 'Ãœberligen'],
+                'Rißtissen,Überligen,Karlsruhe',
+            ],
+            '[Eimeldingen and überligen] in (Rißtissen, Überligen, Karlsruhe)' => [
+                ['Eimeldingen', 'überligen'],
+                'Rißtissen,Überligen,Karlsruhe',
+            ],
+        ];
+    }
+
+    /**
+     * used for test with invalid input
+     * will result in errors returned
+     *
+     * @return array
+     */
+    public function invalidArrayForArrayConfigurationProvider()
+    {
+        return [
+            '12 in (11, 13, 14)' => [
+                '12',
+                ['11', '13', '14'],
+            ],
+            '1 in (5, 3234, oOIUoi8, 3434, 343, 34, 3, 333434, 1234, ssd, ysdfsa)' => [
+                '1',
+                ['5', '3234', 'oOIUoi8', '3434', '343', '34', '3', '333434', '1234', 'ssd', 'ysdfsa'],
+            ],
             'pizza in (Pizza, Lasange, Strogonvo)' => [
                 'pizza',
-                'Pizza,Lasange,Strogonvo',
+                ['Pizza', 'Lasange', 'Strogonvo'],
+            ],
+            'Eimeldingen in (Rißtissen, Überligen, Karlsruhe)' => [
+                'Eimeldingen',
+                ['Rißtissen', 'Überligen', 'Karlsruhe'],
+            ],
+            'überligen in (Rißtissen, Überligen, Karlsruhe)' => [
+                'überligen',
+                ['Rißtissen', 'Überligen', 'Karlsruhe'],
+            ],
+
+            '[12 and 14] in (11, 13, 14)' => [
+                ['12', '14'],
+                ['11', '13', '14'],
+            ],
+            '[1 and ssd] in (5, 3234, oOIUoi8, 3434, 343, 34, 3, 333434, 1234, ssd, ysdfsa)' => [
+                ['1', 'ssd'],
+                ['5', '3234', 'oOIUoi8', '3434', '343', '34', '3', '333434', '1234', 'ssd', 'ysdfsa'],
+            ],
+            '[pizza and Lasange] in (Pizza, Lasange, Strogonvo)' => [
+                ['pizza', 'Lasange'],
+                ['Pizza', 'Lasange', 'Strogonvo'],
+            ],
+            '[Eimeldingen and Überligen] in (Rißtissen, Überligen, Karlsruhe)' => [
+                ['Eimeldingen', 'Ãœberligen'],
+                ['Rißtissen', 'Überligen', 'Karlsruhe'],
+            ],
+            '[Eimeldingen and überligen] in (Rißtissen, Überligen, Karlsruhe)' => [
+                ['Eimeldingen', 'überligen'],
+                ['Rißtissen', 'Überligen', 'Karlsruhe'],
             ],
         ];
     }
@@ -88,36 +228,119 @@ class InArrayValidatorTest extends AbstractValidatorTest
      *
      * @return array
      */
-    public function validArrayIgnoreCaseProvider()
+    public function validArrayForStringConfigurationIgnoreCaseProvider()
     {
         return [
-            '12 in (12, 13)' => [
+            '12 in (12, 13, 14)' => [
                 '12',
-                '12,13',
+                '12,13,14',
             ],
             '1 in (5, 3234, oOIUoi8, 3434, 343, 34, 3, 1, 333434, 1234, ssd, ysdfsa)' => [
                 '1',
                 '5,3234,oOIUoi8,3434,343,34,3,1,333434,1234,ssd,ysdfsa',
             ],
-            'Rißtissen in (Rißtissen, Überligen, Karlsruhe)' => [
+            'pizza in (Pizza, Lasange, Strogonvo)' => [
+                'pizza',
+                'Pizza,Lasange,Strogonvo',
+            ],
+            'Pizza in (pizza, lasange, strogonvo)' => [
+                'Pizza',
+                'pizza,lasange,strogonvo',
+            ],
+            'Rißtissen in (rißtissen, Überligen, Karlsruhe)' => [
                 'Rißtissen',
+                'rißtissen,Überligen,Karlsruhe',
+            ],
+            'überligen in (Rißtissen, Überligen, Karlsruhe)' => [
+                'überligen',
                 'Rißtissen,Überligen,Karlsruhe',
             ],
-            'überlingen in (Rißtissen, Überligen, Karlsruhe)' => [
-                'überlingen',
-                'Rißtissen,Überlingen,Karlsruhe',
+
+            '[12 and 14] in (12, 13, 14)' => [
+                ['12', '14'],
+                '12,13,14',
             ],
-            'Österreich in (österreich, deutschland, schweiz)' => [
-                'Österreich',
-                'österreich,deutschland,schweiz',
+            '[1 and Ssd] in (5, 3234, oOIUoi8, 3434, 343, 34, 3, 1, 333434, 1234, ssd, ysdfsa)' => [
+                ['1', 'Ssd'],
+                '5,3234,oOIUoi8,3434,343,34,3,1,333434,1234,ssd,ysdfsa',
             ],
-            'pizza in (Pizza, Lasange, Strogonvo)' => [
-                'pizza',
+            '[pizza and Lasange] in (Pizza, Lasange, Strogonvo)' => [
+                ['pizza', 'Lasange'],
                 'Pizza,Lasange,Strogonvo',
             ],
-            'lasange in (Pizza, Lasange, Strogonvo)' => [
-                'lasange',
-                'Pizza,Lasange,Strogonvo',
+            '[Pizza and lasange] in (pizza, lasange, strogonvo)' => [
+                ['Pizza', 'lasange'],
+                'pizza,lasange,strogonvo',
+            ],
+            '[Rißtissen and Karlsruhe] in (rißtissen, Überligen, Karlsruhe)' => [
+                ['Rißtissen', 'Karlsruhe'],
+                'rißtissen,Überligen,Karlsruhe',
+            ],
+            '[überligen and Karlsruhe] in (Rißtissen, Überligen, Karlsruhe)' => [
+                ['überligen', 'Karlsruhe'],
+                'Rißtissen,Überligen,Karlsruhe',
+            ],
+        ];
+    }
+
+    /**
+     * used for tests with valid input
+     * ignorecase is set to true
+     * results in no errors returned
+     *
+     * @return array
+     */
+    public function validArrayForArrayConfigurationIgnoreCaseProvider()
+    {
+        return [
+            '12 in [12, 13, 14]' => [
+                '12',
+                ['12', '13', '14'],
+            ],
+            '1 in [5, 3234, oOIUoi8, 3434, 343, 34, 3, 1, 333434, 1234, ssd, ysdfsa]' => [
+                '1',
+                ['5', '3234', 'oOIUoi8', '3434', '343', '34', '3', '1', '333434', '1234', 'ssd', 'ysdfsa'],
+            ],
+            'pizza in [Pizza, Lasange, Strogonvo]' => [
+                'pizza',
+                ['Pizza', 'Lasange', 'Strogonvo'],
+            ],
+            'Pizza in [pizza, lasange, strogonvo]' => [
+                'Pizza',
+                ['pizza', 'lasange', 'strogonvo'],
+            ],
+            'Rißtissen in (rißtissen, Überligen, Karlsruhe)' => [
+                'Rißtissen',
+                ['rißtissen', 'Überligen', 'Karlsruhe'],
+            ],
+            'überligen in (Rißtissen, Überligen, Karlsruhe)' => [
+                'überligen',
+                ['Rißtissen', 'Überligen', 'Karlsruhe'],
+            ],
+
+            '[12 and 14] in (12, 13, 14)' => [
+                ['12', '14'],
+                ['12', '13', '14'],
+            ],
+            '[1 and Ssd] in (5, 3234, oOIUoi8, 3434, 343, 34, 3, 1, 333434, 1234, ssd, ysdfsa)' => [
+                ['1', 'Ssd'],
+                ['5', '3234', 'oOIUoi8', '3434', '343', '34', '3', '1', '333434', '1234', 'ssd', 'ysdfsa'],
+            ],
+            '[pizza and Lasange] in (Pizza, Lasange, Strogonvo)' => [
+                ['pizza', 'Lasange'],
+                ['Pizza', 'Lasange', 'Strogonvo'],
+            ],
+            '[Pizza and lasange] in (pizza, lasange, strogonvo)' => [
+                ['Pizza', 'lasange'],
+                ['pizza', 'lasange', 'strogonvo'],
+            ],
+            '[Rißtissen and Karlsruhe] in (rißtissen, Überligen, Karlsruhe)' => [
+                ['Rißtissen', 'Karlsruhe'],
+                ['rißtissen', 'Überligen', 'Karlsruhe'],
+            ],
+            '[überligen and Karlsruhe] in (Rißtissen, Überligen, Karlsruhe)' => [
+                ['überligen', 'Karlsruhe'],
+                ['Rißtissen', 'Überligen', 'Karlsruhe'],
             ],
         ];
     }
@@ -129,12 +352,12 @@ class InArrayValidatorTest extends AbstractValidatorTest
      *
      * @return array
      */
-    public function invalidArrayIgnoreCaseProvider()
+    public function invalidArrayForStringConfigurationIgnoreCaseProvider()
     {
         return [
-            'zwölf in (12, 13)' => [
+            'zwölf in (12, 13, 14)' => [
                 'zwölf',
-                '12,13',
+                '12,13,14',
             ],
             '7 in (5, 3234, oOIUoi8, 3434, 343, 34, 3, 1, 333434, 1234, ssd, ysdfsa)' => [
                 '7',
@@ -152,22 +375,98 @@ class InArrayValidatorTest extends AbstractValidatorTest
                 'lusange',
                 'Pizza,Lasange,Strogonvo',
             ],
+
+            '[zwölf and 14] in (12, 13, 14)' => [
+                ['zwölf', '14'],
+                '12,13,14',
+            ],
+            '[7 and Ssd] in (5, 3234, oOIUoi8, 3434, 343, 34, 3, 1, 333434, 1234, ssd, ysdfsa)' => [
+                ['7', 'Ssd'],
+                '5,3234,oOIUoi8,3434,343,34,3,1,333434,1234,ssd,ysdfsa',
+            ],
+            '[riss and Karlsruhe] in (Rißtissen, Überligen, Karlsruhe)' => [
+                ['riss', 'Karlsruhe'],
+                'Rißtissen,Überligen,Karlsruhe',
+            ],
+            '[pizzas and Lasange] in (Pizza, Lasange, Strogonvo)' => [
+                ['pizzas', 'Lasange'],
+                'Pizza,Lasange,Strogonvo',
+            ],
+            '[lusange and Strogonvo] in (Pizza, Lasange, Strogonvo)' => [
+                ['lusange', 'Strogonvo'],
+                'Pizza,Lasange,Strogonvo',
+            ],
+        ];
+    }
+
+    /**
+     * used for tests with invalid input
+     * ignorecase is set to true
+     * results in errors returned
+     *
+     * @return array
+     */
+    public function invalidArrayForArrayConfigurationIgnoreCaseProvider()
+    {
+        return [
+            'zwölf in (12, 13, 14)' => [
+                'zwölf',
+                ['12', '13', '14'],
+            ],
+            '7 in (5, 3234, oOIUoi8, 3434, 343, 34, 3, 1, 333434, 1234, ssd, ysdfsa)' => [
+                '7',
+                ['5', '3234', 'oOIUoi8', '3434', '343', '34', '3', '1', '333434', '1234', 'ssd', 'ysdfsa'],
+            ],
+            'riss in (Rißtissen, Überligen, Karlsruhe)' => [
+                'riss',
+                ['Rißtissen', 'Überligen', 'Karlsruhe'],
+            ],
+            'pizzas in (Pizza, Lasange, Strogonvo)' => [
+                'pizzas',
+                ['Pizza', 'Lasange', 'Strogonvo'],
+            ],
+            'lusange in (Pizza, Lasange, Strogonvo)' => [
+                'lusange',
+                ['Pizza', 'Lasange', 'Strogonvo'],
+            ],
+
+            '[zwölf and 14] in (12, 13, 14)' => [
+                ['zwölf', '14'],
+                ['12', '13', '14'],
+            ],
+            '[7 and Ssd] in (5, 3234, oOIUoi8, 3434, 343, 34, 3, 1, 333434, 1234, ssd, ysdfsa)' => [
+                ['7', 'Ssd'],
+                ['5', '3234', 'oOIUoi8', '3434', '343', '34', '3', '1', '333434', '1234', 'ssd', 'ysdfsa'],
+            ],
+            '[riss and Karlsruhe] in (Rißtissen, Überligen, Karlsruhe)' => [
+                ['riss', 'Karlsruhe'],
+                ['Rißtissen', 'Überligen', 'Karlsruhe'],
+            ],
+            '[pizzas and Lasange] in (Pizza, Lasange, Strogonvo)' => [
+                ['pizzas', 'Lasange'],
+                ['Pizza', 'Lasange', 'Strogonvo'],
+            ],
+            '[lusange and Strogonvo] in (Pizza, Lasange, Strogonvo)' => [
+                ['lusange', 'Strogonvo'],
+                ['Pizza', 'Lasange', 'Strogonvo'],
+            ],
         ];
     }
 
     /**
      * @test
-     * @dataProvider validArrayProvider
+     * @dataProvider validArrayForStringConfigurationProvider
      *
      * @param string $value
      * @param string $allowedOptionsString
      */
-    public function validateForValidInputReturnsNoErrors($value, $allowedOptionsString)
+    public function validateForValidInputOnStringConfigurationReturnsNoErrors($value, $allowedOptionsString)
     {
         $options = [
             'element' => uniqid('test'),
             'errorMessage' => uniqid('error'),
         ];
+
         $options['array'] = $allowedOptionsString;
         $subject = $this->createSubject($options);
 
@@ -176,12 +475,31 @@ class InArrayValidatorTest extends AbstractValidatorTest
 
     /**
      * @test
-     * @dataProvider invalidArrayProvider
+     * @dataProvider validArrayForArrayConfigurationProvider
+     *
+     * @param string $value
+     * @param string $allowedOptionsString
+     */
+    public function validateForValidInputOnArrayConfigurationReturnsNoErrors($value, $allowedOptionsString)
+    {
+        $options = [
+            'element' => uniqid('test'),
+            'errorMessage' => uniqid('error'),
+        ];
+        $options['array.'] = $allowedOptionsString;
+        $subject = $this->createSubject($options);
+
+        $this->assertFalse($subject->validate($value)->hasErrors());
+    }
+
+    /**
+     * @test
+     * @dataProvider invalidArrayForStringConfigurationProvider
      *
      * @param string $value
      * @param string $allowedOptionsString
      */
-    public function validateForInvalidInputReturnsErrors($value, $allowedOptionsString)
+    public function validateForInvalidInputOnStringConfigurationReturnsErrors($value, $allowedOptionsString)
     {
         $options = [
             'element' => uniqid('test'),
@@ -195,12 +513,31 @@ class InArrayValidatorTest extends AbstractValidatorTest
 
     /**
      * @test
-     * @dataProvider validArrayProvider
+     * @dataProvider invalidArrayForArrayConfigurationProvider
      *
      * @param string $value
      * @param string $allowedOptionsString
      */
-    public function validateForValidInputWithStrictComparisonReturnsNoErrors(
+    public function validateForInvalidInputOnArrayConfigurationReturnsErrors($value, $allowedOptionsString)
+    {
+        $options = [
+            'element' => uniqid('test'),
+            'errorMessage' => uniqid('error'),
+        ];
+        $options['array.'] = $allowedOptionsString;
+        $subject = $this->createSubject($options);
+
+        $this->assertTrue($subject->validate($value)->hasErrors());
+    }
+
+    /**
+     * @test
+     * @dataProvider validArrayForStringConfigurationProvider
+     *
+     * @param string $value
+     * @param string $allowedOptionsString
+     */
+    public function validateForValidInputOnStringConfigurationWithStrictComparisonReturnsNoErrors(
         $value,
         $allowedOptionsString
     ) {
@@ -217,12 +554,34 @@ class InArrayValidatorTest extends AbstractValidatorTest
 
     /**
      * @test
-     * @dataProvider invalidArrayProvider
+     * @dataProvider validArrayForArrayConfigurationProvider
      *
      * @param string $value
      * @param string $allowedOptionsString
      */
-    public function validateForInvalidInputWithStrictComparisonReturnsErrors(
+    public function validateForValidInputOnArrayConfigurationWithStrictComparisonReturnsNoErrors(
+        $value,
+        $allowedOptionsString
+    ) {
+        $options = [
+            'element' => uniqid('test'),
+            'errorMessage' => uniqid('error'),
+        ];
+        $options['array.'] = $allowedOptionsString;
+        $options['strict'] = true;
+        $subject = $this->createSubject($options);
+
+        $this->assertFalse($subject->validate($value)->hasErrors());
+    }
+
+    /**
+     * @test
+     * @dataProvider invalidArrayForStringConfigurationProvider
+     *
+     * @param string $value
+     * @param string $allowedOptionsString
+     */
+    public function validateForInvalidInputOnStringConfigurationWithStrictComparisonReturnsErrors(
         $value,
         $allowedOptionsString
     ) {
@@ -239,12 +598,34 @@ class InArrayValidatorTest extends AbstractValidatorTest
 
     /**
      * @test
-     * @dataProvider validArrayIgnoreCaseProvider
+     * @dataProvider invalidArrayForArrayConfigurationProvider
+     *
+     * @param string $value
+     * @param string $allowedOptionsString
+     */
+    public function validateForInvalidInputOnArrayConfigurationWithStrictComparisonReturnsErrors(
+        $value,
+        $allowedOptionsString
+    ) {
+        $options = [
+            'element' => uniqid('test'),
+            'errorMessage' => uniqid('error'),
+        ];
+        $options['array.'] = $allowedOptionsString;
+        $options['strict'] = true;
+        $subject = $this->createSubject($options);
+
+        $this->assertTrue($subject->validate($value)->hasErrors());
+    }
+
+    /**
+     * @test
+     * @dataProvider validArrayForStringConfigurationIgnoreCaseProvider
      *
      * @param string $value
      * @param string $allowedOptionsString
      */
-    public function validateForValidInputWithIgnoreCaseReturnsNoErrors(
+    public function validateForValidInputOnStringConfigurationWithIgnoreCaseReturnsNoErrors(
         $value,
         $allowedOptionsString
     ) {
@@ -261,12 +642,34 @@ class InArrayValidatorTest extends AbstractValidatorTest
 
     /**
      * @test
-     * @dataProvider invalidArrayIgnoreCaseProvider
+     * @dataProvider validArrayForArrayConfigurationIgnoreCaseProvider
+     *
+     * @param string $value
+     * @param string $allowedOptionsString
+     */
+    public function validateForValidInputOnArrayConfigurationWithIgnoreCaseReturnsNoErrors(
+        $value,
+        $allowedOptionsString
+    ) {
+        $options = [
+            'element' => uniqid('test'),
+            'errorMessage' => uniqid('error'),
+        ];
+        $options['array.'] = $allowedOptionsString;
+        $options['ignorecase'] = true;
+        $subject = $this->createSubject($options);
+
+        $this->assertFalse($subject->validate($value)->hasErrors());
+    }
+
+    /**
+     * @test
+     * @dataProvider invalidArrayForStringConfigurationIgnoreCaseProvider
      *
      * @param string $value
      * @param string $allowedOptionsString
      */
-    public function validateForInvalidInputWithIgnoreCaseReturnsErrors(
+    public function validateForInvalidInputOnStringConfigurationWithIgnoreCaseReturnsErrors(
         $value,
         $allowedOptionsString
     ) {
@@ -283,12 +686,34 @@ class InArrayValidatorTest extends AbstractValidatorTest
 
     /**
      * @test
-     * @dataProvider validArrayIgnoreCaseProvider
+     * @dataProvider invalidArrayForArrayConfigurationIgnoreCaseProvider
      *
      * @param string $value
      * @param string $allowedOptionsString
      */
-    public function validateForValidInputWithIgnoreCaseAndStrictReturnsNoErrors(
+    public function validateForInvalidInputOnArrayConfigurationWithIgnoreCaseReturnsErrors(
+        $value,
+        $allowedOptionsString
+    ) {
+        $options = [
+            'element' => uniqid('test'),
+            'errorMessage' => uniqid('error'),
+        ];
+        $options['array.'] = $allowedOptionsString;
+        $options['ignorecase'] = true;
+        $subject = $this->createSubject($options);
+
+        $this->assertTrue($subject->validate($value)->hasErrors());
+    }
+
+    /**
+     * @test
+     * @dataProvider validArrayForStringConfigurationIgnoreCaseProvider
+     *
+     * @param string $value
+     * @param string $allowedOptionsString
+     */
+    public function validateForValidInputOnStringConfigurationWithIgnoreCaseAndStrictReturnsNoErrors(
         $value,
         $allowedOptionsString
     ) {
@@ -306,12 +731,35 @@ class InArrayValidatorTest extends AbstractValidatorTest
 
     /**
      * @test
-     * @dataProvider invalidArrayIgnoreCaseProvider
+     * @dataProvider validArrayForArrayConfigurationIgnoreCaseProvider
      *
      * @param string $value
      * @param string $allowedOptionsString
      */
-    public function validateForInvalidInputWithIgnoreCaseAndStrictReturnsErrors(
+    public function validateForValidInputOnArrayConfigurationWithIgnoreCaseAndStrictReturnsNoErrors(
+        $value,
+        $allowedOptionsString
+    ) {
+        $options = [
+            'element' => uniqid('test'),
+            'errorMessage' => uniqid('error'),
+        ];
+        $options['array.'] = $allowedOptionsString;
+        $options['ignorecase'] = true;
+        $options['strict'] = true;
+        $subject = $this->createSubject($options);
+
+        $this->assertFalse($subject->validate($value)->hasErrors());
+    }
+
+    /**
+     * @test
+     * @dataProvider invalidArrayForStringConfigurationIgnoreCaseProvider
+     *
+     * @param string $value
+     * @param string $allowedOptionsString
+     */
+    public function validateForInvalidInputOnStringConfigurationWithIgnoreCaseAndStrictReturnsErrors(
         $value,
         $allowedOptionsString
     ) {
@@ -326,4 +774,27 @@ class InArrayValidatorTest extends AbstractValidatorTest
 
         $this->assertTrue($subject->validate($value)->hasErrors());
     }
+
+    /**
+     * @test
+     * @dataProvider invalidArrayForArrayConfigurationIgnoreCaseProvider
+     *
+     * @param string $value
+     * @param string $allowedOptionsString
+     */
+    public function validateForInvalidInputOnArrayConfigurationWithIgnoreCaseAndStrictReturnsErrors(
+        $value,
+        $allowedOptionsString
+    ) {
+        $options = [
+            'element' => uniqid('test'),
+            'errorMessage' => uniqid('error'),
+        ];
+        $options['array.'] = $allowedOptionsString;
+        $options['ignorecase'] = true;
+        $options['strict'] = true;
+        $subject = $this->createSubject($options);
+
+        $this->assertTrue($subject->validate($value)->hasErrors());
+    }
 }
-- 
GitLab