comparison src/eval.c @ 8749:65a5a18d3acf v7.4.1663

commit https://github.com/vim/vim/commit/ea6553bec340920d8a09c7210cdc2d218e25ace2 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Mar 27 15:13:38 2016 +0200 patch 7.4.1663 Problem: In tests it's often useful to check if a pattern matches. Solution: Add assert_match().
author Christian Brabandt <cb@256bit.org>
date Sun, 27 Mar 2016 15:15:06 +0200
parents 03e5171c23e5
children 4b83af41f5db
comparison
equal deleted inserted replaced
8748:b1a19a2f73f0 8749:65a5a18d3acf
473 static void f_argv(typval_T *argvars, typval_T *rettv); 473 static void f_argv(typval_T *argvars, typval_T *rettv);
474 static void f_assert_equal(typval_T *argvars, typval_T *rettv); 474 static void f_assert_equal(typval_T *argvars, typval_T *rettv);
475 static void f_assert_exception(typval_T *argvars, typval_T *rettv); 475 static void f_assert_exception(typval_T *argvars, typval_T *rettv);
476 static void f_assert_fails(typval_T *argvars, typval_T *rettv); 476 static void f_assert_fails(typval_T *argvars, typval_T *rettv);
477 static void f_assert_false(typval_T *argvars, typval_T *rettv); 477 static void f_assert_false(typval_T *argvars, typval_T *rettv);
478 static void f_assert_match(typval_T *argvars, typval_T *rettv);
478 static void f_assert_true(typval_T *argvars, typval_T *rettv); 479 static void f_assert_true(typval_T *argvars, typval_T *rettv);
479 #ifdef FEAT_FLOAT 480 #ifdef FEAT_FLOAT
480 static void f_asin(typval_T *argvars, typval_T *rettv); 481 static void f_asin(typval_T *argvars, typval_T *rettv);
481 static void f_atan(typval_T *argvars, typval_T *rettv); 482 static void f_atan(typval_T *argvars, typval_T *rettv);
482 static void f_atan2(typval_T *argvars, typval_T *rettv); 483 static void f_atan2(typval_T *argvars, typval_T *rettv);
4104 } 4105 }
4105 4106
4106 #endif /* FEAT_CMDL_COMPL */ 4107 #endif /* FEAT_CMDL_COMPL */
4107 4108
4108 /* 4109 /*
4110 * Return TRUE if "pat" matches "text".
4111 * Does not use 'cpo' and always uses 'magic'.
4112 */
4113 static int
4114 pattern_match(char_u *pat, char_u *text, int ic)
4115 {
4116 int matches = FALSE;
4117 char_u *save_cpo;
4118 regmatch_T regmatch;
4119
4120 /* avoid 'l' flag in 'cpoptions' */
4121 save_cpo = p_cpo;
4122 p_cpo = (char_u *)"";
4123 regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING);
4124 if (regmatch.regprog != NULL)
4125 {
4126 regmatch.rm_ic = ic;
4127 matches = vim_regexec_nl(&regmatch, text, (colnr_T)0);
4128 vim_regfree(regmatch.regprog);
4129 }
4130 p_cpo = save_cpo;
4131 return matches;
4132 }
4133
4134 /*
4109 * types for expressions. 4135 * types for expressions.
4110 */ 4136 */
4111 typedef enum 4137 typedef enum
4112 { 4138 {
4113 TYPE_UNKNOWN = 0 4139 TYPE_UNKNOWN = 0
4401 int type_is = FALSE; /* TRUE for "is" and "isnot" */ 4427 int type_is = FALSE; /* TRUE for "is" and "isnot" */
4402 int len = 2; 4428 int len = 2;
4403 long n1, n2; 4429 long n1, n2;
4404 char_u *s1, *s2; 4430 char_u *s1, *s2;
4405 char_u buf1[NUMBUFLEN], buf2[NUMBUFLEN]; 4431 char_u buf1[NUMBUFLEN], buf2[NUMBUFLEN];
4406 regmatch_T regmatch;
4407 int ic; 4432 int ic;
4408 char_u *save_cpo;
4409 4433
4410 /* 4434 /*
4411 * Get the first variable. 4435 * Get the first variable.
4412 */ 4436 */
4413 if (eval5(arg, rettv, evaluate) == FAIL) 4437 if (eval5(arg, rettv, evaluate) == FAIL)
4644 case TYPE_SMALLER: n1 = (i < 0); break; 4668 case TYPE_SMALLER: n1 = (i < 0); break;
4645 case TYPE_SEQUAL: n1 = (i <= 0); break; 4669 case TYPE_SEQUAL: n1 = (i <= 0); break;
4646 4670
4647 case TYPE_MATCH: 4671 case TYPE_MATCH:
4648 case TYPE_NOMATCH: 4672 case TYPE_NOMATCH:
4649 /* avoid 'l' flag in 'cpoptions' */ 4673 n1 = pattern_match(s2, s1, ic);
4650 save_cpo = p_cpo; 4674 if (type == TYPE_NOMATCH)
4651 p_cpo = (char_u *)""; 4675 n1 = !n1;
4652 regmatch.regprog = vim_regcomp(s2,
4653 RE_MAGIC + RE_STRING);
4654 regmatch.rm_ic = ic;
4655 if (regmatch.regprog != NULL)
4656 {
4657 n1 = vim_regexec_nl(&regmatch, s1, (colnr_T)0);
4658 vim_regfree(regmatch.regprog);
4659 if (type == TYPE_NOMATCH)
4660 n1 = !n1;
4661 }
4662 p_cpo = save_cpo;
4663 break; 4676 break;
4664 4677
4665 case TYPE_UNKNOWN: break; /* avoid gcc warning */ 4678 case TYPE_UNKNOWN: break; /* avoid gcc warning */
4666 } 4679 }
4667 } 4680 }
8152 #endif 8165 #endif
8153 {"assert_equal", 2, 3, f_assert_equal}, 8166 {"assert_equal", 2, 3, f_assert_equal},
8154 {"assert_exception", 1, 2, f_assert_exception}, 8167 {"assert_exception", 1, 2, f_assert_exception},
8155 {"assert_fails", 1, 2, f_assert_fails}, 8168 {"assert_fails", 1, 2, f_assert_fails},
8156 {"assert_false", 1, 2, f_assert_false}, 8169 {"assert_false", 1, 2, f_assert_false},
8170 {"assert_match", 2, 3, f_assert_match},
8157 {"assert_true", 1, 2, f_assert_true}, 8171 {"assert_true", 1, 2, f_assert_true},
8158 #ifdef FEAT_FLOAT 8172 #ifdef FEAT_FLOAT
8159 {"atan", 1, 1, f_atan}, 8173 {"atan", 1, 1, f_atan},
8160 {"atan2", 2, 2, f_atan2}, 8174 {"atan2", 2, 2, f_atan2},
8161 #endif 8175 #endif
9293 list_append_string(rettv->vval.v_list, 9307 list_append_string(rettv->vval.v_list,
9294 alist_name(&ARGLIST[idx]), -1); 9308 alist_name(&ARGLIST[idx]), -1);
9295 } 9309 }
9296 9310
9297 static void prepare_assert_error(garray_T*gap); 9311 static void prepare_assert_error(garray_T*gap);
9298 static void fill_assert_error(garray_T *gap, typval_T *opt_msg_tv, char_u *exp_str, typval_T *exp_tv, typval_T *got_tv); 9312 static void fill_assert_error(garray_T *gap, typval_T *opt_msg_tv, char_u *exp_str, typval_T *exp_tv, typval_T *got_tv, int is_match);
9299 static void assert_error(garray_T *gap); 9313 static void assert_error(garray_T *gap);
9300 static void assert_bool(typval_T *argvars, int isTrue); 9314 static void assert_bool(typval_T *argvars, int isTrue);
9301 9315
9302 /* 9316 /*
9303 * Prepare "gap" for an assert error and add the sourcing position. 9317 * Prepare "gap" for an assert error and add the sourcing position.
9368 fill_assert_error( 9382 fill_assert_error(
9369 garray_T *gap, 9383 garray_T *gap,
9370 typval_T *opt_msg_tv, 9384 typval_T *opt_msg_tv,
9371 char_u *exp_str, 9385 char_u *exp_str,
9372 typval_T *exp_tv, 9386 typval_T *exp_tv,
9373 typval_T *got_tv) 9387 typval_T *got_tv,
9388 int is_match)
9374 { 9389 {
9375 char_u numbuf[NUMBUFLEN]; 9390 char_u numbuf[NUMBUFLEN];
9376 char_u *tofree; 9391 char_u *tofree;
9377 9392
9378 if (opt_msg_tv->v_type != VAR_UNKNOWN) 9393 if (opt_msg_tv->v_type != VAR_UNKNOWN)
9380 ga_concat(gap, tv2string(opt_msg_tv, &tofree, numbuf, 0)); 9395 ga_concat(gap, tv2string(opt_msg_tv, &tofree, numbuf, 0));
9381 vim_free(tofree); 9396 vim_free(tofree);
9382 } 9397 }
9383 else 9398 else
9384 { 9399 {
9385 ga_concat(gap, (char_u *)"Expected "); 9400 if (is_match)
9401 ga_concat(gap, (char_u *)"Pattern ");
9402 else
9403 ga_concat(gap, (char_u *)"Expected ");
9386 if (exp_str == NULL) 9404 if (exp_str == NULL)
9387 { 9405 {
9388 ga_concat_esc(gap, tv2string(exp_tv, &tofree, numbuf, 0)); 9406 ga_concat_esc(gap, tv2string(exp_tv, &tofree, numbuf, 0));
9389 vim_free(tofree); 9407 vim_free(tofree);
9390 } 9408 }
9391 else 9409 else
9392 ga_concat_esc(gap, exp_str); 9410 ga_concat_esc(gap, exp_str);
9393 ga_concat(gap, (char_u *)" but got "); 9411 if (is_match)
9412 ga_concat(gap, (char_u *)" does not match ");
9413 else
9414 ga_concat(gap, (char_u *)" but got ");
9394 ga_concat_esc(gap, tv2string(got_tv, &tofree, numbuf, 0)); 9415 ga_concat_esc(gap, tv2string(got_tv, &tofree, numbuf, 0));
9395 vim_free(tofree); 9416 vim_free(tofree);
9396 } 9417 }
9397 } 9418 }
9398 9419
9419 garray_T ga; 9440 garray_T ga;
9420 9441
9421 if (!tv_equal(&argvars[0], &argvars[1], FALSE, FALSE)) 9442 if (!tv_equal(&argvars[0], &argvars[1], FALSE, FALSE))
9422 { 9443 {
9423 prepare_assert_error(&ga); 9444 prepare_assert_error(&ga);
9424 fill_assert_error(&ga, &argvars[2], NULL, &argvars[0], &argvars[1]); 9445 fill_assert_error(&ga, &argvars[2], NULL, &argvars[0], &argvars[1],
9446 FALSE);
9425 assert_error(&ga); 9447 assert_error(&ga);
9426 ga_clear(&ga); 9448 ga_clear(&ga);
9427 } 9449 }
9428 } 9450 }
9429 9451
9447 else if (error != NULL 9469 else if (error != NULL
9448 && strstr((char *)vimvars[VV_EXCEPTION].vv_str, error) == NULL) 9470 && strstr((char *)vimvars[VV_EXCEPTION].vv_str, error) == NULL)
9449 { 9471 {
9450 prepare_assert_error(&ga); 9472 prepare_assert_error(&ga);
9451 fill_assert_error(&ga, &argvars[1], NULL, &argvars[0], 9473 fill_assert_error(&ga, &argvars[1], NULL, &argvars[0],
9452 &vimvars[VV_EXCEPTION].vv_tv); 9474 &vimvars[VV_EXCEPTION].vv_tv, FALSE);
9453 assert_error(&ga); 9475 assert_error(&ga);
9454 ga_clear(&ga); 9476 ga_clear(&ga);
9455 } 9477 }
9456 } 9478 }
9457 9479
9484 if (error == NULL 9506 if (error == NULL
9485 || strstr((char *)vimvars[VV_ERRMSG].vv_str, error) == NULL) 9507 || strstr((char *)vimvars[VV_ERRMSG].vv_str, error) == NULL)
9486 { 9508 {
9487 prepare_assert_error(&ga); 9509 prepare_assert_error(&ga);
9488 fill_assert_error(&ga, &argvars[2], NULL, &argvars[1], 9510 fill_assert_error(&ga, &argvars[2], NULL, &argvars[1],
9489 &vimvars[VV_ERRMSG].vv_tv); 9511 &vimvars[VV_ERRMSG].vv_tv, FALSE);
9490 assert_error(&ga); 9512 assert_error(&ga);
9491 ga_clear(&ga); 9513 ga_clear(&ga);
9492 } 9514 }
9493 } 9515 }
9494 9516
9516 || error) 9538 || error)
9517 { 9539 {
9518 prepare_assert_error(&ga); 9540 prepare_assert_error(&ga);
9519 fill_assert_error(&ga, &argvars[1], 9541 fill_assert_error(&ga, &argvars[1],
9520 (char_u *)(isTrue ? "True" : "False"), 9542 (char_u *)(isTrue ? "True" : "False"),
9521 NULL, &argvars[0]); 9543 NULL, &argvars[0], FALSE);
9522 assert_error(&ga); 9544 assert_error(&ga);
9523 ga_clear(&ga); 9545 ga_clear(&ga);
9524 } 9546 }
9525 } 9547 }
9526 9548
9529 */ 9551 */
9530 static void 9552 static void
9531 f_assert_false(typval_T *argvars, typval_T *rettv UNUSED) 9553 f_assert_false(typval_T *argvars, typval_T *rettv UNUSED)
9532 { 9554 {
9533 assert_bool(argvars, FALSE); 9555 assert_bool(argvars, FALSE);
9556 }
9557
9558 /*
9559 * "assert_match(pattern, actual[, msg])" function
9560 */
9561 static void
9562 f_assert_match(typval_T *argvars, typval_T *rettv UNUSED)
9563 {
9564 garray_T ga;
9565 char_u buf1[NUMBUFLEN];
9566 char_u buf2[NUMBUFLEN];
9567 char_u *pat = get_tv_string_buf_chk(&argvars[0], buf1);
9568 char_u *text = get_tv_string_buf_chk(&argvars[1], buf2);
9569
9570 if (!pattern_match(pat, text, FALSE))
9571 {
9572 prepare_assert_error(&ga);
9573 fill_assert_error(&ga, &argvars[2], NULL, &argvars[0], &argvars[1],
9574 TRUE);
9575 assert_error(&ga);
9576 ga_clear(&ga);
9577 }
9534 } 9578 }
9535 9579
9536 /* 9580 /*
9537 * "assert_true(actual[, msg])" function 9581 * "assert_true(actual[, msg])" function
9538 */ 9582 */