]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.0387: Vim9: null value tests not sufficient v9.1.0387
authorYegappan Lakshmanan <yegappan@yahoo.com>
Thu, 2 May 2024 11:02:36 +0000 (13:02 +0200)
committerChristian Brabandt <cb@256bit.org>
Thu, 2 May 2024 11:02:36 +0000 (13:02 +0200)
Problem:  Vim9: null value tests not sufficient
Solution: Add a more comprehensive test for null values
          (Yegappan Lakshmanan)

closes: #14701

Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/eval.c
src/evalfunc.c
src/testdir/test_vim9_builtin.vim
src/testdir/test_vim9_class.vim
src/testdir/test_vim9_script.vim
src/version.c
src/vim9type.c

index 21ba1bcfcde37c4d83b5f754a049fbc23552c06c..a91ca2d3e51459daa866e8660c534ad45691a16c 100644 (file)
@@ -6403,9 +6403,9 @@ echo_string_core(
            {
                class_T *cl = tv->vval.v_class;
                char *s = "class";
-               if (cl && IS_INTERFACE(cl))
+               if (cl != NULL && IS_INTERFACE(cl))
                    s = "interface";
-               else if (cl && IS_ENUM(cl))
+               else if (cl != NULL && IS_ENUM(cl))
                    s = "enum";
                size_t len = STRLEN(s) + 1 +
                    (cl == NULL ? 9 : STRLEN(cl->class_name)) + 1;
index 742c5f8e79a5f0ee0d04f930b7c46a694cec1bf7..8ee5cbddd5f63c7500813ad458091de0f9c27127 100644 (file)
@@ -3958,7 +3958,7 @@ f_empty(typval_T *argvars, typval_T *rettv)
                                          || *argvars[0].vval.v_string == NUL;
            break;
        case VAR_PARTIAL:
-           n = FALSE;
+           n = argvars[0].vval.v_partial == NULL;
            break;
        case VAR_NUMBER:
            n = argvars[0].vval.v_number == 0;
@@ -11497,7 +11497,7 @@ f_type(typval_T *argvars, typval_T *rettv)
        case VAR_CLASS:
            {
                class_T *cl = argvars[0].vval.v_class;
-               if (cl && IS_ENUM(cl))
+               if (cl != NULL && IS_ENUM(cl))
                    n = VAR_TYPE_ENUM;
                else
                    n = VAR_TYPE_CLASS;
index 42d09fe9a53cb0f7bde292e38829d52148341ceb..83153ad08500ff5ede18ba627da84edb4adb6d5a 100644 (file)
@@ -4783,8 +4783,6 @@ def Test_typename()
   if has('channel')
     assert_equal('channel', test_null_channel()->typename())
   endif
-  assert_equal('class<Unknown>', typename(null_class))
-  assert_equal('object<Unknown>', typename(null_object))
   var l: list<func(list<number>): number> = [function('min')]
   assert_equal('list<func(list<number>): number>', typename(l))
 enddef
index 0a48b822df0d6d4b8c5d0a41159804e587c92b37..0754af7deccd6f5d02dd5c59a7079c9904454252 100644 (file)
@@ -560,7 +560,7 @@ def Test_using_null_class()
   END
   v9.CheckSourceSuccess(lines)
 
-  # Test for using a null class with string()
+  # Test for using a null class with type() and typename()
   lines =<< trim END
     vim9script
     assert_equal(12, type(null_class))
@@ -569,30 +569,6 @@ def Test_using_null_class()
   v9.CheckSourceSuccess(lines)
 enddef
 
-def Test_using_null_object()
-  # Test for using a null object as a value
-  var lines =<< trim END
-    vim9script
-    assert_equal(1, empty(null_object))
-  END
-  v9.CheckSourceSuccess(lines)
-
-  # Test for using a null object with string()
-  lines =<< trim END
-    vim9script
-    assert_equal('object of [unknown]', string(null_object))
-  END
-  v9.CheckSourceSuccess(lines)
-
-  # Test for using a null object with string()
-  lines =<< trim END
-    vim9script
-    assert_equal(13, type(null_object))
-    assert_equal('object<Unknown>', typename(null_object))
-  END
-  v9.CheckSourceSuccess(lines)
-enddef
-
 def Test_class_interface_wrong_end()
   var lines =<< trim END
     vim9script
index a3f21bed022d1ae381d6f958c23ce3848b1faca9..9ec92b398d5420901f50a437634c819803a61dab 100644 (file)
@@ -5055,6 +5055,34 @@ def Test_eval_lambda_block()
   v9.CheckSourceSuccess(lines)
 enddef
 
+" Test for using various null values
+def Test_null_values()
+  var lines =<< trim END
+    var nullValues = [
+      [null, 1, 'null', 7, 'special'],
+      [null_blob, 1, '0z', 10, 'blob'],
+      [null_channel, 1, 'channel fail', 9, 'channel'],
+      [null_dict, 1, '{}', 4, 'dict<any>'],
+      [null_function, 1, "function('')", 2, 'func(...): unknown'],
+      [null_job, 1, 'no process', 8, 'job'],
+      [null_list, 1, '[]', 3, 'list<any>'],
+      [null_object, 1, 'object of [unknown]', 13, 'object<Unknown>'],
+      [null_partial, 1, "function('')", 2, 'func(...): unknown'],
+      [null_string, 1, "''", 1, 'string']
+    ]
+
+    for [Val, emptyExp, stringExp, typeExp, typenameExp] in nullValues
+      assert_equal(emptyExp, empty(Val))
+      assert_equal(stringExp, string(Val))
+      assert_equal(typeExp, type(Val))
+      assert_equal(typenameExp, typename(Val))
+      assert_equal(Val, copy(Val))
+      assert_equal(-1, test_refcount(Val))
+    endfor
+  END
+  v9.CheckSourceDefAndScriptSuccess(lines)
+enddef
+
 " Keep this last, it messes up highlighting.
 def Test_substitute_cmd()
   new
index ee336f82ca381ae6a167d5aacfd8f656d972ba0b..6dbd93a7f6ea28c1b02df7bd15ae6f1f9d92d25b 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    387,
 /**/
     386,
 /**/
index ab7efce7a04b56a1bc8480b7f476b2ff00fd5486..517dee2805fb012896e5fc11867b02f029535556 100644 (file)
@@ -2093,7 +2093,7 @@ check_typval_is_value(typval_T *tv)
                class_T *cl = tv->vval.v_class;
                char_u *class_name = (cl == NULL) ? (char_u *)""
                                                        : cl->class_name;
-               if (cl && IS_ENUM(cl))
+               if (cl != NULL && IS_ENUM(cl))
                    semsg(_(e_using_enum_as_value_str), class_name);
                else
                    semsg(_(e_using_class_as_value_str), class_name);