Patch 8.2.2782
Problem:    Vim9: blob operations not fully tested.
Solution:   Make more blob tests run in Vim9 script.  Fix filter().  Make
            insert() give an error for a null blob, like add().
Files:      src/list.c, src/testdir/test_blob.vim,
            src/testdir/test_vim9_builtin.vim


*** ../vim-8.2.2781/src/list.c  2021-04-18 14:12:27.707697058 +0200
--- src/list.c  2021-04-18 15:37:41.323438243 +0200
***************
*** 2223,2229 ****
                if (filter_map_one(&tv, expr, filtermap, &newtv, &rem) == FAIL
                                                                   || did_emsg)
                    break;
!               if (newtv.v_type != VAR_NUMBER)
                {
                    clear_tv(&newtv);
                    emsg(_(e_invalblob));
--- 2223,2229 ----
                if (filter_map_one(&tv, expr, filtermap, &newtv, &rem) == FAIL
                                                                   || did_emsg)
                    break;
!               if (newtv.v_type != VAR_NUMBER && newtv.v_type != VAR_BOOL)
                {
                    clear_tv(&newtv);
                    emsg(_(e_invalblob));
***************
*** 2736,2742 ****
  {
      long      before = 0;
      listitem_T        *item;
-     list_T    *l;
      int               error = FALSE;
  
      if (argvars[0].v_type == VAR_BLOB)
--- 2736,2741 ----
***************
*** 2745,2751 ****
--- 2744,2754 ----
        char_u      *p;
  
        if (argvars[0].vval.v_blob == NULL)
+       {
+           if (in_vim9script())
+               emsg(_(e_cannot_add_to_null_blob));
            return;
+       }
  
        len = blob_len(argvars[0].vval.v_blob);
        if (argvars[2].v_type != VAR_UNKNOWN)
***************
*** 2779,2808 ****
      }
      else if (argvars[0].v_type != VAR_LIST)
        semsg(_(e_listblobarg), "insert()");
!     else if ((l = argvars[0].vval.v_list) != NULL
!           && !value_check_lock(l->lv_lock,
!                                    (char_u *)N_("insert() argument"), TRUE))
      {
!       if (argvars[2].v_type != VAR_UNKNOWN)
!           before = (long)tv_get_number_chk(&argvars[2], &error);
!       if (error)
!           return;             // type error; errmsg already given
  
!       if (before == l->lv_len)
!           item = NULL;
!       else
        {
!           item = list_find(l, before);
!           if (item == NULL)
!           {
!               semsg(_(e_listidx), before);
!               l = NULL;
!           }
        }
!       if (l != NULL)
        {
!           (void)list_insert_tv(l, &argvars[1], item);
!           copy_tv(&argvars[0], rettv);
        }
      }
  }
--- 2782,2820 ----
      }
      else if (argvars[0].v_type != VAR_LIST)
        semsg(_(e_listblobarg), "insert()");
!     else
      {
!       list_T  *l = argvars[0].vval.v_list;
  
!       if (l == NULL)
        {
!           if (in_vim9script())
!               emsg(_(e_cannot_add_to_null_list));
        }
!       else if (!value_check_lock(l->lv_lock,
!                                    (char_u *)N_("insert() argument"), TRUE))
        {
!           if (argvars[2].v_type != VAR_UNKNOWN)
!               before = (long)tv_get_number_chk(&argvars[2], &error);
!           if (error)
!               return;         // type error; errmsg already given
! 
!           if (before == l->lv_len)
!               item = NULL;
!           else
!           {
!               item = list_find(l, before);
!               if (item == NULL)
!               {
!                   semsg(_(e_listidx), before);
!                   l = NULL;
!               }
!           }
!           if (l != NULL)
!           {
!               (void)list_insert_tv(l, &argvars[1], item);
!               copy_tv(&argvars[0], rettv);
!           }
        }
      }
  }
*** ../vim-8.2.2781/src/testdir/test_blob.vim   2021-04-18 14:12:27.707697058 
+0200
--- src/testdir/test_blob.vim   2021-04-18 15:39:15.674557872 +0200
***************
*** 379,423 ****
  
  " Test removing items in blob
  func Test_blob_func_remove()
