From 16dc6b50324bf4e5e4ec2a40bf143d6548311281 Mon Sep 17 00:00:00 2001
From: drugan <drugan@1578644.no-reply.drupal.org>
Date: Sun, 26 Mar 2017 14:27:43 +0300
Subject: [PATCH] Issue #2838121 by vaplas, arshadcn, joe_carvajal,
 pingwin4eg, amateescu, alexpott, drugan: Numeric item
 min/max settings ignored if set to 0

---
 .../Plugin/Field/FieldType/NumericItemBase.php     |    8 +++---
 .../KernelTests/Core/TypedData/TypedDataTest.php   |   27 ++++++++++++++++++++
 2 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/NumericItemBase.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/NumericItemBase.php
index 23f5161..471e449 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/NumericItemBase.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/NumericItemBase.php
@@ -78,9 +78,10 @@ public function getConstraints() {
 
     $settings = $this->getSettings();
     $label = $this->getFieldDefinition()->getLabel();
+    $min = is_numeric($settings['min']) ? $settings['min'] : NULL;
+    $max = is_numeric($settings['max']) ? $settings['max'] : NULL;
 
-    if (!empty($settings['min'])) {
-      $min = $settings['min'];
+    if ($min !== NULL) {
       $constraints[] = $constraint_manager->create('ComplexData', [
         'value' => [
           'Range' => [
@@ -91,8 +92,7 @@ public function getConstraints() {
       ]);
     }
 
-    if (!empty($settings['max'])) {
-      $max = $settings['max'];
+    if ($max !== NULL) {
       $constraints[] = $constraint_manager->create('ComplexData', [
         'value' => [
           'Range' => [
diff --git a/core/tests/Drupal/KernelTests/Core/TypedData/TypedDataTest.php b/core/tests/Drupal/KernelTests/Core/TypedData/TypedDataTest.php
index c79f2cf..ec6fd68 100644
--- a/core/tests/Drupal/KernelTests/Core/TypedData/TypedDataTest.php
+++ b/core/tests/Drupal/KernelTests/Core/TypedData/TypedDataTest.php
@@ -114,6 +114,33 @@ public function testGetAndSet() {
     $this->assertEqual($typed_data->validate()->count(), 0);
     $typed_data->setValue('invalid');
     $this->assertEqual($typed_data->validate()->count(), 1, 'Validation detected invalid value.');
+    // Test validating min setting.
+    $definition = BaseFieldDefinition::create('integer')
+      ->setSettings(['min' => 5]);
+    $violations = $this->typedDataManager->create($definition, 5)->validate();
+    $this->assertEqual($violations->count(), 0);
+    $violations = $this->typedDataManager->create($definition, 6)->validate();
+    $this->assertEqual($violations->count(), 0);
+    $violations = $this->typedDataManager->create($definition, 4)->validate();
+    $this->assertEqual($violations->count(), 1);
+    // Test validating max setting.
+    $definition = BaseFieldDefinition::create('integer')
+      ->setSettings(['max' => 5]);
+    $violations = $this->typedDataManager->create($definition, 5)->validate();
+    $this->assertEqual($violations->count(), 0);
+    $violations = $this->typedDataManager->create($definition, 6)->validate();
+    $this->assertEqual($violations->count(), 1);
+    $violations = $this->typedDataManager->create($definition, 4)->validate();
+    $this->assertEqual($violations->count(), 0);
+    // Test validating when settings min/max = 0.
+    $definition = BaseFieldDefinition::create('integer')
+      ->setSettings(['min' => 0, 'max' => 0]);
+    $violations = $this->typedDataManager->create($definition, 0)->validate();
+    $this->assertEqual($violations->count(), 0);
+    $violations = $this->typedDataManager->create($definition, 1)->validate();
+    $this->assertEqual($violations->count(), 1);
+    $violations = $this->typedDataManager->create($definition, -1)->validate();
+    $this->assertEqual($violations->count(), 1);
 
     // Float type.
     $value = 123.45;
-- 
1.7.9.5

