Browse Source

assert() user message

Added 2nd, optional, param to assert. When passed in it will be added
to the printed warnings and passed as a 4th param to a callback. PR 150
by Lonny Kapelushnik
pull/184/head
Lars Strojny 13 years ago
parent
commit
e658a91b3d
  1. 2
      NEWS
  2. 48
      ext/standard/assert.c
  3. 5
      ext/standard/tests/assert/assert04.phpt
  4. 26
      ext/standard/tests/assert/assert_basic6.phpt
  5. 11
      ext/standard/tests/assert/assert_error1.phpt
  6. 30
      ext/standard/tests/assert/assert_error2.phpt
  7. 21
      ext/standard/tests/assert/assert_error3.phpt
  8. 21
      ext/standard/tests/assert/assert_error4.phpt

2
NEWS

@ -25,6 +25,8 @@ PHP NEWS
handler). (Lonny Kapelushnik)
. Fixed bug #40459 (Stat and Dir stream wrapper methods do not call
constructor). (Stas)
. Added optional second argument for assert() to specify custom message. Patch
by Lonny Kapelushnik (lonny@lonnylot.com). (Lars)
- CURL:
. Fixed bug #62912 (CURLINFO_PRIMARY_* AND CURLINFO_LOCAL_* not exposed).

48
ext/standard/assert.c

@ -136,20 +136,20 @@ PHP_MINFO_FUNCTION(assert) /* {{{ */
}
/* }}} */
/* {{{ proto int assert(string|bool assertion)
/* {{{ proto int assert(string|bool assertion[, string description])
Checks if assertion is false */
PHP_FUNCTION(assert)
{
zval **assertion;
int val;
int val, description_len = 0;
char *myeval = NULL;
char *compiled_string_description;
char *compiled_string_description, *description;
if (! ASSERTG(active)) {
RETURN_TRUE;
}
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &assertion) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|s", &assertion, &description, &description_len) == FAILURE) {
return;
}
@ -167,7 +167,11 @@ PHP_FUNCTION(assert)
compiled_string_description = zend_make_compiled_string_description("assert code" TSRMLS_CC);
if (zend_eval_stringl(myeval, Z_STRLEN_PP(assertion), &retval, compiled_string_description TSRMLS_CC) == FAILURE) {
efree(compiled_string_description);
php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "Failure evaluating code: %s%s", PHP_EOL, myeval);
if (description_len == 0) {
php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "Failure evaluating code: %s%s", PHP_EOL, myeval);
} else {
php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "Failure evaluating code: %s%s:\"%s\"", PHP_EOL, description, myeval);
}
if (ASSERTG(bail)) {
zend_bailout();
}
@ -196,7 +200,7 @@ PHP_FUNCTION(assert)
}
if (ASSERTG(callback)) {
zval *args[3];
zval **args = safe_emalloc(description_len == 0 ? 3 : 4, sizeof(zval **), 0);
zval *retval;
int i;
uint lineno = zend_get_executed_lineno(TSRMLS_C);
@ -214,19 +218,38 @@ PHP_FUNCTION(assert)
ZVAL_FALSE(retval);
/* XXX do we want to check for error here? */
call_user_function(CG(function_table), NULL, ASSERTG(callback), retval, 3, args TSRMLS_CC);
if (description_len == 0) {
call_user_function(CG(function_table), NULL, ASSERTG(callback), retval, 3, args TSRMLS_CC);
for (i = 0; i <= 2; i++) {
zval_ptr_dtor(&(args[i]));
}
} else {
MAKE_STD_ZVAL(args[3]);
ZVAL_STRINGL(args[3], SAFE_STRING(description), description_len, 1);
for (i = 0; i <= 2; i++) {
zval_ptr_dtor(&(args[i]));
call_user_function(CG(function_table), NULL, ASSERTG(callback), retval, 4, args TSRMLS_CC);
for (i = 0; i <= 3; i++) {
zval_ptr_dtor(&(args[i]));
}
}
efree(args);
zval_ptr_dtor(&retval);
}
if (ASSERTG(warning)) {
if (myeval) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion \"%s\" failed", myeval);
if (description_len == 0) {
if (myeval) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion \"%s\" failed", myeval);
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion failed");
}
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion failed");
if (myeval) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s: \"%s\" failed", description, myeval);
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s failed", description);
}
}
}
@ -321,3 +344,4 @@ PHP_FUNCTION(assert_options)
* vim600: sw=4 ts=4 fdm=marker
* vim<600: sw=4 ts=4
*/

5
ext/standard/tests/assert/assert04.phpt

