]> granicus.if.org Git - vim/commitdiff
patch 8.2.0288: Vim9: some float and blob operators not tested v8.2.0288
authorBram Moolenaar <Bram@vim.org>
Thu, 20 Feb 2020 21:14:31 +0000 (22:14 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 20 Feb 2020 21:14:31 +0000 (22:14 +0100)
Problem:    Vim9: some float and blob operators not tested.
Solution:   Add float and blob tests.  Fix addition.

src/testdir/test_vim9_expr.vim
src/version.c
src/vim9compile.c

index 1b04d02781bec6da8b0d520d1e8c83fcb03f1ae3..fabbd9b82bc1d55993e003e06e30838c64d794a0 100644 (file)
@@ -286,32 +286,54 @@ enddef
 
 " test > comperator
 def Test_expr4_greater()
-  assert_equal(true, 2 > 0)
-  assert_equal(true, 2 > 1)
-  assert_equal(false, 2 > 2)
-  assert_equal(false, 2 > 3)
+  assert_true(2 > 0)
+  assert_true(2 > 1)
+  assert_false(2 > 2)
+  assert_false(2 > 3)
+  if has('float')
+    assert_true(2.0 > 0.0)
+    assert_true(2.0 > 1.0)
+    assert_false(2.0 > 2.0)
+    assert_false(2.0 > 3.0)
+  endif
 enddef
 
 " test >= comperator
 def Test_expr4_greaterequal()
-  assert_equal(true, 2 >= 0)
-  assert_equal(true, 2 >= 2)
-  assert_equal(false, 2 >= 3)
+  assert_true(2 >= 0)
+  assert_true(2 >= 2)
+  assert_false(2 >= 3)
+  if has('float')
+    assert_true(2.0 >= 0.0)
+    assert_true(2.0 >= 2.0)
+    assert_false(2.0 >= 3.0)
+  endif
 enddef
 
 " test < comperator
 def Test_expr4_smaller()
-  assert_equal(false, 2 < 0)
-  assert_equal(false, 2 < 2)
-  assert_equal(true, 2 < 3)
+  assert_false(2 < 0)
+  assert_false(2 < 2)
+  assert_true(2 < 3)
+  if has('float')
+    assert_false(2.0 < 0.0)
+    assert_false(2.0 < 2.0)
+    assert_true(2.0 < 3.0)
+  endif
 enddef
 
 " test <= comperator
 def Test_expr4_smallerequal()
-  assert_equal(false, 2 <= 0)
-  assert_equal(false, 2 <= 1)
-  assert_equal(true, 2 <= 2)
-  assert_equal(true, 2 <= 3)
+  assert_false(2 <= 0)
+  assert_false(2 <= 1)
+  assert_true(2 <= 2)
+  assert_true(2 <= 3)
+  if has('float')
+    assert_false(2.0 <= 0.0)
+    assert_false(2.0 <= 1.0)
+    assert_true(2.0 <= 2.0)
+    assert_true(2.0 <= 3.0)
+  endif
 enddef
 
 " test =~ comperator
@@ -329,18 +351,28 @@ enddef
 " test is comperator
 def Test_expr4_is()
   let mylist = [2]
-  assert_equal(false, mylist is [2])
+  assert_false(mylist is [2])
   let other = mylist
-  assert_equal(true, mylist is other)
+  assert_true(mylist is other)
+
+  let myblob = 0z1234
+  assert_false(myblob is 0z1234)
+  let otherblob = myblob
+  assert_true(myblob is otherblob)
 enddef
 
 " test isnot comperator
 def Test_expr4_isnot()
   let mylist = [2]
-  assert_equal(true, '2' isnot '0')
-  assert_equal(true, mylist isnot [2])
+  assert_true('2' isnot '0')
+  assert_true(mylist isnot [2])
   let other = mylist
-  assert_equal(false, mylist isnot other)
+  assert_false(mylist isnot other)
+
+  let myblob = 0z1234
+  assert_true(myblob isnot 0z1234)
+  let otherblob = myblob
+  assert_false(myblob isnot otherblob)
 enddef
 
 def RetVoid()
@@ -427,6 +459,12 @@ def Test_expr5()
   assert_equal('hello 123', 'hello ' .. 123)
   assert_equal('123 hello', 123 .. ' hello')
   assert_equal('123456', 123 .. 456)
+
+  assert_equal([1, 2, 3, 4], [1, 2] + [3, 4])
+  assert_equal(0z11223344, 0z1122 + 0z3344)
+  assert_equal(0z112201ab, 0z1122 + g:ablob)
+  assert_equal(0z01ab3344, g:ablob + 0z3344)
+  assert_equal(0z01ab01ab, g:ablob + g:ablob)
 enddef
 
 def Test_expr5_float()
@@ -466,6 +504,13 @@ func Test_expr5_fails()
   call CheckDefFailure("let x = '1'..'2'", msg)
   call CheckDefFailure("let x = '1' ..'2'", msg)
   call CheckDefFailure("let x = '1'.. '2'", msg)
+
+  call CheckDefFailure("let x = 0z1122 + 33", 'E1035')
+  call CheckDefFailure("let x = 0z1122 + [3]", 'E1035')
+  call CheckDefFailure("let x = 0z1122 + 'asd'", 'E1035')
+  call CheckDefFailure("let x = 33 + 0z1122", 'E1035')
+  call CheckDefFailure("let x = [3] + 0z1122", 'E1035')
+  call CheckDefFailure("let x = 'asdf' + 0z1122", 'E1035')
 endfunc
 
 " test multiply, divide, modulo
@@ -650,6 +695,10 @@ def Test_expr7_list()
   assert_equal(g:list_empty, [])
   assert_equal(g:list_empty, [  ])
   assert_equal(g:list_mixed, [1, 'b', false])
+
+  call CheckDefExecFailure("let x = g:anint[3]", 'E714:')
+  call CheckDefExecFailure("let x = g:list_mixed['xx']", 'E39:')
+  call CheckDefExecFailure("let x = g:list_empty[3]", 'E684:')
 enddef
 
 def Test_expr7_lambda()
@@ -667,6 +716,9 @@ def Test_expr7_dict()
   let key = 'one'
   let val = 1
   assert_equal(g:dict_one, {key: val})
+
+  call CheckDefExecFailure("let x = g:anint.member", 'E715:')
+  call CheckDefExecFailure("let x = g:dict_empty.member", 'E716:')
 enddef
 
 def Test_expr7_option()
index 4be1aa357b4371270dffda1cfe327cc3e04882e8..39a0fda14f6185b9c0c7387ec95a3780cdf5b218 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    288,
 /**/
     287,
 /**/
index 45dbf4337f3e7aa3950d66c2c2d51c7b766b5fae..912f8cad284b9386a6bd14b5e2d7fdc1246c1d45 100644 (file)
@@ -374,6 +374,8 @@ generate_two_op(cctx_T *cctx, char_u *op)
     switch (*op)
     {
        case '+': if (vartype != VAR_LIST && vartype != VAR_BLOB
+                         && type1->tt_type != VAR_UNKNOWN
+                         && type2->tt_type != VAR_UNKNOWN
                          && check_number_or_float(
                                   type1->tt_type, type2->tt_type, op) == FAIL)
                      return FAIL;
@@ -1074,9 +1076,16 @@ generate_MEMBER(cctx_T *cctx, char_u *name, size_t len)
        return FAIL;
     isn->isn_arg.string = vim_strnsave(name, (int)len);
 
-    // change dict type to dict member type
+    // check for dict type
     type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
-    ((type_T **)stack->ga_data)[stack->ga_len - 1] = type->tt_member;
+    if (type->tt_type != VAR_DICT && type != &t_any)
+    {
+       emsg(_(e_dictreq));
+       return FAIL;
+    }
+    // change dict type to dict member type
+    if (type->tt_type == VAR_DICT)
+       ((type_T **)stack->ga_data)[stack->ga_len - 1] = type->tt_member;
 
     return OK;
 }
@@ -2370,7 +2379,8 @@ compile_subscript(
                emsg(_(e_listreq));
                return FAIL;
            }
-           *typep = (*typep)->tt_member;
+           if ((*typep)->tt_type == VAR_LIST)
+               *typep = (*typep)->tt_member;
        }
        else if (**arg == '.' && (*arg)[1] != '.')
        {
@@ -2387,7 +2397,6 @@ compile_subscript(
                semsg(_(e_syntax_at), *arg);
                return FAIL;
            }
-           // TODO: check type is dict
            if (generate_MEMBER(cctx, *arg, p - *arg) == FAIL)
                return FAIL;
            *arg = p;
@@ -4964,6 +4973,10 @@ compile_def_function(ufunc_T *ufunc, int set_return_type)
 
            default:
                    // Not recognized, execute with do_cmdline_cmd().
+                   // TODO:
+                   // CMD_echomsg
+                   // CMD_execute
+                   // etc.
                    generate_EXEC(&cctx, line);
                    line = (char_u *)"";
                    break;