diff --git a/ext/intl/bidi/bidi.c b/ext/intl/bidi/bidi.c index 5d9d696ad1d48..4a2c2da80316d 100644 --- a/ext/intl/bidi/bidi.c +++ b/ext/intl/bidi/bidi.c @@ -27,10 +27,19 @@ zend_class_entry *php_intl_bidi_ce; static zend_object_handlers bidi_object_handlers; -typedef struct _php_intl_bidi_object { +typedef struct _bidi_object { UBiDi *bidi; + UBiDiLevel *embeddingLevels; + int32_t start, limit; + int32_t textLength; UChar *prologue, *text, *epilogue; intl_error error; + zend_long childCount; + struct _bidi_object * parent; +} bidi_object; + +typedef struct _php_intl_bidi_object { + bidi_object * bidi; zend_object std; } php_intl_bidi_object; @@ -43,14 +52,14 @@ static inline zend_object *bidi_object_to_zend_object(php_intl_bidi_object *obj) } #define THROW_UFAILURE(obj, fname, error) \ - php_bidi_throw_failure(obj, error, \ + php_intl_bidi_throw_failure(obj, error, \ "IntlBidi::" fname "() returned error " ZEND_LONG_FMT ": %s", \ (zend_long)error, u_errorName(error)) -/* {{{ php_bidi_throw_failure */ -static inline void php_bidi_throw_failure(php_intl_bidi_object *objval, +/* {{{ php_intl_bidi_throw_failure */ +static inline void php_intl_bidi_throw_failure(bidi_object *obj, UErrorCode error, const char *format, ...) { - intl_error *err = objval ? &(objval->error) : NULL; + intl_error *err = obj ? &(obj->error) : NULL; char message[1024]; va_list vargs; @@ -63,48 +72,85 @@ static inline void php_bidi_throw_failure(php_intl_bidi_object *objval, } /* }}} */ -/* {{{ proto void IntlBidi::__construct([int $maxLength = 0, [int $maxRunCount = 0]]) */ -ZEND_BEGIN_ARG_INFO_EX(bidi_ctor_arginfo, 0, ZEND_RETURN_VALUE, 0) - ZEND_ARG_TYPE_INFO(0, maxLength, IS_LONG, 0) - ZEND_ARG_TYPE_INFO(0, maxRunCount, IS_LONG, 0) -ZEND_END_ARG_INFO(); -static PHP_METHOD(IntlBidi, __construct) { - zend_long maxLength = 0, maxRunCount = 0; - php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); +static inline bidi_object * bidi_create_bidi_object(zend_long maxRunCount, zend_long maxLength) { UErrorCode error; - - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "|ll", &maxLength, &maxRunCount) == FAILURE) { - return; - } - - if (maxRunCount < 0) { - php_bidi_throw_failure(NULL, U_ILLEGAL_ARGUMENT_ERROR, - "IntlBidi::__construct() expects maxRunCount to be a non-negative value"); - return; - } - - if (maxLength < 0) { - php_bidi_throw_failure(NULL, U_ILLEGAL_ARGUMENT_ERROR, - "IntlBidi::__construct() expects maxLength to be a non-negative value"); - return; - } + bidi_object * obj = ecalloc(1, sizeof(bidi_object)); if (PG(memory_limit) > 0) { if (maxLength == 0) { maxLength = PG(memory_limit) / 2; } else if (maxLength > PG(memory_limit)) { - php_bidi_throw_failure(NULL, U_ILLEGAL_ARGUMENT_ERROR, + php_intl_bidi_throw_failure(NULL, U_ILLEGAL_ARGUMENT_ERROR, "IntlBidi::__construct() given maxLength greater than memory_limit"); - return; + return NULL; } } + obj->childCount = 1; + intl_error_init(&(obj->error)); + error = U_ZERO_ERROR; - objval->bidi = ubidi_openSized(maxLength, maxRunCount, &error); + obj->bidi = ubidi_openSized(maxLength, maxRunCount, &error); if (U_FAILURE(error)) { THROW_UFAILURE(NULL, "__construct", error); + return NULL; + } + + return obj; +} + +static inline void bidi_free_bidi_object(bidi_object * obj) { + if (obj != NULL) { + obj->childCount--; + if (obj->childCount == 0) { + if (obj->bidi) { ubidi_close(obj->bidi); } + if (obj->prologue) { efree(obj->prologue); } + if (obj->text) { efree(obj->text); } + if (obj->epilogue) { efree(obj->epilogue); } + if (obj->embeddingLevels) { efree(obj->embeddingLevels); } + + intl_error_reset(&(obj->error)); + + bidi_free_bidi_object(obj->parent); + obj->parent = NULL; + + efree(obj); + } + } +} + +static inline void php_intl_bidi_invokeConstruction(zval * instance, zend_long maxRunCount, zend_long maxLength) { + if (maxRunCount < 0) { + php_intl_bidi_throw_failure(NULL, U_ILLEGAL_ARGUMENT_ERROR, + "IntlBidi::__construct() expects maxRunCount to be a non-negative value"); return; } + + if (maxLength < 0) { + php_intl_bidi_throw_failure(NULL, U_ILLEGAL_ARGUMENT_ERROR, + "IntlBidi::__construct() expects maxLength to be a non-negative value"); + return; + } + + php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(instance)); + objval->bidi = bidi_create_bidi_object(maxRunCount, maxLength); +} + +/* {{{ proto void IntlBidi::__construct([int $maxLength = 0, [int $maxRunCount = 0]]) */ +ZEND_BEGIN_ARG_INFO_EX(bidi_ctor_arginfo, 0, ZEND_RETURN_VALUE, 0) + ZEND_ARG_TYPE_INFO(0, maxLength, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, maxRunCount, IS_LONG, 0) +ZEND_END_ARG_INFO(); +static PHP_METHOD(IntlBidi, __construct) { + zend_long maxLength = 0, maxRunCount = 0; + + ZEND_PARSE_PARAMETERS_START(0, 2) + Z_PARAM_OPTIONAL + Z_PARAM_LONG(maxLength) + Z_PARAM_LONG(maxRunCount) + ZEND_PARSE_PARAMETERS_END(); + + php_intl_bidi_invokeConstruction(getThis(), maxLength, maxRunCount); } /* }}} */ @@ -116,11 +162,11 @@ static PHP_METHOD(IntlBidi, setInverse) { php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); zend_bool inverse; - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "b", &inverse) == FAILURE) { - return; - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_BOOL(inverse) + ZEND_PARSE_PARAMETERS_END(); - ubidi_setInverse(objval->bidi, (UBool)inverse); + ubidi_setInverse(objval->bidi->bidi, (UBool)inverse); RETURN_ZVAL(getThis(), 1, 0); } /* }}} */ @@ -131,7 +177,7 @@ ZEND_END_ARG_INFO(); static PHP_METHOD(IntlBidi, isInverse) { php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); if (zend_parse_parameters_none_throw() == FAILURE) { return; } - RETURN_BOOL(ubidi_isInverse(objval->bidi)); + RETURN_BOOL(ubidi_isInverse(objval->bidi->bidi)); } /* }}} */ @@ -143,11 +189,11 @@ static PHP_METHOD(IntlBidi, orderParagraphsLTR) { php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); zend_bool ltr; - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "b", <r) == FAILURE) { - return; - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_BOOL(ltr) + ZEND_PARSE_PARAMETERS_END(); - ubidi_orderParagraphsLTR(objval->bidi, (UBool)ltr); + ubidi_orderParagraphsLTR(objval->bidi->bidi, (UBool)ltr); RETURN_ZVAL(getThis(), 1, 0); } /* }}} */ @@ -158,7 +204,7 @@ ZEND_END_ARG_INFO(); static PHP_METHOD(IntlBidi, isOrderParagraphsLTR) { php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); if (zend_parse_parameters_none_throw() == FAILURE) { return; } - RETURN_BOOL(ubidi_isOrderParagraphsLTR(objval->bidi)); + RETURN_BOOL(ubidi_isOrderParagraphsLTR(objval->bidi->bidi)); } /* }}} */ @@ -170,11 +216,11 @@ static PHP_METHOD(IntlBidi, setReorderingMode) { php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); zend_long mode; - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "l", &mode) == FAILURE) { - return; - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(mode) + ZEND_PARSE_PARAMETERS_END(); - ubidi_setReorderingMode(objval->bidi, (UBiDiReorderingMode)mode); + ubidi_setReorderingMode(objval->bidi->bidi, (UBiDiReorderingMode)mode); RETURN_ZVAL(getThis(), 1, 0); } /* }}} */ @@ -185,7 +231,7 @@ ZEND_END_ARG_INFO(); static PHP_METHOD(IntlBidi, getReorderingMode) { php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); if (zend_parse_parameters_none_throw() == FAILURE) { return; } - RETURN_BOOL(ubidi_getReorderingMode(objval->bidi)); + RETURN_LONG(ubidi_getReorderingMode(objval->bidi->bidi)); } /* }}} */ @@ -197,11 +243,11 @@ static PHP_METHOD(IntlBidi, setReorderingOptions) { php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); zend_long opts; - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "l", &opts) == FAILURE) { - return; - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(opts) + ZEND_PARSE_PARAMETERS_END(); - ubidi_setReorderingOptions(objval->bidi, (UBiDiReorderingOption)opts); + ubidi_setReorderingOptions(objval->bidi->bidi, (UBiDiReorderingOption)opts); RETURN_ZVAL(getThis(), 1, 0); } /* }}} */ @@ -212,15 +258,15 @@ ZEND_END_ARG_INFO(); static PHP_METHOD(IntlBidi, getReorderingOptions) { php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); if (zend_parse_parameters_none_throw() == FAILURE) { return; } - RETURN_BOOL(ubidi_getReorderingOptions(objval->bidi)); + RETURN_LONG(ubidi_getReorderingOptions(objval->bidi->bidi)); } /* }}} */ #if ((U_ICU_VERSION_MAJOR_NUM * 10) + U_ICU_VERSION_MINOR_NUM) >= 48 /* {{{ proto self IntlBidi::setContext([string $prologue = ''[, string $epilogue = '']]) */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(bidi_setctx_arginfo, ZEND_RETURN_VALUE, 0, IS_OBJECT, 0) - ZEND_ARG_TYPE_INFO(0, prologue, IS_STRING, 0) - ZEND_ARG_TYPE_INFO(0, epilogue, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, prologue, IS_STRING, 1) + ZEND_ARG_TYPE_INFO(0, epilogue, IS_STRING, 1) ZEND_END_ARG_INFO(); static PHP_METHOD(IntlBidi, setContext) { php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); @@ -228,15 +274,17 @@ static PHP_METHOD(IntlBidi, setContext) { UChar *uprologue = NULL, *uepilogue = NULL; int32_t uprologue_len = 0, uepilogue_len = 0; - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "|S!S!", &prologue, &epilogue) == FAILURE) { - return; - } + ZEND_PARSE_PARAMETERS_START(0, 2) + Z_PARAM_OPTIONAL + Z_PARAM_STR_EX(prologue, 1, 0) + Z_PARAM_STR_EX(epilogue, 1, 0) + ZEND_PARSE_PARAMETERS_END(); if (prologue && ZSTR_LEN(prologue)) { UErrorCode error = U_ZERO_ERROR; intl_convert_utf8_to_utf16(&uprologue, &uprologue_len, ZSTR_VAL(prologue), ZSTR_LEN(prologue), &error); if (U_FAILURE(error)) { - THROW_UFAILURE(objval, "setContext", error); + THROW_UFAILURE(objval->bidi, "setContext", error); goto setContext_cleanup; } } @@ -245,30 +293,30 @@ static PHP_METHOD(IntlBidi, setContext) { UErrorCode error = U_ZERO_ERROR; intl_convert_utf8_to_utf16(&uepilogue, &uepilogue_len, ZSTR_VAL(epilogue), ZSTR_LEN(epilogue), &error); if (U_FAILURE(error)) { - THROW_UFAILURE(objval, "setContext", error); + THROW_UFAILURE(objval->bidi, "setContext", error); goto setContext_cleanup; } } { UErrorCode error = U_ZERO_ERROR; - ubidi_setContext(objval->bidi, uprologue, uprologue_len, uepilogue, uepilogue_len, &error); + ubidi_setContext(objval->bidi->bidi, uprologue, uprologue_len, uepilogue, uepilogue_len, &error); if (U_FAILURE(error)) { - THROW_UFAILURE(objval, "setContext", error); + THROW_UFAILURE(objval->bidi, "setContext", error); goto setContext_cleanup; } } /* Preserve prologue/epilogue as set for later use */ - if (objval->prologue) { - efree(objval->prologue); + if (objval->bidi->prologue) { + efree(objval->bidi->prologue); } - objval->prologue = uprologue; + objval->bidi->prologue = uprologue; - if (objval->epilogue) { - efree(objval->epilogue); + if (objval->bidi->epilogue) { + efree(objval->bidi->epilogue); } - objval->epilogue = uepilogue; + objval->bidi->epilogue = uepilogue; RETURN_ZVAL(getThis(), 1, 0); @@ -284,43 +332,60 @@ static PHP_METHOD(IntlBidi, setContext) { /* }}} */ #endif /* ICU >= 4.8 */ -/* {{{ proto self IntlBidi::setPara(string $paragraph[, int $paraLevel = IntlBidi::DEFAULT_LTR]) */ +/* {{{ proto self IntlBidi::setPara(string $paragraph[, int $paraLevel = IntlBidi::DEFAULT_LTR[, string $embeddingLevels]]) */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(bidi_setpara_arginfo, ZEND_RETURN_VALUE, 1, IS_OBJECT, 0) ZEND_ARG_TYPE_INFO(0, paragraph, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, paraLevel, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, embeddingLevels, IS_STRING, 1) ZEND_END_ARG_INFO(); static PHP_METHOD(IntlBidi, setPara) { + zend_string *para, *embeddingLevels = NULL; + zend_long paraLevel = UBIDI_DEFAULT_LTR; php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); - zend_string *para; UChar *upara = NULL; int32_t upara_len = 0; - zend_long paraLevel = UBIDI_DEFAULT_LTR; UErrorCode error; - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "S|l", ¶, ¶Level) == FAILURE) { - return; + if (objval->bidi->childCount > 1) { + bidi_free_bidi_object(objval->bidi); + objval->bidi = bidi_create_bidi_object(0, 0); } + ZEND_PARSE_PARAMETERS_START(1, 3) + Z_PARAM_STR(para) + Z_PARAM_OPTIONAL + Z_PARAM_LONG(paraLevel) + Z_PARAM_STR_EX(embeddingLevels, 1, 0) + ZEND_PARSE_PARAMETERS_END(); + error = U_ZERO_ERROR; + objval->bidi->textLength = ZSTR_LEN(para); intl_convert_utf8_to_utf16(&upara, &upara_len, ZSTR_VAL(para), ZSTR_LEN(para), &error); if (U_FAILURE(error)) { - THROW_UFAILURE(objval, "setPara", error); + THROW_UFAILURE(objval->bidi, "setPara", error); goto setPara_cleanup; } + if (embeddingLevels != NULL && ZSTR_LEN(embeddingLevels) > 0) { + objval->bidi->embeddingLevels = (UBiDiLevel*)erealloc(objval->bidi->embeddingLevels, ZSTR_LEN(embeddingLevels)); + memcpy(objval->bidi->embeddingLevels, ZSTR_VAL(embeddingLevels), ZSTR_LEN(embeddingLevels)); + } else { + efree(objval->bidi->embeddingLevels); + objval->bidi->embeddingLevels = NULL; + } + error = U_ZERO_ERROR; - /* TODO: embeddingLevels */ - ubidi_setPara(objval->bidi, upara, upara_len, (UBiDiLevel)paraLevel, NULL, &error); + ubidi_setPara(objval->bidi->bidi, upara, upara_len, (UBiDiLevel)paraLevel, objval->bidi->embeddingLevels, &error); if (U_FAILURE(error)) { - THROW_UFAILURE(objval, "setPara", error); + THROW_UFAILURE(objval->bidi, "setPara", error); goto setPara_cleanup; } /* Most recently set paragraph must be retained by us. */ - if (objval->text) { - efree(objval->text); + if (objval->bidi->text) { + efree(objval->bidi->text); } - objval->text = upara; + objval->bidi->text = upara; RETURN_ZVAL(getThis(), 1, 0); setPara_cleanup: @@ -330,32 +395,58 @@ static PHP_METHOD(IntlBidi, setPara) { } /* }}} */ -/* {{{ proto self IntlBidi::setLine(int $tart, int $limit, IntlBidi $line) */ -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(bidi_setline_arginfo, ZEND_RETURN_VALUE, 3, IS_OBJECT, 0) +/* {{{ proto IntlBidi IntlBidi::setLine(int $start, int $limit) */ +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(bidi_setline_arginfo, ZEND_RETURN_VALUE, 2, IS_OBJECT, 0) ZEND_ARG_TYPE_INFO(0, start, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, limit, IS_LONG, 0) - ZEND_ARG_TYPE_INFO(0, line, IS_OBJECT, 0) ZEND_END_ARG_INFO(); static PHP_METHOD(IntlBidi, setLine) { zend_long start, limit; - zend_object *zline; - php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); - php_intl_bidi_object *lineval; + php_intl_bidi_object *objval, *lineval; UErrorCode error; - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "llO", &start, &limit, &zline, php_intl_bidi_ce) == FAILURE) { - return; + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_LONG(start) + Z_PARAM_LONG(limit) + ZEND_PARSE_PARAMETERS_END(); + + object_init_ex(return_value, php_intl_bidi_ce); + php_intl_bidi_invokeConstruction(return_value, 0, 0); + + objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); + bidi_object * root = objval->bidi; + lineval = bidi_object_from_zend_object(Z_OBJ_P(return_value)); + (lineval->bidi->parent = objval->bidi)->childCount++; + + if (root->parent != NULL) { + if (start + limit > root->limit) { + THROW_UFAILURE(objval->bidi, "setLine", error); + goto setLine_cleanup; + } + + start += root->start; + + while (root->parent != NULL) { + root = root->parent; + } } - lineval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); + lineval->bidi->start = start; + lineval->bidi->limit = limit; + error = U_ZERO_ERROR; - ubidi_setLine(objval->bidi, start, limit, lineval->bidi, &error); + + ubidi_setLine(root->bidi, start, limit, lineval->bidi->bidi, &error); if (U_FAILURE(error)) { - THROW_UFAILURE(objval, "setLine", error); - return; + THROW_UFAILURE(objval->bidi, "setLine", error); + goto setLine_cleanup; } - RETURN_ZVAL(getThis(), 1, 0); + RETURN_ZVAL(return_value, 0, 0); +setLine_cleanup: + if (return_value) { + zval_ptr_dtor(return_value); + } } /* }}} */ @@ -365,23 +456,23 @@ ZEND_END_ARG_INFO(); static PHP_METHOD(IntlBidi, getDirection) { php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); if (zend_parse_parameters_none_throw() == FAILURE) { return; } - RETURN_LONG(ubidi_getDirection(objval->bidi)); + RETURN_LONG(ubidi_getDirection(objval->bidi->bidi)); } /* }}} */ /* {{{ proto int IntlBidi::getBaseDirection(string $text) */ -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(bidi_getbasedir_arginfo, ZEND_RETURN_VALUE, 0, IS_LONG, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(bidi_getbasedir_arginfo, ZEND_RETURN_VALUE, 1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, text, IS_STRING, 0) ZEND_END_ARG_INFO(); static PHP_METHOD(IntlBidi, getBaseDirection) { zend_string *text; UChar *utext = NULL; - int32_t utext_len; + int32_t utext_len = 0; UErrorCode error; - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "S", &text) == FAILURE) { - return; - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_STR(text) + ZEND_PARSE_PARAMETERS_END(); error = U_ZERO_ERROR; intl_convert_utf8_to_utf16(&utext, &utext_len, ZSTR_VAL(text), ZSTR_LEN(text), &error); @@ -390,7 +481,11 @@ static PHP_METHOD(IntlBidi, getBaseDirection) { goto getBaseDirection_cleanup; } - RETURN_LONG(ubidi_getBaseDirection(utext, utext_len)); + zend_long result = ubidi_getBaseDirection(utext, utext_len); + + efree(utext); + + RETVAL_LONG(result); getBaseDirection_cleanup: if (utext) { @@ -405,7 +500,7 @@ ZEND_END_ARG_INFO(); static PHP_METHOD(IntlBidi, getParaLevel) { php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); if (zend_parse_parameters_none_throw() == FAILURE) { return; } - RETURN_LONG(ubidi_getParaLevel(objval->bidi)); + RETURN_LONG(ubidi_getParaLevel(objval->bidi->bidi)); } /* }}} */ @@ -415,7 +510,7 @@ ZEND_END_ARG_INFO(); static PHP_METHOD(IntlBidi, countParagraphs) { php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); if (zend_parse_parameters_none_throw() == FAILURE) { return; } - RETURN_LONG(ubidi_countParagraphs(objval->bidi)); + RETURN_LONG(ubidi_countParagraphs(objval->bidi->bidi)); } /* }}} */ @@ -430,13 +525,13 @@ static PHP_METHOD(IntlBidi, getParagraph) { UBiDiLevel level = UBIDI_MAX_EXPLICIT_LEVEL; UErrorCode error = U_ZERO_ERROR; - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "l", &pos) == FAILURE) { - return; - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(pos) + ZEND_PARSE_PARAMETERS_END(); - idx = ubidi_getParagraph(objval->bidi, pos, &start, &limit, &level, &error); + idx = ubidi_getParagraph(objval->bidi->bidi, pos, &start, &limit, &level, &error); if (U_FAILURE(error)) { - THROW_UFAILURE(objval, "getParagraph", error); + THROW_UFAILURE(objval->bidi, "getParagraph", error); return; } @@ -459,13 +554,13 @@ static PHP_METHOD(IntlBidi, getParagraphByIndex) { UBiDiLevel level = UBIDI_MAX_EXPLICIT_LEVEL; UErrorCode error = U_ZERO_ERROR; - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "l", &idx) == FAILURE) { - return; - } + ZEND_PARSE_PARAMETERS_START(1, 1); + Z_PARAM_LONG(idx) + ZEND_PARSE_PARAMETERS_END(); - ubidi_getParagraphByIndex(objval->bidi, idx, &start, &limit, &level, &error); + ubidi_getParagraphByIndex(objval->bidi->bidi, idx, &start, &limit, &level, &error); if (U_FAILURE(error)) { - THROW_UFAILURE(objval, "getParagraph", error); + THROW_UFAILURE(objval->bidi, "getParagraph", error); return; } @@ -485,11 +580,11 @@ static PHP_METHOD(IntlBidi, getLevelAt) { php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); zend_long pos; - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "l", &pos) == FAILURE) { - return; - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(pos) + ZEND_PARSE_PARAMETERS_END(); - RETURN_LONG(ubidi_getLevelAt(objval->bidi, pos)); + RETURN_LONG(ubidi_getLevelAt(objval->bidi->bidi, pos)); } /* }}} */ @@ -505,12 +600,12 @@ static PHP_METHOD(IntlBidi, getLevels) { if (zend_parse_parameters_none_throw() == FAILURE) { return; } - levels = ubidi_getLevels(objval->bidi, &error); + levels = ubidi_getLevels(objval->bidi->bidi, &error); if (U_FAILURE(error)) { - THROW_UFAILURE(objval, "getLevels", error); + THROW_UFAILURE(objval->bidi, "getLevels", error); return; } - len = ubidi_getProcessedLength(objval->bidi); + len = ubidi_getProcessedLength(objval->bidi->bidi); ret = zend_string_alloc(len, 0); memcpy(ZSTR_VAL(ret), levels, len); ZSTR_VAL(ret)[len] = 0; @@ -529,11 +624,11 @@ static PHP_METHOD(IntlBidi, getLogicalRun) { int32_t limit = 0; UBiDiLevel level = UBIDI_MAX_EXPLICIT_LEVEL; - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "l", &pos) == FAILURE) { - return; - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(pos) + ZEND_PARSE_PARAMETERS_END(); - ubidi_getLogicalRun(objval->bidi, pos, &limit, &level); + ubidi_getLogicalRun(objval->bidi->bidi, pos, &limit, &level); array_init(return_value); add_assoc_long(return_value, "limit", limit); @@ -551,9 +646,9 @@ static PHP_METHOD(IntlBidi, countRuns) { if (zend_parse_parameters_none_throw() == FAILURE) { return; } - ret = ubidi_countRuns(objval->bidi, &error); + ret = ubidi_countRuns(objval->bidi->bidi, &error); if (U_FAILURE(error)) { - THROW_UFAILURE(objval, "countRuns", error); + THROW_UFAILURE(objval->bidi, "countRuns", error); return; } @@ -571,11 +666,11 @@ static PHP_METHOD(IntlBidi, getVisualRun) { int32_t start = 0, length = 0; UBiDiDirection dir; - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "l", &idx) == FAILURE) { - return; - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(idx) + ZEND_PARSE_PARAMETERS_END(); - dir = ubidi_getVisualRun(objval->bidi, idx, &start, &length); + dir = ubidi_getVisualRun(objval->bidi->bidi, idx, &start, &length); array_init(return_value); add_assoc_long(return_value, "start", start); @@ -594,13 +689,13 @@ static PHP_METHOD(IntlBidi, getVisualIndex) { int32_t ret; UErrorCode error = U_ZERO_ERROR; - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "l", &idx) == FAILURE) { - return; - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(idx) + ZEND_PARSE_PARAMETERS_END(); - ret = ubidi_getVisualIndex(objval->bidi, idx, &error); + ret = ubidi_getVisualIndex(objval->bidi->bidi, idx, &error); if (U_FAILURE(error)) { - THROW_UFAILURE(objval, "getVisualIndex", error); + THROW_UFAILURE(objval->bidi, "getVisualIndex", error); return; } @@ -618,13 +713,13 @@ static PHP_METHOD(IntlBidi, getLogicalIndex) { int32_t ret; UErrorCode error = U_ZERO_ERROR; - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "l", &idx) == FAILURE) { - return; - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(idx) + ZEND_PARSE_PARAMETERS_END(); - ret = ubidi_getLogicalIndex(objval->bidi, idx, &error); + ret = ubidi_getLogicalIndex(objval->bidi->bidi, idx, &error); if (U_FAILURE(error)) { - THROW_UFAILURE(objval, "getLogicalIndex", error); + THROW_UFAILURE(objval->bidi, "getLogicalIndex", error); return; } @@ -637,17 +732,17 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(bidi_getlogicalmap_arginfo, ZEND_RETURN_ ZEND_END_ARG_INFO(); static PHP_METHOD(IntlBidi, getLogicalMap) { php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); - int32_t len = ubidi_getProcessedLength(objval->bidi), i; + int32_t len = ubidi_getProcessedLength(objval->bidi->bidi), i; int32_t *map; UErrorCode error = U_ZERO_ERROR; if (zend_parse_parameters_none_throw() == FAILURE) { return; } map = safe_emalloc(sizeof(int32_t), len, 0); - ubidi_getLogicalMap(objval->bidi, map, &error); + ubidi_getLogicalMap(objval->bidi->bidi, map, &error); if (U_FAILURE(error)) { efree(map); - THROW_UFAILURE(objval, "getLogicalMap", error); + THROW_UFAILURE(objval->bidi, "getLogicalMap", error); return; } @@ -665,17 +760,17 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(bidi_getvisualmap_arginfo, ZEND_RETURN_V ZEND_END_ARG_INFO(); static PHP_METHOD(IntlBidi, getVisualMap) { php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); - int32_t len = ubidi_getResultLength(objval->bidi), i; + int32_t len = ubidi_getResultLength(objval->bidi->bidi), i; int32_t *map; UErrorCode error = U_ZERO_ERROR; if (zend_parse_parameters_none_throw() == FAILURE) { return; } map = safe_emalloc(sizeof(int32_t), len, 0); - ubidi_getVisualMap(objval->bidi, map, &error); + ubidi_getVisualMap(objval->bidi->bidi, map, &error); if (U_FAILURE(error)) { efree(map); - THROW_UFAILURE(objval, "getVisualMap", error); + THROW_UFAILURE(objval->bidi, "getVisualMap", error); return; } @@ -694,7 +789,7 @@ ZEND_END_ARG_INFO(); static PHP_METHOD(IntlBidi, getProcessedLength) { php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); if (zend_parse_parameters_none_throw() == FAILURE) { return; } - RETURN_LONG(ubidi_getProcessedLength(objval->bidi)); + RETURN_LONG(ubidi_getProcessedLength(objval->bidi->bidi)); } /* }}} */ @@ -704,41 +799,7 @@ ZEND_END_ARG_INFO(); static PHP_METHOD(IntlBidi, getResultLength) { php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); if (zend_parse_parameters_none_throw() == FAILURE) { return; } - RETURN_LONG(ubidi_getResultLength(objval->bidi)); -} -/* }}} */ - -/* {{{ proto int IntlBidi::getCustomizedClass(string $char) */ -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(bidi_getcustomclass_arginfo, ZEND_RETURN_VALUE, 1, IS_LONG, 0) - ZEND_ARG_TYPE_INFO(0, character, IS_STRING, 0) -ZEND_END_ARG_INFO(); -static PHP_METHOD(IntlBidi, getCustomizedClass) { - php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); - zend_string *text; - int32_t pos = 0; - size_t len; - UChar32 c; - - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "S", &text) == FAILURE) { - return; - } - - if (ZSTR_LEN(text) > 4) { - php_bidi_throw_failure(NULL, U_ILLEGAL_ARGUMENT_ERROR, - "IntlChar::getCustomizedClass() requires precisely one unicode character as input"); - return; - } - - len = ZSTR_LEN(text); - - U8_NEXT(ZSTR_VAL(text), pos, len, c); - if ((size_t)pos != len) { - php_bidi_throw_failure(NULL, U_ILLEGAL_ARGUMENT_ERROR, - "IntlChar::getCustomizedClass() requires precisely one unicode character as input"); - return; - } - - RETURN_LONG(ubidi_getCustomizedClass(objval->bidi, c)); + RETURN_LONG(ubidi_getResultLength(objval->bidi->bidi)); } /* }}} */ @@ -754,26 +815,32 @@ static PHP_METHOD(IntlBidi, getReordered) { zend_string *ret; UErrorCode error; - if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "l", &options) == FAILURE) { - return; - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(options) + ZEND_PARSE_PARAMETERS_END(); - if (options & UBIDI_INSERT_LRM_FOR_NUMERIC) { + if ( + (options & UBIDI_INSERT_LRM_FOR_NUMERIC) == UBIDI_INSERT_LRM_FOR_NUMERIC || + (ubidi_getReorderingOptions(objval->bidi->bidi) & UBIDI_OPTION_INSERT_MARKS) == UBIDI_OPTION_INSERT_MARKS + ) { error = U_ZERO_ERROR; - utext_len = ubidi_getLength(objval->bidi) + (2 * ubidi_countRuns(objval->bidi, &error)); - THROW_UFAILURE(objval, "getReordered", error); + utext_len = ubidi_getLength(objval->bidi->bidi) + (2 * ubidi_countRuns(objval->bidi->bidi, &error)); + if (U_FAILURE(error)) { + THROW_UFAILURE(objval->bidi, "getReordered", error); + return; + } } else if (options & UBIDI_REMOVE_BIDI_CONTROLS) { - utext_len = ubidi_getLength(objval->bidi); + utext_len = ubidi_getLength(objval->bidi->bidi); } else { - utext_len = ubidi_getProcessedLength(objval->bidi); + utext_len = ubidi_getProcessedLength(objval->bidi->bidi); } utext = safe_emalloc(sizeof(UChar), utext_len, sizeof(UChar)); error = U_ZERO_ERROR; - utext_len = ubidi_writeReordered(objval->bidi, utext, utext_len + 1, options, &error); + utext_len = ubidi_writeReordered(objval->bidi->bidi, utext, utext_len, options, &error); if (U_FAILURE(error)) { efree(utext); - THROW_UFAILURE(objval, "getReordered", error); + THROW_UFAILURE(objval->bidi, "getReordered", error); return; } @@ -781,7 +848,7 @@ static PHP_METHOD(IntlBidi, getReordered) { ret = intl_convert_utf16_to_utf8(utext, utext_len, &error); efree(utext); if (U_FAILURE(error)) { - THROW_UFAILURE(objval, "getReordered", error); + THROW_UFAILURE(objval->bidi, "getReordered", error); return; } @@ -789,6 +856,16 @@ static PHP_METHOD(IntlBidi, getReordered) { } /* }}} */ +/* {{{ proto int IntlBidi::getLength() */ +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(bidi_getlength_arginfo, ZEND_RETURN_VALUE, 0, IS_LONG, 0) +ZEND_END_ARG_INFO() +static PHP_METHOD(IntlBidi, getLength) { + php_intl_bidi_object *objval = bidi_object_from_zend_object(Z_OBJ_P(getThis())); + if (zend_parse_parameters_none_throw() == FAILURE) { return; } + RETURN_LONG(ubidi_getLength(objval->bidi->bidi)); +} +/* }}} */ + static zend_function_entry bidi_methods[] = { PHP_ME(IntlBidi, __construct, bidi_ctor_arginfo, ZEND_ACC_CTOR | ZEND_ACC_PUBLIC) PHP_ME(IntlBidi, setInverse, bidi_setinverse_arginfo, ZEND_ACC_PUBLIC) @@ -799,6 +876,7 @@ static zend_function_entry bidi_methods[] = { PHP_ME(IntlBidi, getReorderingMode, bidi_getreordermode_arginfo, ZEND_ACC_PUBLIC) PHP_ME(IntlBidi, setReorderingOptions, bidi_setreorderopts_arginfo, ZEND_ACC_PUBLIC) PHP_ME(IntlBidi, getReorderingOptions, bidi_getreorderopts_arginfo, ZEND_ACC_PUBLIC) + PHP_ME(IntlBidi, getLength, bidi_getlength_arginfo, ZEND_ACC_PUBLIC) #if ((U_ICU_VERSION_MAJOR_NUM * 10) + U_ICU_VERSION_MINOR_NUM) >= 48 PHP_ME(IntlBidi, setContext, bidi_setctx_arginfo, ZEND_ACC_PUBLIC) #endif @@ -821,7 +899,6 @@ static zend_function_entry bidi_methods[] = { PHP_ME(IntlBidi, getVisualMap, bidi_getvisualmap_arginfo, ZEND_ACC_PUBLIC) PHP_ME(IntlBidi, getProcessedLength, bidi_getprocessedlen_arginfo, ZEND_ACC_PUBLIC) PHP_ME(IntlBidi, getResultLength, bidi_getresultlen_arginfo, ZEND_ACC_PUBLIC) - PHP_ME(IntlBidi, getCustomizedClass, bidi_getcustomclass_arginfo, ZEND_ACC_PUBLIC) PHP_ME(IntlBidi, getReordered, bidi_getreordered_arginfo, ZEND_ACC_PUBLIC) PHP_FE_END @@ -837,7 +914,6 @@ static zend_object *bidi_object_ctor(zend_class_entry *ce) { zend_object_std_init(&objval->std, ce); object_properties_init(&objval->std, ce); - intl_error_init(&(objval->error)); objval->std.handlers = &bidi_object_handlers; @@ -846,13 +922,7 @@ static zend_object *bidi_object_ctor(zend_class_entry *ce) { static void bidi_object_dtor(zend_object *obj) { php_intl_bidi_object *objval = bidi_object_from_zend_object(obj); - - if (objval->bidi) { ubidi_close(objval->bidi); } - if (objval->prologue) { efree(objval->prologue); } - if (objval->text) { efree(objval->text); } - if (objval->epilogue) { efree(objval->epilogue); } - - intl_error_reset(&(objval->error)); + bidi_free_bidi_object(objval->bidi); } PHP_MINIT_FUNCTION(intl_bidi) { diff --git a/ext/intl/tests/IntlBidi/IntlBidi___construct_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi___construct_basic.phpt new file mode 100644 index 0000000000000..1d3965cbd4361 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi___construct_basic.phpt @@ -0,0 +1,13 @@ +--TEST-- +Basic test to check the construction of IntlBidi. +--CREDITS-- +Timo Scholz +--SKIPIF-- + +--FILE-- + +==DONE== +--EXPECT-- +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_basic.phpt new file mode 100644 index 0000000000000..24365a64e457c --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_basic.phpt @@ -0,0 +1,78 @@ +--TEST-- +Regression test for the UBA implementation. +--CREDITS-- +Timo Scholz +--SKIPIF-- + + +--FILE-- +setInverse(true); + + $levels = str_repeat("\0", IntlBidi::MAX_EXPLICIT_LEVEL); + for ($i = 0; $i < 10; $i++) { + $levels[$i] = chr($i + 1); + } + + $bidi->setPara($srcUt8, \IntlBidi::DEFAULT_LTR, $levels); + $result = u8ToPseudo($bidi->getReordered(\IntlBidi::OUTPUT_REVERSE)); + var_dump($result); +} +?> +==DONE== +--EXPECT-- +string(17) ")K.C.&(KC)dda(led" +string(19) ")BVDL(ddaQDVT) (led" +string(21) "R.S.)T)U.&(PQ)dda(led" +string(22) "L.V.) L.V.&(LV)dda(led" +string(26) "rbbayad DPDHRVR R 0 yad" +string(27) "rbbayad DPHPDHDA H 1 yad" +string(28) "rbbayad DPBLENDA L 2 yad" +string(26) "rbbayad DPJQVM J 3 yad" +string(29) "rbbayad DPIQNF I 4 yad" +string(25) "rbbayad DPMEG M 5 yad" +string(10) "DPMEGolleh" +string(9) "WXY olleh" +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_basic1.phpt b/ext/intl/tests/IntlBidi/IntlBidi_basic1.phpt new file mode 100644 index 0000000000000..9f7e33f07a097 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_basic1.phpt @@ -0,0 +1,79 @@ +--TEST-- +Regression test for the UBA implementation. +--CREDITS-- +Timo Scholz +--SKIPIF-- + + +--FILE-- +setInverse(true); + $levels = str_repeat("\0", \IntlBidi::MAX_EXPLICIT_LEVEL); + for ($i = 0; $i < 10; $i++) { + $levels[$i] = chr($i + 1); + } + + $bidi->setPara($srcUt8, \IntlBidi::DEFAULT_LTR, $levels); + $result = u8ToPseudo($bidi->getReordered(\IntlBidi::DO_MIRRORING | \IntlBidi::REMOVE_BIDI_CONTROLS)); + var_dump($result); +} +?> +==DONE== +--EXPECT-- +string(16) "del(add(CK(.C.K)" +string(19) "del( (TVDQadd(LDVB)" +string(20) "del(add(QP(.U(T(.S.R" +string(21) "del(add(VL(.V.L (.V.L" +string(26) "day 0 R RVRHDPD dayabbr" +string(27) "day 1 H ADHDPHPD dayabbr" +string(28) "day 2 L ADNELBPD dayabbr" +string(26) "day 3 J MVQJPD dayabbr" +string(29) "day 4 I FNQIPD dayabbr" +string(25) "day 5 M GEMPD dayabbr" +string(10) "helloGEMPD" +string(9) "hello YXW" +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_countParagraphs_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_countParagraphs_basic.phpt new file mode 100644 index 0000000000000..ca230d0468e43 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_countParagraphs_basic.phpt @@ -0,0 +1,48 @@ +--TEST-- +Test for IntlBidi countParagraphs +--CREDITS-- +Timo Scholz +--SKIPIF-- + +--FILE-- +setPara('', IntlBidi::LTR, null); +var_dump($bidi->countParagraphs()); + +$text = "__ABC\u{001c}" /* Para #0 offset 0 */ + . "__\u{05d0}DE\u{001c}" /* 1 6 */ + . "__123\u{001c}" /* 2 12 */ + . "\r\n" /* 3 18 */ + . "FG\r" /* 4 20 */ + . "\r" /* 5 23 */ + . "HI\r\n" /* 6 24 */ + . "\r\n" /* 7 28 */ + . "\n" /* 8 30 */ + . "\n" /* 9 31 */ + . "JK\u{001c}"; /* 10 32 */ + +$bidi->setPara($text, IntlBidi::LTR, null); + +var_dump($bidi->countParagraphs()); +?> +==DONE== +--EXPECT-- +int(0) +int(11) +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_countRuns_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_countRuns_basic.phpt new file mode 100644 index 0000000000000..b4067d0c6e160 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_countRuns_basic.phpt @@ -0,0 +1,77 @@ +--TEST-- +Test for IntlBidi countRuns +--CREDITS-- +Timo Scholz +--SKIPIF-- + + +--FILE-- +setPara($string, 0); + + $runCount = $bidi->countRuns(); + $len = $bidi->getLength(); + + for ($logicalIndex = 0; $logicalIndex < $len; ) { + $logicalIndex = $bidi->getLogicalRun($logicalIndex)['limit']; + + if (--$runCount < 0) { + throw new RuntimeException('Wrong number of runs compared to Bidi.countRuns()'); + } + } + if ($runCount > 0) { + throw new RuntimeException('Wrong number of runs compared to Bidi.countRuns()'); + } + + var_dump($runCount); +} + +doTest("Testen"); +doTest(pseudoToU8('del(KC)add(K.C.&)')); +doTest(pseudoToU8('del(QDVT) add(BVDL)')); +doTest(pseudoToU8('del(PQ)add(R.S.)T)U.&')); +doTest(pseudoToU8('del(LV)add(L.V.) L.V.&')); +doTest(pseudoToU8('day 0 R DPDHRVR dayabbr')); +doTest(pseudoToU8('day 1 H DPHPDHDA dayabbr')); +doTest(pseudoToU8('day 2 L DPBLENDA dayabbr')); +doTest(pseudoToU8('day 3 J DPJQVM dayabbr')); +doTest(pseudoToU8('day 4 I DPIQNF dayabbr')); +doTest(pseudoToU8('day 5 M DPMEG dayabbr')); +doTest(pseudoToU8('helloDPMEG')); +doTest(pseudoToU8('hello WXY')); +?> +==DONE== +--EXPECT-- +int(0) +int(0) +int(0) +int(0) +int(0) +int(0) +int(0) +int(0) +int(0) +int(0) +int(0) +int(0) +int(0) +==DONE== diff --git a/ext/intl/tests/IntlBidi/IntlBidi_countRuns_variant.phpt b/ext/intl/tests/IntlBidi/IntlBidi_countRuns_variant.phpt new file mode 100644 index 0000000000000..cf1b4e379be0d --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_countRuns_variant.phpt @@ -0,0 +1,31 @@ +--TEST-- +Check 1-char runs with RUNS_ONLY +--CREDITS-- +Timo Scholz +--SKIPIF-- + +--FILE-- +setReorderingMode(IntlBidi::REORDER_RUNS_ONLY); +$bidi->setPara("a \u{05d0} b \u{05d1} c \u{05d2} d ", IntlBidi::LTR); +var_dump($bidi->countRuns()); +?> +==DONE== +--EXPECT-- +int(14) +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getBaseDirection_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getBaseDirection_basic.phpt new file mode 100644 index 0000000000000..b7ceeeb033972 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getBaseDirection_basic.phpt @@ -0,0 +1,77 @@ +--TEST-- +Test for IntlBidi getBaseDirection to verify string direction detection function. +--CREDITS-- +Timo Scholz +--SKIPIF-- + +--FILE-- +getBaseDirection("\u{0061}\u{0627}\u{0032}\u{06f3}\u{0061}\u{0034}") === \IntlBidi::LTR); +// mixed start with AL +var_dump($bidi->getBaseDirection( "\u{0661}\u{0627}\u{0662}\u{06f3}\u{0061}\u{0664}") === \IntlBidi::RTL); + +// mixed Start with R +var_dump($bidi->getBaseDirection("\u{05EA}\u{0627}\u{0662}\u{06f3}\u{0061}\u{0664}") === \IntlBidi::RTL); + +// all AL (Arabic. Persian) +var_dump($bidi->getBaseDirection("\u{0698}\u{067E}\u{0686}\u{06AF}") === \IntlBidi::RTL); + +// all R (Hebrew etc.) +var_dump($bidi->getBaseDirection("\u{0590}\u{05D5}\u{05EA}\u{05F1}") === \IntlBidi::RTL); + +// all L (English) +var_dump($bidi->getBaseDirection("\u{0071}\u{0061}\u{0066}") === \IntlBidi::LTR); + +// mixed start with weak AL an then L +var_dump($bidi->getBaseDirection("\u{0663}\u{0071}\u{0061}\u{0066}") === \IntlBidi::LTR); + +// mixed start with weak L and then AL */ +var_dump($bidi->getBaseDirection("\u{0031}\u{0698}\u{067E}\u{0686}\u{06AF}") === \IntlBidi::RTL); + +// empty +var_dump($bidi->getBaseDirection('') === \IntlBidi::NEUTRAL); + +// all weak L (English digits) +var_dump($bidi->getBaseDirection("\u{0031}\u{0032}\u{0033}") === \IntlBidi::NEUTRAL); + +// all weak AL (Arabic digits) +var_dump($bidi->getBaseDirection("\u{0663}\u{0664}\u{0665}") === \IntlBidi::NEUTRAL); + +// first L (English) others are R (Hebrew etc.) +var_dump($bidi->getBaseDirection("\u{0071}\u{0590}\u{05D5}\u{05EA}\u{05F1}") === \IntlBidi::LTR); + +// last R (Hebrew etc.) others are weak L (English Digits) +var_dump($bidi->getBaseDirection("\u{0031}\u{0032}\u{0033}\u{05F1}") === \IntlBidi::RTL); +?> +==DONE== +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getDirection_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getDirection_basic.phpt new file mode 100644 index 0000000000000..35f18a65679c5 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getDirection_basic.phpt @@ -0,0 +1,196 @@ +--TEST-- +Test for IntlBidi getDirection +--CREDITS-- +Timo Scholz +--SKIPIF-- + +--FILE-- +setPara(getStringFromDirProps($testDirProps[$index]), $paraLevels[$index]); + $lineStart = $lineStarts[$index]; + if ($lineStart === -1) { + $line = $bidi; + } else { + $line = $bidi->setLine($lineStart, $lineLimits[$index]); + } + + var_dump($line->getDirection() === $testDirections[$index]); +} +?> +==DONE== +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +==DONE== diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getLevelAt_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getLevelAt_basic.phpt new file mode 100644 index 0000000000000..240966ef8d281 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getLevelAt_basic.phpt @@ -0,0 +1,55 @@ +--TEST-- +Test for IntlBidi getLevelAt +--CREDITS-- +Timo Scholz , Jan Slabon +--SKIPIF-- + +--FILE-- +setPara("abc ", \IntlBidi::RTL); +$bidiLine = $bidi->setLine(0, 6); +for ($i = 3; $i < 6; $i++) { + var_dump($bidiLine->getLevelAt($i) === \IntlBidi::RTL); +} + +$bidi->setPara("abc def", \IntlBidi::RTL, null); +$bidiLine = $bidi->setLine(0, 6); +for ($i = 3; $i < 6; $i++) { + var_dump($bidiLine->getLevelAt($i) === \IntlBidi::RTL); +} + +$bidi->setPara("abcdefghi ", \IntlBidi::RTL, null); +$bidiLine = $bidi->setLine(0, 6); +for ($i = 3; $i < 6; $i++) { + var_dump($bidiLine->getLevelAt($i) === \IntlBidi::MIXED); +} + +?> +==DONE== +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getLevels_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getLevels_basic.phpt new file mode 100644 index 0000000000000..c557efe716880 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getLevels_basic.phpt @@ -0,0 +1,78 @@ +--TEST-- +Test IntlBidi::getLevels() method +--CREDITS-- +Jan Slabon +--SKIPIF-- + + +--FILE-- +setPara($string); + +$levels = $bidi->getLevels(); + +var_dump(strlen($levels) === strlen($original)); + +for ($i = 0, $len = strlen($levels); $i < $len; $i++) { + echo $original[$i] . ': ' . bin2hex($levels[$i]) . "\n"; +} + +echo "\n"; + +// do the with level set to RTL +$bidi = new \IntlBidi(); +$bidi->setPara($string, \IntlBidi::RTL); +$levels = $bidi->getLevels(); + +for ($i = 0, $len = strlen($levels); $i < $len; $i++) { + echo $original[$i] . ': ' . bin2hex($levels[$i]) . "\n"; +} + +?> +==DONE== +--EXPECT-- +bool(true) +d: 00 +e: 00 +l: 00 +(: 00 +K: 01 +C: 01 +): 00 +a: 00 +d: 00 +d: 00 +(: 00 +K: 01 +.: 01 +C: 01 +.: 01 +&: 01 +): 00 + +d: 02 +e: 02 +l: 02 +(: 01 +K: 01 +C: 01 +): 01 +a: 02 +d: 02 +d: 02 +(: 01 +K: 01 +.: 01 +C: 01 +.: 01 +&: 01 +): 01 +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getMapsAndIndexes_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getMapsAndIndexes_basic.phpt new file mode 100644 index 0000000000000..0fca08d485482 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getMapsAndIndexes_basic.phpt @@ -0,0 +1,128 @@ +--TEST-- +Test for IntlBidi::getVisualIndex(), IntlBidi::getLogicalIndex(), IntlBidi::getLogicMap(), IntlBidi::getVisualMap() +--CREDITS-- +Jan Slabon +--SKIPIF-- + + +--FILE-- +setPara($string); + +$logicalMap = $bidi->getLogicalMap(); +$visualMap = $bidi->getVisualMap(); + +var_dump(count($logicalMap)); +var_dump($bidi->getProcessedLength() === count($logicalMap)); + +// We do cross checks in both tables and getter methods: +foreach ($chars as $logicalIndex => $char) { + $visualIndex = $bidi->getVisualIndex($logicalIndex); + var_dump($visualIndex === $logicalMap[$visualMap[$visualIndex]]); + var_dump($visualIndex === $logicalMap[$logicalIndex]); + var_dump($logicalIndex === $bidi->getLogicalIndex($visualIndex)); +} + +// That's how this is done manually/reproducable: + +//var_dump(u8ToPseudo($bidi->getReordered(0))); + +//$logicalIndex = 0; // ( +//$visualIndex = $bidi->getVisualIndex($logicalIndex); +//var_dump($visualIndex === 13, $visualIndex === $logicalMap[$logicalIndex]); +//var_dump($visualIndex === $logicalMap[$logicalIndex]); +//var_dump($bidi->getLogicalIndex($visualIndex) === $logicalIndex); +// +//$logicalIndex = 1; // K +//$visualIndex = $bidi->getVisualIndex($logicalIndex); +//var_dump($visualIndex === 12, $visualIndex === $logicalMap[$visualMap[$visualIndex]]); +//var_dump($visualIndex === $logicalMap[$logicalIndex]); +//var_dump($bidi->getLogicalIndex($visualIndex) === $logicalIndex); +// +//$logicalIndex = 2; // C +//$visualIndex = $bidi->getVisualIndex($logicalIndex); +//var_dump($visualIndex === 11, $visualIndex === $logicalMap[$visualMap[$visualIndex]]); +//var_dump($visualIndex === $logicalMap[$logicalIndex]); +//var_dump($bidi->getLogicalIndex($visualIndex) === $logicalIndex); +// +//$logicalIndex = 3; // ) +//$visualIndex = $bidi->getVisualIndex($logicalIndex); +//var_dump($visualIndex === 10, $visualIndex === $logicalMap[$visualMap[$visualIndex]]); +//var_dump($bidi->getLogicalIndex($visualIndex) === $logicalIndex); +// +//$logicalIndex = 4; // a +//$visualIndex = $bidi->getVisualIndex($logicalIndex); +//var_dump($visualIndex === 7, $visualIndex === $logicalMap[$visualMap[$visualIndex]]); +//var_dump($bidi->getLogicalIndex($visualIndex) === $logicalIndex); +// +//$logicalIndex = 5; // d +//$visualIndex = $bidi->getVisualIndex($logicalIndex); +//var_dump($visualIndex === 8, $visualIndex === $logicalMap[$visualMap[$visualIndex]]); +//var_dump($bidi->getLogicalIndex($visualIndex) === $logicalIndex); +// +//$logicalIndex = 6; // d +//$visualIndex = $bidi->getVisualIndex($logicalIndex); +//var_dump($visualIndex === 9, $visualIndex === $logicalMap[$visualMap[$visualIndex]]); +//var_dump($bidi->getLogicalIndex($visualIndex) === $logicalIndex); + +// ... + +//var_dump($logicalMap); +//var_dump($visualMap); + +?> +==DONE== +--EXPECT-- +int(14) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +==DONE== diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getParaX_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getParaX_basic.phpt new file mode 100644 index 0000000000000..13405b2cd0e96 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getParaX_basic.phpt @@ -0,0 +1,101 @@ +--TEST-- +Test IntlBidi::getPara*() methods: getParaLevel(), getParagraph(), getParagraphByIndex() +--CREDITS-- +Jan Slabon +--SKIPIF-- + +--FILE-- +setPara($string); +var_dump($bidi->getParagraph(0)); +var_dump($bidi->getParaLevel() === \IntlBidi::LTR); +echo "\n"; + +$bidi->setPara($string, \IntlBidi::RTL); +var_dump($bidi->getParagraph(5)); +var_dump($bidi->getParaLevel() === \IntlBidi::RTL); +echo "\n"; + +$bidi->setPara("ABC\r\nDEF"); +var_dump($bidi->getParagraph(4)); // position of the block separator +var_dump($bidi->getParagraphByIndex(0)); +echo "\n"; + +var_dump($bidi->getParagraph(5)); // position after the block separator +var_dump($bidi->getParagraphByIndex(1)); + + +echo "\n"; +?> +==DONE== +--EXPECT-- +array(4) { + ["index"]=> + int(0) + ["start"]=> + int(0) + ["limit"]=> + int(13) + ["level"]=> + int(0) +} +bool(true) + +array(4) { + ["index"]=> + int(0) + ["start"]=> + int(0) + ["limit"]=> + int(13) + ["level"]=> + int(1) +} +bool(true) + +array(4) { + ["index"]=> + int(0) + ["start"]=> + int(0) + ["limit"]=> + int(5) + ["level"]=> + int(0) +} +array(4) { + ["index"]=> + int(0) + ["start"]=> + int(0) + ["limit"]=> + int(5) + ["level"]=> + int(0) +} + +array(4) { + ["index"]=> + int(1) + ["start"]=> + int(5) + ["limit"]=> + int(8) + ["level"]=> + int(0) +} +array(4) { + ["index"]=> + int(1) + ["start"]=> + int(5) + ["limit"]=> + int(8) + ["level"]=> + int(0) +} + +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getProcessedLength_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getProcessedLength_basic.phpt new file mode 100644 index 0000000000000..bc4a5f6a746f3 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getProcessedLength_basic.phpt @@ -0,0 +1,51 @@ +--TEST-- +Test IntlBidi::getProcessedLength() method. +--CREDITS-- +Jan Slabon +--SKIPIF-- + + +--FILE-- +setPara('testen'); +var_dump($bidi->getProcessedLength()); // 6 + +$string = pseudoToU8('del(KC)'); +$bidi->setPara($string); +var_dump($bidi->getProcessedLength()); // 7 + +$string = pseudoToU8('(K.C.&)'); +$bidi->setPara($string); +var_dump($bidi->getProcessedLength()); // 7 + + +$bidi->setReorderingOptions(\IntlBidi::OPTION_STREAMING); +// meaningful boundary +$bidi->setPara('abcdefghijklmnopqrstuvwxyz'); +var_dump($bidi->getProcessedLength()); // 0 + +$string = "testen\ntesten\ntesten"; +$len = strlen($string); +$bidi->setPara($string); +var_dump($bidi->getProcessedLength()); // 14 +// turn streaming off before getting the last part of the text +$bidi->setReorderingOptions(\IntlBidi::OPTION_DEFAULT); +$bidi->setPara(substr($string, 14, $len - 14)); +var_dump($bidi->getProcessedLength()); // 6 + +?> +==DONE== +--EXPECT-- +int(6) +int(7) +int(7) +int(0) +int(14) +int(6) +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic.phpt new file mode 100644 index 0000000000000..3f91d479bfefd --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic.phpt @@ -0,0 +1,73 @@ +--TEST-- +Regression test for the UBA implementation. +--CREDITS-- +Timo Scholz +--SKIPIF-- + + +--FILE-- +setPara($srcUt8, \IntlBidi::DEFAULT_LTR); + $result = u8ToPseudo($bidi->getReordered(\IntlBidi::DO_MIRRORING)); + var_dump($result); +} +?> +==DONE== +--EXPECT-- +string(17) "del(CK)add(&.C.K)" +string(19) "del(TVDQ) add(LDVB)" +string(21) "del(QP)add(S.R.)&.U(T" +string(22) "del(VL)add(V.L.) &.V.L" +string(26) "day 0 RVRHDPD R dayabbr" +string(27) "day 1 ADHDPHPD H dayabbr" +string(28) "day 2 ADNELBPD L dayabbr" +string(26) "day 3 MVQJPD J dayabbr" +string(29) "day 4 FNQIPD I dayabbr" +string(25) "day 5 GEMPD M dayabbr" +string(10) "helloGEMPD" +string(9) "hello YXW" +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic1.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic1.phpt new file mode 100644 index 0000000000000..d30129081b479 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic1.phpt @@ -0,0 +1,72 @@ +--TEST-- +Regression test for the UBA implementation. +--CREDITS-- +Timo Scholz +--SKIPIF-- + + +--FILE-- +setPara($srcUt8, \IntlBidi::DEFAULT_LTR); + $result = u8ToPseudo($bidi->getReordered(\IntlBidi::DO_MIRRORING | \IntlBidi::OUTPUT_REVERSE)); + var_dump($result); +} +?> +==DONE== +--EXPECT-- +string(17) ")K.C.&(dda)KC(led" +string(19) ")BVDL(dda )QDVT(led" +string(21) "T(U.&).R.S(dda)PQ(led" +string(22) "L.V.& ).L.V(dda)LV(led" +string(26) "rbbayad R DPDHRVR 0 yad" +string(27) "rbbayad H DPHPDHDA 1 yad" +string(28) "rbbayad L DPBLENDA 2 yad" +string(26) "rbbayad J DPJQVM 3 yad" +string(29) "rbbayad I DPIQNF 4 yad" +string(25) "rbbayad M DPMEG 5 yad" +string(10) "DPMEGolleh" +string(9) "WXY olleh" +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic2.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic2.phpt new file mode 100644 index 0000000000000..a27ce09cc2fce --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic2.phpt @@ -0,0 +1,73 @@ +--TEST-- +Regression test for the UBA implementation. +--CREDITS-- +Timo Scholz +--SKIPIF-- + + +--FILE-- +setInverse(true); + $bidi->setPara($srcUt8, \IntlBidi::DEFAULT_LTR); + $result = u8ToPseudo($bidi->getReordered(\IntlBidi::OUTPUT_REVERSE | \IntlBidi::INSERT_LRM_FOR_NUMERIC)); + var_dump($result); +} +?> +==DONE== +--EXPECT-- +string(22) "@)@K.C.&@(dda)@KC@(led" +string(24) "@)@BVDL@(dda )@QDVT@(led" +string(24) "R.S.)T)U.&@(dda)@PQ@(led" +string(25) "L.V.) L.V.&@(dda)@LV@(led" +string(28) "rbbayad @R DPDHRVR@ 0 yad" +string(29) "rbbayad @H DPHPDHDA@ 1 yad" +string(30) "rbbayad @L DPBLENDA@ 2 yad" +string(28) "rbbayad @J DPJQVM@ 3 yad" +string(31) "rbbayad @I DPIQNF@ 4 yad" +string(27) "rbbayad @M DPMEG@ 5 yad" +string(10) "DPMEGolleh" +string(10) "WXY@ olleh" +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic3.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic3.phpt new file mode 100644 index 0000000000000..4075039f7d40d --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic3.phpt @@ -0,0 +1,105 @@ +--TEST-- +Regression test for variants to the UBA. +--CREDITS-- +Timo Scholz +--SKIPIF-- + + +--FILE-- +67->', + '-=%$123/ *', + 'abc->12..>JKL', + 'JKL->12..>abc', + '123->abc', + '123->JKL', + '*>12.>34->JKL', + '*>67.>89->JKL', + '* /abc-=$%123', + '* /$%def-=123', + '-=GHI* /123%$', + '-=%$JKL* /123', + 'ab =#CD *?450', + 'ab 234 896 de', + 'abc-=%$LMN* /123', + '123->JKL&MN&P', + '123' +]; + +$bidi = new IntlBidi(); + +$bidi->setReorderingMode(IntlBidi::REORDER_RUNS_ONLY); +$bidi->setReorderingOptions(IntlBidi::OPTION_REMOVE_CONTROLS); + +for ($i = 0, $iMax = \count($testCases); $i < $iMax; $i++) { + $src = $testCases[$i]; + $srcU8 = pseudoToU8($src); + + $bidi->setPara($srcU8, 0); + var_dump(u8ToPseudo($bidi->getReordered(IntlBidi::DO_MIRRORING))); + + $bidi->setPara($srcU8, 1); + var_dump(u8ToPseudo($bidi->getReordered(IntlBidi::DO_MIRRORING))); +} + +?> +==DONE== +--EXPECT-- +string(13) "de 896 ab 234" +string(13) "de 896 ab 234" +string(6) "GHIabc" +string(6) "GHIabc" +string(7) "<-67<.a" +string(7) "<-67<.a" +string(10) "* /%$123=-" +string(10) "* /%$123=-" +string(13) "JKL<..12<-abc" +string(13) "JKL<..abc->12" +string(13) "abc<..JKL->12" +string(13) "abc<..12<-JKL" +string(8) "abc<-123" +string(8) "abc<-123" +string(8) "JKL<-123" +string(8) "123->JKL" +string(13) "JKL<-34<.12<*" +string(13) "12.>34->JKL<*" +string(13) "67.>89->JKL<*" +string(13) "67.>89->JKL<*" +string(13) "$%123=-abc/ *" +string(13) "abc-=$%123/ *" +string(13) "123=-def%$/ *" +string(13) "def-=123%$/ *" +string(13) "GHI* /123%$=-" +string(13) "123%$/ *GHI=-" +string(13) "JKL* /%$123=-" +string(13) "123/ *JKL$%=-" +string(13) "CD *?450#= ab" +string(13) "450?* CD#= ab" +string(13) "de 896 ab 234" +string(13) "de 896 ab 234" +string(16) "LMN* /%$123=-abc" +string(16) "123/ *LMN$%=-abc" +string(11) "JKLMNP<-123" +string(11) "123->JKLMNP" +string(3) "123" +string(3) "123" +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic4.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic4.phpt new file mode 100644 index 0000000000000..1d2de8da0c254 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic4.phpt @@ -0,0 +1,102 @@ +--TEST-- +Regression test for variants to the UBA. +--CREDITS-- +Timo Scholz +--SKIPIF-- + + +--FILE-- +67->', + '-=%$123/ *', + 'abc->12..>JKL', + 'JKL->12..>abc', + '123->abc', + '123->JKL', + '*>12.>34->JKL', + '*>67.>89->JKL', + '* /abc-=$%123', + '* /$%def-=123', + '-=GHI* /123%$', + '-=%$JKL* /123', + 'ab =#CD *?450', + 'ab 234 896 de', + 'abc-=%$LMN* /123', + '123->JKL&MN&P', + '123' +]; + +$bidi = new IntlBidi(); + +$bidi->setReorderingMode(IntlBidi::REORDER_RUNS_ONLY); +$bidi->setReorderingOptions(IntlBidi::OPTION_INSERT_MARKS); + +for ($i = 0, $iMax = \count($testCases); $i < $iMax; $i++) { + $src = $testCases[$i]; + $srcU8 = pseudoToU8($src); + + $bidi->setPara($srcU8, 0); + var_dump(u8ToPseudo($bidi->getReordered(IntlBidi::DO_MIRRORING))); + + $bidi->setPara($srcU8, 1); + var_dump(u8ToPseudo($bidi->getReordered(IntlBidi::DO_MIRRORING))); +} + +?> +==DONE== +--EXPECT-- +string(6) "GHIabc" +string(6) "GHIabc" +string(7) "<-67<.a" +string(7) "<-67<.a" +string(10) "* /%$123=-" +string(10) "* /%$123=-" +string(13) "JKL<..12<-abc" +string(13) "JKL<..abc->12" +string(13) "abc<..JKL->12" +string(13) "abc<..12<-JKL" +string(9) "abc&<-123" +string(8) "abc<-123" +string(8) "JKL<-123" +string(9) "JKL<-@123" +string(13) "JKL<-34<.12<*" +string(14) "JKL<-@34<.12<*" +string(13) "67.>89->JKL<*" +string(13) "67.>89->JKL<*" +string(13) "$%123=-abc/ *" +string(13) "abc-=$%123/ *" +string(13) "123=-def%$/ *" +string(13) "def-=123%$/ *" +string(13) "GHI* /123%$=-" +string(13) "123%$/ *GHI=-" +string(13) "JKL* /%$123=-" +string(13) "123/ *JKL$%=-" +string(13) "CD *?450#= ab" +string(13) "450?* CD#= ab" +string(15) "ab 234 @896@ de" +string(13) "de 896 ab 234" +string(16) "LMN* /%$123=-abc" +string(16) "123/ *LMN$%=-abc" +string(11) "JKLMNP<-123" +string(12) "JKLMNP<-@123" +string(3) "123" +string(3) "123" +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic5.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic5.phpt new file mode 100644 index 0000000000000..89e400bf73f1a --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_basic5.phpt @@ -0,0 +1,91 @@ +--TEST-- +Test inverse Bidi with marks and contextual orientation. +--CREDITS-- +Timo Scholz , Jan Slabon +--SKIPIF-- + + +--FILE-- +setReorderingMode(\IntlBidi::REORDER_INVERSE_LIKE_DIRECT); +$bidi->setReorderingOptions(\IntlBidi::OPTION_INSERT_MARKS); + +$bidi->setPara(''); +var_dump($bidi->getReordered(0) === ''); + +$bidi->setPara(' ', \IntlBidi::DEFAULT_RTL); +var_dump($bidi->getReordered(0) === ' '); + +$bidi->setPara("abc", \IntlBidi::DEFAULT_RTL); +var_dump($bidi->getReordered(0) === 'abc'); + +$bidi->setPara("\u{05d0}\u{05d1}", \IntlBidi::DEFAULT_RTL); +var_dump($bidi->getReordered(0) === "\u{05d1}\u{05d0}"); + +$bidi->setPara("abc \u{05d0}\u{05d1}", \IntlBidi::DEFAULT_RTL); +var_dump($bidi->getReordered(0) === "\u{05d1}\u{05d0} abc"); + +$bidi->setPara("\u{05d0}\u{05d1} abc", \IntlBidi::DEFAULT_RTL); +var_dump($bidi->getReordered(0) === "\u{200f}abc \u{05d1}\u{05d0}"); + +$bidi->setPara("\u{05d0}\u{05d1} abc .-=", \IntlBidi::DEFAULT_RTL); +var_dump($bidi->getReordered(0) === "\u{200f}=-. abc \u{05d1}\u{05d0}"); + +$bidi->orderParagraphsLTR(true); + +// This had raised a BUFFER OVERFLOW ERROR: see IntlBidi_getReordered_variant1.phpt + $bidi->setPara("\n\r \n\rabc\n\u{05d0}\u{05d1}\rabc \u{05d2}\u{05d3}\n\r" . + "\u{05d4}\u{05d5} abc\n\u{05d6}\u{05d7} abc .-=\r\n" . + "-* \u{05d8}\u{05d9} abc .-=", \IntlBidi::DEFAULT_RTL); +$expectedResult = "\n\r \n\rabc\n\u{05d1}\u{05d0}\r\u{05d3}\u{05d2} abc\n\r" . + "\u{200f}abc \u{05d5}\u{05d4}\n\u{200f}=-. abc \u{05d7}\u{05d6}\r\n" . + "\u{200f}=-. abc \u{05d9}\u{05d8} *-"; +var_dump($bidi->getReordered(0) === $expectedResult); + +$bidi->setPara("\u{05d0} \t", \IntlBidi::LTR); +var_dump($bidi->getReordered(0) === "\u{05d0}\u{200e} \t"); + +// This had raised a BUFFER OVERFLOW ERROR: see IntlBidi_getReordered_variant3.phpt +$bidi->setPara("\u{05d0} 123 \t\u{05d1} 123 \u{05d2}", \IntlBidi::LTR); +var_dump($bidi->getReordered(0) === "\u{05d0} \u{200e}123\u{200e} \t\u{05d2} 123 \u{05d1}"); + +// This had raised a BUFFER OVERFLOW ERROR: see IntlBidi_getReordered_variant4.phpt +$bidi->setPara("\u{05d0} 123 \u{0660}\u{0661} ab", \IntlBidi::LTR); +var_dump($bidi->getReordered(0) === "\u{05d0} \u{200e}123 \u{200e}\u{0660}\u{0661} ab"); + +$bidi->setPara("ab \t", \IntlBidi::RTL); +var_dump($bidi->getReordered(0) === "\u{200f}\t ab"); + +?> +==DONE== +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant.phpt new file mode 100644 index 0000000000000..10f4482faf9b6 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant.phpt @@ -0,0 +1,19 @@ +--TEST-- +Test getReordered() with previous setReorderingOptions(\IntlBidi::OPTION_INSERT_MARKS). +--CREDITS-- +Timo Scholz +--SKIPIF-- + +--FILE-- +setReorderingMode(\IntlBidi::REORDER_RUNS_ONLY); +$bidi->setReorderingOptions(\IntlBidi::OPTION_INSERT_MARKS); + +$bidi->setPara('ab 234 ' . "\xD9\xA8\xD9\xA9\xD9\xA6" . 'de', 0); +var_dump(bin2hex($bidi->getReordered(\IntlBidi::DO_MIRRORING))); +?> +==DONE== +--EXPECT-- +string(42) "61622032333420e2808ed9a8d9a9d9a6e2808e6465" +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant1.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant1.phpt new file mode 100644 index 0000000000000..9f37d64d71747 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant1.phpt @@ -0,0 +1,39 @@ +--TEST-- +This tests triggered a U_BUFFER_OVERFLOW_ERROR error during implementation. +--CREDITS-- +Jan Slabon +--SKIPIF-- + +--FILE-- +setReorderingMode(\IntlBidi::REORDER_INVERSE_LIKE_DIRECT); +$bidi->setReorderingOptions(\IntlBidi::OPTION_INSERT_MARKS); +$bidi->orderParagraphsLTR(true); + +$bidi->setPara("\n\r \n\rabc\n\u{05d0}\u{05d1}\rabc \u{05d2}\u{05d3}\n\r" . + "\u{05d4}\u{05d5} abc\n\u{05d6}\u{05d7} abc .-=\r\n" . + "-* \u{05d8}\u{05d9} abc .-=", \IntlBidi::DEFAULT_RTL); +$expectedResult = "\n\r \n\rabc\n\u{05d1}\u{05d0}\r\u{05d3}\u{05d2} abc\n\r" . + "\u{200f}abc \u{05d5}\u{05d4}\n\u{200f}=-. abc \u{05d7}\u{05d6}\r\n" . + "\u{200f}=-. abc \u{05d9}\u{05d8} *-"; +var_dump($bidi->getReordered(0) === $expectedResult); +?> +==DONE== +--EXPECT-- +bool(true) +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant2.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant2.phpt new file mode 100644 index 0000000000000..31b35a912f4a9 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant2.phpt @@ -0,0 +1,16 @@ +--TEST-- +This tests raised an U_ZERO_ERROR error during implementation. +--CREDITS-- +Timo Scholz +--SKIPIF-- + +--FILE-- +setPara('', \IntlBidi::DEFAULT_LTR); +var_dump($bidi->getReordered(\IntlBidi::INSERT_LRM_FOR_NUMERIC)); +?> +==DONE== +--EXPECT-- +string(0) "" +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant3.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant3.phpt new file mode 100644 index 0000000000000..f529b8dc4311c --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant3.phpt @@ -0,0 +1,34 @@ +--TEST-- +This tests triggered a U_BUFFER_OVERFLOW_ERROR error during implementation. +--CREDITS-- +Jan Slabon +--SKIPIF-- + +--FILE-- +setReorderingMode(\IntlBidi::REORDER_INVERSE_LIKE_DIRECT); +$bidi->setReorderingOptions(\IntlBidi::OPTION_INSERT_MARKS); +$bidi->orderParagraphsLTR(true); + +$bidi->setPara("\u{05d0} 123 \t\u{05d1} 123 \u{05d2}", \IntlBidi::LTR); +var_dump($bidi->getReordered(0) === "\u{05d0} \u{200e}123\u{200e} \t\u{05d2} 123 \u{05d1}"); +?> +==DONE== +--EXPECT-- +bool(true) +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant4.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant4.phpt new file mode 100644 index 0000000000000..e781e106d7f22 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant4.phpt @@ -0,0 +1,34 @@ +--TEST-- +This tests triggered a U_BUFFER_OVERFLOW_ERROR error during implementation. +--CREDITS-- +Jan Slabon +--SKIPIF-- + +--FILE-- +setReorderingMode(\IntlBidi::REORDER_INVERSE_LIKE_DIRECT); +$bidi->setReorderingOptions(\IntlBidi::OPTION_INSERT_MARKS); +$bidi->orderParagraphsLTR(true); + +$bidi->setPara("\u{05d0} 123 \u{0660}\u{0661} ab", \IntlBidi::LTR); +var_dump($bidi->getReordered(0) === "\u{05d0} \u{200e}123 \u{200e}\u{0660}\u{0661} ab"); +?> +==DONE== +--EXPECT-- +bool(true) +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant5.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant5.phpt new file mode 100644 index 0000000000000..d5b63fe2f28d3 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant5.phpt @@ -0,0 +1,36 @@ +--TEST-- +Test getReordered() with previous setReorderingOptions(\IntlBidi::OPTION_INSERT_MARKS) + \IntlBidi::INSERT_LRM_FOR_NUMERIC in $options argument. +--CREDITS-- +Timo Scholz , Jan Slabon +--SKIPIF-- + +--FILE-- +setReorderingMode(\IntlBidi::REORDER_RUNS_ONLY); +$bidi->setReorderingOptions(\IntlBidi::OPTION_INSERT_MARKS); + +$bidi->setPara(hex2bin('61622032333420e2808ed9a8d9a9d9a6e2808e6465'), 0); +$bidi->setInverse(true); +$a = $bidi->getReordered(\IntlBidi::DO_MIRRORING); +$b = $bidi->getReordered(\IntlBidi::DO_MIRRORING | \IntlBidi::INSERT_LRM_FOR_NUMERIC); +// because \IntlBidi::OPTION_INSERT_MARKS isset we've no difference +var_dump($a === $b); +var_dump(bin2hex($a)); + +// reset the global reordering options +$bidi->setReorderingOptions(\IntlBidi::OPTION_DEFAULT); +$a = $bidi->getReordered(\IntlBidi::DO_MIRRORING); +$b = $bidi->getReordered(\IntlBidi::DO_MIRRORING | \IntlBidi::INSERT_LRM_FOR_NUMERIC); +var_dump($a === $b); // false +var_dump(bin2hex($a)); +var_dump(bin2hex($b)); +?> +==DONE== +--EXPECT-- +bool(true) +string(48) "61622032333420e2808ee2808ed9a8d9a9d9a6e2808e6465" +bool(false) +string(30) "61622032333420d9a8d9a9d9a66465" +string(48) "61622032333420e2808ee2808ed9a8d9a9d9a6e2808e6465" +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant6.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant6.phpt new file mode 100644 index 0000000000000..7531d3cef8417 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant6.phpt @@ -0,0 +1,70 @@ +--TEST-- +Test inverse behavior +--CREDITS-- +Timo Scholz , Jan Slabon +--SKIPIF-- + + +--FILE-- +setPara($original); +$result = $bidi->getReordered(0); +var_dump(u8ToPseudo($result) === ")&.C.K(add)CK("); + +$bidi->setPara($result); +$bidi->setInverse(true); +$result = $bidi->getReordered(0); +var_dump($original === $result); + +// \IntlBidi::DO_MIRRORING +$bidi->setInverse(false); +$bidi->setPara($original); +$result = $bidi->getReordered(\IntlBidi::DO_MIRRORING); +var_dump(u8ToPseudo($result) === "(&.C.K)add(CK)"); + +$bidi->setPara($result); +$bidi->setInverse(true); +$result = $bidi->getReordered(\IntlBidi::DO_MIRRORING); +var_dump($original === $result); + +// \IntlBidi::OUTPUT_REVERSE +$bidi->setInverse(false); +$bidi->setPara($original); +$result = $bidi->getReordered(\IntlBidi::OUTPUT_REVERSE); +var_dump(u8ToPseudo($result) === "(KC)dda(K.C.&)"); + +$bidi->setPara($result); +$bidi->setInverse(true); +$result = $bidi->getReordered(\IntlBidi::OUTPUT_REVERSE); +var_dump($original === $result); + +// \IntlBidi::DO_MIRRORING | \IntlBidi::OUTPUT_REVERSE +$bidi->setInverse(false); +$bidi->setPara($original); +$result = $bidi->getReordered(\IntlBidi::DO_MIRRORING | \IntlBidi::OUTPUT_REVERSE); +var_dump(u8ToPseudo($result) === ")KC(dda)K.C.&("); + +$bidi->setPara($result); +$bidi->setInverse(true); +$result = $bidi->getReordered(\IntlBidi::DO_MIRRORING | \IntlBidi::OUTPUT_REVERSE); +var_dump($original === $result); + +?> +==DONE== +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant7.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant7.phpt new file mode 100644 index 0000000000000..1c96eeab8b403 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getReordered_variant7.phpt @@ -0,0 +1,75 @@ +--TEST-- +Test getReordered with setLine +--CREDITS-- +Timo Scholz +--SKIPIF-- + + +--FILE-- +setPara($srcUt8, \IntlBidi::DEFAULT_LTR); + $newBidi = $bidi->setLine(0, $bidi->getResultLength()); + $bidi->setPara('', \Intlbidi::DEFAULT_LTR); + $result = u8ToPseudo($newBidi->getReordered(\IntlBidi::DO_MIRRORING)); + var_dump($result); +} +?> +==DONE== +--EXPECT-- +string(17) "del(CK)add(&.C.K)" +string(19) "del(TVDQ) add(LDVB)" +string(21) "del(QP)add(S.R.)&.U(T" +string(22) "del(VL)add(V.L.) &.V.L" +string(26) "day 0 RVRHDPD R dayabbr" +string(27) "day 1 ADHDPHPD H dayabbr" +string(28) "day 2 ADNELBPD L dayabbr" +string(26) "day 3 MVQJPD J dayabbr" +string(29) "day 4 FNQIPD I dayabbr" +string(25) "day 5 GEMPD M dayabbr" +string(10) "helloGEMPD" +string(9) "hello YXW" +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getReorderingMode_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getReorderingMode_basic.phpt new file mode 100644 index 0000000000000..fa59bb85d2e48 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getReorderingMode_basic.phpt @@ -0,0 +1,22 @@ +--TEST-- +Test the getter and setter, to make sure that it stores the mode. +--CREDITS-- +Timo Scholz +--SKIPIF-- + +--FILE-- +getReorderingMode()); +$bidi->setReorderingMode(IntlBidi::REORDER_NUMBERS_SPECIAL); +var_dump($bidi->getReorderingMode()); +$bidi->setReorderingMode(IntlBidi::REORDER_RUNS_ONLY); +var_dump($bidi->getReorderingMode()); +?> +==DONE== +--EXPECT-- +int(0) +int(1) +int(3) +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getReorderingOptions_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getReorderingOptions_basic.phpt new file mode 100644 index 0000000000000..e1ed3c3803060 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getReorderingOptions_basic.phpt @@ -0,0 +1,22 @@ +--TEST-- +Test the getter and setter, to make sure that it stores the options. +--CREDITS-- +Timo Scholz +--SKIPIF-- + +--FILE-- +getReorderingOptions()); +$bidi->setReorderingOptions(IntlBidi::OPTION_STREAMING); +var_dump($bidi->getReorderingOptions()); +$bidi->setReorderingOptions(IntlBidi::OPTION_INSERT_MARKS); +var_dump($bidi->getReorderingOptions()); +?> +==DONE== +--EXPECT-- +int(0) +int(4) +int(1) +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getResultLength_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getResultLength_basic.phpt new file mode 100644 index 0000000000000..58cbec973a80a --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getResultLength_basic.phpt @@ -0,0 +1,37 @@ +--TEST-- +Test get result length. +--CREDITS-- +Timo Scholz +--SKIPIF-- + +--FILE-- +setPara($str, IntlBidi::RTL); +$bidi->setReorderingOptions(IntlBidi::REMOVE_BIDI_CONTROLS); + +var_dump($bidi->getResultLength()); +$bidiLine2 = $bidi->setLine(0, 6); +var_dump($bidiLine2->getResultLength()); +?> +==DONE== +--EXPECT-- +int(14) +int(6) +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getResultLength_variant.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getResultLength_variant.phpt new file mode 100644 index 0000000000000..f1efaa3e739a9 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getResultLength_variant.phpt @@ -0,0 +1,34 @@ +--TEST-- +Test for keeping the parent UBiDI instance. (fails) +--CREDITS-- +Timo Scholz +--SKIPIF-- + +--FILE-- +setPara($str, IntlBidi::RTL); +$bidi->setReorderingOptions(IntlBidi::REMOVE_BIDI_CONTROLS); + +var_dump($bidi->getResultLength()); +$bidiLine = $bidi->setLine(0, 6); +var_dump($bidi->getResultLength()); +var_dump($bidiLine->getResultLength()); + +unset($bidi); + +gc_collect_cycles(); + +var_dump($bidiLine->getResultLength()); + +unset($bidiLine); +?> +==DONE== +--EXPECT-- +int(14) +int(14) +int(6) +int(6) +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_getVisualRun_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_getVisualRun_basic.phpt new file mode 100644 index 0000000000000..1169c85ad8878 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_getVisualRun_basic.phpt @@ -0,0 +1,72 @@ +--TEST-- +Test IntlBidi::getVisualRun() method. +--CREDITS-- +Jan Slabon +--SKIPIF-- + + +--FILE-- +setPara($string); + +var_dump($bidi->countRuns()); // 5 + +var_dump($bidi->getVisualRun(0)); // del( +var_dump($bidi->getVisualRun(1)); // KC +var_dump($bidi->getVisualRun(2)); // )add( +var_dump($bidi->getVisualRun(3)); // K.C.& +var_dump($bidi->getVisualRun(4)); // ) + +?> +==DONE== +--EXPECT-- +int(5) +array(3) { + ["start"]=> + int(0) + ["length"]=> + int(4) + ["direction"]=> + int(0) +} +array(3) { + ["start"]=> + int(4) + ["length"]=> + int(2) + ["direction"]=> + int(1) +} +array(3) { + ["start"]=> + int(6) + ["length"]=> + int(5) + ["direction"]=> + int(0) +} +array(3) { + ["start"]=> + int(11) + ["length"]=> + int(5) + ["direction"]=> + int(1) +} +array(3) { + ["start"]=> + int(16) + ["length"]=> + int(1) + ["direction"]=> + int(0) +} +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_isInverse_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_isInverse_basic.phpt new file mode 100644 index 0000000000000..a9f1e84315ea3 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_isInverse_basic.phpt @@ -0,0 +1,31 @@ +--TEST-- +Test the getter and setter, to make sure that it stores the inverse flag. +--CREDITS-- +Timo Scholz +--SKIPIF-- + +--FILE-- +isInverse()); +$bidi->setInverse(false); +var_dump($bidi->isInverse()); +$bidi->setInverse(true); +var_dump($bidi->isInverse()); +$bidi->setInverse(false); +$bidi->setReorderingMode(IntlBidi::REORDER_INVERSE_NUMBERS_AS_L); // 4 +var_dump($bidi->isInverse()); +$bidi->setInverse(false); // set the flag and the value to 0 +var_dump($bidi->isInverse()); +var_dump($bidi->getReorderingMode()); // should be 0, since the flag got reset by setInverse +?> +==DONE== +--EXPECT-- +bool(false) +bool(false) +bool(true) +bool(true) +bool(false) +int(0) +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_isOrderParagraphsLTR_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_isOrderParagraphsLTR_basic.phpt new file mode 100644 index 0000000000000..2e0607c301772 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_isOrderParagraphsLTR_basic.phpt @@ -0,0 +1,22 @@ +--TEST-- +Test the getter and setter, to make sure that it stores the isOrderParagraphsLTR flag. +--CREDITS-- +Timo Scholz +--SKIPIF-- + +--FILE-- +isOrderParagraphsLTR()); +$bidi->orderParagraphsLTR(true); +var_dump($bidi->isOrderParagraphsLTR()); +$bidi->orderParagraphsLTR(false); +var_dump($bidi->isOrderParagraphsLTR()); +?> +==DONE== +--EXPECT-- +bool(false) +bool(true) +bool(false) +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_orderParagraphsLTR_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_orderParagraphsLTR_basic.phpt new file mode 100644 index 0000000000000..e0a7545cf8769 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_orderParagraphsLTR_basic.phpt @@ -0,0 +1,100 @@ +--TEST-- +Regression test for doing transformations in context. +--CREDITS-- +Timo Scholz +--SKIPIF-- + + +--FILE-- +orderParagraphsLTR(true); + +for ($i = 0, $iMax = \count($data); $i < $iMax; $i++) { + [$prologue, $src, $epilogue, $paraLevel] = $data[$i]; + + $prologue = pseudoToU8($prologue); + $epilogue = pseudoToU8($epilogue); + $src = pseudoToU8($src); + + $bidi->setContext($epilogue, $prologue); + $bidi->setContext($prologue, $epilogue); + + $bidi->setPara($src, $paraLevel); + var_dump(u8ToPseudo($bidi->getReordered(\IntlBidi::DO_MIRRORING))); +} +?> +==DONE== +--EXPECT-- +string(0) "" +string(9) ".-=LKJ-+*" +string(9) ".-=LKJ-+*" +string(9) ".-=LKJ-+*" +string(9) "LKJ=-.-+*" +string(9) ".-=*+-LKJ" +string(9) ".-=*+-LKJ" +string(9) ".-=*+-LKJ" +string(9) "*+-LKJ=-." +string(9) ".-=*+-LKJ" +string(9) "*+-abc=-." +string(9) "*+-abc=-." +string(9) "*+-abc=-." +string(9) "*+-.-=abc" +string(9) "abc-+*=-." +string(9) "abc-+*=-." +string(9) ".-=abc-+*" +string(9) "*+-.-=abc" +string(9) "*+-abc=-." +string(9) "*+-.-=abc" +string(3) ".-=" +string(3) "=-." +string(3) "=-." +string(3) ".-=" +string(3) "=-." +string(7) "=-.|-+*" +==DONE== \ No newline at end of file diff --git a/ext/intl/tests/IntlBidi/IntlBidi_setLine_basic.phpt b/ext/intl/tests/IntlBidi/IntlBidi_setLine_basic.phpt new file mode 100644 index 0000000000000..c7ecdb87ed126 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_setLine_basic.phpt @@ -0,0 +1,24 @@ +--TEST-- +Simple test for setLine +--CREDITS-- +Timo Scholz +--SKIPIF-- + +--FILE-- +setPara('abcde'); + +$line = $bidi->setLine(0, 2); +var_dump($line->getReordered(0)); + +$line = $bidi->setLine(0, 1); +var_dump($line->getReordered(0)); + +?> +==DONE== +--EXPECT-- +string(2) "ab" +string(1) "a" +==DONE== + diff --git a/ext/intl/tests/IntlBidi/IntlBidi_setLine_variant1.phpt b/ext/intl/tests/IntlBidi/IntlBidi_setLine_variant1.phpt new file mode 100644 index 0000000000000..955341cf9044e --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_setLine_variant1.phpt @@ -0,0 +1,23 @@ +--TEST-- +Test for chained setLine() calls. +--CREDITS-- +Jan Slabon +--SKIPIF-- + +--FILE-- +setPara('abcde'); + +$line = $bidi->setLine(0, 2); +var_dump($line->getReordered(0)); + +$line2 = $line->setLine(0, 1); +var_dump($line2->getReordered(0)); + +?> +==DONE== +--EXPECT-- +string(2) "ab" +string(1) "a" +==DONE== diff --git a/ext/intl/tests/IntlBidi/IntlBidi_setPara_variant.phpt b/ext/intl/tests/IntlBidi/IntlBidi_setPara_variant.phpt new file mode 100644 index 0000000000000..8a371d8c469e0 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_setPara_variant.phpt @@ -0,0 +1,30 @@ +--TEST-- +Check exceeding para level +--CREDITS-- +Timo Scholz +--SKIPIF-- + +--FILE-- +setPara("A\u{202a}\u{05d0}\u{202a}C\u{202c}\u{05d1}\u{202c}E", IntlBidi::MAX_EXPLICIT_LEVEL - 1); +var_dump($bidi->getLevelAt(2) === IntlBidi::MAX_EXPLICIT_LEVEL); +?> +==DONE== +--EXPECT-- +bool(true) +==DONE== diff --git a/ext/intl/tests/IntlBidi/IntlBidi_setPara_variant1.phpt b/ext/intl/tests/IntlBidi/IntlBidi_setPara_variant1.phpt new file mode 100644 index 0000000000000..46e7e29fc5e82 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_setPara_variant1.phpt @@ -0,0 +1,45 @@ +--TEST-- +Test the behavior of the $embeddingLevels argument +--CREDITS-- +Jan Slabon +--SKIPIF-- + + +--FILE-- +setPara($string, 0, $embeddingLevels); +var_dump(u8ToPseudo($bidi->getReordered(0))); + +// let's revert the levels: +$embeddingLevels[0] = chr(\IntlBidi::LEVEL_OVERRIDE | \IntlBidi::RTL); // a + +$embeddingLevels[2] = chr(\IntlBidi::LEVEL_OVERRIDE | \IntlBidi::LTR); // K +$embeddingLevels[3] = chr(\IntlBidi::LEVEL_OVERRIDE | \IntlBidi::LTR); // C + +$embeddingLevels[5] = chr(\IntlBidi::LEVEL_OVERRIDE | \IntlBidi::RTL); // a +$embeddingLevels[6] = chr(\IntlBidi::LEVEL_OVERRIDE | \IntlBidi::RTL); // d +$embeddingLevels[7] = chr(\IntlBidi::LEVEL_OVERRIDE | \IntlBidi::RTL); // d + +$embeddingLevels[9] = chr(\IntlBidi::LEVEL_OVERRIDE | \IntlBidi::LTR); // K +$embeddingLevels[10] = chr(\IntlBidi::LEVEL_OVERRIDE | \IntlBidi::LTR); // . +$embeddingLevels[11] = chr(\IntlBidi::LEVEL_OVERRIDE | \IntlBidi::LTR); // C +$embeddingLevels[12] = chr(\IntlBidi::LEVEL_OVERRIDE | \IntlBidi::LTR); // . + +$bidi->setPara($string, \IntlBidi::DEFAULT_LTR | \IntlBidi::LEVEL_OVERRIDE, $embeddingLevels); +var_dump(u8ToPseudo($bidi->getReordered(0))); +?> +==DONE== +--EXPECT-- +string(13) "a CK add C.K." +string(13) "a KC dda K.C." +==DONE== diff --git a/ext/intl/tests/IntlBidi/IntlBidi_ut_common.inc b/ext/intl/tests/IntlBidi/IntlBidi_ut_common.inc new file mode 100644 index 0000000000000..a0f257ad37758 --- /dev/null +++ b/ext/intl/tests/IntlBidi/IntlBidi_ut_common.inc @@ -0,0 +1,181 @@ +'] = 0x003E; + $uCharToPseudo[0x3E] = '>'; + $pseudoToUChar['?'] = 0x003F; + $uCharToPseudo[0x3F] = '?'; + $pseudoToUChar['\\'] = 0x005C; + $uCharToPseudo[0x5C] = '\\'; + + /* initialize specially used characters */ + $pseudoToUChar['`'] = 0x3000; + $uCharToPseudo2[0x00] = '`'; /* NSM */ + $pseudoToUChar['@'] = 0x200E; + $uCharToPseudo2[0x0E] = '@'; /* LRM */ + $pseudoToUChar['&'] = 0x200F; + $uCharToPseudo2[0x0F] = '&'; /* RLM */ + $pseudoToUChar['_'] = 0x001F; + $uCharToPseudo[0x1F] = '_'; /* S */ + $pseudoToUChar['|'] = 0x2029; + $uCharToPseudo2[0x29] = '|'; /* B */ + $pseudoToUChar['['] = 0x202A; + $uCharToPseudo2[0x2A] = '['; /* LRE */ + $pseudoToUChar[']'] = 0x202B; + $uCharToPseudo2[0x2B] = ']'; /* RLE */ + $pseudoToUChar['^'] = 0x202C; + $uCharToPseudo2[0x2C] = '^'; /* PDF */ + $pseudoToUChar['{'] = 0x202D; + $uCharToPseudo2[0x2D] = '{'; /* LRO */ + $pseudoToUChar['}'] = 0x202E; + $uCharToPseudo2[0x2E] = '}'; /* RLO */ + $pseudoToUChar['~'] = 0x007F; + $uCharToPseudo[0x7F] = '~'; /* BN */ + + $columns_str = str_split('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'); + $columns = []; + foreach ($columns_str as $value) { + $columns[] = \IntlChar::chr(\ord($value)); + } + + /* initialize western digits */ + for ($i = 0, $uchar = 0x0030; $i < 6; $i++, $uchar++) { + $c = $columns[$i]; + $pseudoToUChar[$c] = $uchar; + $uCharToPseudo[$uchar & 0x00FF] = $c; + } + /* initialize Hindi digits */ + for ($i = 6, $uchar = 0x0666; $i < 10; $i++, $uchar++) { + $c = $columns[$i]; + $pseudoToUChar[$c] = $uchar; + $uCharToPseudo2[$uchar & 0x00FF] = $c; + } + /* initialize Arabic letters */ + for ($i = 10, $uchar = 0x0631; $i < 16; $i++, $uchar++) { + $c = $columns[$i]; + $pseudoToUChar[$c] = $uchar; + $uCharToPseudo2[$uchar & 0x00FF] = $c; + } + /* initialize Hebrew letters */ + for ($i = 16, $uchar = 0x05D7; $i < 32; $i++, $uchar++) { + $c = $columns[$i]; + $pseudoToUChar[$c] = $uchar; + $uCharToPseudo2[$uchar & 0x00FF] = $c; + } + /* initialize Unassigned code points */ + for ($i = 32, $uchar = 0x08D0; $i < 36; $i++, $uchar++) { + $c = $columns[$i]; + $pseudoToUChar[$c] = $uchar; + $uCharToPseudo2[$uchar & 0x00FF] = $c; + } + /* initialize Latin lower case letters */ + for ($i = 36, $uchar = 0x0061; $i < 62; $i++, $uchar++) { + $c = $columns[$i]; + $pseudoToUChar[$c] = $uchar; + $uCharToPseudo[$uchar & 0x00FF] = $c; + } + + return [ + 'pseudoToUChar' => $pseudoToUChar, + 'uCharToPseudo' => $uCharToPseudo, + 'uCharToPseudo2' => $uCharToPseudo2 + ]; +} + +function getMapping() { + static $mapping = null; + if ($mapping === null) { + $mapping = initMapping(); + } + + return $mapping; +} + +function pseudoToU8(string $input) +{ + $len = strlen($input); + $output = ''; + + for ($i = 0; $i < $len; $i++) { + $output .= \IntlChar::chr(getMapping()['pseudoToUChar'][$input[$i]]); + } + + return $output; +} + +function u8ToPseudo(string $input) +{ + $encoding = 'utf-8'; + $len = \mb_strlen($input, $encoding); + $output = ''; + + $mapping = getMapping(); + + for ($i = 0; $i < $len; $i++) { + $uChar = \IntlChar::ord(\mb_substr($input, $i, 1, $encoding)); + $output .= $uChar < 0x0100 ? $mapping['uCharToPseudo'][$uChar] : $mapping['uCharToPseudo2'][$uChar & 0x00FF]; + } + + return $output; +} \ No newline at end of file