@ -15,7 +15,7 @@ assert(1);
/* Wrong parameter count in assert */
assert_options(ASSERT_ACTIVE, 1);
assert(2,3);
assert(2, "failure", 3);
/* Wrong parameter count in assert_options */
assert_options(ASSERT_ACTIVE, 0, 2);
@ -36,7 +36,7 @@ echo "not reached\n";
?>
--EXPECTF--
Warning: assert() expects exactly 1 parameter, 2 given in %s on line %d
Warning: assert() expects at most 2 parameters, 3 given in %s on line %d
Warning: assert_options() expects at most 2 parameters, 3 given in %s on line %d
@ -45,3 +45,4 @@ Warning: assert_options() expects parameter 1 to be long, %unicode_string_option
Warning: assert(): Assertion failed in %s on line %d
Warning: assert(): Assertion failed in %s on line %d

26
ext/standard/tests/assert/assert_basic6.phpt

@ -0,0 +1,26 @@
--TEST--
assert() - basic - Test that bailout works
--INI--
assert.active = 1
assert.warning = 1
assert.callback = f1
assert.quiet_eval = 1
assert.bail = 0
--FILE--
<?php
function f1($message)
{
echo "f1 called\n";
}
//bail out on error
var_dump($rao = assert_options(ASSERT_BAIL, 1));
$sa = "0 != 0";
var_dump($r2 = assert($sa, "0 is 0"));
echo "If this is printed BAIL hasn't worked";
--EXPECTF--
int(0)
f1 called
Warning: assert(): 0 is 0: "0 != 0" failed in %s on line 10

11
ext/standard/tests/assert/assert_error1.phpt

@ -20,19 +20,19 @@ function handler($errno, $errstr) {
//Wrong number of parameters for assert_options()
assert_options(ASSERT_WARNING, 1);
var_dump($rao=assert_options(ASSERT_CALLBACK,"f1",1));
var_dump($rao = assert_options(ASSERT_CALLBACK, "f1", 1));
//Unknown option for assert_options()
var_dump($rao=assert_options("F1","f1"));
var_dump($rao=assert_options("F1", "f1"));
//Wrong number of parameters for assert()
$sa="0 != 0";
var_dump($r2=assert($sa,1));
var_dump($r2 = assert($sa, "message", 1));
//Catch recoverable error with handler
var_dump($rc=assert('aa=sd+as+safsafasfaçsafçsafç'));
var_dump($rc = assert('aa=sd+as+safsafasfaçsafçsafç'));
--EXPECTF--
Warning: assert_options() expects at most 2 parameters, 3 given in %s on line %d
NULL
@ -40,5 +40,6 @@ NULL
Warning: assert_options() expects parameter 1 to be long, string given in %s on line %d
NULL
Warning: assert() expects exactly 1 parameter, 2 given in %s on line %d
Warning: assert() expects at most 2 parameters, 3 given in %s on line %d
NULL

30
ext/standard/tests/assert/assert_error2.phpt

@ -0,0 +1,30 @@
--TEST--
assert() - basic - Test that bailout works
--INI--
assert.active = 1
assert.warning = 1
assert.callback = f1
assert.quiet_eval = 1
assert.bail = 0
error_reporting = -1
display_errors = 1
--FILE--
<?php
function f1($script, $line, $message, $user_message)
{
echo "f1 called\n";
}
//bail out on error
var_dump($rao = assert_options(ASSERT_BAIL, 1));
$sa = "0 != 0";
var_dump($r2 = assert($sa));
echo "If this is printed BAIL hasn't worked";
--EXPECTF--
int(0)
Warning: Missing argument 4 for f1() in %s on line 2
f1 called
Warning: assert(): Assertion "0 != 0" failed in %s on line 10

21
ext/standard/tests/assert/assert_error3.phpt

@ -0,0 +1,21 @@
--TEST--
assert() - basic - Test recoverable error
--INI--
assert.active = 1
assert.warning = 1
assert.callback = f1
assert.quiet_eval = 0
assert.bail = 0
error_reporting = -1
display_errors = 1
--FILE--
<?php
$sa = "0 $ 0";
var_dump($r2 = assert($sa));
--EXPECTF--
Parse error: syntax error, unexpected '$' in %s(3) : assert code on line 1
Catchable fatal error: assert(): Failure evaluating code:
0 $ 0 in %s on line 3

21
ext/standard/tests/assert/assert_error4.phpt

@ -0,0 +1,21 @@
--TEST--
assert() - basic - Test recoverable error
--INI--
assert.active = 1
assert.warning = 1
assert.callback = f1
assert.quiet_eval = 0
assert.bail = 0
error_reporting = -1
display_errors = 1
--FILE--
<?php
$sa = "0 $ 0";
var_dump($r2 = assert($sa, "Describing what was asserted"));
--EXPECTF--
Parse error: syntax error, unexpected '$' in %s(3) : assert code on line 1
Catchable fatal error: assert(): Failure evaluating code:
Describing what was asserted:"0 $ 0" in %s on line 3
Loading…
Cancel
Save