From bf01a8e0190a1f27a4f7eb4e4c03ff3a27612c95 Mon Sep 17 00:00:00 2001
From: Asmir Mustafic <goetas@gmail.com>
Date: Mon, 24 Sep 2018 17:35:57 +0200
Subject: [PATCH] add boolean enums support to forms

---
 ModelDescriber/FormModelDescriber.php | 25 ++++++++++++++++++++++++-
 Tests/Functional/Form/DummyType.php   |  1 +
 Tests/Functional/FunctionalTest.php   |  4 ++++
 3 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/ModelDescriber/FormModelDescriber.php b/ModelDescriber/FormModelDescriber.php
index 6262e89..15fd27a 100644
--- a/ModelDescriber/FormModelDescriber.php
+++ b/ModelDescriber/FormModelDescriber.php
@@ -147,7 +147,14 @@ final class FormModelDescriber implements ModelDescriberInterface, ModelRegistry
                 }
                 if (($choices = $config->getOption('choices')) && is_array($choices) && count($choices)) {
                     $enums = array_values($choices);
-                    $type = $this->isNumbersArray($enums) ? 'number' : 'string';
+                    if ($this->isNumbersArray($enums)) {
+                        $type = 'number';
+                    } elseif ($this->isBooleansArray($enums)) {
+                        $type = 'boolean';
+                    } else {
+                        $type = 'string';
+                    }
+
                     if ($config->getOption('multiple')) {
                         $property->getItems()->setType($type)->setEnum($enums);
                     } else {
@@ -233,6 +240,22 @@ final class FormModelDescriber implements ModelDescriberInterface, ModelRegistry
         return true;
     }
 
+    /**
+     * @param array $array
+     *
+     * @return bool true if $array contains only booleans, false otherwise
+     */
+    private function isBooleansArray(array $array): bool
+    {
+        foreach ($array as $item) {
+            if (!is_bool($item)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
     /**
      * @param ResolvedFormTypeInterface $type
      *
diff --git a/Tests/Functional/Form/DummyType.php b/Tests/Functional/Form/DummyType.php
index 0a8cc4a..453a191 100644
--- a/Tests/Functional/Form/DummyType.php
+++ b/Tests/Functional/Form/DummyType.php
@@ -26,6 +26,7 @@ class DummyType extends AbstractType
     {
         $builder->add('bar', TextType::class, ['required' => false]);
         $builder->add('foo', ChoiceType::class, ['choices' => ['male', 'female']]);
+        $builder->add('boo', ChoiceType::class, ['choices' => [true, false], 'required' => false]);
         $builder->add('foz', ChoiceType::class, ['choices' => ['male', 'female'], 'multiple' => true]);
         $builder->add('baz', CheckboxType::class, ['required' => false]);
         $builder->add('bey', IntegerType::class, ['required' => false]);
diff --git a/Tests/Functional/FunctionalTest.php b/Tests/Functional/FunctionalTest.php
index dbd2012..9db02d0 100644
--- a/Tests/Functional/FunctionalTest.php
+++ b/Tests/Functional/FunctionalTest.php
@@ -285,6 +285,10 @@ class FunctionalTest extends WebTestCase
                     'type' => 'string',
                     'enum' => ['male', 'female'],
                 ],
+                'boo' => [
+                    'type' => 'boolean',
+                    'enum' => [true, false],
+                ],
                 'foz' => [
                     'type' => 'array',
                     'items' => [