From 13ecf4d9ce828ff142e6c5dab2e0e281d3f6e9c1 Mon Sep 17 00:00:00 2001
From: drugan <drugan@1578644.no-reply.drupal.org>
Date: Sun, 26 Mar 2017 05:49:38 +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     |   12 ++++-----
 .../KernelTests/Core/TypedData/TypedDataTest.php   |   27 ++++++++++++++++++++
 2 files changed, 33 insertions(+), 6 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..6ffdafe 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/NumericItemBase.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/NumericItemBase.php
@@ -78,26 +78,26 @@ 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' => [
             'min' => $min,
-            'minMessage' => t('%name: the value may be no less than %min.', ['%name' => $label, '%min' => $min]),
+            'minMessage' => $this->t('%name: the value may be no less than %min.', ['%name' => $label, '%min' => $min]),
           ]
         ],
       ]);
     }
 
-    if (!empty($settings['max'])) {
-      $max = $settings['max'];
+    if ($max !== NULL) {
       $constraints[] = $constraint_manager->create('ComplexData', [
         'value' => [
           'Range' => [
             'max' => $max,
-            'maxMessage' => t('%name: the value may be no greater than %max.', ['%name' => $label, '%max' => $max]),
+            'maxMessage' => $this->t('%name: the value may be no greater than %max.', ['%name' => $label, '%max' => $max]),
           ]
         ],
       ]);
diff --git a/core/tests/Drupal/KernelTests/Core/TypedData/TypedDataTest.php b/core/tests/Drupal/KernelTests/Core/TypedData/TypedDataTest.php
index c79f2cf..f1da20a 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, 6)->validate();
+    $this->assertEqual($violations->count(), 0);
+    $violations = $this->typedDataManager->create($definition, -1)->validate();
+    $this->assertEqual($violations->count(), 1);
+    $violations = $this->typedDataManager->create($definition, 0)->validate();
+    $this->assertEqual($violations->count(), 1);
+    // Test validating max setting.
+    $definition = BaseFieldDefinition::create('integer')
+      ->setSettings(['max' => 5]);
+    $violations = $this->typedDataManager->create($definition, 6)->validate();
+    $this->assertEqual($violations->count(), 1);
+    $violations = $this->typedDataManager->create($definition, -1)->validate();
+    $this->assertEqual($violations->count(), 0);
+    $violations = $this->typedDataManager->create($definition, 0)->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