!   " Test removing 1 element
!   let b = 0zDEADBEEF
!   call assert_equal(0xDE, remove(b, 0))
!   call assert_equal(0zADBEEF, b)
! 
!   let b = 0zDEADBEEF
!   call assert_equal(0xEF, remove(b, -1))
!   call assert_equal(0zDEADBE, b)
! 
!   let b = 0zDEADBEEF
!   call assert_equal(0xAD, remove(b, 1))
!   call assert_equal(0zDEBEEF, b)
! 
!   " Test removing range of element(s)
!   let b = 0zDEADBEEF
!   call assert_equal(0zBE, remove(b, 2, 2))
!   call assert_equal(0zDEADEF, b)
! 
!   let b = 0zDEADBEEF
!   call assert_equal(0zADBE, remove(b, 1, 2))
!   call assert_equal(0zDEEF, b)
  
    " Test invalid cases
!   let b = 0zDEADBEEF
!   call assert_fails("call remove(b, 5)", 'E979:')
!   call assert_fails("call remove(b, 1, 5)", 'E979:')
!   call assert_fails("call remove(b, 3, 2)", 'E979:')
!   call assert_fails("call remove(1, 0)", 'E896:')
!   call assert_fails("call remove(b, b)", 'E974:')
!   call assert_fails("call remove(b, 1, [])", 'E745:')
!   call assert_fails("call remove(test_null_blob(), 1, 2)", 'E979:')
  endfunc
  
  func Test_blob_read_write()
!   let b = 0zDEADBEEF
!   call writefile(b, 'Xblob')
!   let br = readfile('Xblob', 'B')
!   call assert_equal(b, br)
!   call delete('Xblob')
  
    " This was crashing when calling readfile() with a directory.
    call assert_fails("call readfile('.', 'B')", 'E17: "." is a directory')
--- 379,462 ----
  
  " Test removing items in blob
  func Test_blob_func_remove()
!   let lines =<< trim END
!       #" Test removing 1 element
!       VAR b = 0zDEADBEEF
!       call assert_equal(0xDE, remove(b, 0))
!       call assert_equal(0zADBEEF, b)
! 
!       LET b = 0zDEADBEEF
!       call assert_equal(0xEF, remove(b, -1))
!       call assert_equal(0zDEADBE, b)
! 
!       LET b = 0zDEADBEEF
!       call assert_equal(0xAD, remove(b, 1))
!       call assert_equal(0zDEBEEF, b)
! 
!       #" Test removing range of element(s)
!       LET b = 0zDEADBEEF
!       call assert_equal(0zBE, remove(b, 2, 2))
!       call assert_equal(0zDEADEF, b)
! 
!       LET b = 0zDEADBEEF
!       call assert_equal(0zADBE, remove(b, 1, 2))
!       call assert_equal(0zDEEF, b)
!   END
!   call CheckLegacyAndVim9Success(lines)
  
    " Test invalid cases
!   let lines =<< trim END
!       VAR b = 0zDEADBEEF
!       call remove(b, 5)
!   END
!   call CheckLegacyAndVim9Failure(lines, 'E979:')
! 
!   let lines =<< trim END
!       VAR b = 0zDEADBEEF
!       call remove(b, 1, 5)
!   END
!   call CheckLegacyAndVim9Failure(lines, 'E979:')
! 
!   let lines =<< trim END
!       VAR b = 0zDEADBEEF
!       call remove(b, 3, 2)
!   END
!   call CheckLegacyAndVim9Failure(lines, 'E979:')
! 
!   let lines =<< trim END
!       VAR b = 0zDEADBEEF
!       call remove(1, 0)
!   END
!   call CheckLegacyAndVim9Failure(lines, 'E896:')
! 
!   let lines =<< trim END
!       VAR b = 0zDEADBEEF
!       call remove(b, b)
!   END
!   call CheckLegacyAndVim9Failure(lines, 'E974:')
! 
!   let lines =<< trim END
!       VAR b = 0zDEADBEEF
!       call remove(b, 1, [])
!   END
!   call CheckLegacyAndVim9Failure(lines, 'E745:')
! 
!   let lines =<< trim END
!       VAR b = 0zDEADBEEF
!       call remove(test_null_blob(), 1, 2)
!   END
!   call CheckLegacyAndVim9Failure(lines, 'E979:')
  endfunc
  
  func Test_blob_read_write()
