comparison src/eval.c @ 8831:6f41d68aa68e v7.4.1703

commit https://github.com/vim/vim/commit/b50e5f56861deb867478997397f7c784a7043233 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Apr 3 20:57:20 2016 +0200 patch 7.4.1703 Problem: Can't assert for not equal and not matching. Solution: Add assert_notmatch() and assert_notequal().
author Christian Brabandt <cb@256bit.org>
date Sun, 03 Apr 2016 21:00:05 +0200
parents 6b70b9cdebfc
children 9fa567d13551
comparison
equal deleted inserted replaced
8830:d15abeac22c6 8831:6f41d68aa68e
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_match(typval_T *argvars, typval_T *rettv);
479 static void f_assert_notequal(typval_T *argvars, typval_T *rettv);
480 static void f_assert_notmatch(typval_T *argvars, typval_T *rettv);
479 static void f_assert_true(typval_T *argvars, typval_T *rettv); 481 static void f_assert_true(typval_T *argvars, typval_T *rettv);
480 #ifdef FEAT_FLOAT 482 #ifdef FEAT_FLOAT
481 static void f_asin(typval_T *argvars, typval_T *rettv); 483 static void f_asin(typval_T *argvars, typval_T *rettv);
482 static void f_atan(typval_T *argvars, typval_T *rettv); 484 static void f_atan(typval_T *argvars, typval_T *rettv);
483 static void f_atan2(typval_T *argvars, typval_T *rettv); 485 static void f_atan2(typval_T *argvars, typval_T *rettv);
8180 {"assert_equal", 2, 3, f_assert_equal}, 8182 {"assert_equal", 2, 3, f_assert_equal},
8181 {"assert_exception", 1, 2, f_assert_exception}, 8183 {"assert_exception", 1, 2, f_assert_exception},
8182 {"assert_fails", 1, 2, f_assert_fails}, 8184 {"assert_fails", 1, 2, f_assert_fails},
8183 {"assert_false", 1, 2, f_assert_false}, 8185 {"assert_false", 1, 2, f_assert_false},
8184 {"assert_match", 2, 3, f_assert_match}, 8186 {"assert_match", 2, 3, f_assert_match},
8187 {"assert_notequal", 2, 3, f_assert_notequal},
8188 {"assert_notmatch", 2, 3, f_assert_notmatch},
8185 {"assert_true", 1, 2, f_assert_true}, 8189 {"assert_true", 1, 2, f_assert_true},
8186 #ifdef FEAT_FLOAT 8190 #ifdef FEAT_FLOAT
8187 {"atan", 1, 1, f_atan}, 8191 {"atan", 1, 1, f_atan},
8188 {"atan2", 2, 2, f_atan2}, 8192 {"atan2", 2, 2, f_atan2},
8189 #endif 8193 #endif
9321 for (idx = 0; idx < ARGCOUNT; ++idx) 9325 for (idx = 0; idx < ARGCOUNT; ++idx)
9322 list_append_string(rettv->vval.v_list, 9326 list_append_string(rettv->vval.v_list,
9323 alist_name(&ARGLIST[idx]), -1); 9327 alist_name(&ARGLIST[idx]), -1);
9324 } 9328 }
9325 9329
9330 typedef enum
9331 {
9332 ASSERT_EQUAL,
9333 ASSERT_NOTEQUAL,
9334 ASSERT_MATCH,
9335 ASSERT_NOTMATCH,
9336 ASSERT_OTHER,
9337 } assert_type_T;
9338
9326 static void prepare_assert_error(garray_T*gap); 9339 static void prepare_assert_error(garray_T*gap);
9327 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); 9340 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, assert_type_T is_match);
9328 static void assert_error(garray_T *gap); 9341 static void assert_error(garray_T *gap);
9329 static void assert_bool(typval_T *argvars, int isTrue); 9342 static void assert_bool(typval_T *argvars, int isTrue);
9330 9343
9331 /* 9344 /*
9332 * Prepare "gap" for an assert error and add the sourcing position. 9345 * Prepare "gap" for an assert error and add the sourcing position.
9398 garray_T *gap, 9411 garray_T *gap,
9399 typval_T *opt_msg_tv, 9412 typval_T *opt_msg_tv,
9400 char_u *exp_str, 9413 char_u *exp_str,
9401 typval_T *exp_tv, 9414 typval_T *exp_tv,
9402 typval_T *got_tv, 9415 typval_T *got_tv,
9403 int is_match) 9416 assert_type_T atype)
9404 { 9417 {
9405 char_u numbuf[NUMBUFLEN]; 9418 char_u numbuf[NUMBUFLEN];
9406 char_u *tofree; 9419 char_u *tofree;
9407 9420
9408 if (opt_msg_tv->v_type != VAR_UNKNOWN) 9421 if (opt_msg_tv->v_type != VAR_UNKNOWN)
9410 ga_concat(gap, tv2string(opt_msg_tv, &tofree, numbuf, 0)); 9423 ga_concat(gap, tv2string(opt_msg_tv, &tofree, numbuf, 0));
9411 vim_free(tofree); 9424 vim_free(tofree);
9412 } 9425 }
9413 else 9426 else
9414 { 9427 {
9415 if (is_match) 9428 if (atype == ASSERT_MATCH || atype == ASSERT_NOTMATCH)
9416 ga_concat(gap, (char_u *)"Pattern "); 9429 ga_concat(gap, (char_u *)"Pattern ");
9417 else 9430 else
9418 ga_concat(gap, (char_u *)"Expected "); 9431 ga_concat(gap, (char_u *)"Expected ");
9419 if (exp_str == NULL) 9432 if (exp_str == NULL)
9420 { 9433 {
9421 ga_concat_esc(gap, tv2string(exp_tv, &tofree, numbuf, 0)); 9434 ga_concat_esc(gap, tv2string(exp_tv, &tofree, numbuf, 0));
9422 vim_free(tofree); 9435 vim_free(tofree);
9423 } 9436 }
9424 else 9437 else
9425 ga_concat_esc(gap, exp_str); 9438 ga_concat_esc(gap, exp_str);
9426 if (is_match) 9439 if (atype == ASSERT_MATCH)
9427 ga_concat(gap, (char_u *)" does not match "); 9440 ga_concat(gap, (char_u *)" does not match ");
9441 else if (atype == ASSERT_NOTMATCH)
9442 ga_concat(gap, (char_u *)" does match ");
9443 else if (atype == ASSERT_NOTEQUAL)
9444 ga_concat(gap, (char_u *)" differs from ");
9428 else 9445 else
9429 ga_concat(gap, (char_u *)" but got "); 9446 ga_concat(gap, (char_u *)" but got ");
9430 ga_concat_esc(gap, tv2string(got_tv, &tofree, numbuf, 0)); 9447 ga_concat_esc(gap, tv2string(got_tv, &tofree, numbuf, 0));
9431 vim_free(tofree); 9448 vim_free(tofree);
9432 } 9449 }
9444 /* Make sure v:errors is a list. */ 9461 /* Make sure v:errors is a list. */
9445 set_vim_var_list(VV_ERRORS, list_alloc()); 9462 set_vim_var_list(VV_ERRORS, list_alloc());
9446 list_append_string(vimvars[VV_ERRORS].vv_list, gap->ga_data, gap->ga_len); 9463 list_append_string(vimvars[VV_ERRORS].vv_list, gap->ga_data, gap->ga_len);
9447 } 9464 }
9448 9465
9449 /* 9466 static void
9450 * "assert_equal(expected, actual[, msg])" function 9467 assert_equal_common(typval_T *argvars, assert_type_T atype)
9451 */
9452 static void
9453 f_assert_equal(typval_T *argvars, typval_T *rettv UNUSED)
9454 { 9468 {
9455 garray_T ga; 9469 garray_T ga;
9456 9470
9457 if (!tv_equal(&argvars[0], &argvars[1], FALSE, FALSE)) 9471 if (tv_equal(&argvars[0], &argvars[1], FALSE, FALSE)
9472 != (atype == ASSERT_EQUAL))
9458 { 9473 {
9459 prepare_assert_error(&ga); 9474 prepare_assert_error(&ga);
9460 fill_assert_error(&ga, &argvars[2], NULL, &argvars[0], &argvars[1], 9475 fill_assert_error(&ga, &argvars[2], NULL, &argvars[0], &argvars[1],
9461 FALSE); 9476 atype);
9462 assert_error(&ga); 9477 assert_error(&ga);
9463 ga_clear(&ga); 9478 ga_clear(&ga);
9464 } 9479 }
9480 }
9481
9482 /*
9483 * "assert_equal(expected, actual[, msg])" function
9484 */
9485 static void
9486 f_assert_equal(typval_T *argvars, typval_T *rettv UNUSED)
9487 {
9488 assert_equal_common(argvars, ASSERT_EQUAL);
9489 }
9490
9491 /*
9492 * "assert_notequal(expected, actual[, msg])" function
9493 */
9494 static void
9495 f_assert_notequal(typval_T *argvars, typval_T *rettv UNUSED)
9496 {
9497 assert_equal_common(argvars, ASSERT_NOTEQUAL);
9465 } 9498 }
9466 9499
9467 /* 9500 /*
9468 * "assert_exception(string[, msg])" function 9501 * "assert_exception(string[, msg])" function
9469 */ 9502 */
9484 else if (error != NULL 9517 else if (error != NULL
9485 && strstr((char *)vimvars[VV_EXCEPTION].vv_str, error) == NULL) 9518 && strstr((char *)vimvars[VV_EXCEPTION].vv_str, error) == NULL)
9486 { 9519 {
9487 prepare_assert_error(&ga); 9520 prepare_assert_error(&ga);
9488 fill_assert_error(&ga, &argvars[1], NULL, &argvars[0], 9521 fill_assert_error(&ga, &argvars[1], NULL, &argvars[0],
9489 &vimvars[VV_EXCEPTION].vv_tv, FALSE); 9522 &vimvars[VV_EXCEPTION].vv_tv, ASSERT_OTHER);
9490 assert_error(&ga); 9523 assert_error(&ga);
9491 ga_clear(&ga); 9524 ga_clear(&ga);
9492 } 9525 }
9493 } 9526 }
9494 9527
9521 if (error == NULL 9554 if (error == NULL
9522 || strstr((char *)vimvars[VV_ERRMSG].vv_str, error) == NULL) 9555 || strstr((char *)vimvars[VV_ERRMSG].vv_str, error) == NULL)
9523 { 9556 {
9524 prepare_assert_error(&ga); 9557 prepare_assert_error(&ga);
9525 fill_assert_error(&ga, &argvars[2], NULL, &argvars[1], 9558 fill_assert_error(&ga, &argvars[2], NULL, &argvars[1],
9526 &vimvars[VV_ERRMSG].vv_tv, FALSE); 9559 &vimvars[VV_ERRMSG].vv_tv, ASSERT_OTHER);
9527 assert_error(&ga); 9560 assert_error(&ga);
9528 ga_clear(&ga); 9561 ga_clear(&ga);
9529 } 9562 }
9530 } 9563 }
9531 9564
9553 || error) 9586 || error)
9554 { 9587 {
9555 prepare_assert_error(&ga); 9588 prepare_assert_error(&ga);
9556 fill_assert_error(&ga, &argvars[1], 9589 fill_assert_error(&ga, &argvars[1],
9557 (char_u *)(isTrue ? "True" : "False"), 9590 (char_u *)(isTrue ? "True" : "False"),
9558 NULL, &argvars[0], FALSE); 9591 NULL, &argvars[0], ASSERT_OTHER);
9559 assert_error(&ga); 9592 assert_error(&ga);
9560 ga_clear(&ga); 9593 ga_clear(&ga);
9561 } 9594 }
9562 } 9595 }
9563 9596
9568 f_assert_false(typval_T *argvars, typval_T *rettv UNUSED) 9601 f_assert_false(typval_T *argvars, typval_T *rettv UNUSED)
9569 { 9602 {
9570 assert_bool(argvars, FALSE); 9603 assert_bool(argvars, FALSE);
9571 } 9604 }
9572 9605
9573 /* 9606 static void
9574 * "assert_match(pattern, actual[, msg])" function 9607 assert_match_common(typval_T *argvars, assert_type_T atype)
9575 */
9576 static void
9577 f_assert_match(typval_T *argvars, typval_T *rettv UNUSED)
9578 { 9608 {
9579 garray_T ga; 9609 garray_T ga;
9580 char_u buf1[NUMBUFLEN]; 9610 char_u buf1[NUMBUFLEN];
9581 char_u buf2[NUMBUFLEN]; 9611 char_u buf2[NUMBUFLEN];
9582 char_u *pat = get_tv_string_buf_chk(&argvars[0], buf1); 9612 char_u *pat = get_tv_string_buf_chk(&argvars[0], buf1);
9583 char_u *text = get_tv_string_buf_chk(&argvars[1], buf2); 9613 char_u *text = get_tv_string_buf_chk(&argvars[1], buf2);
9584 9614
9585 if (pat == NULL || text == NULL) 9615 if (pat == NULL || text == NULL)
9586 EMSG(_(e_invarg)); 9616 EMSG(_(e_invarg));
9587 else if (!pattern_match(pat, text, FALSE)) 9617 else if (pattern_match(pat, text, FALSE) != (atype == ASSERT_MATCH))
9588 { 9618 {
9589 prepare_assert_error(&ga); 9619 prepare_assert_error(&ga);
9590 fill_assert_error(&ga, &argvars[2], NULL, &argvars[0], &argvars[1], 9620 fill_assert_error(&ga, &argvars[2], NULL, &argvars[0], &argvars[1],
9591 TRUE); 9621 atype);
9592 assert_error(&ga); 9622 assert_error(&ga);
9593 ga_clear(&ga); 9623 ga_clear(&ga);
9594 } 9624 }
9625 }
9626
9627 /*
9628 * "assert_match(pattern, actual[, msg])" function
9629 */
9630 static void
9631 f_assert_match(typval_T *argvars, typval_T *rettv UNUSED)
9632 {
9633 assert_match_common(argvars, ASSERT_MATCH);
9634 }
9635
9636 /*
9637 * "assert_notmatch(pattern, actual[, msg])" function
9638 */
9639 static void
9640 f_assert_notmatch(typval_T *argvars, typval_T *rettv UNUSED)
9641 {
9642 assert_match_common(argvars, ASSERT_NOTMATCH);
9595 } 9643 }
9596 9644
9597 /* 9645 /*
9598 * "assert_true(actual[, msg])" function 9646 * "assert_true(actual[, msg])" function
9599 */ 9647 */