New valid_length and fix valid_range

- New valid_length function
- Also fixed some errors in valid_range

Change-Id: I1a9856ee796388d189060f9b860cd88ff3e9e16c
Signed-off-by: Michael Walsh <micwalsh@us.ibm.com>
diff --git a/lib/gen_robot_valid.py b/lib/gen_robot_valid.py
index 556561d..160da0c 100755
--- a/lib/gen_robot_valid.py
+++ b/lib/gen_robot_valid.py
@@ -214,6 +214,14 @@
     process_error_message(error_message)
 
 
+def valid_length(var_name, *args, **kwargs):
+
+    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
+    error_message = \
+        gv.valid_length(var_value, *args, var_name=var_name, **kwargs)
+    process_error_message(error_message)
+
+
 # Modify the validation function docstrings by calling customize_doc_string
 # for each function in the func_names list.
 func_names = [
diff --git a/lib/gen_valid.py b/lib/gen_valid.py
index 53466dc..1faf3a7 100755
--- a/lib/gen_valid.py
+++ b/lib/gen_valid.py
@@ -310,11 +310,11 @@
     """
 
     error_message = ""
-    if not lower and not upper:
+    if lower is None and upper is None:
         return process_error_message(error_message)
-    if not lower and var_value <= upper:
+    if lower is None and var_value <= upper:
         return process_error_message(error_message)
-    if not upper and var_value >= lower:
+    if upper is None and var_value >= lower:
         return process_error_message(error_message)
     if lower and upper:
         if lower > upper:
@@ -592,6 +592,37 @@
     return process_error_message(error_message)
 
 
+def valid_length(var_value, min_length=None, max_length=None, *args, **kwargs):
+    r"""
+    The variable value is valid if it is an object (e.g. list, dictionary)
+    whose length is within the specified range.
+
+    Description of argument(s):
+    var_value                       The value being validated.
+    min_length                      The minimum length of the object.  If not
+                                    None, the length of var_value must be
+                                    greater than or equal to min_length.
+    max_length                      The maximum length of the object.  If not
+                                    None, the length of var_value must be less
+                                    than or equal to min_length.
+    """
+
+    error_message = ""
+    length = len(var_value)
+    error_message = valid_range(length, min_length, max_length)
+    if error_message:
+        var_name = get_var_name(*args, **kwargs)
+        error_message = "The length of the following object is not within the"
+        error_message += " expected range:\n"
+        error_message += gp.sprint_var(length)
+        error_message += gp.sprint_varx(var_name, var_value, gp.blank())
+        error_message += "\n"
+        error_message += gp.sprint_vars(min_length, max_length)
+        return process_error_message(error_message)
+
+    return process_error_message(error_message)
+
+
 # Modify selected function docstrings by adding headers/footers.
 
 func_names = [