!   let lines =<< trim END
!       VAR b = 0zDEADBEEF
!       call writefile(b, 'Xblob')
!       VAR br = readfile('Xblob', 'B')
!       call assert_equal(b, br)
!       call delete('Xblob')
!   END
!   call CheckLegacyAndVim9Success(lines)
  
    " This was crashing when calling readfile() with a directory.
    call assert_fails("call readfile('.', 'B')", 'E17: "." is a directory')
***************
*** 425,508 ****
  
  " filter() item in blob
  func Test_blob_filter()
!   call assert_equal(test_null_blob(), filter(test_null_blob(), '0'))
!   call assert_equal(0z, filter(0zDEADBEEF, '0'))
!   call assert_equal(0zADBEEF, filter(0zDEADBEEF, 'v:val != 0xDE'))
!   call assert_equal(0zDEADEF, filter(0zDEADBEEF, 'v:val != 0xBE'))
!   call assert_equal(0zDEADBE, filter(0zDEADBEEF, 'v:val != 0xEF'))
!   call assert_equal(0zDEADBEEF, filter(0zDEADBEEF, '1'))
!   call assert_equal(0z01030103, filter(0z010203010203, 'v:val != 0x02'))
!   call assert_equal(0zADEF, filter(0zDEADBEEF, 'v:key % 2'))
  endfunc
  
  " map() item in blob
  func Test_blob_map()
!   call assert_equal(0zDFAEBFF0, map(0zDEADBEEF, 'v:val + 1'))
!   call assert_equal(0z00010203, map(0zDEADBEEF, 'v:key'))
!   call assert_equal(0zDEAEC0F2, map(0zDEADBEEF, 'v:key + v:val'))
! 
!   call assert_fails("call map(0z00, '[9]')", 'E978:')
  endfunc
  
  func Test_blob_index()
!   call assert_equal(2, index(0zDEADBEEF, 0xBE))
!   call assert_equal(-1, index(0zDEADBEEF, 0))
!   call assert_equal(2, index(0z11111111, 0x11, 2))
!   call assert_equal(3, 0z11110111->index(0x11, 2))
!   call assert_equal(2, index(0z11111111, 0x11, -2))
!   call assert_equal(3, index(0z11110111, 0x11, -2))
!   call assert_equal(0, index(0z11110111, 0x11, -10))
!   call assert_fails("echo index(0z11110111, 0x11, [])", 'E745:')
!   call assert_equal(-1, index(test_null_blob(), 1))
! 
!   call assert_fails('call index("asdf", 0)', 'E897:')
  endfunc
  
  func Test_blob_insert()
!   let b = 0zDEADBEEF
!   call insert(b, 0x33)
!   call assert_equal(0z33DEADBEEF, b)
! 
!   let b = 0zDEADBEEF
!   call insert(b, 0x33, 2)
!   call assert_equal(0zDEAD33BEEF, b)
! 
!   call assert_fails('call insert(b, -1)', 'E475:')
!   call assert_fails('call insert(b, 257)', 'E475:')
!   call assert_fails('call insert(b, 0, [9])', 'E745:')
!   call assert_fails('call insert(b, 0, -20)', 'E475:')
!   call assert_fails('call insert(b, 0, 20)', 'E475:')
!   call assert_fails('call insert(b, [])', 'E745:')
    call assert_equal(0, insert(test_null_blob(), 0x33))
  endfunc
  
  func Test_blob_reverse()
!   call assert_equal(0zEFBEADDE, reverse(0zDEADBEEF))
!   call assert_equal(0zBEADDE, reverse(0zDEADBE))
!   call assert_equal(0zADDE, reverse(0zDEAD))
!   call assert_equal(0zDE, reverse(0zDE))
!   call assert_equal(0z, reverse(test_null_blob()))
  endfunc
  
  func Test_blob_json_encode()
!   call assert_equal('[222,173,190,239]', json_encode(0zDEADBEEF))
!   call assert_equal('[]', json_encode(0z))
  endfunc
  
  func Test_blob_lock()
!   let b = 0z112233
!   lockvar b
!   call assert_fails('let b = 0z44', 'E741:')
!   unlockvar b
!   let b = 0z44
  endfunc
  
  func Test_blob_sort()
    if has('float')
!     call assert_fails('call sort([1.0, 0z11], "f")', 'E975:')
!   else
!     call assert_fails('call sort(["abc", 0z11], "f")', 'E702:')
    endif
  endfunc
  
  " vim: shiftwidth=2 sts=2 expandtab
--- 464,636 ----
  
  " filter() item in blob
  func Test_blob_filter()
!   let lines =<< trim END
!       call assert_equal(test_null_blob(), filter(test_null_blob(), '0'))
!       call assert_equal(0z, filter(0zDEADBEEF, '0'))
!       call assert_equal(0zADBEEF, filter(0zDEADBEEF, 'v:val != 0xDE'))
!       call assert_equal(0zDEADEF, filter(0zDEADBEEF, 'v:val != 0xBE'))
!       call assert_equal(0zDEADBE, filter(0zDEADBEEF, 'v:val != 0xEF'))
!       call assert_equal(0zDEADBEEF, filter(0zDEADBEEF, '1'))
!       call assert_equal(0z01030103, filter(0z010203010203, 'v:val != 0x02'))
!       call assert_equal(0zADEF, filter(0zDEADBEEF, 'v:key % 2'))
!   END
!   call CheckLegacyAndVim9Success(lines)
  endfunc
  
  " map() item in blob
  func Test_blob_map()
!   let lines =<< trim END
!       call assert_equal(0zDFAEBFF0, map(0zDEADBEEF, 'v:val + 1'))
!       call assert_equal(0z00010203, map(0zDEADBEEF, 'v:key'))
!       call assert_equal(0zDEAEC0F2, map(0zDEADBEEF, 'v:key + v:val'))
!   END
!   call CheckLegacyAndVim9Success(lines)
! 
!   let lines =<< trim END
!       call map(0z00, '[9]')
!   END
!   call CheckLegacyAndVim9Failure(lines, 'E978:')
  endfunc
  
  func Test_blob_index()
!   let lines =<< trim END
!       call assert_equal(2, index(0zDEADBEEF, 0xBE))
!       call assert_equal(-1, index(0zDEADBEEF, 0))
!       call assert_equal(2, index(0z11111111, 0x11, 2))
!       call assert_equal(3, 0z11110111->index(0x11, 2))
!       call assert_equal(2, index(0z11111111, 0x11, -2))
!       call assert_equal(3, index(0z11110111, 0x11, -2))
!       call assert_equal(0, index(0z11110111, 0x11, -10))
!       call assert_equal(-1, index(test_null_blob(), 1))
!   END
!   call CheckLegacyAndVim9Success(lines)
! 
!   let lines =<< trim END
!       echo index(0z11110111, 0x11, [])
!   END
!   call CheckLegacyAndVim9Failure(lines, 'E745:')
! 
!   let lines =<< trim END
!       call index("asdf", 0)
!   END
!   call CheckLegacyAndVim9Failure(lines, 'E897:')
  endfunc
  
  func Test_blob_insert()
!   let lines =<< trim END
!       VAR b = 0zDEADBEEF
!       call insert(b, 0x33)
!       call assert_equal(0z33DEADBEEF, b)
! 
!       LET b = 0zDEADBEEF
!       call insert(b, 0x33, 2)
!       call assert_equal(0zDEAD33BEEF, b)
!   END
!   call CheckLegacyAndVim9Success(lines)
! 
!   " only works in legacy script
    call assert_equal(0, insert(test_null_blob(), 0x33))
+ 
+   let lines =<< trim END
+       VAR b = 0zDEADBEEF
+       call insert(b, -1)
+   END
+   call CheckLegacyAndVim9Failure(lines, 'E475:')
+ 
+   let lines =<< trim END
+       VAR b = 0zDEADBEEF
+       call insert(b, 257)
+   END
+   call CheckLegacyAndVim9Failure(lines, 'E475:')
+ 
+   let lines =<< trim END
+       VAR b = 0zDEADBEEF
+       call insert(b, 0, [9])
+   END
+   call CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E745:'])
+ 
+   let lines =<< trim END
+       VAR b = 0zDEADBEEF
+       call insert(b, 0, -20)
+   END
+   call CheckLegacyAndVim9Failure(lines, 'E475:')
+ 
+   let lines =<< trim END
+       VAR b = 0zDEADBEEF
+       call insert(b, 0, 20)
+   END
+   call CheckLegacyAndVim9Failure(lines, 'E475:')
+ 
+   let lines =<< trim END
+       VAR b = 0zDEADBEEF
+       call insert(b, [])
+   END
+   call CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E745:'])
+ 
+   let lines =<< trim END
+       insert(test_null_blob(), 0x33)
+   END
+   call CheckDefExecAndScriptFailure(lines, 'E1131:')
  endfunc
  
  func Test_blob_reverse()
!   let lines =<< trim END
!       call assert_equal(0zEFBEADDE, reverse(0zDEADBEEF))
!       call assert_equal(0zBEADDE, reverse(0zDEADBE))
!       call assert_equal(0zADDE, reverse(0zDEAD))
!       call assert_equal(0zDE, reverse(0zDE))
!       call assert_equal(0z, reverse(test_null_blob()))
!   END
!   call CheckLegacyAndVim9Success(lines)
  endfunc
  
  func Test_blob_json_encode()
!   let lines =<< trim END
!       call assert_equal('[222,173,190,239]', json_encode(0zDEADBEEF))
!       call assert_equal('[]', json_encode(0z))
!   END
!   call CheckLegacyAndVim9Success(lines)
  endfunc
  
  func Test_blob_lock()
!   let lines =<< trim END
!       let b = 0z112233
!       lockvar b
!       unlockvar b
!       let b = 0z44
!   END
!   call CheckScriptSuccess(lines)
! 
!   let lines =<< trim END
!       vim9script
!       var b = 0z112233
!       lockvar b
!       unlockvar b
!       b = 0z44
!   END
!   call CheckScriptSuccess(lines)
! 
!   let lines =<< trim END
!       let b = 0z112233
!       lockvar b
!       let b = 0z44
!   END
!   call CheckScriptFailure(lines, 'E741:')
! 
!   let lines =<< trim END
!       vim9script
!       var b = 0z112233
!       lockvar b
!       b = 0z44
!   END
!   call CheckScriptFailure(lines, 'E741:')
  endfunc
  
  func Test_blob_sort()
    if has('float')
!     call CheckLegacyAndVim9Failure(['call sort([1.0, 0z11], "f")'], 'E975:')
    endif
+   call CheckLegacyAndVim9Failure(['call sort(["abc", 0z11], "f")'], 'E892:')
  endfunc
  
  " vim: shiftwidth=2 sts=2 expandtab
*** ../vim-8.2.2781/src/testdir/test_vim9_builtin.vim   2021-04-18 
14:12:27.707697058 +0200
--- src/testdir/test_vim9_builtin.vim   2021-04-18 15:41:50.381044957 +0200
***************
*** 719,724 ****
--- 719,734 ----
    endfor
    res->assert_equal(6)
  
+   var lines =<< trim END
+       insert(test_null_list(), 123)
+   END
+   CheckDefExecAndScriptFailure(lines, 'E1130:', 1)
+ 
+   lines =<< trim END
+       insert(test_null_blob(), 123)
+   END
+   CheckDefExecAndScriptFailure(lines, 'E1131:', 1)
+ 
    assert_equal([1, 2, 3], insert([2, 3], 1))
    assert_equal([1, 2, 3], insert([2, 3], s:number_one))
    assert_equal([1, 2, 3], insert([1, 2], 3, 2))
*** ../vim-8.2.2781/src/version.c       2021-04-18 14:12:27.707697058 +0200
--- src/version.c       2021-04-18 14:38:31.733302175 +0200
***************
*** 752,753 ****
--- 752,755 ----
  {   /* Add new patch number below this line */
+ /**/
+     2782,
  /**/

-- 
"A clear conscience is usually the sign of a bad memory."
                             -- Steven Wright

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202104181348.13IDmY7k323482%40masaka.moolenaar.net.

Raspunde prin e-mail lui