summaryrefslogtreecommitdiff
path: root/ext/mbstring/tests
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2013-03-14 05:42:27 +0000
committer <>2013-04-03 16:25:08 +0000
commitc4dd7a1a684490673e25aaf4fabec5df138854c4 (patch)
tree4d57c44caae4480efff02b90b9be86f44bf25409 /ext/mbstring/tests
downloadphp2-master.tar.gz
Imported from /home/lorry/working-area/delta_php2/php-5.4.13.tar.bz2.HEADphp-5.4.13master
Diffstat (limited to 'ext/mbstring/tests')
-rw-r--r--ext/mbstring/tests/bug20087.phpt22
-rw-r--r--ext/mbstring/tests/bug25140.phpt10
-rw-r--r--ext/mbstring/tests/bug26639.phpt123
-rw-r--r--ext/mbstring/tests/bug28220.phpt25
-rw-r--r--ext/mbstring/tests/bug30549.phpt31
-rw-r--r--ext/mbstring/tests/bug31911.phpt13
-rw-r--r--ext/mbstring/tests/bug40685.phpt25
-rw-r--r--ext/mbstring/tests/bug43301.phpt21
-rw-r--r--ext/mbstring/tests/bug43840.phpt75
-rw-r--r--ext/mbstring/tests/bug43841.phpt85
-rw-r--r--ext/mbstring/tests/bug43993.phpt26
-rw-r--r--ext/mbstring/tests/bug43994.phpt129
-rw-r--r--ext/mbstring/tests/bug43998.phpt71
-rw-r--r--ext/mbstring/tests/bug45239.phpt18
-rw-r--r--ext/mbstring/tests/bug45722.phpt10
-rw-r--r--ext/mbstring/tests/bug45923.phpt202
-rw-r--r--ext/mbstring/tests/bug46806.phpt16
-rw-r--r--ext/mbstring/tests/bug46843.phpt12
-rw-r--r--ext/mbstring/tests/bug47399.phpt525
-rw-r--r--ext/mbstring/tests/bug48645.phpt162
-rw-r--r--ext/mbstring/tests/bug48697.phpt24
-rw-r--r--ext/mbstring/tests/bug49354.phpt21
-rw-r--r--ext/mbstring/tests/bug49528.phpt20
-rw-r--r--ext/mbstring/tests/bug49536.phpt20
-rw-r--r--ext/mbstring/tests/bug52861.phpt29
-rw-r--r--ext/mbstring/tests/bug52931.phpt24
-rw-r--r--ext/mbstring/tests/bug52981.phpt23
-rw-r--r--ext/mbstring/tests/bug54494.phpt52
-rw-r--r--ext/mbstring/tests/bug60306.phpt11
-rw-r--r--ext/mbstring/tests/bug63447_001.phpt20
-rw-r--r--ext/mbstring/tests/bug63447_002.phpt20
-rw-r--r--ext/mbstring/tests/bug63447_003.phpt34
-rw-r--r--ext/mbstring/tests/casefold.phpt24
-rw-r--r--ext/mbstring/tests/common.inc55
-rw-r--r--ext/mbstring/tests/empty_pattern.phpt16
-rw-r--r--ext/mbstring/tests/htmlent.phpt42
-rw-r--r--ext/mbstring/tests/illformed_utf_sequences.phpt217
-rw-r--r--ext/mbstring/tests/ini_language.phpt15
-rw-r--r--ext/mbstring/tests/mb_convert_encoding.phpt138
-rw-r--r--ext/mbstring/tests/mb_convert_encoding_basic.phpt95
-rw-r--r--ext/mbstring/tests/mb_convert_encoding_stateful.phpt37
-rw-r--r--ext/mbstring/tests/mb_convert_encoding_variation1.phpt207
-rw-r--r--ext/mbstring/tests/mb_convert_kana.phpt60
-rw-r--r--ext/mbstring/tests/mb_convert_variables.phpt164
-rw-r--r--ext/mbstring/tests/mb_decode_mimeheader_basic.phpt35
-rw-r--r--ext/mbstring/tests/mb_decode_mimeheader_error.phpt42
-rw-r--r--ext/mbstring/tests/mb_decode_mimeheader_variation1.phpt206
-rw-r--r--ext/mbstring/tests/mb_decode_mimeheader_variation2.phpt51
-rw-r--r--ext/mbstring/tests/mb_decode_mimeheader_variation3.phpt29
-rw-r--r--ext/mbstring/tests/mb_decode_numericentity.phpt21
-rw-r--r--ext/mbstring/tests/mb_detect_encoding.phpt121
-rw-r--r--ext/mbstring/tests/mb_detect_order.phpt61
-rw-r--r--ext/mbstring/tests/mb_encode_mimeheader_basic.phpt74
-rw-r--r--ext/mbstring/tests/mb_encode_mimeheader_basic2.phpt73
-rw-r--r--ext/mbstring/tests/mb_encode_mimeheader_basic3.phpt69
-rw-r--r--ext/mbstring/tests/mb_encode_mimeheader_indent.phpt901
-rw-r--r--ext/mbstring/tests/mb_encode_mimeheader_variation1.phpt184
-rw-r--r--ext/mbstring/tests/mb_encode_mimeheader_variation2.phpt224
-rw-r--r--ext/mbstring/tests/mb_encode_mimeheader_variation3.phpt186
-rw-r--r--ext/mbstring/tests/mb_encode_mimeheader_variation4.phpt187
-rw-r--r--ext/mbstring/tests/mb_encode_mimeheader_variation5.phpt215
-rw-r--r--ext/mbstring/tests/mb_encode_mimeheader_variation6.phpt53
-rw-r--r--ext/mbstring/tests/mb_encode_numericentity.phpt22
-rw-r--r--ext/mbstring/tests/mb_encoding_aliases.phpt45
-rw-r--r--ext/mbstring/tests/mb_ereg-compat-01.phpt21
-rw-r--r--ext/mbstring/tests/mb_ereg-compat-02.phpt25
-rw-r--r--ext/mbstring/tests/mb_ereg.phpt46
-rw-r--r--ext/mbstring/tests/mb_ereg1.phpt77
-rw-r--r--ext/mbstring/tests/mb_ereg2.phpt41
-rw-r--r--ext/mbstring/tests/mb_ereg3.phpt44
-rw-r--r--ext/mbstring/tests/mb_ereg4.phpt44
-rw-r--r--ext/mbstring/tests/mb_ereg_basic.phpt117
-rw-r--r--ext/mbstring/tests/mb_ereg_error.phpt49
-rw-r--r--ext/mbstring/tests/mb_ereg_match_basic.phpt59
-rw-r--r--ext/mbstring/tests/mb_ereg_match_error1.phpt58
-rw-r--r--ext/mbstring/tests/mb_ereg_replace-compat-01.phpt15
-rw-r--r--ext/mbstring/tests/mb_ereg_replace-compat-02.phpt15
-rw-r--r--ext/mbstring/tests/mb_ereg_replace-compat-03.phpt15
-rw-r--r--ext/mbstring/tests/mb_ereg_replace-compat-04.phpt15
-rw-r--r--ext/mbstring/tests/mb_ereg_replace-compat-05.phpt16
-rw-r--r--ext/mbstring/tests/mb_ereg_replace-compat-06.phpt14
-rw-r--r--ext/mbstring/tests/mb_ereg_replace-compat-07.phpt15
-rw-r--r--ext/mbstring/tests/mb_ereg_replace-compat-08.phpt15
-rw-r--r--ext/mbstring/tests/mb_ereg_replace-compat-09.phpt15
-rw-r--r--ext/mbstring/tests/mb_ereg_replace-compat-10.phpt15
-rw-r--r--ext/mbstring/tests/mb_ereg_replace-compat-11.phpt15
-rw-r--r--ext/mbstring/tests/mb_ereg_replace-compat-12.phpt14
-rw-r--r--ext/mbstring/tests/mb_ereg_replace-compat-13.phpt14
-rw-r--r--ext/mbstring/tests/mb_ereg_replace.phpt18
-rw-r--r--ext/mbstring/tests/mb_ereg_replace_basic.phpt62
-rw-r--r--ext/mbstring/tests/mb_ereg_replace_callback.phpt15
-rw-r--r--ext/mbstring/tests/mb_ereg_replace_error.phpt47
-rw-r--r--ext/mbstring/tests/mb_ereg_replace_variation1.phpt170
-rw-r--r--ext/mbstring/tests/mb_ereg_replace_variation2.phpt178
-rw-r--r--ext/mbstring/tests/mb_ereg_replace_variation3.phpt179
-rw-r--r--ext/mbstring/tests/mb_ereg_replace_variation4.phpt179
-rw-r--r--ext/mbstring/tests/mb_ereg_search.phpt39
-rw-r--r--ext/mbstring/tests/mb_ereg_search_pos.phpt31
-rw-r--r--ext/mbstring/tests/mb_ereg_search_regs.phpt28
-rw-r--r--ext/mbstring/tests/mb_ereg_search_xxx.phpt82
-rw-r--r--ext/mbstring/tests/mb_ereg_variation1.phpt165
-rw-r--r--ext/mbstring/tests/mb_ereg_variation2.phpt216
-rw-r--r--ext/mbstring/tests/mb_ereg_variation3.phpt159
-rw-r--r--ext/mbstring/tests/mb_ereg_variation4.phpt149
-rw-r--r--ext/mbstring/tests/mb_ereg_variation5.phpt82
-rw-r--r--ext/mbstring/tests/mb_ereg_variation6.phpt192
-rw-r--r--ext/mbstring/tests/mb_ereg_variation7.phpt94
-rw-r--r--ext/mbstring/tests/mb_eregi.phpt20
-rw-r--r--ext/mbstring/tests/mb_eregi_invalid_arguments.phpt20
-rw-r--r--ext/mbstring/tests/mb_eregi_replace.phpt37
-rw-r--r--ext/mbstring/tests/mb_get_info.phpt190
-rw-r--r--ext/mbstring/tests/mb_http_input.phpt51
-rw-r--r--ext/mbstring/tests/mb_http_output.phpt84
-rw-r--r--ext/mbstring/tests/mb_internal_encoding.phpt68
-rw-r--r--ext/mbstring/tests/mb_internal_encoding_basic.phpt36
-rw-r--r--ext/mbstring/tests/mb_internal_encoding_error1.phpt36
-rw-r--r--ext/mbstring/tests/mb_internal_encoding_error2.phpt31
-rw-r--r--ext/mbstring/tests/mb_internal_encoding_ini_basic2.phpt29
-rw-r--r--ext/mbstring/tests/mb_internal_encoding_variation1.phpt217
-rw-r--r--ext/mbstring/tests/mb_internal_encoding_variation2.phpt374
-rw-r--r--ext/mbstring/tests/mb_list_encodings.phpt16
-rw-r--r--ext/mbstring/tests/mb_output_handler_euc_jp.phpt21
-rw-r--r--ext/mbstring/tests/mb_output_handler_pattern-01.phpt18
-rw-r--r--ext/mbstring/tests/mb_output_handler_pattern-02.phpt18
-rw-r--r--ext/mbstring/tests/mb_output_handler_pattern-03.phpt18
-rw-r--r--ext/mbstring/tests/mb_output_handler_pattern-04.phpt18
-rw-r--r--ext/mbstring/tests/mb_output_handler_pattern-05.phpt17
-rw-r--r--ext/mbstring/tests/mb_output_handler_pattern-06.phpt18
-rw-r--r--ext/mbstring/tests/mb_output_handler_pattern-07.phpt19
-rw-r--r--ext/mbstring/tests/mb_output_handler_pattern-08.phpt19
-rw-r--r--ext/mbstring/tests/mb_output_handler_pattern-09.phpt19
-rw-r--r--ext/mbstring/tests/mb_output_handler_pattern-10.phpt19
-rw-r--r--ext/mbstring/tests/mb_output_handler_pattern-11.phpt17
-rw-r--r--ext/mbstring/tests/mb_output_handler_pattern-12.phpt18
-rw-r--r--ext/mbstring/tests/mb_output_handler_runtime_ini_alteration-01.phpt20
-rw-r--r--ext/mbstring/tests/mb_output_handler_runtime_ini_alteration-02.phpt20
-rw-r--r--ext/mbstring/tests/mb_output_handler_shift_jis.phpt16
-rw-r--r--ext/mbstring/tests/mb_parse_str.phpt81
-rw-r--r--ext/mbstring/tests/mb_parse_str02.phpt106
-rw-r--r--ext/mbstring/tests/mb_preferred_mime_name.phpt61
-rw-r--r--ext/mbstring/tests/mb_regex_encoding_basic.phpt35
-rw-r--r--ext/mbstring/tests/mb_regex_encoding_error1.phpt36
-rw-r--r--ext/mbstring/tests/mb_regex_encoding_error2.phpt31
-rw-r--r--ext/mbstring/tests/mb_regex_encoding_variation1.phpt215
-rw-r--r--ext/mbstring/tests/mb_regex_encoding_variation2.phpt420
-rw-r--r--ext/mbstring/tests/mb_regex_set_options.phpt18
-rw-r--r--ext/mbstring/tests/mb_send_mail01.phpt42
-rw-r--r--ext/mbstring/tests/mb_send_mail02.phpt42
-rw-r--r--ext/mbstring/tests/mb_send_mail03.phpt42
-rw-r--r--ext/mbstring/tests/mb_send_mail04.phpt42
-rw-r--r--ext/mbstring/tests/mb_send_mail05.phpt46
-rw-r--r--ext/mbstring/tests/mb_send_mail06.phpt45
-rw-r--r--ext/mbstring/tests/mb_send_mail07.phpt45
-rw-r--r--ext/mbstring/tests/mb_split-compat-01.phpt23
-rw-r--r--ext/mbstring/tests/mb_split.phpt67
-rw-r--r--ext/mbstring/tests/mb_split_empty_match.phpt23
-rw-r--r--ext/mbstring/tests/mb_split_error.phpt50
-rw-r--r--ext/mbstring/tests/mb_split_variation1.phpt246
-rw-r--r--ext/mbstring/tests/mb_split_variation2.phpt248
-rw-r--r--ext/mbstring/tests/mb_split_variation3.phpt331
-rw-r--r--ext/mbstring/tests/mb_str_functions_opt-parameter.phpt30
-rw-r--r--ext/mbstring/tests/mb_strcut.phpt34
-rw-r--r--ext/mbstring/tests/mb_strcut_missing_boundary_check.phpt31
-rw-r--r--ext/mbstring/tests/mb_strimwidth.phpt43
-rw-r--r--ext/mbstring/tests/mb_stripos.phpt178
-rw-r--r--ext/mbstring/tests/mb_stripos_basic.phpt158
-rw-r--r--ext/mbstring/tests/mb_stripos_basic2.phpt129
-rw-r--r--ext/mbstring/tests/mb_stripos_error1.phpt51
-rw-r--r--ext/mbstring/tests/mb_stripos_error2.phpt35
-rw-r--r--ext/mbstring/tests/mb_stripos_variation1.phpt183
-rw-r--r--ext/mbstring/tests/mb_stripos_variation2.phpt200
-rw-r--r--ext/mbstring/tests/mb_stripos_variation3.phpt203
-rw-r--r--ext/mbstring/tests/mb_stripos_variation4.phpt223
-rw-r--r--ext/mbstring/tests/mb_stripos_variation5_Bug45923.phpt119
-rw-r--r--ext/mbstring/tests/mb_stristr_basic.phpt70
-rw-r--r--ext/mbstring/tests/mb_stristr_error1.phpt47
-rw-r--r--ext/mbstring/tests/mb_stristr_error2.phpt35
-rw-r--r--ext/mbstring/tests/mb_stristr_variation1.phpt208
-rw-r--r--ext/mbstring/tests/mb_stristr_variation2.phpt216
-rw-r--r--ext/mbstring/tests/mb_stristr_variation3.phpt232
-rw-r--r--ext/mbstring/tests/mb_stristr_variation4.phpt227
-rw-r--r--ext/mbstring/tests/mb_stristr_variation5.phpt69
-rw-r--r--ext/mbstring/tests/mb_strlen.phpt101
-rw-r--r--ext/mbstring/tests/mb_strlen_basic.phpt43
-rw-r--r--ext/mbstring/tests/mb_strlen_error1.phpt46
-rw-r--r--ext/mbstring/tests/mb_strlen_error2.phpt34
-rw-r--r--ext/mbstring/tests/mb_strlen_variation1.phpt180
-rw-r--r--ext/mbstring/tests/mb_strlen_variation2.phpt220
-rw-r--r--ext/mbstring/tests/mb_strlen_variation3.phpt445
-rw-r--r--ext/mbstring/tests/mb_strpos.phpt175
-rw-r--r--ext/mbstring/tests/mb_strpos_basic.phpt57
-rw-r--r--ext/mbstring/tests/mb_strpos_error1.phpt50
-rw-r--r--ext/mbstring/tests/mb_strpos_error2.phpt34
-rw-r--r--ext/mbstring/tests/mb_strpos_variation1.phpt182
-rw-r--r--ext/mbstring/tests/mb_strpos_variation2.phpt198
-rw-r--r--ext/mbstring/tests/mb_strpos_variation3.phpt202
-rw-r--r--ext/mbstring/tests/mb_strpos_variation4.phpt222
-rw-r--r--ext/mbstring/tests/mb_strpos_variation5.phpt117
-rw-r--r--ext/mbstring/tests/mb_strrchr_basic.phpt64
-rw-r--r--ext/mbstring/tests/mb_strrchr_error1.phpt47
-rw-r--r--ext/mbstring/tests/mb_strrchr_error2.phpt35
-rw-r--r--ext/mbstring/tests/mb_strrchr_variation1.phpt207
-rw-r--r--ext/mbstring/tests/mb_strrchr_variation2.phpt207
-rw-r--r--ext/mbstring/tests/mb_strrchr_variation3.phpt232
-rw-r--r--ext/mbstring/tests/mb_strrchr_variation4.phpt227
-rw-r--r--ext/mbstring/tests/mb_strrchr_variation5.phpt59
-rw-r--r--ext/mbstring/tests/mb_strrchr_variation6.phpt65
-rw-r--r--ext/mbstring/tests/mb_strrichr_basic.phpt70
-rw-r--r--ext/mbstring/tests/mb_strrichr_error1.phpt47
-rw-r--r--ext/mbstring/tests/mb_strrichr_error2.phpt35
-rw-r--r--ext/mbstring/tests/mb_strrichr_variation1.phpt207
-rw-r--r--ext/mbstring/tests/mb_strrichr_variation2.phpt207
-rw-r--r--ext/mbstring/tests/mb_strrichr_variation3.phpt232
-rw-r--r--ext/mbstring/tests/mb_strrichr_variation4.phpt227
-rw-r--r--ext/mbstring/tests/mb_strrichr_variation5.phpt69
-rw-r--r--ext/mbstring/tests/mb_strripos_basic.phpt158
-rw-r--r--ext/mbstring/tests/mb_strripos_basic2.phpt128
-rw-r--r--ext/mbstring/tests/mb_strripos_error1.phpt51
-rw-r--r--ext/mbstring/tests/mb_strripos_error2.phpt35
-rw-r--r--ext/mbstring/tests/mb_strripos_variation1.phpt183
-rw-r--r--ext/mbstring/tests/mb_strripos_variation2.phpt183
-rw-r--r--ext/mbstring/tests/mb_strripos_variation3_Bug45923.phpt206
-rw-r--r--ext/mbstring/tests/mb_strripos_variation4.phpt223
-rw-r--r--ext/mbstring/tests/mb_strripos_variation5_Bug45923.phpt115
-rw-r--r--ext/mbstring/tests/mb_strrpos_basic.phpt58
-rw-r--r--ext/mbstring/tests/mb_strrpos_error1.phpt50
-rw-r--r--ext/mbstring/tests/mb_strrpos_error2.phpt35
-rw-r--r--ext/mbstring/tests/mb_strrpos_variation1.phpt181
-rw-r--r--ext/mbstring/tests/mb_strrpos_variation2.phpt183
-rw-r--r--ext/mbstring/tests/mb_strrpos_variation3.phpt153
-rw-r--r--ext/mbstring/tests/mb_strrpos_variation4.phpt222
-rw-r--r--ext/mbstring/tests/mb_strrpos_variation5.phpt61
-rw-r--r--ext/mbstring/tests/mb_strstr.phpt35
-rw-r--r--ext/mbstring/tests/mb_strstr_basic.phpt64
-rw-r--r--ext/mbstring/tests/mb_strstr_error1.phpt47
-rw-r--r--ext/mbstring/tests/mb_strstr_error2.phpt35
-rw-r--r--ext/mbstring/tests/mb_strstr_variation1.phpt207
-rw-r--r--ext/mbstring/tests/mb_strstr_variation2.phpt215
-rw-r--r--ext/mbstring/tests/mb_strstr_variation3.phpt232
-rw-r--r--ext/mbstring/tests/mb_strstr_variation4.phpt227
-rw-r--r--ext/mbstring/tests/mb_strstr_variation5.phpt59
-rw-r--r--ext/mbstring/tests/mb_strstr_variation6.phpt65
-rw-r--r--ext/mbstring/tests/mb_strtolower_basic.phpt58
-rw-r--r--ext/mbstring/tests/mb_strtolower_error1.phpt46
-rw-r--r--ext/mbstring/tests/mb_strtolower_error2.phpt32
-rw-r--r--ext/mbstring/tests/mb_strtolower_variation1.phpt178
-rw-r--r--ext/mbstring/tests/mb_strtolower_variation2.phpt225
-rw-r--r--ext/mbstring/tests/mb_strtolower_variation3.phpt57
-rw-r--r--ext/mbstring/tests/mb_strtolower_variation4.phpt56
-rw-r--r--ext/mbstring/tests/mb_strtoupper_basic.phpt60
-rw-r--r--ext/mbstring/tests/mb_strtoupper_error1.phpt47
-rw-r--r--ext/mbstring/tests/mb_strtoupper_error2.phpt34
-rw-r--r--ext/mbstring/tests/mb_strtoupper_variation1.phpt181
-rw-r--r--ext/mbstring/tests/mb_strtoupper_variation2.phpt226
-rw-r--r--ext/mbstring/tests/mb_strtoupper_variation3.phpt58
-rw-r--r--ext/mbstring/tests/mb_strtoupper_variation4.phpt57
-rw-r--r--ext/mbstring/tests/mb_strwidth.phpt32
-rw-r--r--ext/mbstring/tests/mb_substitute_character.phpt45
-rw-r--r--ext/mbstring/tests/mb_substitute_character_basic.phpt43
-rw-r--r--ext/mbstring/tests/mb_substitute_character_error.phpt35
-rw-r--r--ext/mbstring/tests/mb_substitute_character_variation1.phpt231
-rw-r--r--ext/mbstring/tests/mb_substitute_character_variation2.phpt39
-rw-r--r--ext/mbstring/tests/mb_substr.phpt35
-rw-r--r--ext/mbstring/tests/mb_substr_basic.phpt57
-rw-r--r--ext/mbstring/tests/mb_substr_count.phpt44
-rw-r--r--ext/mbstring/tests/mb_substr_count_basic.phpt47
-rw-r--r--ext/mbstring/tests/mb_substr_count_error1.phpt49
-rw-r--r--ext/mbstring/tests/mb_substr_count_error2.phpt37
-rw-r--r--ext/mbstring/tests/mb_substr_count_variation1.phpt182
-rw-r--r--ext/mbstring/tests/mb_substr_count_variation2.phpt196
-rw-r--r--ext/mbstring/tests/mb_substr_count_variation3.phpt220
-rw-r--r--ext/mbstring/tests/mb_substr_count_variation4.phpt44
-rw-r--r--ext/mbstring/tests/mb_substr_error1.phpt49
-rw-r--r--ext/mbstring/tests/mb_substr_error2.phpt35
-rw-r--r--ext/mbstring/tests/mb_substr_variation1.phpt181
-rw-r--r--ext/mbstring/tests/mb_substr_variation2.phpt227
-rw-r--r--ext/mbstring/tests/mb_substr_variation3.phpt445
-rw-r--r--ext/mbstring/tests/mb_substr_variation4.phpt132
-rw-r--r--ext/mbstring/tests/mb_substr_variation5.phpt133
-rw-r--r--ext/mbstring/tests/mb_substr_variation6.phpt137
-rw-r--r--ext/mbstring/tests/mb_substr_variation7.phpt138
-rw-r--r--ext/mbstring/tests/overload01.phpt25
-rw-r--r--ext/mbstring/tests/overload02.phpt36
-rw-r--r--ext/mbstring/tests/php_gr_jp_10830.phpt20
-rw-r--r--ext/mbstring/tests/php_gr_jp_16242.phpt21
-rw-r--r--ext/mbstring/tests/php_gr_jp_dev_884-1.phpt19
-rw-r--r--ext/mbstring/tests/php_gr_jp_dev_884-2.phpt23
-rw-r--r--ext/mbstring/tests/pictogram1.phpt172
-rw-r--r--ext/mbstring/tests/simpletest.phpt34
-rw-r--r--ext/mbstring/tests/skipif.inc14
-rw-r--r--ext/mbstring/tests/zend_multibyte-01.phpt23
-rw-r--r--ext/mbstring/tests/zend_multibyte-02.phpt18
-rw-r--r--ext/mbstring/tests/zend_multibyte-03.phpt18
-rw-r--r--ext/mbstring/tests/zend_multibyte-04.phpt18
-rw-r--r--ext/mbstring/tests/zend_multibyte-05.phpt21
-rw-r--r--ext/mbstring/tests/zend_multibyte-06.phpt19
-rw-r--r--ext/mbstring/tests/zend_multibyte-07.phpt19
-rw-r--r--ext/mbstring/tests/zend_multibyte-08.phpt19
-rw-r--r--ext/mbstring/tests/zend_multibyte-09.phpt22
-rw-r--r--ext/mbstring/tests/zend_multibyte-10.phpt17
-rw-r--r--ext/mbstring/tests/zend_multibyte-11.phpt18
-rw-r--r--ext/mbstring/tests/zend_multibyte-12.phpt17
-rw-r--r--ext/mbstring/tests/zend_multibyte-13.phpt23
-rw-r--r--ext/mbstring/tests/zend_multibyte-14.phpt23
304 files changed, 27868 insertions, 0 deletions
diff --git a/ext/mbstring/tests/bug20087.phpt b/ext/mbstring/tests/bug20087.phpt
new file mode 100644
index 0000000..01bcc90
--- /dev/null
+++ b/ext/mbstring/tests/bug20087.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Bug #20087 (Assertion failure)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FAIL--
+register_globals calls killed the ability for mb_parse_str() to register into the global scope
+--FILE--
+<?php
+ini_set('include_path', dirname(__FILE__));
+include_once('common.inc');
+$testmoo = "blah blah";
+var_dump(mb_parse_str("testmoo"));
+var_dump($testmoo);
+var_dump(mb_parse_str("test=moo"));
+var_dump($test);
+?>
+--EXPECT--
+bool(true)
+string(0) ""
+bool(true)
+string(3) "moo"
+
diff --git a/ext/mbstring/tests/bug25140.phpt b/ext/mbstring/tests/bug25140.phpt
new file mode 100644
index 0000000..0b20912
--- /dev/null
+++ b/ext/mbstring/tests/bug25140.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Bug #25140 (mb_convert_encoding returns FALSE on an empty string)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+var_dump( mb_convert_encoding( '', 'SJIS', 'EUC-JP' ) );
+?>
+--EXPECT--
+string(0) ""
diff --git a/ext/mbstring/tests/bug26639.phpt b/ext/mbstring/tests/bug26639.phpt
new file mode 100644
index 0000000..a87e912
--- /dev/null
+++ b/ext/mbstring/tests/bug26639.phpt
@@ -0,0 +1,123 @@
+--TEST--
+Bug #26639 (mb_convert_variables() clutters variables beyond the references)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+$a = "";
+$b = $a;
+mb_convert_variables("EUC-JP", "Shift_JIS", $b);
+debug_zval_dump($a);
+debug_zval_dump($b);
+unset($a);
+unset($b);
+
+$a = "";
+$b = &$a;
+mb_convert_variables("EUC-JP", "Shift_JIS", $b);
+debug_zval_dump($a);
+debug_zval_dump($b);
+unset($a);
+unset($b);
+
+$a = "";
+$b = array($a);
+$c = $b;
+mb_convert_variables("EUC-JP", "Shift_JIS", $c);
+debug_zval_dump($b);
+debug_zval_dump($c);
+unset($a);
+unset($b);
+unset($c);
+
+$a = "";
+$b = array(&$a);
+$c = $b;
+mb_convert_variables("EUC-JP", "Shift_JIS", $c);
+debug_zval_dump($b);
+debug_zval_dump($c);
+unset($a);
+unset($b);
+unset($c);
+
+$a = "";
+$b = array($a);
+$c = &$b;
+mb_convert_variables("EUC-JP", "Shift_JIS", $c);
+debug_zval_dump($b);
+debug_zval_dump($c);
+unset($a);
+unset($b);
+unset($c);
+
+$a = "";
+$b = array(&$a);
+$c = &$b;
+mb_convert_variables("EUC-JP", "Shift_JIS", $c);
+debug_zval_dump($b);
+debug_zval_dump($c);
+unset($a);
+unset($b);
+unset($c);
+
+$a = array(array(""));
+$b = $a;
+$c = $b;
+mb_convert_variables("EUC-JP", "Shift_JIS", $c);
+debug_zval_dump($b);
+debug_zval_dump($c);
+unset($a);
+unset($b);
+unset($c);
+?>
+--EXPECT--
+string(10) "" refcount(2)
+string(10) "あいうえお" refcount(2)
+string(10) "あいうえお" refcount(1)
+string(10) "あいうえお" refcount(1)
+array(1) refcount(2){
+ [0]=>
+ string(10) "" refcount(2)
+}
+array(1) refcount(2){
+ [0]=>
+ string(10) "あいうえお" refcount(1)
+}
+array(1) refcount(2){
+ [0]=>
+ &string(10) "" refcount(2)
+}
+array(1) refcount(2){
+ [0]=>
+ string(10) "あいうえお" refcount(1)
+}
+array(1) refcount(1){
+ [0]=>
+ string(10) "あいうえお" refcount(2)
+}
+array(1) refcount(1){
+ [0]=>
+ string(10) "あいうえお" refcount(2)
+}
+array(1) refcount(1){
+ [0]=>
+ string(10) "あいうえお" refcount(2)
+}
+array(1) refcount(1){
+ [0]=>
+ string(10) "あいうえお" refcount(2)
+}
+array(1) refcount(3){
+ [0]=>
+ array(1) refcount(1){
+ [0]=>
+ string(10) "" refcount(1)
+ }
+}
+array(1) refcount(2){
+ [0]=>
+ array(1) refcount(1){
+ [0]=>
+ string(10) "あいうえお" refcount(1)
+ }
+}
diff --git a/ext/mbstring/tests/bug28220.phpt b/ext/mbstring/tests/bug28220.phpt
new file mode 100644
index 0000000..527fdc6
--- /dev/null
+++ b/ext/mbstring/tests/bug28220.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Bug #28220 (mb_strwidth() returns wrong width values for some Hangul characters)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+$coderange = array(
+ range(0x0000, 0x1fff),
+ range(0xff60, 0xff9f)
+);
+
+
+foreach ($coderange as $r) {
+ $ng = 0;
+ foreach ($r as $c) {
+ if (mb_strwidth(pack('N1', $c), 'UCS-4BE') != 2) {
+ $ng++;
+ }
+ }
+ echo "$ng\n";
+}
+?>
+--EXPECT--
+8085
+63
diff --git a/ext/mbstring/tests/bug30549.phpt b/ext/mbstring/tests/bug30549.phpt
new file mode 100644
index 0000000..a6007e0
--- /dev/null
+++ b/ext/mbstring/tests/bug30549.phpt
@@ -0,0 +1,31 @@
+--TEST--
+Bug #30549 (incorrect character translations for some ISO8859 charsets)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+test('ISO-8859-7', array(0xa4 => 0x20ac, 0xa5 => 0x20af, 0xaa => 0x037a));
+test('ISO-8859-8', array(0xaf => 0x00af, 0xfd => 0x200e, 0xfe => 0x200f));
+test('ISO-8859-10', array(0xa4 => 0x012a ));
+
+function test($enc, $map) {
+ print "$enc\n";
+
+ foreach($map as $fromc => $toc) {
+ $ustr = mb_convert_encoding(pack('C', $fromc), 'UCS-4BE', $enc);
+ foreach (unpack('Nc', $ustr) as $unic);
+ printf("0x%04x, 0x%04x\n", $toc, $unic);
+ }
+}
+?>
+--EXPECT--
+ISO-8859-7
+0x20ac, 0x20ac
+0x20af, 0x20af
+0x037a, 0x037a
+ISO-8859-8
+0x00af, 0x00af
+0x200e, 0x200e
+0x200f, 0x200f
+ISO-8859-10
+0x012a, 0x012a
diff --git a/ext/mbstring/tests/bug31911.phpt b/ext/mbstring/tests/bug31911.phpt
new file mode 100644
index 0000000..48d4971
--- /dev/null
+++ b/ext/mbstring/tests/bug31911.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Bug #31911 (mb_decode_mimeheader() is case-sensitive to hex escapes)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+echo mb_decode_mimeheader("Works: =?iso-8859-1?q?=3F=3F=3F?=");
+echo "\n";
+echo mb_decode_mimeheader("Fails: =?iso-8859-1?q?=3f=3f=3f?=")
+?>
+--EXPECT--
+Works: ???
+Fails: ???
diff --git a/ext/mbstring/tests/bug40685.phpt b/ext/mbstring/tests/bug40685.phpt
new file mode 100644
index 0000000..1a673e5
--- /dev/null
+++ b/ext/mbstring/tests/bug40685.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Bug #40685 (mb_decode_numericentity() removes '&' in the string)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+$map = array(0, 0x10FFFF, 0, 0xFFFFFF);
+var_dump(mb_decode_numericentity('&', $map, 'UTF-8'));
+var_dump(mb_decode_numericentity('&&&', $map, 'UTF-8'));
+var_dump(mb_decode_numericentity('&#', $map, 'UTF-8'));
+var_dump(mb_decode_numericentity('&#x', $map, 'UTF-8'));
+var_dump(mb_decode_numericentity('&#61', $map, 'UTF-8'));
+var_dump(mb_decode_numericentity('&#x3d', $map, 'UTF-8'));
+var_dump(mb_decode_numericentity('&#61;', $map, 'UTF-8'));
+var_dump(mb_decode_numericentity('&#x3d;', $map, 'UTF-8'));
+?>
+--EXPECTF--
+string(1) "&"
+string(3) "&&&"
+string(2) "&#"
+string(3) "&#x"
+string(4) "&#61"
+string(5) "&#x3D"
+string(1) "="
+string(1) "="
diff --git a/ext/mbstring/tests/bug43301.phpt b/ext/mbstring/tests/bug43301.phpt
new file mode 100644
index 0000000..2a5f748
--- /dev/null
+++ b/ext/mbstring/tests/bug43301.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Bug #43301 (mb_ereg*_replace() crashes when replacement string is invalid PHP expression and 'e' option is used)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+
+$ptr = 'hello';
+
+$txt = <<<doc
+hello, I have got a cr*sh on you
+doc;
+
+echo mb_ereg_replace($ptr,'$1',$txt,'e');
+
+?>
+--EXPECTF--
+Parse error: syntax error, unexpected %s, expecting %s or '$' in %sbug43301.php(%d) : mbregex replace on line %d
+
+Fatal error: mb_ereg_replace(): Failed evaluating code:
+$1 in %sbug43301.php on line %d
diff --git a/ext/mbstring/tests/bug43840.phpt b/ext/mbstring/tests/bug43840.phpt
new file mode 100644
index 0000000..626cd70
--- /dev/null
+++ b/ext/mbstring/tests/bug43840.phpt
@@ -0,0 +1,75 @@
+--TEST--
+Test mb_strpos() function : mb_strpos bounds check is byte count rather than a character count
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strpos') or die("skip mb_strpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * mb_strpos bounds check is byte count rather than a character count:
+ * The multibyte string should be returning the same results as the ASCII string.
+ * Multibyte string was not returning error message until offset was passed the
+ * byte count of the string. Should return error message when passed character count.
+ */
+
+$offsets = array(20, 21, 22, 53, 54);
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+$needle = base64_decode('44CC');
+
+foreach($offsets as $i) {
+ echo "\n-- Offset is $i --\n";
+ echo "--Multibyte String:--\n";
+ var_dump( mb_strpos($string_mb, $needle, $i, 'UTF-8') );
+ echo"--ASCII String:--\n";
+ var_dump(mb_strpos(b'This is na English ta', b'a', $i));
+}
+?>
+--EXPECTF--
+-- Offset is 20 --
+--Multibyte String:--
+int(20)
+--ASCII String:--
+int(20)
+
+-- Offset is 21 --
+--Multibyte String:--
+bool(false)
+--ASCII String:--
+bool(false)
+
+-- Offset is 22 --
+--Multibyte String:--
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+--ASCII String:--
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+-- Offset is 53 --
+--Multibyte String:--
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+--ASCII String:--
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+-- Offset is 54 --
+--Multibyte String:--
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+--ASCII String:--
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
diff --git a/ext/mbstring/tests/bug43841.phpt b/ext/mbstring/tests/bug43841.phpt
new file mode 100644
index 0000000..9f25832
--- /dev/null
+++ b/ext/mbstring/tests/bug43841.phpt
@@ -0,0 +1,85 @@
+--TEST--
+Test mb_strrpos() function : mb_strrpos offset is byte count for negative values
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrpos') or die("skip mb_strrpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strrpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of last occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test that mb_strrpos offset is byte count for negative values (should be character count)
+ */
+
+$offsets = array(-25, -24, -13, -12);
+$string_mb =
+base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvv
+JfvvJjvvJnjgII=');
+$needle = base64_decode('44CC');
+
+foreach ($offsets as $i) {
+ echo "\n-- Offset is $i --\n";
+ echo "Multibyte String:\n";
+ var_dump( mb_strrpos($string_mb, $needle, $i, 'UTF-8') );
+ echo "ASCII String:\n";
+ echo "mb_strrpos:\n";
+ var_dump(mb_strrpos(b'This is na English ta', b'a', $i));
+ echo "strrpos:\n";
+ var_dump(strrpos(b'This is na English ta', b'a', $i));
+}
+?>
+
+--EXPECTF--
+
+-- Offset is -25 --
+Multibyte String:
+
+Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+ASCII String:
+mb_strrpos:
+
+Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+strrpos:
+
+Warning: strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+-- Offset is -24 --
+Multibyte String:
+
+Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+ASCII String:
+mb_strrpos:
+
+Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+strrpos:
+
+Warning: strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+-- Offset is -13 --
+Multibyte String:
+bool(false)
+ASCII String:
+mb_strrpos:
+bool(false)
+strrpos:
+bool(false)
+
+-- Offset is -12 --
+Multibyte String:
+int(9)
+ASCII String:
+mb_strrpos:
+int(9)
+strrpos:
+int(9)
diff --git a/ext/mbstring/tests/bug43993.phpt b/ext/mbstring/tests/bug43993.phpt
new file mode 100644
index 0000000..662045d
--- /dev/null
+++ b/ext/mbstring/tests/bug43993.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Bug #43993 (mb_substr_count() behaves differently to substr_count() with overlapping needles)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+var_dump(mb_substr_count("abcabcabca", "abcabc"));
+var_dump(mb_substr_count("abcabcabca", "abc"));
+var_dump(mb_substr_count("abcabcabca", "cab"));
+var_dump(mb_substr_count("abcabcabca", "bca"));
+var_dump(mb_substr_count("ababababab", "ba"));
+var_dump(mb_substr_count("ababababab", "ab"));
+var_dump(mb_substr_count("ababababab", "bc"));
+var_dump(mb_substr_count("aaaaaaaaaa", "a"));
+var_dump(mb_substr_count("aaaaaaaaaa", "b"));
+?>
+--EXPECT--
+int(1)
+int(3)
+int(2)
+int(3)
+int(4)
+int(5)
+int(0)
+int(10)
+int(0)
diff --git a/ext/mbstring/tests/bug43994.phpt b/ext/mbstring/tests/bug43994.phpt
new file mode 100644
index 0000000..8fdb904
--- /dev/null
+++ b/ext/mbstring/tests/bug43994.phpt
@@ -0,0 +1,129 @@
+--TEST--
+Test mb_ereg() function : mb_ereg 'successfully' matching incorrectly
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_ereg(string $pattern, string $string [, array $registers])
+ * Description: Regular expression match for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * mb_ereg 'successfully' matching incorrectly:
+ * Bug now seems to be fixed - error message is now generated when an 'empty'
+ * pattern is supplied to mb_ereg. Similar error message to ereg().
+ */
+
+$unset_var = 10;
+unset ($unset_var);
+$inputs = array(NULL, null, false, FALSE, "", '', @$undefined_var,
+@$unset_var);
+
+$iterator = 1;
+foreach($inputs as $input) {
+ if(@is_array($mb_regs)){
+ $mb_regs = '';
+ }
+ echo "\n-- Iteration $iterator --\n";
+ echo "Without \$regs arg:\n";
+ var_dump( mb_ereg($input, 'hello, world') );
+ echo "With \$regs arg:\n";
+ var_dump(mb_ereg($input, 'hello, world', $mb_regs));
+ var_dump($mb_regs);
+ $iterator++;
+};
+?>
+
+--EXPECTF--
+
+-- Iteration 1 --
+Without $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+With $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+NULL
+
+-- Iteration 2 --
+Without $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+With $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+NULL
+
+-- Iteration 3 --
+Without $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+With $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+NULL
+
+-- Iteration 4 --
+Without $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+With $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+NULL
+
+-- Iteration 5 --
+Without $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+With $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+NULL
+
+-- Iteration 6 --
+Without $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+With $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+NULL
+
+-- Iteration 7 --
+Without $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+With $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+NULL
+
+-- Iteration 8 --
+Without $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+With $regs arg:
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+NULL
diff --git a/ext/mbstring/tests/bug43998.phpt b/ext/mbstring/tests/bug43998.phpt
new file mode 100644
index 0000000..da5e599
--- /dev/null
+++ b/ext/mbstring/tests/bug43998.phpt
@@ -0,0 +1,71 @@
+--TEST--
+Test mb_strtolower() function : Two error messages returned for incorrect encoding for mb_strto[upper|lower]
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strtolower') or die("skip mb_strtolower() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strto[lower|upper](string $sourcestring [, string $encoding])
+ * Description: Returns a [lower|upper]cased version of $sourcestring
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Two error messages returned for incorrect encoding for mb_strto[upper|lower]
+ * Bug now appears to be fixed
+ */
+
+$sourcestring = 'Hello, World';
+
+$inputs = array(12345, 12.3456789000E-10, true, false, "");
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strtolower($sourcestring, $input) );
+ var_dump( mb_strtoupper($sourcestring, $input) );
+ $iterator++;
+};
+?>
+--EXPECTF--
+
+-- Iteration 1 --
+
+Warning: mb_strtolower(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+Warning: mb_strtoupper(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+-- Iteration 2 --
+
+Warning: mb_strtolower(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+Warning: mb_strtoupper(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+-- Iteration 3 --
+
+Warning: mb_strtolower(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+Warning: mb_strtoupper(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_strtolower(): Unknown encoding "" in %s on line %d
+bool(false)
+
+Warning: mb_strtoupper(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_strtolower(): Unknown encoding "" in %s on line %d
+bool(false)
+
+Warning: mb_strtoupper(): Unknown encoding "" in %s on line %d
+bool(false)
diff --git a/ext/mbstring/tests/bug45239.phpt b/ext/mbstring/tests/bug45239.phpt
new file mode 100644
index 0000000..8d8ef48
--- /dev/null
+++ b/ext/mbstring/tests/bug45239.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Bug #45239 (encoding detector hangs with mbstring.strict_detection enabled)
+--INI--
+mbstring.strict_detection=1
+mbstring.http_input=UTF-8
+mbstring.internal_encoding=UTF-8
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+?>
+--FILE--
+<?php
+mb_internal_encoding("utf-8");
+mb_parse_str("a=%fc", $dummy);
+var_dump(mb_http_input());
+?>
+--EXPECT--
+string(5) "UTF-8"
diff --git a/ext/mbstring/tests/bug45722.phpt b/ext/mbstring/tests/bug45722.phpt
new file mode 100644
index 0000000..97f6fe5
--- /dev/null
+++ b/ext/mbstring/tests/bug45722.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Bug #45722 (mb_check_encoding() crashes)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+var_dump(mb_check_encoding("&\xc2\xb7 TEST TEST TEST TEST TEST TEST", "HTML-ENTITIES"));
+?>
+--EXPECT--
+bool(false)
diff --git a/ext/mbstring/tests/bug45923.phpt b/ext/mbstring/tests/bug45923.phpt
new file mode 100644
index 0000000..2d184ab
--- /dev/null
+++ b/ext/mbstring/tests/bug45923.phpt
@@ -0,0 +1,202 @@
+--TEST--
+Bug #45923 (mb_st[r]ripos() offset not handled correctly)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=UTF-8
+--FILE--
+<?php
+var_dump(strpos("abc abc abc", "abc", 0));
+var_dump(strpos("abc abc abc", "abc", 3));
+var_dump(strpos("abc abc abc", "abc", 6));
+var_dump(strpos("abc abc abc", "abc", 9));
+var_dump(strpos("abc abc abc", "abc", 11));
+var_dump(strpos("abc abc abc", "abc", 12));
+var_dump(strpos("abc abc abc", "abc", -1));
+var_dump(strpos("abc abc abc", "abc", -3));
+var_dump(strpos("abc abc abc", "abc", -6));
+
+var_dump(mb_strpos(" ", "", 0));
+var_dump(mb_strpos(" ", "", 3));
+var_dump(mb_strpos(" ", "", 6));
+var_dump(mb_strpos(" ", "", 9));
+var_dump(mb_strpos(" ", "", 11));
+var_dump(mb_strpos(" ", "", 12));
+var_dump(mb_strpos(" ", "", -1));
+var_dump(mb_strpos(" ", "", -3));
+var_dump(mb_strpos(" ", "", -6));
+
+var_dump(stripos("abc abc abc", "abc", 0));
+var_dump(stripos("abc abc abc", "abc", 3));
+var_dump(stripos("abc abc abc", "abc", 6));
+var_dump(stripos("abc abc abc", "abc", 9));
+var_dump(stripos("abc abc abc", "abc", 11));
+var_dump(stripos("abc abc abc", "abc", 12));
+var_dump(stripos("abc abc abc", "abc", -1));
+var_dump(stripos("abc abc abc", "abc", -3));
+var_dump(stripos("abc abc abc", "abc", -6));
+
+var_dump(mb_stripos(" ", "", 0));
+var_dump(mb_stripos(" ", "", 3));
+var_dump(mb_stripos(" ", "", 6));
+var_dump(mb_stripos(" ", "", 9));
+var_dump(mb_stripos(" ", "", 11));
+var_dump(mb_stripos(" ", "", 12));
+var_dump(mb_stripos(" ", "", -1));
+var_dump(mb_stripos(" ", "", -3));
+var_dump(mb_stripos(" ", "", -6));
+
+var_dump(strrpos("abc abc abc", "abc", 0));
+var_dump(strrpos("abc abc abc", "abc", 3));
+var_dump(strrpos("abc abc abc", "abc", 6));
+var_dump(strrpos("abc abc abc", "abc", 9));
+var_dump(strrpos("abc abc abc", "abc", 11));
+var_dump(strrpos("abc abc abc", "abc", 12));
+var_dump(strrpos("abc abc abc", "abc", -1));
+var_dump(strrpos("abc abc abc", "abc", -3));
+var_dump(strrpos("abc abc abc", "abc", -6));
+
+var_dump(mb_strrpos(" ", "", 0));
+var_dump(mb_strrpos(" ", "", 3));
+var_dump(mb_strrpos(" ", "", 6));
+var_dump(mb_strrpos(" ", "", 9));
+var_dump(mb_strrpos(" ", "", 11));
+var_dump(mb_strrpos(" ", "", 12));
+var_dump(mb_strrpos(" ", "", -1));
+var_dump(mb_strrpos(" ", "", -3));
+var_dump(mb_strrpos(" ", "", -6));
+
+var_dump(strripos("abc abc abc", "abc", 0));
+var_dump(strripos("abc abc abc", "abc", 3));
+var_dump(strripos("abc abc abc", "abc", 6));
+var_dump(strripos("abc abc abc", "abc", 9));
+var_dump(strripos("abc abc abc", "abc", 11));
+var_dump(strripos("abc abc abc", "abc", 12));
+var_dump(strripos("abc abc abc", "abc", -1));
+var_dump(strripos("abc abc abc", "abc", -3));
+var_dump(strripos("abc abc abc", "abc", -6));
+
+var_dump(mb_strripos(" ", "", 0));
+var_dump(mb_strripos(" ", "", 3));
+var_dump(mb_strripos(" ", "", 6));
+var_dump(mb_strripos(" ", "", 9));
+var_dump(mb_strripos(" ", "", 11));
+var_dump(mb_strripos(" ", "", 12));
+var_dump(mb_strripos(" ", "", -1));
+var_dump(mb_strripos(" ", "", -3));
+var_dump(mb_strripos(" ", "", -6));
+
+?>
+--EXPECTF--
+int(0)
+int(4)
+int(8)
+bool(false)
+bool(false)
+
+Warning: strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: strpos(): Offset not contained in string in %s on line %d
+bool(false)
+int(0)
+int(4)
+int(8)
+bool(false)
+bool(false)
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+int(0)
+int(4)
+int(8)
+bool(false)
+bool(false)
+
+Warning: stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: stripos(): Offset not contained in string in %s on line %d
+bool(false)
+int(0)
+int(4)
+int(8)
+bool(false)
+bool(false)
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+int(8)
+int(8)
+int(8)
+bool(false)
+bool(false)
+
+Warning: strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+int(8)
+int(8)
+int(4)
+int(8)
+int(8)
+int(8)
+bool(false)
+bool(false)
+
+Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+int(8)
+int(8)
+int(4)
+int(8)
+int(8)
+int(8)
+bool(false)
+bool(false)
+
+Warning: strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+int(8)
+int(8)
+int(4)
+int(8)
+int(8)
+int(8)
+bool(false)
+bool(false)
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+int(8)
+int(8)
+int(4)
diff --git a/ext/mbstring/tests/bug46806.phpt b/ext/mbstring/tests/bug46806.phpt
new file mode 100644
index 0000000..eec44b5
--- /dev/null
+++ b/ext/mbstring/tests/bug46806.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Bug #46806 (mb_wtrimwidth cutting to early)
+--CREDITS--
+Sebastian Sch端rmann
+sebs@php.net
+Testfest 2009
+--SKIPIF--
+<?php if (!extension_loaded("mbstring")) die("skip mbstring is not available"); ?>
+--FILE--
+<?php
+echo mb_strimwidth('helloworld', 0, 5, '...', 'UTF-8') . "\n";
+echo mb_strimwidth('hello', 0, 5, '...', 'UTF-8');
+?>
+--EXPECT--
+he...
+hello
diff --git a/ext/mbstring/tests/bug46843.phpt b/ext/mbstring/tests/bug46843.phpt
new file mode 100644
index 0000000..136195c
--- /dev/null
+++ b/ext/mbstring/tests/bug46843.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Bug #46843 (CP936 euro symbol is not converted properly)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+var_dump(bin2hex(mb_convert_encoding("\x80", 'UCS-2BE', 'CP936')));
+var_dump(bin2hex(mb_convert_encoding("\x20\xac", 'CP936', 'UCS-2BE')));
+?>
+--EXPECT--
+string(4) "20ac"
+string(2) "80"
diff --git a/ext/mbstring/tests/bug47399.phpt b/ext/mbstring/tests/bug47399.phpt
new file mode 100644
index 0000000..3586e5c
--- /dev/null
+++ b/ext/mbstring/tests/bug47399.phpt
@@ -0,0 +1,525 @@
+--TEST--
+Bug #47399 (mb_check_encoding() returns true for some illegal SJIS characters)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+foreach (array("Shift_JIS", "CP932") as $enc) {
+ for ($a = 0; $a < 256; $a++) {
+ var_dump(mb_check_encoding("\x81".pack("c", $a), $enc));
+ }
+}
+?>
+--EXPECT--
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+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)
+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(false)
+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)
+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)
+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(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+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)
+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(false)
+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)
+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)
+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(false)
+bool(false)
+bool(false)
diff --git a/ext/mbstring/tests/bug48645.phpt b/ext/mbstring/tests/bug48645.phpt
new file mode 100644
index 0000000..6185442
--- /dev/null
+++ b/ext/mbstring/tests/bug48645.phpt
@@ -0,0 +1,162 @@
+--TEST--
+Bug #48645 (mb_convert_encoding() doesn't understand hexadecimal html-entities)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+var_dump(bin2hex(mb_convert_encoding("&#x0;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#x1;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#x2;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#x3;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#x4;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#x5;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#x6;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#x7;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#x8;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#x9;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#xA;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#xB;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#xC;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#xD;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#xE;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#xF;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#xa;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#xb;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#xc;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#xd;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#xe;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#xf;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#x/;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#x:;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#x@;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#x`;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#xG;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#xg;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#x;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#X0;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#X1;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#X2;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#X3;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#X4;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#X5;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#X6;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#X7;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#X8;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#X9;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#XA;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#XB;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#XC;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#XD;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#XE;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#XF;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#Xa;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#Xb;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#Xc;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#Xd;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#Xe;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#Xf;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#X/;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#X:;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#X@;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#X`;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#XG;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#Xg;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#X;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#0;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#1;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#2;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#3;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#4;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#5;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#6;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#7;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#8;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#9;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#/;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#:;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#x10ffff;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#x110000;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#X10ffff;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#X110000;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#1114111;", "UTF-8", "HTML-ENTITIES")));
+var_dump(bin2hex(mb_convert_encoding("&#1114112;", "UTF-8", "HTML-ENTITIES")));
+?>
+--EXPECT--
+string(2) "00"
+string(2) "01"
+string(2) "02"
+string(2) "03"
+string(2) "04"
+string(2) "05"
+string(2) "06"
+string(2) "07"
+string(2) "08"
+string(2) "09"
+string(2) "0a"
+string(2) "0b"
+string(2) "0c"
+string(2) "0d"
+string(2) "0e"
+string(2) "0f"
+string(2) "0a"
+string(2) "0b"
+string(2) "0c"
+string(2) "0d"
+string(2) "0e"
+string(2) "0f"
+string(10) "2623782f3b"
+string(10) "2623783a3b"
+string(10) "262378403b"
+string(10) "262378603b"
+string(10) "262378473b"
+string(10) "262378673b"
+string(8) "2623783b"
+string(2) "00"
+string(2) "01"
+string(2) "02"
+string(2) "03"
+string(2) "04"
+string(2) "05"
+string(2) "06"
+string(2) "07"
+string(2) "08"
+string(2) "09"
+string(2) "0a"
+string(2) "0b"
+string(2) "0c"
+string(2) "0d"
+string(2) "0e"
+string(2) "0f"
+string(2) "0a"
+string(2) "0b"
+string(2) "0c"
+string(2) "0d"
+string(2) "0e"
+string(2) "0f"
+string(10) "2623582f3b"
+string(10) "2623583a3b"
+string(10) "262358403b"
+string(10) "262358603b"
+string(10) "262358473b"
+string(10) "262358673b"
+string(8) "2623583b"
+string(2) "00"
+string(2) "01"
+string(2) "02"
+string(2) "03"
+string(2) "04"
+string(2) "05"
+string(2) "06"
+string(2) "07"
+string(2) "08"
+string(2) "09"
+string(8) "26232f3b"
+string(8) "26233a3b"
+string(6) "26233b"
+string(8) "f48fbfbf"
+string(20) "2623783131303030303b"
+string(8) "f48fbfbf"
+string(20) "2623583131303030303b"
+string(8) "f48fbfbf"
+string(20) "2623313131343131323b"
diff --git a/ext/mbstring/tests/bug48697.phpt b/ext/mbstring/tests/bug48697.phpt
new file mode 100644
index 0000000..42bbe9f
--- /dev/null
+++ b/ext/mbstring/tests/bug48697.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Bug #48697 (mb_internal_encoding() value gets reset by parse_str() or mb_parse_str()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+ini_set('mbstring.internal_encoding', 'ISO-8859-15');
+ini_set('mbstring.encoding_translation', true);
+var_dump(mb_internal_encoding());
+mb_internal_encoding('UTF-8');
+var_dump(mb_internal_encoding());
+parse_str('a=b');
+var_dump(mb_internal_encoding());
+mb_internal_encoding('UTF-8');
+var_dump(mb_internal_encoding());
+parse_str('a=b');
+var_dump(mb_internal_encoding());
+?>
+--EXPECT--
+string(11) "ISO-8859-15"
+string(5) "UTF-8"
+string(5) "UTF-8"
+string(5) "UTF-8"
+string(5) "UTF-8"
diff --git a/ext/mbstring/tests/bug49354.phpt b/ext/mbstring/tests/bug49354.phpt
new file mode 100644
index 0000000..c25b405
--- /dev/null
+++ b/ext/mbstring/tests/bug49354.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Bug #49354 (mb_strcut() cuts wrong length when offset is in the middle of a multibyte character)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+$crap = 'A奪B辰C旦D端';
+var_dump(mb_strcut($crap, 0, 100, 'UTF-8'));
+var_dump(mb_strcut($crap, 1, 100, 'UTF-8'));
+var_dump(mb_strcut($crap, 2, 100, 'UTF-8'));
+var_dump(mb_strcut($crap, 3, 100, 'UTF-8'));
+var_dump(mb_strcut($crap, 12, 100, 'UTF-8'));
+var_dump(mb_strcut($crap, 13, 100, 'UTF-8'));
+?>
+--EXPECT--
+string(12) "A奪B辰C旦D端"
+string(11) "奪B辰C旦D端"
+string(11) "奪B辰C旦D端"
+string(9) "B辰C旦D端"
+string(0) ""
+bool(false)
diff --git a/ext/mbstring/tests/bug49528.phpt b/ext/mbstring/tests/bug49528.phpt
new file mode 100644
index 0000000..b06c35f
--- /dev/null
+++ b/ext/mbstring/tests/bug49528.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #49528 (UTF-16 strings prefixed by BOM wrongly converted)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+var_dump(bin2hex(mb_convert_encoding("\xff\xfe\x01\x02\x03\x04", "UCS-2BE", "UTF-16")));
+var_dump(bin2hex(mb_convert_encoding("\xfe\xff\x01\x02\x03\x04", "UCS-2BE", "UTF-16")));
+var_dump(bin2hex(mb_convert_encoding("\xff\xfe\xff\xfe\x01\x02\x03\x04", "UCS-2BE", "UTF-16")));
+var_dump(bin2hex(mb_convert_encoding("\xff\xfe\xfe\xff\x01\x02\x03\x04", "UCS-2BE", "UTF-16")));
+var_dump(bin2hex(mb_convert_encoding("\xfe\xff\xff\xfe\x01\x02\x03\x04", "UCS-2BE", "UTF-16")));
+var_dump(bin2hex(mb_convert_encoding("\xfe\xff\xfe\xff\x01\x02\x03\x04", "UCS-2BE", "UTF-16")));
+?>
+--EXPECT--
+string(8) "02010403"
+string(8) "01020304"
+string(12) "feff02010403"
+string(12) "fffe02010403"
+string(12) "fffe01020304"
+string(12) "feff01020304"
diff --git a/ext/mbstring/tests/bug49536.phpt b/ext/mbstring/tests/bug49536.phpt
new file mode 100644
index 0000000..40328f7
--- /dev/null
+++ b/ext/mbstring/tests/bug49536.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #49536 (mb_detect_encoding() returns incorrect results when strict_mode is turned on)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+// non-strict mode
+var_dump(mb_detect_encoding("A\x81", "SJIS", false));
+// strict mode
+var_dump(mb_detect_encoding("A\x81", "SJIS", true));
+// non-strict mode
+var_dump(mb_detect_encoding("\xc0\x00", "UTF-8", false));
+// strict mode
+var_dump(mb_detect_encoding("\xc0\x00", "UTF-8", true));
+?>
+--EXPECT--
+string(4) "SJIS"
+bool(false)
+bool(false)
+bool(false)
diff --git a/ext/mbstring/tests/bug52861.phpt b/ext/mbstring/tests/bug52861.phpt
new file mode 100644
index 0000000..dc1914d
--- /dev/null
+++ b/ext/mbstring/tests/bug52861.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Bug #52681 (mb_send_mail() appends an extra MIME-Version header)
+--SKIPIF--
+<?php
+if (substr(PHP_OS, 0, 3) == 'WIN') {
+ die('skip.. Not valid for Windows');
+}
+if (!function_exists("mb_send_mail") || !mb_language("neutral")) {
+ die("skip mb_send_mail() not available");
+}
+?>
+--INI--
+sendmail_path=/bin/cat
+mail.add_x_header=off
+--FILE--
+<?php
+$to = 'example@example.com';
+$headers = 'MIME-Version: 2.0';
+
+mb_send_mail($to, mb_language(), "test", $headers);
+?>
+--EXPECTF--
+To: example@example.com
+Subject: %s
+MIME-Version: 2.0
+Content-Type: text/plain; charset=%s
+Content-Transfer-Encoding: %s
+
+%s
diff --git a/ext/mbstring/tests/bug52931.phpt b/ext/mbstring/tests/bug52931.phpt
new file mode 100644
index 0000000..52efd03
--- /dev/null
+++ b/ext/mbstring/tests/bug52931.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Bug #52931 (strripos not overloaded with function overloading enabled)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.func_overload = 7
+mbstring.internal_encoding = utf-8
+--FILE--
+<?php
+
+$string = '<body>Umlauttest 旦端辰</body>';
+
+var_dump(strlen($string));
+var_dump(mb_strlen($string));
+
+var_dump(strripos($string, '</body>'));
+var_dump(mb_strripos($string, '</body>'));
+
+?>
+--EXPECTF--
+int(27)
+int(27)
+int(20)
+int(20)
diff --git a/ext/mbstring/tests/bug52981.phpt b/ext/mbstring/tests/bug52981.phpt
new file mode 100644
index 0000000..fe96a56
--- /dev/null
+++ b/ext/mbstring/tests/bug52981.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Bug #52981 (Unicode properties are outdated (from Unicode 3.2))
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+function test($str)
+{
+ $upper = mb_strtoupper($str, 'UTF-8');
+ $len = strlen($upper);
+ for ($i = 0; $i < $len; ++$i) echo dechex(ord($upper[$i])) . ' ';
+ echo "\n";
+}
+
+// OK
+test("\xF0\x90\x90\xB8");// U+10438 DESERET SMALL LETTER H (added in 3.1.0, March 2001)
+// not OK
+test("\xE2\xB0\xB0"); // U+2C30 GLAGOLITIC SMALL LETTER AZU (added in 4.1.0, March 2005)
+test("\xD4\xA5"); // U+0525 CYRILLIC SMALL LETTER PE WITH DESCENDER (added in 5.2.0, October 2009)
+--EXPECTF--
+f0 90 90 90
+e2 b0 80
+d4 a4
diff --git a/ext/mbstring/tests/bug54494.phpt b/ext/mbstring/tests/bug54494.phpt
new file mode 100644
index 0000000..3d7206c
--- /dev/null
+++ b/ext/mbstring/tests/bug54494.phpt
@@ -0,0 +1,52 @@
+--TEST--
+Bug #54494: mb_substr() mishandles UTF-32LE and UCS-2LE
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+
+//declare(encoding = 'UTF-8');
+mb_internal_encoding('UTF-8');
+
+header('Content-Type: text/plain; charset=UTF-32LE');
+
+$stringOr = "h辰ll旦 w旦rld\n";
+
+$mode = "UTF-32LE";
+
+echo "$mode:\n";
+
+$string = mb_convert_encoding($stringOr, $mode);
+$length = mb_strlen($string, $mode);
+echo "Length: ", $length, "\n";
+
+
+for ($i=0; $i < $length; $i++) {
+ $t = unpack("H*",mb_substr($string, $i, 1, $mode));
+ echo $t[1];
+}
+echo "\n";
+
+
+$mode = "UCS-2LE";
+
+echo "$mode:\n";
+
+$string = mb_convert_encoding($stringOr, $mode);
+$length = mb_strlen($string, $mode);
+echo "Length: ", $length, "\n";
+
+
+for ($i=0; $i < $length; $i++) {
+ $t = unpack("H*",mb_substr($string, $i, 1, $mode));
+ echo $t[1];
+}
+echo "\n";
+--EXPECT--
+UTF-32LE:
+Length: 12
+68000000e40000006c0000006c000000f60000002000000077000000f6000000720000006c000000640000000a000000
+UCS-2LE:
+Length: 12
+6800e4006c006c00f60020007700f60072006c0064000a00
+
diff --git a/ext/mbstring/tests/bug60306.phpt b/ext/mbstring/tests/bug60306.phpt
new file mode 100644
index 0000000..f7969e1
--- /dev/null
+++ b/ext/mbstring/tests/bug60306.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Bug #60306 (Characters lost while converting from cp936 to utf8)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+$s = "羇篁";
+var_dump($s === mb_convert_encoding(mb_convert_encoding($s, "cp936", "utf8"), "utf8", "cp936"));
+?>
+--EXPECT--
+bool(true)
diff --git a/ext/mbstring/tests/bug63447_001.phpt b/ext/mbstring/tests/bug63447_001.phpt
new file mode 100644
index 0000000..5130299
--- /dev/null
+++ b/ext/mbstring/tests/bug63447_001.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #63447 (max_input_vars doesn't filter variables when mbstring.encoding_translation = On)
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+?>
+--INI--
+max_input_nesting_level=10
+max_input_vars=5
+mbstring.encoding_translation=1
+--POST--
+a=1&b=2&c=3&d=4&e=5&f=6
+--FILE--
+<?php
+var_dump($_POST);
+?>
+--EXPECT--
+Warning: Unknown: Input variables exceeded 5. To increase the limit change max_input_vars in php.ini. in Unknown on line 0
+array(0) {
+}
diff --git a/ext/mbstring/tests/bug63447_002.phpt b/ext/mbstring/tests/bug63447_002.phpt
new file mode 100644
index 0000000..e51089b
--- /dev/null
+++ b/ext/mbstring/tests/bug63447_002.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #63447 (max_input_vars doesn't filter variables when mbstring.encoding_translation = On)
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+?>
+--INI--
+max_input_nesting_level=10
+max_input_vars=4
+mbstring.encoding_translation=1
+--POST--
+a=1&b=2&c=3&d=4&e=5
+--FILE--
+<?php
+var_dump($_POST);
+?>
+--EXPECT--
+Warning: Unknown: Input variables exceeded 4. To increase the limit change max_input_vars in php.ini. in Unknown on line 0
+array(0) {
+}
diff --git a/ext/mbstring/tests/bug63447_003.phpt b/ext/mbstring/tests/bug63447_003.phpt
new file mode 100644
index 0000000..a4a7e14
--- /dev/null
+++ b/ext/mbstring/tests/bug63447_003.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Bug #63447 (max_input_vars doesn't filter variables when mbstring.encoding_translation = On)
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+?>
+--INI--
+max_input_nesting_level=5
+max_input_vars=100
+mbstring.encoding_translation=1
+--POST--
+a=1&b[][][]=2&c[][][][][][]=7
+--FILE--
+<?php
+print_r($_POST);
+?>
+--EXPECT--
+Array
+(
+ [a] => 1
+ [b] => Array
+ (
+ [0] => Array
+ (
+ [0] => Array
+ (
+ [0] => 2
+ )
+
+ )
+
+ )
+
+)
diff --git a/ext/mbstring/tests/casefold.phpt b/ext/mbstring/tests/casefold.phpt
new file mode 100644
index 0000000..977b0bb
--- /dev/null
+++ b/ext/mbstring/tests/casefold.phpt
@@ -0,0 +1,24 @@
+--TEST--
+mb_strtoupper() / mb_strtolower()
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+function_exists('mb_strtolower') and
+function_exists('mb_convert_case' ) or die("skip mb_convert_case() is not available");
+?>
+--INI--
+output_handler=
+--FILE--
+<?php
+ mb_internal_encoding( 'ISO-8859-1' );
+ print mb_strtolower( "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" );
+ print mb_strtoupper( mb_strtolower( "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" ) );
+ print mb_strtoupper( "粳\n" );
+ print mb_convert_case( "粳\n", MB_CASE_TITLE );
+?>
+
+--EXPECT--
+abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+痛
+帝
diff --git a/ext/mbstring/tests/common.inc b/ext/mbstring/tests/common.inc
new file mode 100644
index 0000000..1df6341
--- /dev/null
+++ b/ext/mbstring/tests/common.inc
@@ -0,0 +1,55 @@
+<?php
+/*
+ * Common definition and Settings
+ */
+
+// Custom Error Hanlder for testing
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ global $debug;
+
+ $err_type = array (
+ 1 => "Error", // E_ERROR
+ 2 => "Warning", // E_WARINING
+ 4 => "Parsing Error", // E_PARSE
+ 8 => "Notice", // E_NOTICE
+ 16 => "Core Error", // E_CORE_ERROR
+ 32 => "Core Warning", // E_CORE_WARNING
+ 64 => "Compile Error", // E_COMPILE_ERROR
+ 128 => "Compile Warning", // E_COMPILE_WARNING
+ 256 => "User Error", // E_USER_ERROR
+ 512 => "User Warning", // E_USER_WARMING
+ 1024=> "User Notice", // E_USER_NOTICE
+ 2048=> "Strict Notice", // E_STRICT
+ 4096=> "Catchable fatal error", // E_RECOVERABLE_ERROR
+ );
+
+ if (!empty($debug)) {
+ printf("%s: %s (%d)\n", $err_type[$err_no], $err_msg, $linenum);
+ }
+ else {
+ printf("ERR: %s\n",$err_type[$err_no]);
+ }
+}
+
+set_error_handler('test_error_handler');
+
+
+// Var def for testing
+$t_ary = array(
+ 's1' => '日本語EUC-JPの文字列',
+ 's2' => 'English Text'
+ );
+
+class tc
+{
+ public $s1 = '日本語EUC-JPの文字列';
+ public $s2 = 'English Text';
+
+ function tc()
+ {
+ }
+}
+
+$t_obj = new tc;
+
+?>
diff --git a/ext/mbstring/tests/empty_pattern.phpt b/ext/mbstring/tests/empty_pattern.phpt
new file mode 100644
index 0000000..10b0330
--- /dev/null
+++ b/ext/mbstring/tests/empty_pattern.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Check for empty pattern
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+
+mb_ereg_search_init("","","");
+mb_split("","");
+mb_ereg_search_regs();
+
+?>
+--EXPECTF--
+Warning: mb_ereg_search_init(): Empty pattern in %s on line %d
+
+Warning: mb_ereg_search_regs(): No regex given in %s on line %d
diff --git a/ext/mbstring/tests/htmlent.phpt b/ext/mbstring/tests/htmlent.phpt
new file mode 100644
index 0000000..5af96c7
--- /dev/null
+++ b/ext/mbstring/tests/htmlent.phpt
@@ -0,0 +1,42 @@
+--TEST--
+HTML input/output
+--SKIPIF--
+<?php
+ ini_set('include_path', dirname(__FILE__));
+ extension_loaded('mbstring') or die('skip mbstring not available');
+?>
+--INI--
+output_buffering=4096
+output_handler=mb_output_handler
+zlib.output_compression=
+arg_separator.input=x
+error_reporting=0
+mbstring.http_input=HTML-ENTITIES
+mbstring.internal_encoding=UTF-8
+mbstring.http_output=HTML-ENTITIES
+mbstring.encoding_translation=1
+filter.default=unsafe_raw
+--FILE--
+<?php
+// enable output encoding through output handler
+//ob_start("mb_output_handler");
+// &#64... are must be decoded on input these are not reencoded on output.
+// If you see &#64;&#65;&#66; on output this means input encoding fails.
+// If you do not see &auml;... on output this means output encoding fails.
+// Using UTF-8 internally allows to encode/decode ALL characters.
+// &128... will stay as they are since their character codes are above 127
+// and they do not have a named entity representaion.
+?>
+<?php echo mb_http_input('l').'>'.mb_internal_encoding().'>'.mb_http_output();?>
+
+<?php mb_parse_str("test=&#38;&#64;&#65;&#66;&#128;&#129;&#130;&auml;&ouml;&uuml;&euro;&lang;&rang;", $test);
+print_r($test);
+?>
+===DONE===
+--EXPECT--
+HTML-ENTITIES>UTF-8>HTML-ENTITIES
+Array
+(
+ [test] => &@AB&#128;&#129;&#130;&auml;&ouml;&uuml;&euro;&lang;&rang;
+)
+===DONE===
diff --git a/ext/mbstring/tests/illformed_utf_sequences.phpt b/ext/mbstring/tests/illformed_utf_sequences.phpt
new file mode 100644
index 0000000..b5b9d94
--- /dev/null
+++ b/ext/mbstring/tests/illformed_utf_sequences.phpt
@@ -0,0 +1,217 @@
+--TEST--
+Unicode standard conformance test (ill-formed UTF sequences.)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+function chk_enc($str, $n, $enc = "UTF-8", $with_bom = false) {
+ $src = bin2hex(mb_convert_encoding($str, "UCS-4BE", $enc));
+ $dst = str_repeat("0000fffd", $n);
+ if ($with_bom) {
+ $dst = "0000feff" . $dst;
+ }
+ if ($dst == $src) {
+ return false;
+ } else {
+ return $src;
+ }
+}
+
+mb_substitute_character(0xfffd);
+
+
+echo "UTF-8 redundancy\n";
+var_dump(chk_enc("\x31\x32\x33", 0));
+var_dump(chk_enc("\x41\x42\x43", 0));
+var_dump(chk_enc("\xc0\xb1\xc0\xb2\xc0\xb3", 6));
+var_dump(chk_enc("\xc1\x81\xc1\x82\xc1\x83", 6));
+var_dump(chk_enc("\xe0\x80\xb1\xe0\x80\xb2\xe0\x80\xb3", 6));
+var_dump(chk_enc("\xe0\x81\x81\xe0\x81\x82\xe0\x81\x83", 6));
+var_dump(chk_enc("\xf0\x80\x80\xb1\xf0\x80\x80\xb2\xf0\x80\x80\xb3", 9));
+var_dump(chk_enc("\xf0\x80\x81\x81\xf0\x80\x81\x82\xf0\x81\x83", 8));
+var_dump(chk_enc("\xf8\x80\x80\x80\xb1\xf8\x80\x80\x80\xb2\xf8\x80\x80\x80\xb3", 15));
+var_dump(chk_enc("\xf8\x80\x80\x81\x81\xf8\x80\x80\x81\x82\xf8\x80\x80\x81\x83", 15));
+var_dump(chk_enc("\xfc\x80\x80\x80\x80\xb1\xfc\x80\x80\x80\x80\xb2\xfc\x80\x80\x80\x80\xb3", 18));
+var_dump(chk_enc("\xfc\x80\x80\x80\x81\x81\xfc\x80\x80\x80\x81\x82\xfc\x80\x80\x80\x81\x83", 18));
+
+var_dump(chk_enc("\xc2\xa2\xc2\xa3\xc2\xa5", 0));
+var_dump(chk_enc("\xe0\x82\xa2\xe0\x82\xa3\xe0\x82\xa5", 6));
+var_dump(chk_enc("\xf0\x80\x82\xa2\xf0\x80\x82\xa3\xf0\x80\x82\xa5", 9));
+var_dump(chk_enc("\xf8\x80\x80\x82\xa2\xf8\x80\x80\x82\xa3\xf8\x80\x80\x82\xa5", 15));
+var_dump(chk_enc("\xfc\x80\x80\x80\x82\xa2\xfc\x80\x80\x80\x82\xa3\xfc\x80\x80\x80\x82\xa5", 18));
+
+var_dump(chk_enc("\xc1\xbf", 2));
+var_dump(chk_enc("\xc2\x80", 0));
+var_dump(chk_enc("\xdf\xbf", 0));
+var_dump(chk_enc("\xe0\x9f\xff", 2));
+var_dump(chk_enc("\xe0\xa0\x80", 2));
+var_dump(chk_enc("\xef\xbf\xbf", 0));
+var_dump(chk_enc("\xf0\x8f\xbf\xbf", 3));
+var_dump(chk_enc("\xf0\x90\x80\x80", 0));
+var_dump(chk_enc("\xf7\xbf\xbf\xbf", 4));
+var_dump(chk_enc("\xf8\x87\xbf\xbf\xbf", 5));
+var_dump(chk_enc("\xf8\x88\x80\x80\x80", 5));
+var_dump(chk_enc("\xfb\xbf\xbf\xbf\xbf", 5));
+var_dump(chk_enc("\xfc\x83\xbf\xbf\xbf\xbf", 6));
+var_dump(chk_enc("\xfc\x84\x80\x80\x80\x80", 6));
+var_dump(chk_enc("\xfd\xaf\xbf\xbf\xbf\xbf", 6));
+var_dump(chk_enc("\xfd\xbf\xbf\xbf\xbf\xbf", 6));
+
+echo "UTF-8 and surrogates area\n";
+$out = '';
+$cnt = 0;
+for ($i = 0xd7ff; $i <= 0xe000; ++$i) {
+ $s = chk_enc(pack('C3', 0xe0 | ($i >> 12), 0x80 | ($i >> 6) & 0x3f, 0x80 | $i & 0x3f), 2);
+ if ($s === false) {
+ $cnt++;
+ } else {
+ $out .= $s;
+ }
+}
+var_dump($cnt);
+var_dump($out);
+
+echo "UTF-32 code range\n";
+var_dump(chk_enc("\x00\x11\x00\x00", 1, "UTF-32BE"));
+var_dump(chk_enc("\x00\x10\xff\xff", 0, "UTF-32BE"));
+var_dump(chk_enc("\x00\x00\x11\x00", 1, "UTF-32LE"));
+var_dump(chk_enc("\xff\xff\x10\x00", 0, "UTF-32LE"));
+var_dump(chk_enc("\x00\x11\x00\x00", 1, "UTF-32"));
+var_dump(chk_enc("\x00\x10\xff\xff", 0, "UTF-32"));
+var_dump(chk_enc("\x00\x00\xfe\xff\x00\x11\x00\x00", 0, "UTF-32"));
+var_dump(chk_enc("\x00\x00\xfe\xff\x00\x10\xff\xff", 0, "UTF-32"));
+var_dump(chk_enc("\xff\xfe\x00\x00\x00\x00\x11\x00", 0, "UTF-32"));
+var_dump(chk_enc("\xff\xfe\x00\x00\xff\xff\x10\x00", 0, "UTF-32"));
+
+echo "UTF-32 and surrogates area\n";
+$out = '';
+$cnt = 0;
+for ($i = 0xd7ff; $i <= 0xe000; ++$i) {
+ $s = chk_enc(pack('C4', $i >> 24, ($i >> 16) & 0xff, ($i >> 8) & 0xff, $i & 0xff), 1, "UTF-32BE");
+ if ($s === false) {
+ $cnt++;
+ } else {
+ $out .= $s;
+ }
+}
+var_dump($cnt);
+var_dump($out);
+
+$out = '';
+$cnt = 0;
+for ($i = 0xd7ff; $i <= 0xe000; ++$i) {
+ $s = chk_enc(pack('C4', $i & 0xff, ($i >> 8) & 0xff, ($i >> 16) & 0xff, ($i >> 24) & 0xff), 1, "UTF-32LE");
+ if ($s === false) {
+ $cnt++;
+ } else {
+ $out .= $s;
+ }
+}
+var_dump($cnt);
+var_dump($out);
+
+$out = '';
+$cnt = 0;
+for ($i = 0xd7ff; $i <= 0xe000; ++$i) {
+ $s = chk_enc(pack('C4', $i >> 24, ($i >> 16) & 0xff, ($i >> 8) & 0xff, $i & 0xff), 1, "UTF-32");
+ if ($s === false) {
+ $cnt++;
+ } else {
+ $out .= $s;
+ }
+}
+var_dump($cnt);
+var_dump($out);
+
+echo "UTF-32 and surrogates area with BOM\n";
+
+$out = '';
+$cnt = 0;
+for ($i = 0xd7ff; $i <= 0xe000; ++$i) {
+ $s = chk_enc("\x00\x00\xfe\xff". pack('C4', $i >> 24, ($i >> 16) & 0xff, ($i >> 8) & 0xff, $i & 0xff),
+ 1, "UTF-32", true);
+ if ($s === false) {
+ $cnt++;
+ } else {
+ $out .= $s;
+ }
+}
+var_dump($cnt);
+var_dump(str_replace("0000feff","",$out));
+
+$out = '';
+$cnt = 0;
+for ($i = 0xd7ff; $i <= 0xe000; ++$i) {
+ $s = chk_enc("\xff\xfe\x00\x00". pack('C4', $i & 0xff, ($i >> 8) & 0xff, ($i >> 16) & 0xff, ($i >> 24) & 0xff),
+ 1, "UTF-32", true);
+ if ($s === false) {
+ $cnt++;
+ } else {
+ $out .= $s;
+ }
+}
+var_dump($cnt);
+var_dump(str_replace("0000feff","",$out));
+
+?>
+--EXPECT--
+UTF-8 redundancy
+string(24) "000000310000003200000033"
+string(24) "000000410000004200000043"
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+string(24) "000000a2000000a3000000a5"
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+string(8) "00000080"
+string(8) "000007ff"
+bool(false)
+string(8) "00000800"
+string(8) "0000ffff"
+bool(false)
+string(8) "00010000"
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+UTF-8 and surrogates area
+int(2048)
+string(16) "0000d7ff0000e000"
+UTF-32 code range
+bool(false)
+string(8) "0010ffff"
+bool(false)
+string(8) "0010ffff"
+bool(false)
+string(8) "0010ffff"
+string(16) "0000feff0000fffd"
+string(16) "0000feff0010ffff"
+string(16) "0000feff0000fffd"
+string(16) "0000feff0010ffff"
+UTF-32 and surrogates area
+int(2048)
+string(16) "0000d7ff0000e000"
+int(2048)
+string(16) "0000d7ff0000e000"
+int(2048)
+string(16) "0000d7ff0000e000"
+UTF-32 and surrogates area with BOM
+int(2048)
+string(16) "0000d7ff0000e000"
+int(2048)
+string(16) "0000d7ff0000e000"
diff --git a/ext/mbstring/tests/ini_language.phpt b/ext/mbstring/tests/ini_language.phpt
new file mode 100644
index 0000000..1dc9414
--- /dev/null
+++ b/ext/mbstring/tests/ini_language.phpt
@@ -0,0 +1,15 @@
+--TEST--
+mbstring.language bug
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=Shift_JIS
+mbstring.language=Japanese
+--FILE--
+<?php
+var_dump(ini_get('mbstring.internal_encoding'));
+var_dump(mb_internal_encoding());
+?>
+--EXPECT--
+string(9) "Shift_JIS"
+string(4) "SJIS"
diff --git a/ext/mbstring/tests/mb_convert_encoding.phpt b/ext/mbstring/tests/mb_convert_encoding.phpt
new file mode 100644
index 0000000..1bc7c86
--- /dev/null
+++ b/ext/mbstring/tests/mb_convert_encoding.phpt
@@ -0,0 +1,138 @@
+--TEST--
+mb_convert_encoding()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+output_handler=
+mbstring.language=Japanese
+--FILE--
+<?php
+// TODO: Add more tests
+//$debug = true; // Uncomment this line to view error/warning/notice message in *.out file
+ini_set('include_path', dirname(__FILE__));
+include_once('common.inc');
+
+// SJIS string (BASE64 encoded)
+$sjis = base64_decode('k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==');
+// JIS string (BASE64 encoded)
+$jis = base64_decode('GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==');
+// EUC-JP string
+$euc_jp = '日本語テキストです。0123456789。';
+
+// Test with sigle "form encoding"
+// Note: For some reason it complains, results are differ. Not reserched.
+echo "== BASIC TEST ==\n";
+$s = $sjis;
+$s = mb_convert_encoding($s, 'EUC-JP', 'SJIS');
+print("EUC-JP: $s\n"); // EUC-JP
+
+$s = $jis;
+$s = mb_convert_encoding($s, 'EUC-JP', 'JIS');
+print("EUC-JP: $s\n"); // EUC-JP
+
+$s = $euc_jp;
+$s = mb_convert_encoding($s, 'SJIS', 'EUC-JP');
+print("SJIS: ".base64_encode($s)."\n"); // SJIS
+
+$s = $euc_jp;
+$s = mb_convert_encoding($s, 'JIS', 'EUC-JP');
+print("JIS: ".base64_encode($s)."\n"); // JIS
+
+
+// Using Encoding List Array
+echo "== STRING ENCODING LIST ==\n";
+
+$a = 'JIS,UTF-8,EUC-JP,SJIS';
+$s = $jis;
+$s = mb_convert_encoding($s, 'EUC-JP', $a);
+print("EUC-JP: $s\n"); // EUC-JP
+
+$s = $euc_jp;
+$s = mb_convert_encoding($s, 'SJIS', $a);
+print("SJIS: ".base64_encode($s)."\n"); // SJIS
+
+$s = $euc_jp;
+$s = mb_convert_encoding($s, 'JIS', $a);
+print("JIS: ".base64_encode($s)."\n"); // JIS
+
+
+// Using Encoding List Array
+echo "== ARRAY ENCODING LIST ==\n";
+
+$a = array(0=>'JIS', 1=>'UTF-8', 2=>'EUC-JP', 3=>'SJIS');
+$s = $jis;
+$s = mb_convert_encoding($s, 'EUC-JP', $a);
+print("EUC-JP: $s\n"); // EUC-JP
+
+$s = $euc_jp;
+$s = mb_convert_encoding($s, 'SJIS', $a);
+print("SJIS: ".base64_encode($s)."\n"); // SJIS
+
+$s = $euc_jp;
+$s = mb_convert_encoding($s, 'JIS', $a);
+print("JIS: ".base64_encode($s)."\n"); // JIS
+
+
+// Using Detect Order
+echo "== DETECT ORDER ==\n";
+
+$s = $jis;
+$s = mb_convert_encoding($s, 'EUC-JP', 'auto');
+print("EUC-JP: $s\n"); // EUC-JP
+
+$s = $euc_jp;
+$s = mb_convert_encoding($s, 'SJIS', 'auto');
+print("SJIS: ".base64_encode($s)."\n"); // SJIS
+
+$s = $euc_jp;
+$s = mb_convert_encoding($s, 'JIS', 'auto');
+print("JIS: ".base64_encode($s)."\n"); // JIS
+
+
+// Invalid(?) Parameters
+echo "== INVALID PARAMETER ==\n";
+
+$s = mb_convert_encoding(1234, 'EUC-JP');
+print("INT: $s\n"); // EUC-JP
+
+$s = mb_convert_encoding('', 'EUC-JP');
+print("EUC-JP: $s\n"); // SJIS
+
+$s = $euc_jp;
+$s = mb_convert_encoding($s, 'BAD');
+print("BAD: $s\n"); // BAD
+
+$s = $euc_jp;
+$s = mb_convert_encoding($s);
+print("MP: $s\n"); // Missing parameter
+
+
+?>
+
+--EXPECT--
+== BASIC TEST ==
+EUC-JP: 日本語テキストです。0123456789。
+EUC-JP: 日本語テキストです。0123456789。
+SJIS: k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==
+JIS: GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==
+== STRING ENCODING LIST ==
+EUC-JP: 日本語テキストです。0123456789。
+SJIS: k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==
+JIS: GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==
+== ARRAY ENCODING LIST ==
+EUC-JP: 日本語テキストです。0123456789。
+SJIS: k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==
+JIS: GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==
+== DETECT ORDER ==
+EUC-JP: 日本語テキストです。0123456789。
+SJIS: k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==
+JIS: GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==
+== INVALID PARAMETER ==
+INT: 1234
+EUC-JP:
+ERR: Warning
+BAD:
+ERR: Warning
+MP:
+
+
diff --git a/ext/mbstring/tests/mb_convert_encoding_basic.phpt b/ext/mbstring/tests/mb_convert_encoding_basic.phpt
new file mode 100644
index 0000000..0060a71
--- /dev/null
+++ b/ext/mbstring/tests/mb_convert_encoding_basic.phpt
@@ -0,0 +1,95 @@
+--TEST--
+Test mb_convert_encoding() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_convert_encoding') or die("skip mb_convert_encoding() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_convert_encoding(string $str, string $to_encoding [, mixed $from_encoding])
+ * Description: Returns converted string in desired encoding
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test basic functionality of mb_convert_encoding()
+ */
+
+echo "*** Testing mb_convert_encoding() : basic functionality ***\n";
+
+//All strings are the same when displayed in their respective encodings
+$sjis_string = base64_decode('k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==');
+$jis_string = base64_decode('GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==');
+$euc_jp_string = base64_decode('xvzL3LjspcalraW5pcikx6S5oaMwMTIzNKO1o7ajt6O4o7mhow==');
+$utf8_string = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+echo "\n-- Convert to JIS --\n";
+echo "JIS encoded string in base64:\n";
+var_dump(base64_encode($jis_string));
+echo "Converted Strings:\n";
+var_dump(base64_encode(mb_convert_encoding($sjis_string, 'JIS', 'SJIS')));
+var_dump(base64_encode(mb_convert_encoding($euc_jp_string, 'JIS', 'EUC-JP')));
+var_dump(base64_encode(mb_convert_encoding($utf8_string, 'JIS', 'UTF-8')));
+
+echo "\n-- Convert to EUC-JP --\n";
+echo "EUC-JP encoded string in base64:\n";
+var_dump(base64_encode($euc_jp_string));
+echo "Converted Strings:\n";
+var_dump(base64_encode(mb_convert_encoding($sjis_string, 'EUC-JP', 'SJIS')));
+var_dump(base64_encode(mb_convert_encoding($jis_string, 'EUC-JP', 'JIS')));
+var_dump(base64_encode(mb_convert_encoding($utf8_string, 'EUC-JP', 'UTF-8')));
+
+echo "\n-- Convert to SJIS --\n";
+echo "SJIS encoded string in base64:\n";
+var_dump(base64_encode($sjis_string));
+echo "Converted Strings:\n";
+var_dump(base64_encode(mb_convert_encoding($jis_string, 'SJIS', 'JIS')));
+var_dump(base64_encode(mb_convert_encoding($euc_jp_string, 'SJIS', 'EUC-JP')));
+var_dump(base64_encode(mb_convert_encoding($utf8_string, 'SJIS', 'UTF-8')));
+
+echo "\n-- Convert to UTF-8 --\n";
+echo "UTF-8 encoded string in base64:\n";
+var_dump(base64_encode($utf8_string));
+echo "Converted Strings:\n";
+var_dump(base64_encode(mb_convert_encoding($sjis_string, 'UTF-8', 'SJIS')));
+var_dump(base64_encode(mb_convert_encoding($jis_string, 'UTF-8', 'JIS')));
+var_dump(base64_encode(mb_convert_encoding($euc_jp_string, 'UTF-8', 'EUC-JP')));
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_convert_encoding() : basic functionality ***
+
+-- Convert to JIS --
+JIS encoded string in base64:
+string(68) "GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg=="
+Converted Strings:
+string(68) "GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg=="
+string(68) "GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg=="
+string(68) "GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg=="
+
+-- Convert to EUC-JP --
+EUC-JP encoded string in base64:
+string(52) "xvzL3LjspcalraW5pcikx6S5oaMwMTIzNKO1o7ajt6O4o7mhow=="
+Converted Strings:
+string(52) "xvzL3LjspcalraW5pcikx6S5oaMwMTIzNKO1o7ajt6O4o7mhow=="
+string(52) "xvzL3LjspcalraW5pcikx6S5oaMwMTIzNKO1o7ajt6O4o7mhow=="
+string(52) "xvzL3LjspcalraW5pcikx6S5oaMwMTIzNKO1o7ajt6O4o7mhow=="
+
+-- Convert to SJIS --
+SJIS encoded string in base64:
+string(52) "k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg=="
+Converted Strings:
+string(52) "k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg=="
+string(52) "k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg=="
+string(52) "k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg=="
+
+-- Convert to UTF-8 --
+UTF-8 encoded string in base64:
+string(72) "5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
+Converted Strings:
+string(72) "5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
+string(72) "5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
+string(72) "5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
+Done
diff --git a/ext/mbstring/tests/mb_convert_encoding_stateful.phpt b/ext/mbstring/tests/mb_convert_encoding_stateful.phpt
new file mode 100644
index 0000000..a8c1e39
--- /dev/null
+++ b/ext/mbstring/tests/mb_convert_encoding_stateful.phpt
@@ -0,0 +1,37 @@
+--TEST--
+mb_convert_encoding() with stateful encodings
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+output_handler=
+mbstring.language=Japanese
+--FILE--
+<?php
+echo "ISO-2022-JP empty segment\n";
+echo bin2hex(mb_convert_encoding(pack("H*", "1b24401b24402121"), "UTF-8", "ISO-2022-JP")), "\n";
+echo bin2hex(mb_convert_encoding(pack("H*", "1b24421b24422121"), "UTF-8", "ISO-2022-JP")), "\n";
+echo bin2hex(mb_convert_encoding(pack("H*", "1b28421b284261626364"), "UTF-8", "ISO-2022-JP")), "\n";
+echo bin2hex(mb_convert_encoding(pack("H*", "1b284a1b284a61626364"), "UTF-8", "ISO-2022-JP")), "\n";
+echo bin2hex(mb_convert_encoding(pack("H*", "1b24401b284261626364"), "UTF-8", "ISO-2022-JP")), "\n";
+echo bin2hex(mb_convert_encoding(pack("H*", "1b24401b284a61626364"), "UTF-8", "ISO-2022-JP")), "\n";
+echo bin2hex(mb_convert_encoding(pack("H*", "1b24421b284261626364"), "UTF-8", "ISO-2022-JP")), "\n";
+echo bin2hex(mb_convert_encoding(pack("H*", "1b24421b284a61626364"), "UTF-8", "ISO-2022-JP")), "\n";
+echo "ISO-2022-KR empty segment\n";
+echo bin2hex(mb_convert_encoding(pack("H*", "1b2429430e0f61626364"), "UTF-8", "ISO-2022-KR")), "\n";
+echo "HZ empty segment\n";
+echo bin2hex(mb_convert_encoding(pack("H*", "7e7b7e7d61626364"), "UTF-8", "HZ")), "\n";
+?>
+--EXPECT--
+ISO-2022-JP empty segment
+e38080
+e38080
+61626364
+61626364
+61626364
+61626364
+61626364
+61626364
+ISO-2022-KR empty segment
+61626364
+HZ empty segment
+61626364
diff --git a/ext/mbstring/tests/mb_convert_encoding_variation1.phpt b/ext/mbstring/tests/mb_convert_encoding_variation1.phpt
new file mode 100644
index 0000000..e3f1c83
--- /dev/null
+++ b/ext/mbstring/tests/mb_convert_encoding_variation1.phpt
@@ -0,0 +1,207 @@
+--TEST--
+Test mb_convert_encoding() function : usage variations - pass different data types as $to_encoding arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_convert_encoding') or die("skip mb_convert_encoding() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_convert_encoding(string $str, string $to_encoding [, mixed $from_encoding])
+ * Description: Returns converted string in desired encoding
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+
+/*
+ * Pass different data types to $to_encoding arg to test behaviour of mb_convert_encoding
+ */
+
+echo "*** Testing mb_convert_encoding() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+mb_internal_encoding('utf-8');
+$sourcestring = b'hello, world';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $to_encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behaviour of mb_convert_encoding()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump(bin2hex( mb_convert_encoding($sourcestring, $input, 'ISO-8859-1') ));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_convert_encoding() : usage variations ***
+
+-- Iteration 1 --
+
+Warning: mb_convert_encoding(): Unknown encoding "0" in %s on line %d
+string(0) ""
+
+-- Iteration 2 --
+
+Warning: mb_convert_encoding(): Unknown encoding "1" in %s on line %d
+string(0) ""
+
+-- Iteration 3 --
+
+Warning: mb_convert_encoding(): Unknown encoding "12345" in %s on line %d
+string(0) ""
+
+-- Iteration 4 --
+
+Warning: mb_convert_encoding(): Unknown encoding "-2345" in %s on line %d
+string(0) ""
+
+-- Iteration 5 --
+
+Warning: mb_convert_encoding(): Unknown encoding "10.5" in %s on line %d
+string(0) ""
+
+-- Iteration 6 --
+
+Warning: mb_convert_encoding(): Unknown encoding "-10.5" in %s on line %d
+string(0) ""
+
+-- Iteration 7 --
+
+Warning: mb_convert_encoding(): Unknown encoding "123456789000" in %s on line %d
+string(0) ""
+
+-- Iteration 8 --
+
+Warning: mb_convert_encoding(): Unknown encoding "1.23456789E-9" in %s on line %d
+string(0) ""
+
+-- Iteration 9 --
+
+Warning: mb_convert_encoding(): Unknown encoding "0.5" in %s on line %d
+string(0) ""
+
+-- Iteration 10 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 11 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 12 --
+
+Warning: mb_convert_encoding(): Unknown encoding "1" in %s on line %d
+string(0) ""
+
+-- Iteration 13 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 14 --
+
+Warning: mb_convert_encoding(): Unknown encoding "1" in %s on line %d
+string(0) ""
+
+-- Iteration 15 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 16 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 17 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 18 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 19 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 20 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 21 --
+
+Warning: mb_convert_encoding(): Unknown encoding "Class A object" in %s on line %d
+string(0) ""
+
+-- Iteration 22 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 23 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 24 --
+
+Warning: mb_convert_encoding() expects parameter 2 to be string, resource given in %s on line %d
+string(0) ""
+Done
+
diff --git a/ext/mbstring/tests/mb_convert_kana.phpt b/ext/mbstring/tests/mb_convert_kana.phpt
new file mode 100644
index 0000000..b3bffb6
--- /dev/null
+++ b/ext/mbstring/tests/mb_convert_kana.phpt
@@ -0,0 +1,60 @@
+--TEST--
+Testing mb_convert_kana() function
+--SKIPIF--
+<?php
+if (!extension_loaded('mbstring')) die('skip mbstring not enabled');
+if (!function_exists("mb_convert_kana")) print "skip mb_convert_kana() not available";
+?>
+--FILE--
+<?php
+$zenKakuA = '<≪cゃャс';
+$zenKakuB = '違宴蚊潟眼泣吟激吾鴻冴祉若純障';
+$zenKakuC = '';
+$zenKakuD = '';
+$zenKakuE = '<≪cゃャс';
+$zenKakuF = '違宴蚊潟眼泣吟激吾鴻冴祉若純';
+
+$hanKakuA = '鐔鐔¥就鐔o修鐔ワ拾鐔э秀鐔鐔鐔鐔鐔鐔鐔';
+$hanKakuB = '鐔逸襲鐔駕蹴鐔器週鐔駈酬鐔醐醜鐔削住鐔種十鐔常戎';
+$hanKakuC = '鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓';
+$hanKakuD = '鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓';
+
+
+echo $zenKakuA . ' => ' . mb_convert_kana($zenKakuA, 'AZKH', 'utf-8');
+echo "\n";
+echo $zenKakuB . ' => ' . mb_convert_kana($zenKakuB, 'azkh', 'utf-8');
+echo "\n";
+echo $zenKakuC . ' => ' . mb_convert_kana($zenKakuC, 'azkh', 'utf-8');
+echo "\n";
+echo $zenKakuD . ' => ' . mb_convert_kana($zenKakuD, 'azkh', 'utf-8');
+echo "\n";
+echo $zenKakuE . ' => ' . mb_convert_kana($zenKakuE, 'azkh', 'utf-8');
+echo "\n";
+echo $zenKakuF . ' => ' . mb_convert_kana($zenKakuF, 'azkh', 'utf-8');
+echo "\n";
+echo "\n";
+echo $hanKakuA . ' => ' . mb_convert_kana($hanKakuA, 'AZKH', 'utf-8');
+echo "\n";
+echo $hanKakuB . ' => ' . mb_convert_kana($hanKakuB, 'AZKH', 'utf-8');
+echo "\n";
+echo $hanKakuC . ' => ' . mb_convert_kana($hanKakuC, 'AZKH', 'utf-8');
+echo "\n";
+echo $hanKakuD . ' => ' . mb_convert_kana($hanKakuD, 'AZKH', 'utf-8');
+?>
+--EXPECT--
+<≪cゃャс => <≪cゃャс
+違宴蚊潟眼泣吟激吾鴻冴祉若純障 => 鐔醐鐔刻醜鐓鐔削什鐓鐔誌住鐓鐔種充鐓鐔緒十鐓鐔常従鐓鐔随戎鐓鐓
+ => 鐓鐓鐓鐓鐓鐔鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓
+ => 鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓
+<≪cゃャс => 鐓鐓鐓鐔鐓鐔鐓鐔鐓鐓鐓鐓鐓鐓鐓鐓
+違宴蚊潟眼泣吟激吾鴻冴祉若純 => 鐔駕輯鐔鐓鐔鰹泣吟激吾鴻削愁鐔違純
+
+鐔鐔¥就鐔o修鐔ワ拾鐔э秀鐔鐔鐔鐔鐔鐔鐔 => 鐔祉蚊<cャсcャс
+鐔逸襲鐔駕蹴鐔器週鐔駈酬鐔醐醜鐔削住鐔種十鐔常戎 => 若≪ゃ宴潟泣激鴻祉
+鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓 => 帥
+鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓鐓 => <≪ゃ潟
+
+--CREDITS--
+Jason Easter <easter@phpug-wuerzburg.de>
+PHPUG W端rzburg <phpug-wuerzburg.de>
+Testfest 2009 2009-06-20
diff --git a/ext/mbstring/tests/mb_convert_variables.phpt b/ext/mbstring/tests/mb_convert_variables.phpt
new file mode 100644
index 0000000..01ced05
--- /dev/null
+++ b/ext/mbstring/tests/mb_convert_variables.phpt
@@ -0,0 +1,164 @@
+--TEST--
+mb_convert_variables()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+output_handler=
+mbstring.language=Japanese
+--FILE--
+<?php
+// TODO: Add more tests
+//$debug = true; // Uncomment this line to view error/warning/notice message in *.out file
+ini_set('include_path', dirname(__FILE__));
+include_once('common.inc');
+
+// SJIS string (BASE64 encoded)
+$sjis = base64_decode('k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==');
+// JIS string (BASE64 encoded)
+$jis = base64_decode('GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==');
+// EUC-JP string
+$euc_jp = '日本語テキストです。0123456789。';
+
+// Test for single scaler
+echo "== SCALER TEST ==\n";
+$s = $sjis;
+$encoding = mb_convert_variables('EUC-JP', 'SJIS', $s);
+print("$encoding\n"); // SJIS
+print("$s\n"); // Converted to EUC-JP
+
+$s = $jis;
+$encoding = mb_convert_variables('EUC-JP', 'JIS', $s);
+print("$encoding\n"); // JIS
+print("$s\n"); // Converted to EUC-JP
+
+$s = $euc_jp;
+$encoding = mb_convert_variables('SJIS', 'EUC-JP', $s);
+print("$encoding\n"); // EUC-JP
+print(base64_encode($s)."\n"); // Converted to SJIS (base64 encoded)
+
+$s = $euc_jp;
+$encoding = mb_convert_variables('JIS', 'EUC-JP', $s);
+print("$encoding\n"); // EUC-JP
+print(base64_encode($s)."\n"); // Converted to JIS (base64 encoded)
+
+// Test for multiple slcaler
+$s1 = $euc_jp;
+$s2 = $euc_jp;
+$s3 = $euc_jp;
+$encoding = mb_convert_variables('EUC-JP', 'auto', $s1, $s2, $s3);
+print("$encoding\n"); // EUC-JP
+print("$s1$s2$s3\n"); // Converted to EUC-JP
+
+
+
+// Note: Mixing encoding in array/object is not supported?
+// Test for array
+echo "== ARRAY TEST ==\n";
+$a = array($s3, $s2, $s1);
+$aa = $a;
+$encoding = mb_convert_variables('EUC-JP', 'auto', $aa);
+print("$encoding\n"); // EUC-JP
+print("{$aa[0]}{$aa[1]}{$aa[2]}\n"); // Converted to EUC-JP
+
+$a = array($s1, $s2, $s3);
+$aa = $a;
+$encoding = mb_convert_variables('EUC-JP', 'auto', $aa);
+print("$encoding\n"); // EUC-JP
+print("{$aa[0]}{$aa[1]}{$aa[2]}\n"); // Converted to EUC-JP
+
+
+
+// Test for object
+echo "== OBJECT TEST ==\n";
+class foo
+{
+ public $s1;
+ public $s2;
+ public $s3;
+
+ function foo()
+ {
+ global $sjis, $jis, $euc_jp;
+
+ $this->s1 = $euc_jp;
+ $this->s2 = $euc_jp;
+ $this->s3 = $euc_jp;
+ }
+}
+
+class bar
+{
+ public $s1;
+ public $s2;
+ public $s3;
+
+ function bar()
+ {
+ global $sjis, $jis, $euc_jp;
+
+ $this->s1 = $euc_jp;
+ $this->s2 = $euc_jp;
+ $this->s3 = $euc_jp;
+ }
+}
+
+
+$o = new foo;
+$oo = $o;
+$encoding = mb_convert_variables('EUC-JP', 'auto', $oo);
+print("$encoding\n"); // EUC-JP
+print("{$oo->s1}{$oo->s2}{$oo->s3}\n"); // Converted to EUC-JP
+
+$o = new bar;
+$oo = $o;
+$encoding = mb_convert_variables('EUC-JP', 'auto', $oo);
+print("$encoding\n"); // EUC-JP
+print("{$oo->s1}{$oo->s2}{$oo->s3}\n"); // Converted to EUC-JP
+
+
+// Test for scaler, array and object
+echo "== SCALER, ARRAY AND OBJECT TEST ==\n";
+
+$s1 = $euc_jp;
+$s2 = $euc_jp;
+$s3 = $euc_jp;
+$aa = $a;
+$oo = $o;
+
+$encoding = mb_convert_variables('EUC-JP', 'auto', $s1, $s2, $s3, $aa, $oo);
+print("$encoding\n"); // EUC-JP
+print("$s1$s2$s3\n"); // Converted to EUC-JP
+print("{$aa[0]}{$aa[1]}{$aa[2]}\n"); // Converted to EUC-JP
+print("{$oo->s1}{$oo->s2}{$oo->s3}\n"); // Converted to EUC-JP
+
+
+?>
+
+--EXPECT--
+== SCALER TEST ==
+SJIS
+日本語テキストです。0123456789。
+JIS
+日本語テキストです。0123456789。
+EUC-JP
+k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==
+EUC-JP
+GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==
+EUC-JP
+日本語テキストです。0123456789。日本語テキストです。0123456789。日本語テキストです。0123456789。
+== ARRAY TEST ==
+EUC-JP
+日本語テキストです。0123456789。日本語テキストです。0123456789。日本語テキストです。0123456789。
+EUC-JP
+日本語テキストです。0123456789。日本語テキストです。0123456789。日本語テキストです。0123456789。
+== OBJECT TEST ==
+EUC-JP
+日本語テキストです。0123456789。日本語テキストです。0123456789。日本語テキストです。0123456789。
+EUC-JP
+日本語テキストです。0123456789。日本語テキストです。0123456789。日本語テキストです。0123456789。
+== SCALER, ARRAY AND OBJECT TEST ==
+EUC-JP
+日本語テキストです。0123456789。日本語テキストです。0123456789。日本語テキストです。0123456789。
+日本語テキストです。0123456789。日本語テキストです。0123456789。日本語テキストです。0123456789。
+日本語テキストです。0123456789。日本語テキストです。0123456789。日本語テキストです。0123456789。
+
diff --git a/ext/mbstring/tests/mb_decode_mimeheader_basic.phpt b/ext/mbstring/tests/mb_decode_mimeheader_basic.phpt
new file mode 100644
index 0000000..5374c31
--- /dev/null
+++ b/ext/mbstring/tests/mb_decode_mimeheader_basic.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_decode_mimeheader() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_decode_mimeheader') or die("skip mb_decode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_decode_mimeheader(string string)
+ * Description: Decodes the MIME "encoded-word" in the string
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_decode_mimeheader() : basic functionality ***\n";
+mb_internal_encoding('utf-8');
+
+//the following encoded-words are identical and are UTF-8 Japanese.
+$a = "=?UTF-8?b?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?=";
+$b = mb_decode_mimeheader($a);
+var_dump(bin2hex($b));
+
+$a = "=?UTF-8?Q?=E6=97=A5=E6=9C=AC=E8=AA=9E=E3=83=86=E3=82=AD=E3=82=B9=E3=83=88?=
+=?UTF-8?Q?=E3=81=A7=E3=81=99=E3=80=82?=";
+$b = mb_decode_mimeheader($a);
+var_dump(bin2hex($b));
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_decode_mimeheader() : basic functionality ***
+string(60) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e38082"
+string(60) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e38082"
+===DONE===
diff --git a/ext/mbstring/tests/mb_decode_mimeheader_error.phpt b/ext/mbstring/tests/mb_decode_mimeheader_error.phpt
new file mode 100644
index 0000000..c40cdbd
--- /dev/null
+++ b/ext/mbstring/tests/mb_decode_mimeheader_error.phpt
@@ -0,0 +1,42 @@
+--TEST--
+Test mb_decode_mimeheader() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_decode_mimeheader') or die("skip mb_decode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_decode_mimeheader(string string)
+ * Description: Decodes the MIME "encoded-word" in the string
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_decode_mimeheader() : error conditions ***\n";
+
+// Zero arguments
+echo "\n-- Testing mb_decode_mimeheader() function with Zero arguments --\n";
+var_dump( mb_decode_mimeheader() );
+
+//Test mb_decode_mimeheader with one more than the expected number of arguments
+echo "\n-- Testing mb_decode_mimeheader() function with more than expected no. of arguments --\n";
+$string = 'string_val';
+$extra_arg = 10;
+var_dump( mb_decode_mimeheader($string, $extra_arg) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_decode_mimeheader() : error conditions ***
+
+-- Testing mb_decode_mimeheader() function with Zero arguments --
+
+Warning: mb_decode_mimeheader() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+-- Testing mb_decode_mimeheader() function with more than expected no. of arguments --
+
+Warning: mb_decode_mimeheader() expects exactly 1 parameter, 2 given in %s on line %d
+NULL
+===DONE===
diff --git a/ext/mbstring/tests/mb_decode_mimeheader_variation1.phpt b/ext/mbstring/tests/mb_decode_mimeheader_variation1.phpt
new file mode 100644
index 0000000..e07ccad
--- /dev/null
+++ b/ext/mbstring/tests/mb_decode_mimeheader_variation1.phpt
@@ -0,0 +1,206 @@
+--TEST--
+Test mb_decode_mimeheader() function : usage variation
+--CREDITS--
+D. Kesley
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_decode_mimeheader') or die("skip mb_decode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_decode_mimeheader(string string)
+ * Description: Decodes the MIME "encoded-word" in the string
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_decode_mimeheader() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for string
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_decode_mimeheader($value) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_decode_mimeheader() : usage variation ***
+
+--int 0--
+string(1) "0"
+
+--int 1--
+string(1) "1"
+
+--int 12345--
+string(5) "12345"
+
+--int -12345--
+string(5) "-2345"
+
+--float 10.5--
+string(4) "10.5"
+
+--float -10.5--
+string(5) "-10.5"
+
+--float 12.3456789000e10--
+string(12) "123456789000"
+
+--float -12.3456789000e10--
+string(13) "-123456789000"
+
+--float .5--
+string(3) "0.5"
+
+--empty array--
+Error: 2 - mb_decode_mimeheader() expects parameter 1 to be string, array given, %s(%d)
+NULL
+
+--int indexed array--
+Error: 2 - mb_decode_mimeheader() expects parameter 1 to be string, array given, %s(%d)
+NULL
+
+--associative array--
+Error: 2 - mb_decode_mimeheader() expects parameter 1 to be string, array given, %s(%d)
+NULL
+
+--nested arrays--
+Error: 2 - mb_decode_mimeheader() expects parameter 1 to be string, array given, %s(%d)
+NULL
+
+--uppercase NULL--
+string(0) ""
+
+--lowercase null--
+string(0) ""
+
+--lowercase true--
+string(1) "1"
+
+--lowercase false--
+string(0) ""
+
+--uppercase TRUE--
+string(1) "1"
+
+--uppercase FALSE--
+string(0) ""
+
+--empty string DQ--
+string(0) ""
+
+--empty string SQ--
+string(0) ""
+
+--instance of classWithToString--
+string(14) "Class A object"
+
+--instance of classWithoutToString--
+Error: 2 - mb_decode_mimeheader() expects parameter 1 to be string, object given, %s(%d)
+NULL
+
+--undefined var--
+string(0) ""
+
+--unset var--
+string(0) ""
+
+--resource--
+Error: 2 - mb_decode_mimeheader() expects parameter 1 to be string, resource given, %s(%d)
+NULL
+===DONE===
diff --git a/ext/mbstring/tests/mb_decode_mimeheader_variation2.phpt b/ext/mbstring/tests/mb_decode_mimeheader_variation2.phpt
new file mode 100644
index 0000000..7527c9a
--- /dev/null
+++ b/ext/mbstring/tests/mb_decode_mimeheader_variation2.phpt
@@ -0,0 +1,51 @@
+--TEST--
+Test mb_decode_mimeheader() function : variation
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_decode_mimeheader') or die("skip mb_decode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_decode_mimeheader(string string)
+ * Description: Decodes the MIME "encoded-word" in the string
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_decode_mimeheader() : variation ***\n";
+mb_internal_encoding('utf-8');
+
+//all the following are identical, we will convert to utf-8
+
+$encoded_words = array(
+"=?Shift_JIS?B?k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==?=",
+"=?Shift_JIS?Q?=93=FA=96=7B=8C=EA=83e=83L=83X=83g=82=C5=82=B7=81B=30=31=32?=
+=?Shift_JIS?Q?=33=34=82T=82U=82V=82W=82X=81B?=",
+
+"=?ISO-2022-JP?B?GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYbKEI=?=
+=?ISO-2022-JP?B?GyRCIzcjOCM5ISMbKEI=?=",
+"=?ISO-2022-JP?Q?=1B=24BF=7CK=5C=38l=25F=25-=25=39=25H=24G=24=39=1B=28B?=
+=?ISO-2022-JP?Q?=1B=24B!=23=1B=28B=30=31=32=33=34=1B=24B=23=35=1B=28B?=
+=?ISO-2022-JP?Q?=1B=24B=23=36=23=37=23=38=23=39!=23=1B=28B?=",
+
+"=?EUC-JP?B?xvzL3LjspcalraW5pcikx6S5oaMwMTIzNKO1o7ajt6O4o7mhow==?=",
+"=?EUC-JP?Q?=C6=FC=CB=DC=B8=EC=A5=C6=A5=AD=A5=B9=A5=C8=A4=C7=A4=B9=A1=A3?=
+=?EUC-JP?Q?=30=31=32=33=34=A3=B5=A3=B6=A3=B7=A3=B8=A3=B9=A1=A3?="
+ );
+
+ foreach ($encoded_words as $word) {
+ var_dump(bin2hex(mb_decode_mimeheader($word)));
+}
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_decode_mimeheader() : variation ***
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+===DONE===
diff --git a/ext/mbstring/tests/mb_decode_mimeheader_variation3.phpt b/ext/mbstring/tests/mb_decode_mimeheader_variation3.phpt
new file mode 100644
index 0000000..968e76e
--- /dev/null
+++ b/ext/mbstring/tests/mb_decode_mimeheader_variation3.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Test mb_decode_mimeheader() function : variation
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_decode_mimeheader') or die("skip mb_decode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_decode_mimeheader(string string)
+ * Description: Decodes the MIME "encoded-word" in the string
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_decode_mimeheader() : variation ***\n";
+mb_internal_encoding('iso-8859-7');
+
+//greek in UTF-8 to be converted to iso-8859-7
+$encoded_word = "=?UTF-8?B?zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J?=";
+var_dump(bin2hex(mb_decode_mimeheader($encoded_word)));
+
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_decode_mimeheader() : variation ***
+string(48) "e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f3f4f5f6f7f8f9"
+===DONE===
diff --git a/ext/mbstring/tests/mb_decode_numericentity.phpt b/ext/mbstring/tests/mb_decode_numericentity.phpt
new file mode 100644
index 0000000..6008ef9
--- /dev/null
+++ b/ext/mbstring/tests/mb_decode_numericentity.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Test mb_decode_numericentity() function : Convert HTML-Entities to UTF-8
+--SKIPIF--
+<?php
+if (!extension_loaded('mbstring')) die('skip mbstring not enabled');
+function_exists('mb_encode_mimeheader') or die("skip mb_encode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+$str1 = '&#161;&#162;&#163;&#164;&#165;&#166;&#167;&#168;&#169;&#170;&#171;&#172;&#173;&#174;&#175;&#176;&#177;&#178;&#179;&#180;&#181;&#182;&#183;&#184;&#185;&#186;&#187;&#188;&#189;&#190;&#191;&#192;&#193;&#194;&#195;&#196;&#197;&#198;&#199;&#200;&#201;&#202;&#203;&#204;&#205;&#206;&#207;&#208;&#209;&#210;&#211;&#212;&#213;&#214;&#215;&#216;&#217;&#218;&#219;&#220;&#221;&#222;&#223;&#224;&#225;&#226;&#227;&#228;&#229;&#230;&#231;&#232;&#233;&#234;&#235;&#236;&#237;&#238;&#239;&#240;&#241;&#242;&#243;&#244;&#245;&#246;&#247;&#248;&#249;&#250;&#251;&#252;&#253;&#254;&#255;';
+$str2 = '&#402;&#913;&#914;&#915;&#916;&#917;&#918;&#919;&#920;&#921;&#922;&#923;&#924;&#925;&#926;&#927;&#928;&#929;&#931;&#932;&#933;&#934;&#935;&#936;&#937;&#945;&#946;&#947;&#948;&#949;&#950;&#951;&#952;&#953;&#954;&#955;&#956;&#957;&#958;&#959;&#960;&#961;&#962;&#963;&#964;&#965;&#966;&#967;&#968;&#969;&#977;&#978;&#982;&#8226;&#8230;&#8242;&#8243;&#8254;&#8260;&#8472;&#8465;&#8476;&#8482;&#8501;&#8592;&#8593;&#8594;&#8595;&#8596;&#8629;&#8656;&#8657;&#8658;&#8659;&#8660;&#8704;&#8706;&#8707;&#8709;&#8711;&#8712;&#8713;&#8715;&#8719;&#8721;&#8722;&#8727;&#8730;&#8733;&#8734;&#8736;&#8743;&#8744;&#8745;&#8746;&#8747;&#8756;&#8764;&#8773;&#8776;&#8800;&#8801;&#8804;&#8805;&#8834;&#8835;&#8836;&#8838;&#8839;&#8853;&#8855;&#8869;&#8901;&#8968;&#8969;&#8970;&#8971;&#9001;&#9002;&#9674;&#9824;&#9827;&#9829;&#9830;';
+$str3 = 'a&#338;b&#339;c&#352;d&#353;e&#8364;fg';
+$convmap = array(0x0, 0x2FFFF, 0, 0xFFFF);
+echo mb_decode_numericentity($str1, $convmap, "UTF-8")."\n";
+echo mb_decode_numericentity($str2, $convmap, "UTF-8")."\n";
+echo mb_decode_numericentity($str3, $convmap, "UTF-8")."\n";
+?>
+--EXPECT--
+臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多テ叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽
+痢裡里離陸律率立留硫粒隆竜龍侶慮旅虜了亮僚両凌≒霞鰍鐘≒汲汲р癌錫≠もモモbモ
+abcd邸efg
diff --git a/ext/mbstring/tests/mb_detect_encoding.phpt b/ext/mbstring/tests/mb_detect_encoding.phpt
new file mode 100644
index 0000000..4fd22a6
--- /dev/null
+++ b/ext/mbstring/tests/mb_detect_encoding.phpt
@@ -0,0 +1,121 @@
+--TEST--
+mb_detect_encoding()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.language=Japanese
+--FILE--
+<?php
+// TODO: Add more tests
+//$debug = true; // Uncomment this line to view error/warning/notice message in *.out file
+ini_set('include_path', dirname(__FILE__));
+include_once('common.inc');
+
+// SJIS string (BASE64 encoded)
+$sjis = base64_decode('k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==');
+// JIS string (BASE64 encoded)
+$jis = base64_decode('GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==');
+// EUC-JP string
+$euc_jp = '日本語テキストです。0123456789。';
+
+// Test with sigle "form encoding"
+// Note: For some reason it complains, results are differ. Not reserched.
+echo "== BASIC TEST ==\n";
+$s = $sjis;
+$s = mb_detect_encoding($s, 'SJIS');
+print("SJIS: $s\n");
+
+$s = $jis;
+$s = mb_detect_encoding($s, 'JIS');
+print("JIS: $s\n");
+
+$s = $euc_jp;
+$s = mb_detect_encoding($s, 'UTF-8,EUC-JP,JIS');
+print("EUC-JP: $s\n");
+
+$s = $euc_jp;
+$s = mb_detect_encoding($s, 'JIS,EUC-JP');
+print("EUC-JP: $s\n");
+
+
+
+// Using Encoding List Array
+echo "== ARRAY ENCODING LIST ==\n";
+
+$a = array(0=>'UTF-8',1=>'EUC-JP', 2=>'SJIS', 3=>'JIS');
+
+// Note: Due to detect order, detected as UTF-8
+$s = $jis;
+$s = mb_detect_encoding($s, $a);
+print("JIS: $s\n");
+
+$s = $euc_jp;
+$s = mb_detect_encoding($s, $a);
+print("EUC-JP: $s\n");
+
+$s = $sjis;
+$s = mb_detect_encoding($s, $a);
+print("SJIS: $s\n");
+
+
+// Using Detect Order
+echo "== DETECT ORDER ==\n";
+
+mb_detect_order('auto');
+
+
+$s = $jis;
+$s = mb_detect_encoding($s);
+print("JIS: $s\n");
+
+$s = $euc_jp;
+$s = mb_detect_encoding($s);
+print("EUC-JP: $s\n");
+
+$s = $sjis;
+$s = mb_detect_encoding($s);
+print("SJIS: $s\n");
+
+
+// Invalid(?) Parameters
+echo "== INVALID PARAMETER ==\n";
+
+$s = mb_detect_encoding(1234, 'EUC-JP');
+print("INT: $s\n"); // EUC-JP
+
+$s = mb_detect_encoding('', 'EUC-JP');
+print("EUC-JP: $s\n"); // SJIS
+
+$s = $euc_jp;
+$s = mb_detect_encoding($s, 'BAD');
+print("BAD: $s\n"); // BAD
+
+$s = $euc_jp;
+$s = mb_detect_encoding();
+print("MP: $s\n"); // Missing parameter
+
+
+?>
+
+--EXPECT--
+== BASIC TEST ==
+SJIS: SJIS
+JIS: JIS
+EUC-JP: EUC-JP
+EUC-JP: EUC-JP
+== ARRAY ENCODING LIST ==
+JIS: UTF-8
+EUC-JP: EUC-JP
+SJIS: SJIS
+== DETECT ORDER ==
+JIS: JIS
+EUC-JP: EUC-JP
+SJIS: SJIS
+== INVALID PARAMETER ==
+INT: EUC-JP
+EUC-JP: EUC-JP
+ERR: Warning
+BAD: EUC-JP
+ERR: Warning
+MP:
+
diff --git a/ext/mbstring/tests/mb_detect_order.phpt b/ext/mbstring/tests/mb_detect_order.phpt
new file mode 100644
index 0000000..382691c
--- /dev/null
+++ b/ext/mbstring/tests/mb_detect_order.phpt
@@ -0,0 +1,61 @@
+--TEST--
+mb_detect_order()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.language=Japanese
+--FILE--
+<?php
+//$debug = true;
+ini_set('include_path', dirname(__FILE__));
+include_once('common.inc');
+
+
+// Set order to "auto"
+$r = mb_detect_order('auto');
+($r === TRUE) ? print "OK_AUTO\n" : print "NG_AUTO\n";
+print implode(', ', mb_detect_order()) . "\n";
+
+
+// Set order by string
+$r = mb_detect_order('SJIS,EUC-JP,JIS,UTF-8');
+($r === TRUE) ? print "OK_STR\n" : print "NG_STR\n";
+print implode(', ', mb_detect_order()) . "\n";
+
+
+// Set order by array
+$a[] = 'ASCII';
+$a[] = 'JIS';
+$a[] = 'EUC-JP';
+$a[] = 'UTF-8';
+$r = mb_detect_order($a);
+($r === TRUE) ? print "OK_ARRAY\n" : print "NG_ARRAY\n";
+print implode(', ', mb_detect_order()) . "\n";
+
+// Set invalid encoding. Should fail.
+print "== INVALID PARAMETER ==\n";
+
+$r = mb_detect_order('BAD_NAME');
+($r === FALSE) ? print "OK_BAD_STR\n" : print "NG_BAD_STR\n";
+print implode(', ', mb_detect_order()) . "\n";
+
+$a[] = 'BAD_NAME';
+$r = mb_detect_order($a);
+($r === FALSE) ? print "OK_BAD_ARRAY\n" : print "NG_BAD_ARRAY\n";
+print implode(', ', mb_detect_order()) . "\n";
+
+?>
+
+--EXPECT--
+OK_AUTO
+ASCII, JIS, UTF-8, EUC-JP, SJIS
+OK_STR
+SJIS, EUC-JP, JIS, UTF-8
+OK_ARRAY
+ASCII, JIS, EUC-JP, UTF-8
+== INVALID PARAMETER ==
+OK_BAD_STR
+ASCII, JIS, EUC-JP, UTF-8
+OK_BAD_ARRAY
+ASCII, JIS, EUC-JP, UTF-8
+
diff --git a/ext/mbstring/tests/mb_encode_mimeheader_basic.phpt b/ext/mbstring/tests/mb_encode_mimeheader_basic.phpt
new file mode 100644
index 0000000..0487a19
--- /dev/null
+++ b/ext/mbstring/tests/mb_encode_mimeheader_basic.phpt
@@ -0,0 +1,74 @@
+--TEST--
+Test mb_encode_mimeheader() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_encode_mimeheader') or die("skip mb_encode_mimeheader() is not available in this build");
+?>
+
+--FILE--
+<?php
+/* Prototype : string mb_encode_mimeheader
+ * (string $str [, string $charset [, string $transfer-encoding [, string $linefeed [, int $indent]]]])
+ * Description: Converts the string to MIME "encoded-word" in the format of =?charset?(B|Q)?encoded_string?=
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test basic functionality of mb_encode_mimeheader with different strings.
+ * For the below strings:
+ * 'English' is ASCII only, 'Japanese' has no ASCII characters and 'Greek' is mixed.
+ */
+
+echo "*** Testing mb_encode_mimeheader() : basic ***\n";
+
+$english = array('English' => 'This is an English string. 0123456789');
+$nonEnglish = array('Japanese' => base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC'),
+ 'Greek' => base64_decode('zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg=='));
+
+foreach ($english as $lang => $input) {
+ echo "\nLanguage: $lang\n";
+ echo "-- Base 64: --\n";
+ var_dump(mb_encode_mimeheader($input, 'UTF-8', 'B'));
+ echo "-- Quoted-Printable --\n";
+ var_dump(mb_encode_mimeheader($input, 'UTF-8', 'Q'));
+}
+
+mb_internal_encoding('utf-8');
+
+foreach ($nonEnglish as $lang => $input) {
+ echo "\nLanguage: $lang\n";
+ echo "-- Base 64: --\n";
+ var_dump(mb_encode_mimeheader($input, 'UTF-8', 'B'));
+ echo "-- Quoted-Printable --\n";
+ var_dump(mb_encode_mimeheader($input, 'UTF-8', 'Q'));
+}
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_encode_mimeheader() : basic ***
+
+Language: English
+-- Base 64: --
+string(37) "This is an English string. 0123456789"
+-- Quoted-Printable --
+string(37) "This is an English string. 0123456789"
+
+Language: Japanese
+-- Base 64: --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+-- Quoted-Printable --
+string(117) "=?UTF-8?Q?=E6=97=A5=E6=9C=AC=E8=AA=9E=E3=83=86=E3=82=AD=E3=82=B9=E3=83=88?=
+ =?UTF-8?Q?=E3=81=A7=E3=81=99=E3=80=82?="
+
+Language: Greek
+-- Base 64: --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+-- Quoted-Printable --
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_encode_mimeheader_basic2.phpt b/ext/mbstring/tests/mb_encode_mimeheader_basic2.phpt
new file mode 100644
index 0000000..cd52fa5
--- /dev/null
+++ b/ext/mbstring/tests/mb_encode_mimeheader_basic2.phpt
@@ -0,0 +1,73 @@
+--TEST--
+Test mb_encode_mimeheader() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_encode_mimeheader') or die("skip mb_encode_mimeheader() is not available in this build");
+?>
+
+--FILE--
+<?php
+/* Prototype : string mb_encode_mimeheader(string $str [, string $charset
+ * [, string $transfer-encoding [, string $linefeed [, int $indent]]]])
+ * Description: Converts the string to MIME "encoded-word" in the format of =?charset?(B|Q)?encoded_string?=
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test mb_encode_header() with different strings
+ */
+
+echo "*** Testing mb_encode_mimeheader() : basic2 ***\n";
+
+//All strings are the same when displayed in their respective encodings
+$sjis_string = base64_decode('k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==');
+$jis_string = base64_decode('GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==');
+$euc_jp_string = base64_decode('xvzL3LjspcalraW5pcikx6S5oaMwMTIzNKO1o7ajt6O4o7mhow==');
+
+$inputs = array('SJIS' => $sjis_string,
+ 'JIS' => $jis_string,
+ 'EUC_JP' => $euc_jp_string);
+
+foreach ($inputs as $lang => $input) {
+ echo "\nLanguage: $lang\n";
+ echo "-- Base 64: --\n";
+ mb_internal_encoding($lang);
+ $outEncoding = "UTF-8";
+ var_dump(mb_encode_mimeheader($input, $outEncoding, 'B'));
+ echo "-- Quoted-Printable --\n";
+ var_dump(mb_encode_mimeheader($input, $outEncoding, 'Q'));
+}
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_encode_mimeheader() : basic2 ***
+
+Language: SJIS
+-- Base 64: --
+string(99) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJc=?=
+ =?UTF-8?B?77yY77yZ44CC?="
+-- Quoted-Printable --
+string(201) "=?UTF-8?Q?=E6=97=A5=E6=9C=AC=E8=AA=9E=E3=83=86=E3=82=AD=E3=82=B9=E3=83=88?=
+ =?UTF-8?Q?=E3=81=A7=E3=81=99=E3=80=82=30=31=32=33=34=EF=BC=95=EF=BC=96?=
+ =?UTF-8?Q?=EF=BC=97=EF=BC=98=EF=BC=99=E3=80=82?="
+
+Language: JIS
+-- Base 64: --
+string(99) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJc=?=
+ =?UTF-8?B?77yY77yZ44CC?="
+-- Quoted-Printable --
+string(201) "=?UTF-8?Q?=E6=97=A5=E6=9C=AC=E8=AA=9E=E3=83=86=E3=82=AD=E3=82=B9=E3=83=88?=
+ =?UTF-8?Q?=E3=81=A7=E3=81=99=E3=80=82=30=31=32=33=34=EF=BC=95=EF=BC=96?=
+ =?UTF-8?Q?=EF=BC=97=EF=BC=98=EF=BC=99=E3=80=82?="
+
+Language: EUC_JP
+-- Base 64: --
+string(99) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJc=?=
+ =?UTF-8?B?77yY77yZ44CC?="
+-- Quoted-Printable --
+string(201) "=?UTF-8?Q?=E6=97=A5=E6=9C=AC=E8=AA=9E=E3=83=86=E3=82=AD=E3=82=B9=E3=83=88?=
+ =?UTF-8?Q?=E3=81=A7=E3=81=99=E3=80=82=30=31=32=33=34=EF=BC=95=EF=BC=96?=
+ =?UTF-8?Q?=EF=BC=97=EF=BC=98=EF=BC=99=E3=80=82?="
+Done
diff --git a/ext/mbstring/tests/mb_encode_mimeheader_basic3.phpt b/ext/mbstring/tests/mb_encode_mimeheader_basic3.phpt
new file mode 100644
index 0000000..b2f0c8b
--- /dev/null
+++ b/ext/mbstring/tests/mb_encode_mimeheader_basic3.phpt
@@ -0,0 +1,69 @@
+--TEST--
+Test mb_encode_mimeheader() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_encode_mimeheader') or die("skip mb_encode_mimeheader() is not available in this build");
+?>
+
+--FILE--
+<?php
+/* Prototype : string mb_encode_mimeheader(string $str [, string $charset
+ * [, string $transfer-encoding [, string $linefeed [, int $indent]]]])
+ * Description: Converts the string to MIME "encoded-word" in the format of =?charset?(B|Q)?encoded_string?=
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test mb_encode_header() with different strings
+ */
+
+echo "*** Testing mb_encode_mimeheader() : basic2 ***\n";
+
+//All strings are the same when displayed in their respective encodings
+$sjis_string = base64_decode('k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==');
+$jis_string = base64_decode('GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==');
+$euc_jp_string = base64_decode('xvzL3LjspcalraW5pcikx6S5oaMwMTIzNKO1o7ajt6O4o7mhow==');
+
+$inputs = array('SJIS' => $sjis_string,
+ 'JIS' => $jis_string,
+ 'EUC_JP' => $euc_jp_string);
+
+foreach ($inputs as $lang => $input) {
+ echo "\nLanguage: $lang\n";
+ echo "-- Base 64: --\n";
+ mb_internal_encoding($lang);
+ $outEncoding = $lang;
+ var_dump(mb_encode_mimeheader($input, $outEncoding, 'B'));
+ echo "-- Quoted-Printable --\n";
+ var_dump(mb_encode_mimeheader($input, $outEncoding, 'Q'));
+}
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_encode_mimeheader() : basic2 ***
+
+Language: SJIS
+-- Base 64: --
+string(68) "=?Shift_JIS?B?k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==?="
+-- Quoted-Printable --
+string(124) "=?Shift_JIS?Q?=93=FA=96=7B=8C=EA=83e=83L=83X=83g=82=C5=82=B7=81B=30=31=32?=
+ =?Shift_JIS?Q?=33=34=82T=82U=82V=82W=82X=81B?="
+
+Language: JIS
+-- Base 64: --
+string(115) "=?ISO-2022-JP?B?GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYbKEI=?=
+ =?ISO-2022-JP?B?GyRCIzcjOCM5ISMbKEI=?="
+-- Quoted-Printable --
+string(209) "=?ISO-2022-JP?Q?=1B=24BF=7CK=5C=38l=25F=25-=25=39=25H=24G=24=39=1B=28B?=
+ =?ISO-2022-JP?Q?=1B=24B!=23=1B=28B=30=31=32=33=34=1B=24B=23=35=1B=28B?=
+ =?ISO-2022-JP?Q?=1B=24B=23=36=23=37=23=38=23=39!=23=1B=28B?="
+
+Language: EUC_JP
+-- Base 64: --
+string(65) "=?EUC-JP?B?xvzL3LjspcalraW5pcikx6S5oaMwMTIzNKO1o7ajt6O4o7mhow==?="
+-- Quoted-Printable --
+string(140) "=?EUC-JP?Q?=C6=FC=CB=DC=B8=EC=A5=C6=A5=AD=A5=B9=A5=C8=A4=C7=A4=B9=A1=A3?=
+ =?EUC-JP?Q?=30=31=32=33=34=A3=B5=A3=B6=A3=B7=A3=B8=A3=B9=A1=A3?="
+Done
diff --git a/ext/mbstring/tests/mb_encode_mimeheader_indent.phpt b/ext/mbstring/tests/mb_encode_mimeheader_indent.phpt
new file mode 100644
index 0000000..11fe23f
--- /dev/null
+++ b/ext/mbstring/tests/mb_encode_mimeheader_indent.phpt
@@ -0,0 +1,901 @@
+--TEST--
+Test mb_encode_mimeheader() function : basic functionality, indent
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_encode_mimeheader') or die("skip mb_encode_mimeheader() is not available in this build");
+?>
+
+--FILE--
+<?php
+/* Prototype : string mb_encode_mimeheader
+ * (string $str [, string $charset [, string $transfer_encoding [, string $linefeed [, int $indent]]]])
+ * Description: Converts the string to MIME "encoded-word" in the format of =?charset?(B|Q)?encoded_string?=
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass different data types to $indent argument to see how mb_encode_mimeheader() behaves
+ */
+
+echo "*** Testing mb_encode_mimeheader() : indent ***\n";
+
+mb_internal_encoding('utf-8');
+
+// Initialise function arguments not being substituted
+$str = base64_decode('zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==');
+$charset = 'utf-8';
+$linefeed = "\r\n";
+
+for ($i = 0; $i < 100; $i++) {
+ echo "\n-- Iteration $i --\n";
+ var_dump( mb_encode_mimeheader($str, $charset, "B", $linefeed, $i));
+ var_dump( mb_encode_mimeheader($str, $charset, "Q", $linefeed, $i));
+};
+echo "Done";
+?>
+--EXPECT--
+*** Testing mb_encode_mimeheader() : indent ***
+
+-- Iteration 0 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 1 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 2 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 3 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 4 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrU=?=
+ =?UTF-8?B?zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9?=
+ =?UTF-8?Q?=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36?=
+ =?UTF-8?Q?=37=38=39=2E?="
+
+-- Iteration 5 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrU=?=
+ =?UTF-8?B?zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9?=
+ =?UTF-8?Q?=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36?=
+ =?UTF-8?Q?=37=38=39=2E?="
+
+-- Iteration 6 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrU=?=
+ =?UTF-8?B?zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9?=
+ =?UTF-8?Q?=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36?=
+ =?UTF-8?Q?=37=38=39=2E?="
+
+-- Iteration 7 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrU=?=
+ =?UTF-8?B?zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1?=
+ =?UTF-8?Q?=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20?=
+ =?UTF-8?Q?=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34?=
+ =?UTF-8?Q?=35=36=37=38=39=2E?="
+
+-- Iteration 8 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66?=
+ =?UTF-8?B?zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1?=
+ =?UTF-8?Q?=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20?=
+ =?UTF-8?Q?=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34?=
+ =?UTF-8?Q?=35=36=37=38=39=2E?="
+
+-- Iteration 9 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66?=
+ =?UTF-8?B?zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1?=
+ =?UTF-8?Q?=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20?=
+ =?UTF-8?Q?=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34?=
+ =?UTF-8?Q?=35=36=37=38=39=2E?="
+
+-- Iteration 10 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66?=
+ =?UTF-8?B?zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1?=
+ =?UTF-8?Q?=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20?=
+ =?UTF-8?Q?=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34?=
+ =?UTF-8?Q?=35=36=37=38=39=2E?="
+
+-- Iteration 11 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66?=
+ =?UTF-8?B?zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1?=
+ =?UTF-8?Q?=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20?=
+ =?UTF-8?Q?=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34?=
+ =?UTF-8?Q?=35=36=37=38=39=2E?="
+
+-- Iteration 12 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+M?=
+ =?UTF-8?B?IM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1?=
+ =?UTF-8?Q?=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20?=
+ =?UTF-8?Q?=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34?=
+ =?UTF-8?Q?=35=36=37=38=39=2E?="
+
+-- Iteration 13 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+M?=
+ =?UTF-8?B?IM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD?=
+ =?UTF-8?Q?=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C?=
+ =?UTF-8?Q?=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33?=
+ =?UTF-8?Q?=34=35=36=37=38=39=2E?="
+
+-- Iteration 14 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+M?=
+ =?UTF-8?B?IM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD?=
+ =?UTF-8?Q?=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C?=
+ =?UTF-8?Q?=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33?=
+ =?UTF-8?Q?=34=35=36=37=38=39=2E?="
+
+-- Iteration 15 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+M?=
+ =?UTF-8?B?IM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD?=
+ =?UTF-8?Q?=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C?=
+ =?UTF-8?Q?=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33?=
+ =?UTF-8?Q?=34=35=36=37=38=39=2E?="
+
+-- Iteration 16 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrk=?=
+ =?UTF-8?B?zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD?=
+ =?UTF-8?Q?=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C?=
+ =?UTF-8?Q?=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33?=
+ =?UTF-8?Q?=34=35=36=37=38=39=2E?="
+
+-- Iteration 17 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrk=?=
+ =?UTF-8?B?zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD?=
+ =?UTF-8?Q?=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C?=
+ =?UTF-8?Q?=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33?=
+ =?UTF-8?Q?=34=35=36=37=38=39=2E?="
+
+-- Iteration 18 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrk=?=
+ =?UTF-8?B?zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD?=
+ =?UTF-8?Q?=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C?=
+ =?UTF-8?Q?=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33?=
+ =?UTF-8?Q?=34=35=36=37=38=39=2E?="
+
+-- Iteration 19 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrk=?=
+ =?UTF-8?B?zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF?=
+ =?UTF-8?Q?=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA?=
+ =?UTF-8?Q?=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31?=
+ =?UTF-8?Q?=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 20 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869?=
+ =?UTF-8?B?zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF?=
+ =?UTF-8?Q?=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA?=
+ =?UTF-8?Q?=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31?=
+ =?UTF-8?Q?=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 21 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869?=
+ =?UTF-8?B?zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF?=
+ =?UTF-8?Q?=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA?=
+ =?UTF-8?Q?=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31?=
+ =?UTF-8?Q?=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 22 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869?=
+ =?UTF-8?B?zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF?=
+ =?UTF-8?Q?=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA?=
+ =?UTF-8?Q?=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31?=
+ =?UTF-8?Q?=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 23 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869?=
+ =?UTF-8?B?zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF?=
+ =?UTF-8?Q?=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA?=
+ =?UTF-8?Q?=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31?=
+ =?UTF-8?Q?=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 24 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrs=?=
+ =?UTF-8?B?zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF?=
+ =?UTF-8?Q?=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA?=
+ =?UTF-8?Q?=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31?=
+ =?UTF-8?Q?=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 25 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrs=?=
+ =?UTF-8?B?zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9?=
+ =?UTF-8?Q?=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20?=
+ =?UTF-8?Q?=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 26 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrs=?=
+ =?UTF-8?B?zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9?=
+ =?UTF-8?Q?=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20?=
+ =?UTF-8?Q?=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 27 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrs=?=
+ =?UTF-8?B?zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9?=
+ =?UTF-8?Q?=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20?=
+ =?UTF-8?Q?=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 28 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67?=
+ =?UTF-8?B?zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9?=
+ =?UTF-8?Q?=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20?=
+ =?UTF-8?Q?=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 29 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67?=
+ =?UTF-8?B?zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9?=
+ =?UTF-8?Q?=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20?=
+ =?UTF-8?Q?=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 30 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67?=
+ =?UTF-8?B?zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9?=
+ =?UTF-8?Q?=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20?=
+ =?UTF-8?Q?=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 31 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67?=
+ =?UTF-8?B?zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD?=
+ =?UTF-8?Q?=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF?=
+ =?UTF-8?Q?=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 32 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSA=?=
+ =?UTF-8?B?zrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD?=
+ =?UTF-8?Q?=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF?=
+ =?UTF-8?Q?=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 33 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSA=?=
+ =?UTF-8?B?zrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD?=
+ =?UTF-8?Q?=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF?=
+ =?UTF-8?Q?=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 34 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSA=?=
+ =?UTF-8?B?zrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD?=
+ =?UTF-8?Q?=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF?=
+ =?UTF-8?Q?=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 35 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSA=?=
+ =?UTF-8?B?zrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD?=
+ =?UTF-8?Q?=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF?=
+ =?UTF-8?Q?=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 36 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrE=?=
+ =?UTF-8?B?zrkgzrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4?=
+ =?UTF-8?B?OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20?=
+ =?UTF-8?Q?=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD?=
+ =?UTF-8?Q?=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF?=
+ =?UTF-8?Q?=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 37 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrE=?=
+ =?UTF-8?B?zrkgzrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4?=
+ =?UTF-8?B?OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C?=
+ =?UTF-8?Q?=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7?=
+ =?UTF-8?Q?=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD?=
+ =?UTF-8?Q?=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 38 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrE=?=
+ =?UTF-8?B?zrkgzrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4?=
+ =?UTF-8?B?OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C?=
+ =?UTF-8?Q?=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7?=
+ =?UTF-8?Q?=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD?=
+ =?UTF-8?Q?=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 39 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrE=?=
+ =?UTF-8?B?zrkgzrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEyMzQ1Njc4?=
+ =?UTF-8?B?OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C?=
+ =?UTF-8?Q?=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB=CE=B7?=
+ =?UTF-8?Q?=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5=CE=BD?=
+ =?UTF-8?Q?=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 40 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869?=
+ =?UTF-8?B?zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2?=
+ =?UTF-8?B?Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84?=
+ =?UTF-8?Q?=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB?=
+ =?UTF-8?Q?=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5?=
+ =?UTF-8?Q?=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 41 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869?=
+ =?UTF-8?B?zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2?=
+ =?UTF-8?B?Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84?=
+ =?UTF-8?Q?=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB?=
+ =?UTF-8?Q?=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5?=
+ =?UTF-8?Q?=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 42 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869?=
+ =?UTF-8?B?zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2?=
+ =?UTF-8?B?Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84?=
+ =?UTF-8?Q?=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB?=
+ =?UTF-8?Q?=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5?=
+ =?UTF-8?Q?=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 43 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869?=
+ =?UTF-8?B?zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2?=
+ =?UTF-8?B?Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84?=
+ =?UTF-8?Q?=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB?=
+ =?UTF-8?Q?=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5?=
+ =?UTF-8?Q?=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 44 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrU=?=
+ =?UTF-8?B?zq/Ovc6xzrkgzrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEy?=
+ =?UTF-8?B?MzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84?=
+ =?UTF-8?Q?=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB?=
+ =?UTF-8?Q?=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5?=
+ =?UTF-8?Q?=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 45 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrU=?=
+ =?UTF-8?B?zq/Ovc6xzrkgzrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEy?=
+ =?UTF-8?B?MzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84?=
+ =?UTF-8?Q?=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB=CE=BB?=
+ =?UTF-8?Q?=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC=CE=B5?=
+ =?UTF-8?Q?=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 46 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrU=?=
+ =?UTF-8?B?zq/Ovc6xzrkgzrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEy?=
+ =?UTF-8?B?MzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85?=
+ =?UTF-8?Q?=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB?=
+ =?UTF-8?Q?=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC?=
+ =?UTF-8?Q?=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 47 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wgzrU=?=
+ =?UTF-8?B?zq/Ovc6xzrkgzrXOu867zrfOvc65zrrPjCDOus61zq/OvM61zr3Ovy4gMDEy?=
+ =?UTF-8?B?MzQ1Njc4OS4=?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85?=
+ =?UTF-8?Q?=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB?=
+ =?UTF-8?Q?=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC?=
+ =?UTF-8?Q?=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 48 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wg?=
+ =?UTF-8?B?zrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAw?=
+ =?UTF-8?B?MTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85?=
+ =?UTF-8?Q?=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB?=
+ =?UTF-8?Q?=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC?=
+ =?UTF-8?Q?=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 49 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wg?=
+ =?UTF-8?B?zrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAw?=
+ =?UTF-8?B?MTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85?=
+ =?UTF-8?Q?=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB?=
+ =?UTF-8?Q?=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC?=
+ =?UTF-8?Q?=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 50 --
+string(130) "=?UTF-8?B?zpHPhc+Ez4wg?=
+ =?UTF-8?B?zrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAw?=
+ =?UTF-8?B?MTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85?=
+ =?UTF-8?Q?=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20=CE=B5=CE=BB?=
+ =?UTF-8?Q?=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5=CE=AF=CE=BC?=
+ =?UTF-8?Q?=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38=39=2E?="
+
+-- Iteration 51 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 52 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 53 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 54 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 55 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 56 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 57 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 58 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 59 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 60 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 61 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 62 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 63 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 64 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 65 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 66 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 67 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 68 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 69 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 70 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 71 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 72 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 73 --
+string(118) "
+ =?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(252) "
+ =?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 74 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 75 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 76 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 77 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 78 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 79 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 80 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 81 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 82 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 83 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 84 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 85 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 86 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 87 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 88 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 89 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 90 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 91 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 92 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 93 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 94 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 95 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 96 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 97 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 98 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+
+-- Iteration 99 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+string(249) "=?UTF-8?Q?=CE=91=CF=85=CF=84=CF=8C=20=CE=B5=CE=AF=CE=BD=CE=B1=CE=B9=20?=
+ =?UTF-8?Q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA=CF=8C=20=CE=BA=CE=B5?=
+ =?UTF-8?Q?=CE=AF=CE=BC=CE=B5=CE=BD=CE=BF=2E=20=30=31=32=33=34=35=36=37=38?=
+ =?UTF-8?Q?=39=2E?="
+Done
+
diff --git a/ext/mbstring/tests/mb_encode_mimeheader_variation1.phpt b/ext/mbstring/tests/mb_encode_mimeheader_variation1.phpt
new file mode 100644
index 0000000..7b5bd30
--- /dev/null
+++ b/ext/mbstring/tests/mb_encode_mimeheader_variation1.phpt
@@ -0,0 +1,184 @@
+--TEST--
+Test mb_encode_mimeheader() function : usage variations - Pass different data types to $str arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_encode_mimeheader') or die("skip mb_encode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_encode_mimeheader
+ * (string $str [, string $charset [, string $transfer_encoding [, string $linefeed [, int $indent]]]])
+ * Description: Converts the string to MIME "encoded-word" in the format of =?charset?(B|Q)?encoded_string?=
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass different data types to $str argument to see how mb_encode_mimeheader() behaves
+ */
+
+echo "*** Testing mb_encode_mimeheader() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$charset = 'utf-8';
+$transfer_encoding = 'B';
+$linefeed = "\r\n";
+$indent = 2;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $str argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "string",
+ 'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_encode_mimeheader()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_encode_mimeheader($input, $charset, $transfer_encoding, $linefeed, $indent));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_encode_mimeheader() : usage variations ***
+
+-- Iteration 1 --
+string(1) "0"
+
+-- Iteration 2 --
+string(1) "1"
+
+-- Iteration 3 --
+string(5) "12345"
+
+-- Iteration 4 --
+string(5) "-2345"
+
+-- Iteration 5 --
+string(4) "10.5"
+
+-- Iteration 6 --
+string(5) "-10.5"
+
+-- Iteration 7 --
+string(12) "123456789000"
+
+-- Iteration 8 --
+string(13) "1.23456789E-9"
+
+-- Iteration 9 --
+string(3) "0.5"
+
+-- Iteration 10 --
+string(0) ""
+
+-- Iteration 11 --
+string(0) ""
+
+-- Iteration 12 --
+string(1) "1"
+
+-- Iteration 13 --
+string(0) ""
+
+-- Iteration 14 --
+string(1) "1"
+
+-- Iteration 15 --
+string(0) ""
+
+-- Iteration 16 --
+string(0) ""
+
+-- Iteration 17 --
+string(0) ""
+
+-- Iteration 18 --
+string(6) "string"
+
+-- Iteration 19 --
+string(6) "string"
+
+-- Iteration 20 --
+string(11) "hello world"
+
+-- Iteration 21 --
+string(14) "Class A object"
+
+-- Iteration 22 --
+string(0) ""
+
+-- Iteration 23 --
+string(0) ""
+
+-- Iteration 24 --
+
+Warning: mb_encode_mimeheader() expects parameter 1 to be string, resource given in %s on line %d
+NULL
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_encode_mimeheader_variation2.phpt b/ext/mbstring/tests/mb_encode_mimeheader_variation2.phpt
new file mode 100644
index 0000000..e765e94
--- /dev/null
+++ b/ext/mbstring/tests/mb_encode_mimeheader_variation2.phpt
@@ -0,0 +1,224 @@
+--TEST--
+Test mb_encode_mimeheader() function : usage variations - Pass different data types to $charset arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_encode_mimeheader') or die("skip mb_encode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_encode_mimeheader
+ * (string $str [, string $charset [, string $transfer_encoding [, string $linefeed [, int $indent]]]])
+ * Description: Converts the string to MIME "encoded-word" in the format of =?charset?(B|Q)?encoded_string?=
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass different data types to $charset argument to see how mb_encode_mimeheader() behaves
+ */
+
+echo "*** Testing mb_encode_mimeheader() : usage variations ***\n";
+
+mb_internal_encoding('utf-8');
+
+// Initialise function arguments not being substituted
+$str = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC');
+$transfer_encoding = 'B';
+$linefeed = "\r\n";
+$indent = 2;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+utf-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $charset argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "utf-8",
+ 'utf-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_encode_mimeheader()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_encode_mimeheader($str, $input, $transfer_encoding, $linefeed, $indent));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_encode_mimeheader() : usage variations ***
+
+-- Iteration 1 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "0" in %s on line %d
+bool(false)
+
+-- Iteration 2 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 3 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "-2345" in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "10.5" in %s on line %d
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "-10.5" in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "123456789000" in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+-- Iteration 9 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "0.5" in %s on line %d
+bool(false)
+
+-- Iteration 10 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 11 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 12 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 13 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 14 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 15 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 16 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 19 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 20 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 21 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 22 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 23 --
+
+Warning: mb_encode_mimeheader(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_encode_mimeheader() expects parameter 2 to be string, resource given in %s on line %d
+NULL
+Done
diff --git a/ext/mbstring/tests/mb_encode_mimeheader_variation3.phpt b/ext/mbstring/tests/mb_encode_mimeheader_variation3.phpt
new file mode 100644
index 0000000..c2976f5
--- /dev/null
+++ b/ext/mbstring/tests/mb_encode_mimeheader_variation3.phpt
@@ -0,0 +1,186 @@
+--TEST--
+Test mb_encode_mimeheader() function : usage variations - Pass different data types to $transfer_encoding arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_encode_mimeheader') or die("skip mb_encode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_encode_mimeheader
+ * (string $str [, string $charset [, string $transfer_encoding [, string $linefeed [, int $indent]]]])
+ * Description: Converts the string to MIME "encoded-word" in the format of =?charset?(B|Q)?encoded_string?=
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass different data types to $transfer_encoding argument to see how mb_encode_mimeheader() behaves
+ */
+
+echo "*** Testing mb_encode_mimeheader() : usage variations ***\n";
+
+mb_internal_encoding('utf-8');
+
+// Initialise function arguments not being substituted
+$str = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC');
+$charset = 'utf-8';
+$linefeed = "\r\n";
+$indent = 2;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $transfer_encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "string",
+ 'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_encode_mimeheader()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_encode_mimeheader($str, $charset, $input, $linefeed, $indent));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_encode_mimeheader() : usage variations ***
+
+-- Iteration 1 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 2 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 3 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 4 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 5 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 6 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 7 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 8 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 9 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 10 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 11 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 12 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 13 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 14 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 15 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 16 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 17 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 18 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 19 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 20 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 21 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 22 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 23 --
+string(52) "=?UTF-8?B?5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC?="
+
+-- Iteration 24 --
+
+Warning: mb_encode_mimeheader() expects parameter 3 to be string, resource given in %s on line %d
+NULL
+Done
diff --git a/ext/mbstring/tests/mb_encode_mimeheader_variation4.phpt b/ext/mbstring/tests/mb_encode_mimeheader_variation4.phpt
new file mode 100644
index 0000000..fe05084
--- /dev/null
+++ b/ext/mbstring/tests/mb_encode_mimeheader_variation4.phpt
@@ -0,0 +1,187 @@
+--TEST--
+Test mb_encode_mimeheader() function : usage variations - Pass different data types to $linefeed arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_encode_mimeheader') or die("skip mb_encode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_encode_mimeheader
+ * (string $str [, string $charset [, string $transfer_encoding [, string $linefeed [, int $indent]]]])
+ * Description: Converts the string to MIME "encoded-word" in the format of =?charset?(B|Q)?encoded_string?=
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass different data types to $linefeed argument to see how mb_encode_mimeheader() behaves
+ */
+
+echo "*** Testing mb_encode_mimeheader() : usage variations ***\n";
+mb_internal_encoding('utf-8');
+
+
+// Initialise function arguments not being substituted
+//longer $str to go over 1 line
+$str = base64_decode('zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==');
+$charset = 'utf-8';
+$transfer_encoding = 'B';
+$indent = 2;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $linefeed argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "string",
+ 'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_encode_mimeheader()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_encode_mimeheader($str, $charset, $transfer_encoding, $input, $indent));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_encode_mimeheader() : usage variations ***
+
+-- Iteration 1 --
+string(114) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=0 =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 2 --
+string(114) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=1 =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 3 --
+string(118) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=12345 =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 4 --
+string(118) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=-2345 =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 5 --
+string(117) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=10.5 =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 6 --
+string(118) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=-10.5 =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 7 --
+string(121) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=12345678 =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 8 --
+string(121) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=1.234567 =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 9 --
+string(116) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=0.5 =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 10 --
+string(113) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?= =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 11 --
+string(113) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?= =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 12 --
+string(114) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=1 =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 13 --
+string(113) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?= =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 14 --
+string(114) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=1 =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 15 --
+string(113) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?= =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 16 --
+string(113) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?= =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 17 --
+string(113) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?= =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 18 --
+string(119) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=string =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 19 --
+string(119) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=string =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 20 --
+string(121) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=hello wo =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 21 --
+string(121) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=Class A =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 22 --
+string(113) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?= =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 23 --
+string(113) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?= =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 24 --
+
+Warning: mb_encode_mimeheader() expects parameter 4 to be string, resource given in %s on line %d
+NULL
+Done
diff --git a/ext/mbstring/tests/mb_encode_mimeheader_variation5.phpt b/ext/mbstring/tests/mb_encode_mimeheader_variation5.phpt
new file mode 100644
index 0000000..d57bc10
--- /dev/null
+++ b/ext/mbstring/tests/mb_encode_mimeheader_variation5.phpt
@@ -0,0 +1,215 @@
+--TEST--
+Test mb_encode_mimeheader() function : usage variations - Pass different data types to $indent arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_encode_mimeheader') or die("skip mb_encode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_encode_mimeheader
+ * (string $str [, string $charset [, string $transfer_encoding [, string $linefeed [, int $indent]]]])
+ * Description: Converts the string to MIME "encoded-word" in the format of =?charset?(B|Q)?encoded_string?=
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass different data types to $indent argument to see how mb_encode_mimeheader() behaves
+ */
+
+echo "*** Testing mb_encode_mimeheader() : usage variations ***\n";
+
+mb_internal_encoding('utf-8');
+
+// Initialise function arguments not being substituted
+$str = base64_decode('zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==');
+$charset = 'utf-8';
+$transfer_encoding = 'B';
+$linefeed = "\r\n";
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $indent argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "string",
+ 'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_encode_mimeheader()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_encode_mimeheader($str, $charset, $transfer_encoding, $linefeed, $input));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_encode_mimeheader() : usage variations ***
+
+-- Iteration 1 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 2 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 3 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 4 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 5 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66?=
+ =?UTF-8?B?zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 6 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 7 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 8 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 9 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 10 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 11 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 12 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 13 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 14 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 15 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 16 --
+
+Warning: mb_encode_mimeheader() expects parameter 5 to be long, string given in %s on line %d
+NULL
+
+-- Iteration 17 --
+
+Warning: mb_encode_mimeheader() expects parameter 5 to be long, string given in %s on line %d
+NULL
+
+-- Iteration 18 --
+
+Warning: mb_encode_mimeheader() expects parameter 5 to be long, string given in %s on line %d
+NULL
+
+-- Iteration 19 --
+
+Warning: mb_encode_mimeheader() expects parameter 5 to be long, string given in %s on line %d
+NULL
+
+-- Iteration 20 --
+
+Warning: mb_encode_mimeheader() expects parameter 5 to be long, string given in %s on line %d
+NULL
+
+-- Iteration 21 --
+
+Warning: mb_encode_mimeheader() expects parameter 5 to be long, object given in %s on line %d
+NULL
+
+-- Iteration 22 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 23 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 24 --
+
+Warning: mb_encode_mimeheader() expects parameter 5 to be long, resource given in %s on line %d
+NULL
+Done
diff --git a/ext/mbstring/tests/mb_encode_mimeheader_variation6.phpt b/ext/mbstring/tests/mb_encode_mimeheader_variation6.phpt
new file mode 100644
index 0000000..668ae8b
--- /dev/null
+++ b/ext/mbstring/tests/mb_encode_mimeheader_variation6.phpt
@@ -0,0 +1,53 @@
+--TEST--
+Test mb_encode_mimeheader() function : usage variations - Pass different strings to $linefeed arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_encode_mimeheader') or die("skip mb_encode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_encode_mimeheader
+ * (string $str [, string $charset [, string $transfer_encoding [, string $linefeed [, int $indent]]]])
+ * Description: Converts the string to MIME "encoded-word" in the format of =?charset?(B|Q)?encoded_string?=
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass different strings to $linefeed argument
+ */
+
+echo "*** Testing mb_encode_mimeheader() : usage variations ***\n";
+
+mb_internal_encoding('utf-8');
+
+$linefeeds = array("\r\n",
+ "\n",
+ "---");
+$str = base64_decode('zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==');
+
+$iterator = 1;
+foreach ($linefeeds as $linefeed) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump(mb_encode_mimeheader($str, 'utf-8', 'B', $linefeed));
+ $iterator++;
+}
+
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_encode_mimeheader() : usage variations ***
+
+-- Iteration 1 --
+string(115) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 2 --
+string(114) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=
+ =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+
+-- Iteration 3 --
+string(116) "=?UTF-8?B?zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868?=--- =?UTF-8?B?zrXOvc6/LiAwMTIzNDU2Nzg5Lg==?="
+Done
diff --git a/ext/mbstring/tests/mb_encode_numericentity.phpt b/ext/mbstring/tests/mb_encode_numericentity.phpt
new file mode 100644
index 0000000..dffb419
--- /dev/null
+++ b/ext/mbstring/tests/mb_encode_numericentity.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Test mb_encode_numericentity() function : Convert UTF-8 to HTML-Entities
+--SKIPIF--
+<?php
+if (!extension_loaded('mbstring')) die('skip mbstring not enabled');
+function_exists('mb_encode_mimeheader') or die("skip mb_encode_mimeheader() is not available in this build");
+?>
+--FILE--
+<?php
+$str1 = '臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多テ叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽';
+$str2 = '痢裡里離陸律率立留硫粒隆竜龍侶慮旅虜了亮僚両凌≒霞鰍鐘≒汲汲р癌錫≠もモモbモ';
+$convmap = array(0x0, 0x2FFFF, 0, 0xFFFF);
+echo mb_encode_numericentity($str1, $convmap, "UTF-8")."\n";
+echo mb_encode_numericentity($str2, $convmap, "UTF-8")."\n";
+
+$convmap = array(0xFF, 0x2FFFF, 0, 0xFFFF);
+echo mb_encode_numericentity('abcd邸efg', $convmap, "UTF-8")."\n";
+?>
+--EXPECTF--
+&#161;&#162;&#163;&#164;&#165;&#166;&#167;&#168;&#169;&#170;&#171;&#172;&#173;&#174;&#175;&#176;&#177;&#178;&#179;&#180;&#181;&#182;&#183;&#184;&#185;&#186;&#187;&#188;&#189;&#190;&#191;&#192;&#193;&#194;&#195;&#196;&#197;&#198;&#199;&#200;&#201;&#202;&#203;&#204;&#205;&#206;&#207;&#208;&#209;&#210;&#211;&#212;&#213;&#214;&#215;&#216;&#217;&#218;&#219;&#220;&#221;&#222;&#223;&#224;&#225;&#226;&#227;&#228;&#229;&#230;&#231;&#232;&#233;&#234;&#235;&#236;&#237;&#238;&#239;&#240;&#241;&#242;&#243;&#244;&#245;&#246;&#247;&#248;&#249;&#250;&#251;&#252;&#253;&#254;&#255;
+&#402;&#913;&#914;&#915;&#916;&#917;&#918;&#919;&#920;&#921;&#922;&#923;&#924;&#925;&#926;&#927;&#928;&#929;&#931;&#932;&#933;&#934;&#935;&#936;&#937;&#945;&#946;&#947;&#948;&#949;&#950;&#951;&#952;&#953;&#954;&#955;&#956;&#957;&#958;&#959;&#960;&#961;&#962;&#963;&#964;&#965;&#966;&#967;&#968;&#969;&#977;&#978;&#982;&#8226;&#8230;&#8242;&#8243;&#8254;&#8260;&#8472;&#8465;&#8476;&#8482;&#8501;&#8592;&#8593;&#8594;&#8595;&#8596;&#8629;&#8656;&#8657;&#8658;&#8659;&#8660;&#8704;&#8706;&#8707;&#8709;&#8711;&#8712;&#8713;&#8715;&#8719;&#8721;&#8722;&#8727;&#8730;&#8733;&#8734;&#8736;&#8743;&#8744;&#8745;&#8746;&#8747;&#8756;&#8764;&#8773;&#8776;&#8800;&#8801;&#8804;&#8805;&#8834;&#8835;&#8836;&#8838;&#8839;&#8853;&#8855;&#8869;&#8901;&#8968;&#8969;&#8970;&#8971;&#9001;&#9002;&#9674;&#9824;&#9827;&#9829;&#9830;
+a&#338;b&#339;c&#352;d&#353;e&#8364;fg
diff --git a/ext/mbstring/tests/mb_encoding_aliases.phpt b/ext/mbstring/tests/mb_encoding_aliases.phpt
new file mode 100644
index 0000000..8ef2994
--- /dev/null
+++ b/ext/mbstring/tests/mb_encoding_aliases.phpt
@@ -0,0 +1,45 @@
+--TEST--
+mb_encoding_aliases()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+mb_encoding_aliases();
+$list = mb_encoding_aliases("ASCII");
+sort($list);
+var_dump($list);
+var_dump(mb_encoding_aliases("7bit"));
+var_dump(mb_encoding_aliases("8bit"));
+?>
+--EXPECTF--
+Warning: mb_encoding_aliases() expects exactly 1 parameter, 0 given in %s on line 2
+array(11) {
+ [0]=>
+ string(14) "ANSI_X3.4-1968"
+ [1]=>
+ string(14) "ANSI_X3.4-1986"
+ [2]=>
+ string(7) "IBM-367"
+ [3]=>
+ string(6) "IBM367"
+ [4]=>
+ string(9) "ISO646-US"
+ [5]=>
+ string(16) "ISO_646.irv:1991"
+ [6]=>
+ string(8) "US-ASCII"
+ [7]=>
+ string(5) "cp367"
+ [8]=>
+ string(7) "csASCII"
+ [9]=>
+ string(8) "iso-ir-6"
+ [10]=>
+ string(2) "us"
+}
+array(0) {
+}
+array(1) {
+ [0]=>
+ string(6) "binary"
+}
diff --git a/ext/mbstring/tests/mb_ereg-compat-01.phpt b/ext/mbstring/tests/mb_ereg-compat-01.phpt
new file mode 100644
index 0000000..0937678
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg-compat-01.phpt
@@ -0,0 +1,21 @@
+--TEST--
+mb_ereg() compat test 1
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build");
+?>
+--FILE--
+<?php
+/* (counterpart: ext/standard/tests/reg/004.phpt) */
+ $a="This is a nice and simple string";
+ if (mb_ereg(".*nice and simple.*",$a)) {
+ echo "ok\n";
+ }
+ if (!mb_ereg(".*doesn't exist.*",$a)) {
+ echo "ok\n";
+ }
+?>
+--EXPECT--
+ok
+ok
diff --git a/ext/mbstring/tests/mb_ereg-compat-02.phpt b/ext/mbstring/tests/mb_ereg-compat-02.phpt
new file mode 100644
index 0000000..2f40422
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg-compat-02.phpt
@@ -0,0 +1,25 @@
+--TEST--
+mb_ereg() compat test 2
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build");
+?>
+--FILE--
+<?php
+/* (counterpart: ext/standard/tests/reg/005.phpt) */
+ $a="This is a nice and simple string";
+ echo mb_ereg(".*(is).*(is).*",$a,$registers);
+ echo "\n";
+ echo $registers[0];
+ echo "\n";
+ echo $registers[1];
+ echo "\n";
+ echo $registers[2];
+ echo "\n";
+?>
+--EXPECT--
+32
+This is a nice and simple string
+is
+is
diff --git a/ext/mbstring/tests/mb_ereg.phpt b/ext/mbstring/tests/mb_ereg.phpt
new file mode 100644
index 0000000..8fc5b94
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg.phpt
@@ -0,0 +1,46 @@
+--TEST--
+mb_ereg()
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build");
+?>
+--INI--
+output_handler=
+--FILE--
+<?php
+ mb_regex_set_options( '' );
+
+ $encs = array( 'EUC-JP', 'Shift_JIS', 'SJIS', 'UTF-8' );
+
+ function test_ereg( $test_enc, $pat, $str, $in_enc = 'EUC-JP' ) {
+ mb_regex_encoding( $test_enc );
+ $pat = mb_convert_encoding( $pat, $test_enc, $in_enc );
+ $str = mb_convert_encoding( $str, $test_enc, $in_enc );
+ printf( "(%d)%s\n", mb_ereg( $pat, $str, $reg ), ( is_array( $reg )? bin2hex(mb_convert_encoding( implode( b' ', $reg ), $in_enc, $test_enc )) : '' ) );
+ }
+ function do_tests( $enc ) {
+ test_ereg( $enc, b'abc ([a-z]+) ([a-z]+) ([a-z]+)$', b"abc def ghi jkl" );
+ $pat = b'([a-z]+) ([ あ-か]+)([か-な]+) ([わ-ん]+)$';
+ test_ereg( $enc, $pat, b'abc あおい かこな わゑん' );
+ test_ereg( $enc, $pat, b'mzxfp うおか きか をゐ' );
+ }
+
+ foreach( $encs as $enc ) {
+ do_tests( $enc );
+ }
+?>
+
+--EXPECT--
+(15)6162632064656620676869206a6b6c2064656620676869206a6b6c
+(27)a3e1a3e2a3e320a4a2a4aaa4a420a4aba4b3a4ca20a4efa4f1a4f320a3e1a3e2a3e320a4a2a4aaa4a420a4ab20a4b3a4ca20a4efa4f1a4f3
+(27)a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab20a4ada4ab20a4f2a4f020a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab2020a4ada4ab20a4f2a4f0
+(15)6162632064656620676869206a6b6c2064656620676869206a6b6c
+(27)a3e1a3e2a3e320a4a2a4aaa4a420a4aba4b3a4ca20a4efa4f1a4f320a3e1a3e2a3e320a4a2a4aaa4a420a4ab20a4b3a4ca20a4efa4f1a4f3
+(27)a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab20a4ada4ab20a4f2a4f020a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab2020a4ada4ab20a4f2a4f0
+(15)6162632064656620676869206a6b6c2064656620676869206a6b6c
+(27)a3e1a3e2a3e320a4a2a4aaa4a420a4aba4b3a4ca20a4efa4f1a4f320a3e1a3e2a3e320a4a2a4aaa4a420a4ab20a4b3a4ca20a4efa4f1a4f3
+(27)a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab20a4ada4ab20a4f2a4f020a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab2020a4ada4ab20a4f2a4f0
+(15)6162632064656620676869206a6b6c2064656620676869206a6b6c
+(39)a3e1a3e2a3e320a4a2a4aaa4a420a4aba4b3a4ca20a4efa4f1a4f320a3e1a3e2a3e320a4a2a4aaa4a420a4ab20a4b3a4ca20a4efa4f1a4f3
+(39)a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab20a4ada4ab20a4f2a4f020a3eda3faa3f8a3e6a3f020a4a6a4aaa4ab2020a4ada4ab20a4f2a4f0 \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_ereg1.phpt b/ext/mbstring/tests/mb_ereg1.phpt
new file mode 100644
index 0000000..57884c0
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg1.phpt
@@ -0,0 +1,77 @@
+--TEST--
+mb_ereg() and invalid arguments
+--SKIPIF--
+<?php if (!function_exists("mb_ereg")) print "skip"; ?>
+--FILE--
+<?php
+
+$a = array(
+ array(1,2,3),
+ array("", "", ""),
+ array(array(), 1, ""),
+ array(1, array(), ""),
+ array(1, "", array()),
+ );
+
+foreach ($a as $args) {
+ var_dump(mb_ereg($args[0], $args[1], $args[2]));
+ var_dump($args);
+}
+?>
+===DONE===
+--EXPECTF--
+bool(false)
+array(3) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ [2]=>
+ int(3)
+}
+
+Warning: mb_ereg(): empty pattern in %s on line %d
+bool(false)
+array(3) {
+ [0]=>
+ string(0) ""
+ [1]=>
+ string(0) ""
+ [2]=>
+ string(0) ""
+}
+
+Notice: Array to string conversion in %s on line %d
+bool(false)
+array(3) {
+ [0]=>
+ array(0) {
+ }
+ [1]=>
+ int(1)
+ [2]=>
+ string(0) ""
+}
+
+Warning: mb_ereg() expects parameter 2 to be string, array given in %s on line %d
+bool(false)
+array(3) {
+ [0]=>
+ int(1)
+ [1]=>
+ array(0) {
+ }
+ [2]=>
+ string(0) ""
+}
+bool(false)
+array(3) {
+ [0]=>
+ int(1)
+ [1]=>
+ string(0) ""
+ [2]=>
+ array(0) {
+ }
+}
+===DONE===
diff --git a/ext/mbstring/tests/mb_ereg2.phpt b/ext/mbstring/tests/mb_ereg2.phpt
new file mode 100644
index 0000000..2b79baf
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg2.phpt
@@ -0,0 +1,41 @@
+--TEST--
+mb_ereg() returning matches
+--SKIPIF--
+<?php if (!function_exists("mb_ereg")) print "skip"; ?>
+--FILE--
+<?php
+
+$a = -1; $b = -1; $c = -1;
+mbereg($a, $b, $c);
+var_dump($a, $b, $c);
+
+mberegi($a, $b, $c);
+var_dump($a, $b, $c);
+
+mbereg_search_init($a, $b, $c);
+var_dump($a, $b, $c);
+
+echo "Done\n";
+?>
+--EXPECTF--
+int(-1)
+int(-1)
+array(1) {
+ [0]=>
+ string(2) "-1"
+}
+int(-1)
+int(-1)
+array(1) {
+ [0]=>
+ string(2) "-1"
+}
+
+Warning: mbereg_search_init() expects parameter 3 to be string, array given in %s on line %d
+int(-1)
+int(-1)
+array(1) {
+ [0]=>
+ string(2) "-1"
+}
+Done
diff --git a/ext/mbstring/tests/mb_ereg3.phpt b/ext/mbstring/tests/mb_ereg3.phpt
new file mode 100644
index 0000000..abec3e7
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg3.phpt
@@ -0,0 +1,44 @@
+--TEST--
+mb_ereg() returning matches
+--SKIPIF--
+<?php
+if (!extension_loaded('mbstring')) die('skip mbstring not enabled');
+if (!function_exists("mb_ereg")) print "skip mb_ereg() not available";
+?>
+--FILE--
+<?php
+
+$a = -1; $b = -1; $c = -1;
+mbereg($a, $b, $c);
+var_dump($a, $b, $c);
+
+mberegi($a, $b, $c);
+var_dump($a, $b, $c);
+
+mbereg_search_init($a, $b, $c);
+var_dump($a, $b, $c);
+
+echo "Done\n";
+?>
+--EXPECTF--
+int(-1)
+int(-1)
+array(1) {
+ [0]=>
+ string(2) "-1"
+}
+int(-1)
+int(-1)
+array(1) {
+ [0]=>
+ string(2) "-1"
+}
+
+Warning: mbereg_search_init() expects parameter 3 to be %binary_string_optional%, array given in %s on line %d
+int(-1)
+int(-1)
+array(1) {
+ [0]=>
+ string(2) "-1"
+}
+Done
diff --git a/ext/mbstring/tests/mb_ereg4.phpt b/ext/mbstring/tests/mb_ereg4.phpt
new file mode 100644
index 0000000..8dca435
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg4.phpt
@@ -0,0 +1,44 @@
+--TEST--
+mb_ereg() returning matches
+--SKIPIF--
+<?php
+if (!extension_loaded('mbstring')) die('skip mbstring not enabled');
+if (!function_exists("mb_ereg")) print "skip mb_ereg() not available";
+?>
+--FILE--
+<?php
+
+$a = -1; $b = -1; $c = -1;
+mbereg($a, $b, $c);
+var_dump($a, $b, $c);
+
+mberegi($a, $b, $c);
+var_dump($a, $b, $c);
+
+mbereg_search_init($a, $b, $c);
+var_dump($a, $b, $c);
+
+echo "Done\n";
+?>
+--EXPECTF--
+int(-1)
+int(-1)
+array(1) {
+ [0]=>
+ string(2) "-1"
+}
+int(-1)
+int(-1)
+array(1) {
+ [0]=>
+ string(2) "-1"
+}
+
+Warning: mbereg_search_init() expects parameter 3 to be string, array given in %s on line %d
+int(-1)
+int(-1)
+array(1) {
+ [0]=>
+ string(2) "-1"
+}
+Done
diff --git a/ext/mbstring/tests/mb_ereg_basic.phpt b/ext/mbstring/tests/mb_ereg_basic.phpt
new file mode 100644
index 0000000..db28223
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_basic.phpt
@@ -0,0 +1,117 @@
+--TEST--
+Test mb_ereg() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_ereg(string $pattern, string $string [, array $registers])
+ * Description: Regular expression match for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Test basic functionality of mb_ereg
+ */
+
+echo "*** Testing mb_ereg() : basic functionality ***\n";
+
+if(mb_regex_encoding('utf-8') == true) {
+ echo "Regex encoding set to utf-8\n";
+} else {
+ echo "Could not set regex encoding to utf-8\n";
+}
+$string_ascii = b'This is an English string. 0123456789.';
+$regex_ascii1 = b'(.*is)+.*\.[[:blank:]][0-9]{9}';
+$regex_ascii2 = b'.*is+';
+
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+$regex_mb1 = base64_decode('KOaXpeacrOiqnikuKj8oWzEtOV0rKQ==');
+$regex_mb2 = base64_decode('5LiW55WM');
+
+echo "\n**-- ASCII String --**\n";
+echo "-- Without \$regs argument--\n";
+var_dump(mb_ereg($regex_ascii1, $string_ascii));
+var_dump(mb_ereg($regex_ascii2, $string_ascii));
+echo "--With \$regs argument --\n";
+var_dump(mb_ereg($regex_ascii1, $string_ascii, $regs_ascii1));
+base64_encode_var_dump($regs_ascii1);
+var_dump(mb_ereg($regex_ascii2, $string_ascii, $regs_ascii2));
+base64_encode_var_dump($regs_ascii2);
+
+echo "\n**-- Multibyte String --**\n";
+echo "-- Without \$regs argument --\n";
+var_dump(mb_ereg($regex_mb1, $string_mb));
+var_dump(mb_ereg($regex_mb2, $string_mb));
+echo "-- With \$regs argument --\n";
+var_dump(mb_ereg($regex_mb1, $string_mb, $regs_mb1));
+base64_encode_var_dump($regs_mb1);
+var_dump(mb_ereg($regex_mb2, $string_mb, $regs_mb2));
+var_dump($regs_mb2);
+
+echo "Done";
+
+/**
+ * replicate a var dump of an array but outputted string values are base64 encoded
+ *
+ * @param array $regs
+ */
+function base64_encode_var_dump($regs) {
+ if ($regs) {
+ echo "array(" . count($regs) . ") {\n";
+ foreach ($regs as $key => $value) {
+ echo " [$key]=>\n ";
+ if (is_string($value)) {
+ var_dump(base64_encode($value));
+ } else {
+ var_dump($value);
+ }
+ }
+ echo "}\n";
+ } else {
+ echo "NULL\n";
+ }
+}
+?>
+
+--EXPECT--
+*** Testing mb_ereg() : basic functionality ***
+Regex encoding set to utf-8
+
+**-- ASCII String --**
+-- Without $regs argument--
+int(1)
+int(1)
+--With $regs argument --
+int(36)
+array(2) {
+ [0]=>
+ string(48) "VGhpcyBpcyBhbiBFbmdsaXNoIHN0cmluZy4gMDEyMzQ1Njc4"
+ [1]=>
+ string(24) "VGhpcyBpcyBhbiBFbmdsaXM="
+}
+int(17)
+array(1) {
+ [0]=>
+ string(24) "VGhpcyBpcyBhbiBFbmdsaXM="
+}
+
+**-- Multibyte String --**
+-- Without $regs argument --
+int(1)
+bool(false)
+-- With $regs argument --
+int(35)
+array(3) {
+ [0]=>
+ string(48) "5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzQ="
+ [1]=>
+ string(12) "5pel5pys6Kqe"
+ [2]=>
+ string(8) "MTIzNA=="
+}
+bool(false)
+NULL
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_ereg_error.phpt b/ext/mbstring/tests/mb_ereg_error.phpt
new file mode 100644
index 0000000..3610aea
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_error.phpt
@@ -0,0 +1,49 @@
+--TEST--
+Test mb_ereg() function : error conditions - pass incorrect number of arguments
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_ereg(string $pattern, string $string [, array $registers])
+ * Description: Regular expression match for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Test behaviour of mb_ereg() when passed an incorrcect number of arguments
+ */
+
+echo "*** Testing mb_ereg() : error conditions ***\n";
+
+
+//Test mb_ereg with one more than the expected number of arguments
+echo "\n-- Testing mb_ereg() function with more than expected no. of arguments --\n";
+$pattern = b'string_val';
+$string = b'string_val';
+$registers = array(1, 2);
+$extra_arg = 10;
+var_dump( mb_ereg($pattern, $string, $registers, $extra_arg) );
+
+// Testing mb_ereg with one less than the expected number of arguments
+echo "\n-- Testing mb_ereg() function with less than expected no. of arguments --\n";
+$pattern = b'string_val';
+var_dump( mb_ereg($pattern) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_ereg() : error conditions ***
+
+-- Testing mb_ereg() function with more than expected no. of arguments --
+
+Warning: mb_ereg() expects at most 3 parameters, 4 given in %s on line %d
+bool(false)
+
+-- Testing mb_ereg() function with less than expected no. of arguments --
+
+Warning: mb_ereg() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_ereg_match_basic.phpt b/ext/mbstring/tests/mb_ereg_match_basic.phpt
new file mode 100644
index 0000000..56710a9
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_match_basic.phpt
@@ -0,0 +1,59 @@
+--TEST--
+Test mb_ereg_match() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_match') or die("skip mb_ereg_match() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : bool mb_ereg_match(string $pattern, string $string [,string $option])
+ * Description: Regular expression match for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Test basic functionality of mb_ereg_match
+ */
+
+mb_internal_encoding('UTF-8');
+mb_regex_encoding('UTF-8');
+
+echo "*** Testing mb_ereg_match() : basic functionality ***\n";
+$string_ascii = b'abc def, 0123456789';
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+//will return true as pattern matches from start of string
+echo "\n-- ASCII string 1 --\n";
+var_dump(mb_ereg_match(b'.*def', $string_ascii));
+
+//will return false as pattern would match half way through string
+echo "\n-- ASCII string 2 --\n";
+var_dump(mb_ereg_match(b'def', $string_ascii));
+
+echo "\n-- Multibyte string 1 --\n";
+$regex1 = base64_decode('5pel5pys6KqeKC4qKT9bMS05XSs=');
+var_dump(mb_ereg_match($regex1, $string_mb, b'i'));
+
+echo "\n-- Multibyte string 2 --\n";
+$regex2 = base64_decode('5LiW55WM');
+var_dump(mb_ereg_match($regex2, $string_mb));
+
+echo "Done";
+?>
+--EXPECTF--
+
+*** Testing mb_ereg_match() : basic functionality ***
+
+-- ASCII string 1 --
+bool(true)
+
+-- ASCII string 2 --
+bool(false)
+
+-- Multibyte string 1 --
+bool(true)
+
+-- Multibyte string 2 --
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_ereg_match_error1.phpt b/ext/mbstring/tests/mb_ereg_match_error1.phpt
new file mode 100644
index 0000000..b36c686
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_match_error1.phpt
@@ -0,0 +1,58 @@
+--TEST--
+Test mb_ereg_match() function : error conditions - pass function incorrect number of arguments
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_match') or die("skip mb_ereg_match() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : bool mb_ereg_match(string $pattern, string $string [,string $option])
+ * Description: Regular expression match for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Test mb_ereg_match by passing an incorrect number of arguments
+ */
+
+echo "*** Testing mb_ereg_match() : error conditions ***\n";
+
+
+//Test mb_ereg_match with one more than the expected number of arguments
+echo "\n-- Testing mb_ereg_match() function with more than expected no. of arguments --\n";
+$pattern = b'string_val';
+$string = b'string_val';
+$option = 'string_val';
+$extra_arg = 10;
+var_dump( mb_ereg_match($pattern, $string, $option, $extra_arg) );
+
+// Testing mb_ereg_match with one less than the expected number of arguments
+echo "\n-- Testing mb_ereg_match() function with less than expected no. of arguments --\n";
+$pattern = b'string_val';
+var_dump( mb_ereg_match($pattern) );
+
+// Testing mb_ereg_match with zero arguments
+echo "\n-- Testing mb_ereg_match() function with zero arguments --\n";
+var_dump( mb_ereg_match() );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_ereg_match() : error conditions ***
+
+-- Testing mb_ereg_match() function with more than expected no. of arguments --
+
+Warning: mb_ereg_match() expects at most 3 parameters, 4 given in %s on line %d
+bool(false)
+
+-- Testing mb_ereg_match() function with less than expected no. of arguments --
+
+Warning: mb_ereg_match() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+
+-- Testing mb_ereg_match() function with zero arguments --
+
+Warning: mb_ereg_match() expects at least 2 parameters, 0 given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-01.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-01.phpt
new file mode 100644
index 0000000..ad2c6c1
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-01.phpt
@@ -0,0 +1,15 @@
+--TEST--
+mb_ereg_replace() compat test 1
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* (counterpart: ext/standard/tests/reg/001.phpt) */
+ $a="abc123";
+ echo mb_ereg_replace("123","def",$a);
+?>
+--EXPECT--
+abcdef
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-02.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-02.phpt
new file mode 100644
index 0000000..b5ea121
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-02.phpt
@@ -0,0 +1,15 @@
+--TEST--
+mb_ereg_replace() compat test 2
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* (counterpart: ext/standard/tests/reg/002.phpt) */
+ $a="abc123";
+ echo mb_ereg_replace("123","",$a);
+?>
+--EXPECT--
+abc
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-03.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-03.phpt
new file mode 100644
index 0000000..c02a346
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-03.phpt
@@ -0,0 +1,15 @@
+--TEST--
+mb_ereg_replace() compat test 3
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* (counterpart: ext/standard/tests/reg/003.phpt) */
+ $a="\\'test";
+ echo mb_ereg_replace("\\\\'","'",$a);
+?>
+--EXPECT--
+'test
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-04.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-04.phpt
new file mode 100644
index 0000000..94ff320
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-04.phpt
@@ -0,0 +1,15 @@
+--TEST--
+mb_ereg_replace() compat test 4
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* (counterpart: ext/standard/tests/reg/006.phpt) */
+ $a="This is a nice and simple string";
+ echo mb_ereg_replace("^This","That",$a);
+?>
+--EXPECT--
+That is a nice and simple string
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-05.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-05.phpt
new file mode 100644
index 0000000..f5dae3d
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-05.phpt
@@ -0,0 +1,16 @@
+--TEST--
+mb_ereg_replace() compat test 5
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* (counterpart: ext/standard/tests/reg/007.phpt) */
+ $a="abcd";
+ $b=mb_ereg_replace("abcd","",$a);
+ echo "strlen(\$b)=".strlen($b);
+?>
+--EXPECT--
+strlen($b)=0
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-06.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-06.phpt
new file mode 100644
index 0000000..8c84dc1
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-06.phpt
@@ -0,0 +1,14 @@
+--TEST--
+mb_ereg_replace() compat test 6
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* (counterpart: ext/standard/tests/reg/008.phpt) */
+ echo mb_ereg_replace("([a-z]*)([-=+|]*)([0-9]+)","\\3 \\1 \\2\n","abc+-|=123");
+?>
+--EXPECT--
+123 abc +-|=
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-07.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-07.phpt
new file mode 100644
index 0000000..e390655
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-07.phpt
@@ -0,0 +1,15 @@
+--TEST--
+mb_ereg_replace() compat test 7
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* (counterpart: ext/standard/tests/reg/010.phpt) */
+ $a="abc122222222223";
+ echo mb_ereg_replace("1(2*)3","\\1def\\1",$a);
+?>
+--EXPECT--
+abc2222222222def2222222222
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-08.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-08.phpt
new file mode 100644
index 0000000..5ccc9fd
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-08.phpt
@@ -0,0 +1,15 @@
+--TEST--
+mb_ereg_replace() compat test 8
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* (counterpart: ext/standard/tests/reg/011.phpt) */
+ $a="abc123";
+ echo mb_ereg_replace("123","def\\0ghi",$a);
+?>
+--EXPECT--
+abcdef123ghi
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-09.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-09.phpt
new file mode 100644
index 0000000..bef8be1
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-09.phpt
@@ -0,0 +1,15 @@
+--TEST--
+mb_ereg_replace() compat test 9
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* (counterpart: ext/standard/tests/reg/012.phpt) */
+ $a="abc123";
+ echo mb_ereg_replace("123",'def\1ghi',$a);
+?>
+--EXPECT--
+abcdef\1ghi
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-10.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-10.phpt
new file mode 100644
index 0000000..ac80a4e
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-10.phpt
@@ -0,0 +1,15 @@
+--TEST--
+mb_ereg_replace() compat test 10
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* (counterpart: ext/standard/tests/reg/013.phpt) */
+ $a="abc123";
+ echo mb_ereg_replace("123","def\\g\\\\hi\\",$a);
+?>
+--EXPECT--
+abcdef\g\\hi\
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-11.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-11.phpt
new file mode 100644
index 0000000..7ae3edf
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-11.phpt
@@ -0,0 +1,15 @@
+--TEST--
+mb_ereg_replace() compat test 11
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* (counterpart: ext/standard/tests/reg/014.phpt) */
+ $a="a\\2bxc";
+ echo mb_ereg_replace("a(.*)b(.*)c","\\1",$a);
+?>
+--EXPECT--
+\2
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-12.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-12.phpt
new file mode 100644
index 0000000..53bc51e
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-12.phpt
@@ -0,0 +1,14 @@
+--TEST--
+mb_ereg_replace() compat test 12
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* (counterpart: ext/standard/tests/reg/015.phpt) */
+ echo mb_ereg_replace("^","z","abc123");
+?>
+--EXPECT--
+zabc123
diff --git a/ext/mbstring/tests/mb_ereg_replace-compat-13.phpt b/ext/mbstring/tests/mb_ereg_replace-compat-13.phpt
new file mode 100644
index 0000000..2975ab7
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace-compat-13.phpt
@@ -0,0 +1,14 @@
+--TEST--
+mb_ereg_replace() compat test 13
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* (counterpart: ext/standard/tests/reg/016.phpt) */
+ echo mb_ereg_replace('\?',"abc","?123?");
+?>
+--EXPECT--
+abc123abc
diff --git a/ext/mbstring/tests/mb_ereg_replace.phpt b/ext/mbstring/tests/mb_ereg_replace.phpt
new file mode 100644
index 0000000..9413da8
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace.phpt
@@ -0,0 +1,18 @@
+--TEST--
+mb_ereg_replace()
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+ mb_regex_set_options( '' );
+ print mb_ereg_replace( ' ', '-', 'a b c d e' )."\n";
+ print mb_ereg_replace( '([a-z]+)','[\\1]', 'abc def ghi' );
+?>
+
+--EXPECT--
+a-b-c-d-e
+[abc] [def] [ghi]
+
diff --git a/ext/mbstring/tests/mb_ereg_replace_basic.phpt b/ext/mbstring/tests/mb_ereg_replace_basic.phpt
new file mode 100644
index 0000000..5a07004
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace_basic.phpt
@@ -0,0 +1,62 @@
+--TEST--
+Test mb_ereg_replace() function : basic
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_ereg_replace(string $pattern, string $replacement,
+ * string $string [, string o$ption])
+ * Description: Replace regular expression for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Test Basic Functionality of mb_ereg_replace()
+ */
+
+echo "*** Testing mb_ereg_replace() : basic functionality ***\n";
+
+mb_internal_encoding('UTF-8');
+mb_regex_encoding('UTF-8');
+
+$string_ascii = b'abc def';
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+echo "\n-- ASCII string 1 --\n";
+$result_1 = mb_ereg_replace(b'(.*)def', b'\\1 123', $string_ascii);
+var_dump(bin2hex($result_1));
+
+echo "\n-- ASCII string 2 --\n";
+$result_2 = mb_ereg_replace(b'123', b'abc', $string_ascii);
+var_dump(bin2hex($result_2));
+
+echo "\n-- Multibyte string 1 --\n";
+$regex1 = base64_decode('KOaXpeacrOiqnikuKj8oWzEtOV0rKQ=='); //Japanese regex in UTF-8
+$result_3 = mb_ereg_replace($regex1, b'\\1_____\\2', $string_mb);
+var_dump(bin2hex($result_3));
+
+echo "\n-- Multibyte string 2 --\n";
+$regex2 = base64_decode('5LiW55WM');
+$result_4 = mb_ereg_replace($regex2, b'_____', $string_mb);
+var_dump(bin2hex($result_4));
+
+echo "Done";
+?>
+--EXPECT--
+*** Testing mb_ereg_replace() : basic functionality ***
+
+-- ASCII string 1 --
+string(16) "6162632020313233"
+
+-- ASCII string 2 --
+string(14) "61626320646566"
+
+-- Multibyte string 1 --
+string(72) "e697a5e69cace8aa9e5f5f5f5f5f31323334efbc95efbc96efbc97efbc98efbc99e38082"
+
+-- Multibyte string 2 --
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_ereg_replace_callback.phpt b/ext/mbstring/tests/mb_ereg_replace_callback.phpt
new file mode 100644
index 0000000..98a3809
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace_callback.phpt
@@ -0,0 +1,15 @@
+--TEST--
+mb_ereg_replace_callback()
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+function_exists('mb_ereg_replace_callback') or die("skip mb_ereg_replace_callback() is not available in this build");
+?>
+--FILE--
+<?php
+$str = 'abc 123 #",; $foo';
+echo mb_ereg_replace_callback('(\S+)', function($m){return $m[1].'('.strlen($m[1]).')';}, $str);
+?>
+--EXPECT--
+abc(3) 123(3) #",;(4) $foo(4)
+
diff --git a/ext/mbstring/tests/mb_ereg_replace_error.phpt b/ext/mbstring/tests/mb_ereg_replace_error.phpt
new file mode 100644
index 0000000..9413936
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace_error.phpt
@@ -0,0 +1,47 @@
+--TEST--
+Test mb_ereg_replace() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto string mb_ereg_replace(string pattern, string replacement, string string [, string option])
+ * Description: Replace regular expression for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_ereg_replace() : error conditions ***\n";
+
+//Test mb_ereg_replace with one more than the expected number of arguments
+echo "\n-- Testing mb_ereg_replace() function with more than expected no. of arguments --\n";
+$pattern = b'[a-k]';
+$replacement = b'1';
+$string = b'string_val';
+$option = '';
+$extra_arg = 10;
+var_dump( mb_ereg_replace($pattern, $replacement, $string, $option, $extra_arg) );
+
+// Testing mb_ereg_replace with one less than the expected number of arguments
+echo "\n-- Testing mb_ereg_replace() function with less than expected no. of arguments --\n";
+$pattern = b'string_val';
+$replacement = b'string_val';
+var_dump( mb_ereg_replace($pattern, $replacement) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_ereg_replace() : error conditions ***
+
+-- Testing mb_ereg_replace() function with more than expected no. of arguments --
+
+Warning: mb_ereg_replace() expects at most 4 parameters, 5 given in %s on line %d
+bool(false)
+
+-- Testing mb_ereg_replace() function with less than expected no. of arguments --
+
+Warning: mb_ereg_replace() expects at least 3 parameters, 2 given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_ereg_replace_variation1.phpt b/ext/mbstring/tests/mb_ereg_replace_variation1.phpt
new file mode 100644
index 0000000..3e24979
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace_variation1.phpt
@@ -0,0 +1,170 @@
+--TEST--
+Test mb_ereg_replace() function : usage variations - <type here specifics of this variation>
+--INI--
+error_reporting=E_ALL & ~E_NOTICE
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto string mb_ereg_replace(string pattern, string replacement, string string [, string option])
+ * Description: Replace regular expression for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_ereg_replace() : usage variations ***\n";
+
+// Initialise function arguments not being substituted (if any)
+$replacement = 'string_val';
+$string = 'string_val';
+$option = '';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+);
+
+// loop through each element of the array for pattern
+
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_ereg_replace($input, $replacement, $string, $option) );
+ $iterator++;
+};
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_ereg_replace() : usage variations ***
+
+-- Iteration 1 --
+string(10) "string_val"
+
+-- Iteration 2 --
+string(10) "string_val"
+
+-- Iteration 3 --
+string(10) "string_val"
+
+-- Iteration 4 --
+string(10) "string_val"
+
+-- Iteration 5 --
+string(10) "string_val"
+
+-- Iteration 6 --
+string(10) "string_val"
+
+-- Iteration 7 --
+string(10) "string_val"
+
+-- Iteration 8 --
+string(10) "string_val"
+
+-- Iteration 9 --
+string(10) "string_val"
+
+-- Iteration 10 --
+string(10) "string_val"
+
+-- Iteration 11 --
+string(10) "string_val"
+
+-- Iteration 12 --
+string(10) "string_val"
+
+-- Iteration 13 --
+string(10) "string_val"
+
+-- Iteration 14 --
+string(10) "string_val"
+
+-- Iteration 15 --
+string(10) "string_val"
+
+-- Iteration 16 --
+string(120) "string_valsstring_valtstring_valrstring_valistring_valnstring_valgstring_val_string_valvstring_valastring_vallstring_val"
+
+-- Iteration 17 --
+string(120) "string_valsstring_valtstring_valrstring_valistring_valnstring_valgstring_val_string_valvstring_valastring_vallstring_val"
+
+-- Iteration 18 --
+string(10) "string_val"
+
+-- Iteration 19 --
+string(10) "string_val"
+
+-- Iteration 20 --
+string(10) "string_val"
+
+-- Iteration 21 --
+string(10) "string_val"
+
+-- Iteration 22 --
+string(10) "string_val"
+
+-- Iteration 23 --
+string(10) "string_val"
+Done
diff --git a/ext/mbstring/tests/mb_ereg_replace_variation2.phpt b/ext/mbstring/tests/mb_ereg_replace_variation2.phpt
new file mode 100644
index 0000000..37a89fc
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace_variation2.phpt
@@ -0,0 +1,178 @@
+--TEST--
+Test mb_ereg_replace() function : usage variations
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto string mb_ereg_replace(string pattern, string replacement, string string [, string option])
+ * Description: Replace regular expression for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_ereg_replace() : usage variations ***\n";
+
+// Initialise function arguments not being substituted (if any)
+$pattern = '[a-z]';
+$string = 'string_val';
+$option = '';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of the array for pattern
+
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_ereg_replace($pattern, $input, $string, $option) );
+ $iterator++;
+};
+fclose($fp);
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_ereg_replace() : usage variations ***
+
+-- Iteration 1 --
+string(10) "000000_000"
+
+-- Iteration 2 --
+string(10) "111111_111"
+
+-- Iteration 3 --
+string(46) "123451234512345123451234512345_123451234512345"
+
+-- Iteration 4 --
+string(46) "-2345-2345-2345-2345-2345-2345_-2345-2345-2345"
+
+-- Iteration 5 --
+string(37) "10.510.510.510.510.510.5_10.510.510.5"
+
+-- Iteration 6 --
+string(46) "-10.5-10.5-10.5-10.5-10.5-10.5_-10.5-10.5-10.5"
+
+-- Iteration 7 --
+string(109) "123456789000123456789000123456789000123456789000123456789000123456789000_123456789000123456789000123456789000"
+
+-- Iteration 8 --
+string(118) "1.23456789E-91.23456789E-91.23456789E-91.23456789E-91.23456789E-91.23456789E-9_1.23456789E-91.23456789E-91.23456789E-9"
+
+-- Iteration 9 --
+string(28) "0.50.50.50.50.50.5_0.50.50.5"
+
+-- Iteration 10 --
+string(1) "_"
+
+-- Iteration 11 --
+string(1) "_"
+
+-- Iteration 12 --
+string(10) "111111_111"
+
+-- Iteration 13 --
+string(1) "_"
+
+-- Iteration 14 --
+string(10) "111111_111"
+
+-- Iteration 15 --
+string(1) "_"
+
+-- Iteration 16 --
+string(1) "_"
+
+-- Iteration 17 --
+string(1) "_"
+
+-- Iteration 18 --
+string(46) "UTF-8UTF-8UTF-8UTF-8UTF-8UTF-8_UTF-8UTF-8UTF-8"
+
+-- Iteration 19 --
+string(46) "UTF-8UTF-8UTF-8UTF-8UTF-8UTF-8_UTF-8UTF-8UTF-8"
+
+-- Iteration 20 --
+string(46) "UTF-8UTF-8UTF-8UTF-8UTF-8UTF-8_UTF-8UTF-8UTF-8"
+
+-- Iteration 21 --
+string(46) "UTF-8UTF-8UTF-8UTF-8UTF-8UTF-8_UTF-8UTF-8UTF-8"
+
+-- Iteration 22 --
+string(1) "_"
+
+-- Iteration 23 --
+string(1) "_"
+
+-- Iteration 24 --
+
+Warning: mb_ereg_replace() expects parameter 2 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_ereg_replace_variation3.phpt b/ext/mbstring/tests/mb_ereg_replace_variation3.phpt
new file mode 100644
index 0000000..09da6cd
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace_variation3.phpt
@@ -0,0 +1,179 @@
+--TEST--
+Test mb_ereg_replace() function : usage variations
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto string mb_ereg_replace(string pattern, string replacement, string string [, string option])
+ * Description: Replace regular expression for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_ereg_replace() : usage variations ***\n";
+
+// Initialise function arguments not being substituted (if any)
+$pattern = '[a-z]';
+$replacement = 'string_val';
+$option = '';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of the array for pattern
+
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_ereg_replace($pattern, $replacement, $input, $option) );
+ $iterator++;
+};
+
+fclose($fp);
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_ereg_replace() : usage variations ***
+
+-- Iteration 1 --
+string(1) "0"
+
+-- Iteration 2 --
+string(1) "1"
+
+-- Iteration 3 --
+string(5) "12345"
+
+-- Iteration 4 --
+string(5) "-2345"
+
+-- Iteration 5 --
+string(4) "10.5"
+
+-- Iteration 6 --
+string(5) "-10.5"
+
+-- Iteration 7 --
+string(12) "123456789000"
+
+-- Iteration 8 --
+string(13) "1.23456789E-9"
+
+-- Iteration 9 --
+string(3) "0.5"
+
+-- Iteration 10 --
+string(0) ""
+
+-- Iteration 11 --
+string(0) ""
+
+-- Iteration 12 --
+string(1) "1"
+
+-- Iteration 13 --
+string(0) ""
+
+-- Iteration 14 --
+string(1) "1"
+
+-- Iteration 15 --
+string(0) ""
+
+-- Iteration 16 --
+string(0) ""
+
+-- Iteration 17 --
+string(0) ""
+
+-- Iteration 18 --
+string(5) "UTF-8"
+
+-- Iteration 19 --
+string(5) "UTF-8"
+
+-- Iteration 20 --
+string(5) "UTF-8"
+
+-- Iteration 21 --
+string(5) "UTF-8"
+
+-- Iteration 22 --
+string(0) ""
+
+-- Iteration 23 --
+string(0) ""
+
+-- Iteration 24 --
+
+Warning: mb_ereg_replace() expects parameter 3 to be string, resource given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_ereg_replace_variation4.phpt b/ext/mbstring/tests/mb_ereg_replace_variation4.phpt
new file mode 100644
index 0000000..05b4f60
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_replace_variation4.phpt
@@ -0,0 +1,179 @@
+--TEST--
+Test mb_ereg_replace() function : usage variations
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto string mb_ereg_replace(string pattern, string replacement, string string [, string option])
+ * Description: Replace regular expression for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_ereg_replace() : usage variations ***\n";
+
+// Initialise function arguments not being substituted (if any)
+$pattern = '[a-k]';
+$replacement = '1';
+$string = 'string_val';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of the array for pattern
+
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_ereg_replace($pattern, $replacement, $string, $input) );
+ $iterator++;
+};
+
+fclose($fp);
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_ereg_replace() : usage variations ***
+
+-- Iteration 1 --
+string(10) "str1n1_v1l"
+
+-- Iteration 2 --
+string(10) "str1n1_v1l"
+
+-- Iteration 3 --
+string(10) "str1n1_v1l"
+
+-- Iteration 4 --
+string(10) "str1n1_v1l"
+
+-- Iteration 5 --
+string(10) "str1n1_v1l"
+
+-- Iteration 6 --
+string(10) "str1n1_v1l"
+
+-- Iteration 7 --
+string(10) "str1n1_v1l"
+
+-- Iteration 8 --
+string(10) "str1n1_v1l"
+
+-- Iteration 9 --
+string(10) "str1n1_v1l"
+
+-- Iteration 10 --
+string(10) "str1n1_v1l"
+
+-- Iteration 11 --
+string(10) "str1n1_v1l"
+
+-- Iteration 12 --
+string(10) "str1n1_v1l"
+
+-- Iteration 13 --
+string(10) "str1n1_v1l"
+
+-- Iteration 14 --
+string(10) "str1n1_v1l"
+
+-- Iteration 15 --
+string(10) "str1n1_v1l"
+
+-- Iteration 16 --
+string(10) "str1n1_v1l"
+
+-- Iteration 17 --
+string(10) "str1n1_v1l"
+
+-- Iteration 18 --
+string(10) "str1n1_v1l"
+
+-- Iteration 19 --
+string(10) "str1n1_v1l"
+
+-- Iteration 20 --
+string(10) "str1n1_v1l"
+
+-- Iteration 21 --
+string(10) "str1n1_v1l"
+
+-- Iteration 22 --
+string(10) "str1n1_v1l"
+
+-- Iteration 23 --
+string(10) "str1n1_v1l"
+
+-- Iteration 24 --
+
+Warning: mb_ereg_replace() expects parameter 4 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_ereg_search.phpt b/ext/mbstring/tests/mb_ereg_search.phpt
new file mode 100644
index 0000000..4df54c4
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_search.phpt
@@ -0,0 +1,39 @@
+--TEST--
+Testing mb_ereg_search() function
+--SKIPIF--
+<?php
+if (!extension_loaded('mbstring')) die('skip mbstring not enabled');
+function_exists('mb_ereg_search') or die("skip mb_ereg_search() is not available in this build");
+?>
+--FILE--
+<?php
+ $str = "筝abc + abc ?!鐚鐚絖膃鐚china string";
+
+ $reg = "\w+";
+
+ mb_regex_encoding("UTF-8");
+
+ mb_ereg_search_init($str, $reg);
+ $r = mb_ereg_search();
+
+ if(!$r)
+ {
+ echo "null\n";
+ }
+ else
+ {
+ $r = mb_ereg_search_getregs(); //get first result
+ do
+ {
+ var_dump($r[0]);
+ $r = mb_ereg_search_regs();//get next result
+ }
+ while($r);
+ }
+?>
+--EXPECT--
+string(9) "筝abc"
+string(3) "abc"
+string(6) "絖膃"
+string(5) "china"
+string(6) "string"
diff --git a/ext/mbstring/tests/mb_ereg_search_pos.phpt b/ext/mbstring/tests/mb_ereg_search_pos.phpt
new file mode 100644
index 0000000..08fcd7f
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_search_pos.phpt
@@ -0,0 +1,31 @@
+--TEST--
+mb_ereg_search_pos() # a test for the basic function of mb_ereg_search_pos
+--SKIPIF--
+<?php
+if (!extension_loaded('mbstring')) die('skip mbstring not enabled');
+?>
+--FILE--
+<?php
+mb_regex_encoding('iso-8859-1');
+$test_str = 'Itrntinliztin';
+
+if(mb_ereg_search_init($test_str))
+{
+ $val=mb_ereg_search_pos("ntin");
+
+ var_dump($val);
+
+}
+else{
+ var_dump("false");
+}
+?>
+--EXPECT--
+array(2) {
+ [0]=>
+ int(5)
+ [1]=>
+ int(6)
+}
+
+
diff --git a/ext/mbstring/tests/mb_ereg_search_regs.phpt b/ext/mbstring/tests/mb_ereg_search_regs.phpt
new file mode 100644
index 0000000..2cc55a7
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_search_regs.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Funktionstest mb_ereg_search_regs()
+--SKIPIF--
+<?php
+if (!extension_loaded('mbstring')) die('skip mbstring not enabled');
+function_exists('mb_ereg_search_regs') or die("skip mb_ereg_search_regs() not available");
+?>
+--FILE--
+<?php
+ // homepage:
+
+ //$mb_str = "仍亠从亠亶 个亠亟仂仂于亳 舒舒仄舒亰仂于 弍仍 仍亠从亠亶 个亠亟仂仂于亳 舒舒仄舒亰仂于 弍仍 kyrillischer string string";
+ // = "Lorem ipsum dolor sit amet"
+
+ mb_ereg_search_init("仍亠从亠亶 个亠亟仂仂于亳 舒舒仄舒亰仂于 弍仍 仍亠从亠亶 个亠亟仂仂于亳 舒舒仄舒亰仂于 弍仍");
+
+
+
+ $match= mb_ereg_search_regs("仂于");
+ var_dump($match);
+
+
+?>
+--EXPECT--
+array(1) {
+ [0]=>
+ string(4) "仂于"
+}
diff --git a/ext/mbstring/tests/mb_ereg_search_xxx.phpt b/ext/mbstring/tests/mb_ereg_search_xxx.phpt
new file mode 100644
index 0000000..c2c0b84
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_search_xxx.phpt
@@ -0,0 +1,82 @@
+--TEST--
+mb_ereg_search() stuff
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+function_exists('mb_ereg_search') or die("skip\n");
+?>
+--INI--
+output_handler=
+--FILE--
+<?php
+ mb_regex_set_options( '' );
+
+ $encs = array( 'EUC-JP', 'Shift_JIS', 'SJIS', 'UTF-8' );
+
+ function test_search( $test_enc, $str, $look_for, $opt, $in_enc = 'EUC-JP' ) {
+ mb_regex_encoding( $test_enc );
+ $str = mb_convert_encoding( $str, $test_enc, $in_enc );
+ $look_for = mb_convert_encoding( $look_for, $test_enc, $in_enc );
+ mb_ereg_search_init( $str, $look_for, $opt );
+ while ( mb_ereg_search_pos() ) {
+ $regs = mb_ereg_search_getregs();
+ array_shift( $regs );
+ printf( "(%s) (%d) %s\n", $test_enc, mb_ereg_search_getpos(), mb_convert_encoding( ( is_array( $regs ) ? implode( '-', $regs ): '' ), $in_enc, $test_enc ) );
+ }
+ }
+ function do_tests( $enc, $opt ) {
+ test_search( $enc, "∀・ ・∀\n", ' (・?∀・?)[[:space:]]', $opt );
+ test_search( $enc, 'abcde abdeabcf anvfabc odu abcd ', '(ab[a-z]+)', $opt );
+ }
+
+ foreach( $encs as $enc ) {
+ do_tests( $enc, '' );
+ do_tests( $enc, 'x' );
+ }
+?>
+
+--EXPECT--
+(EUC-JP) (10) ・∀
+(EUC-JP) (5) abcde
+(EUC-JP) (14) abdeabcf
+(EUC-JP) (22) abc
+(EUC-JP) (31) abcd
+(EUC-JP) (5) ∀・
+(EUC-JP) (10) ・∀
+(EUC-JP) (5) abcde
+(EUC-JP) (14) abdeabcf
+(EUC-JP) (22) abc
+(EUC-JP) (31) abcd
+(Shift_JIS) (10) ・∀
+(Shift_JIS) (5) abcde
+(Shift_JIS) (14) abdeabcf
+(Shift_JIS) (22) abc
+(Shift_JIS) (31) abcd
+(Shift_JIS) (5) ∀・
+(Shift_JIS) (10) ・∀
+(Shift_JIS) (5) abcde
+(Shift_JIS) (14) abdeabcf
+(Shift_JIS) (22) abc
+(Shift_JIS) (31) abcd
+(SJIS) (10) ・∀
+(SJIS) (5) abcde
+(SJIS) (14) abdeabcf
+(SJIS) (22) abc
+(SJIS) (31) abcd
+(SJIS) (5) ∀・
+(SJIS) (10) ・∀
+(SJIS) (5) abcde
+(SJIS) (14) abdeabcf
+(SJIS) (22) abc
+(SJIS) (31) abcd
+(UTF-8) (14) ・∀
+(UTF-8) (5) abcde
+(UTF-8) (14) abdeabcf
+(UTF-8) (22) abc
+(UTF-8) (31) abcd
+(UTF-8) (7) ∀・
+(UTF-8) (14) ・∀
+(UTF-8) (5) abcde
+(UTF-8) (14) abdeabcf
+(UTF-8) (22) abc
+(UTF-8) (31) abcd
diff --git a/ext/mbstring/tests/mb_ereg_variation1.phpt b/ext/mbstring/tests/mb_ereg_variation1.phpt
new file mode 100644
index 0000000..1f4419d
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_variation1.phpt
@@ -0,0 +1,165 @@
+--TEST--
+Test mb_ereg() function : usage variations - pass different data types to $pattern argument
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_ereg(string $pattern, string $string [, array $registers])
+ * Description: Regular expression match for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Pass different data types to $pattern argument
+ */
+
+echo "*** Testing mb_ereg() : usage variations ***\n";
+
+// Initialise function arguments not being substituted (if any)
+$string = 'string value';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $pattern argument
+$inputs = array(
+
+// int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+// float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+// boolean data
+/*10*/ true,
+ TRUE,
+
+// string data
+/*12*/ "string",
+ 'string',
+ $heredoc,
+
+// object data
+/*15*/ new classA(),
+
+// resource variable
+/*16*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_ereg()
+$iterator = 1;
+foreach($inputs as $input) {
+ if (@is_array($regs)){
+ $regs = null;
+ }
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_ereg($input, $string, $regs) );
+ var_dump($regs);
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_ereg() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+NULL
+
+-- Iteration 2 --
+bool(false)
+NULL
+
+-- Iteration 3 --
+bool(false)
+NULL
+
+-- Iteration 4 --
+bool(false)
+NULL
+
+-- Iteration 5 --
+bool(false)
+NULL
+
+-- Iteration 6 --
+bool(false)
+NULL
+
+-- Iteration 7 --
+bool(false)
+NULL
+
+-- Iteration 8 --
+bool(false)
+NULL
+
+-- Iteration 9 --
+bool(false)
+NULL
+
+-- Iteration 10 --
+bool(false)
+NULL
+
+-- Iteration 11 --
+bool(false)
+NULL
+
+-- Iteration 12 --
+int(6)
+array(1) {
+ [0]=>
+ string(6) "string"
+}
+
+-- Iteration 13 --
+int(6)
+array(1) {
+ [0]=>
+ string(6) "string"
+}
+
+-- Iteration 14 --
+bool(false)
+NULL
+
+-- Iteration 15 --
+bool(false)
+NULL
+
+-- Iteration 16 --
+bool(false)
+NULL
+Done
diff --git a/ext/mbstring/tests/mb_ereg_variation2.phpt b/ext/mbstring/tests/mb_ereg_variation2.phpt
new file mode 100644
index 0000000..d85c8bd
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_variation2.phpt
@@ -0,0 +1,216 @@
+--TEST--
+Test mb_ereg() function : usage variations - pass different data types to $string arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_ereg(string $pattern, string $string [, array $registers])
+ * Description: Regular expression match for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Test behaviour of mb_ereg() when passed different data types as $string arg
+ */
+
+echo "*** Testing mb_ereg() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$pattern = 'str';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $string argument
+$inputs = array(
+
+// int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+// float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+// null data
+/*10*/ NULL,
+ null,
+
+// boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+// empty data
+/*16*/ "",
+ '',
+
+// string data
+/*18*/ "string",
+ 'string',
+ $heredoc,
+
+// object data
+/*21*/ new classA(),
+
+// undefined data
+/*22*/ @$undefined_var,
+
+// unset data
+/*23*/ @$unset_var,
+
+// resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_ereg()
+$iterator = 1;
+foreach($inputs as $input) {
+ if (@is_array($regs)){
+ $regs = null;
+ }
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_ereg($pattern, $input, $regs) );
+ var_dump($regs);
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+
+?>
+
+--EXPECTF--
+*** Testing mb_ereg() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+NULL
+
+-- Iteration 2 --
+bool(false)
+NULL
+
+-- Iteration 3 --
+bool(false)
+NULL
+
+-- Iteration 4 --
+bool(false)
+NULL
+
+-- Iteration 5 --
+bool(false)
+NULL
+
+-- Iteration 6 --
+bool(false)
+NULL
+
+-- Iteration 7 --
+bool(false)
+NULL
+
+-- Iteration 8 --
+bool(false)
+NULL
+
+-- Iteration 9 --
+bool(false)
+NULL
+
+-- Iteration 10 --
+bool(false)
+NULL
+
+-- Iteration 11 --
+bool(false)
+NULL
+
+-- Iteration 12 --
+bool(false)
+NULL
+
+-- Iteration 13 --
+bool(false)
+NULL
+
+-- Iteration 14 --
+bool(false)
+NULL
+
+-- Iteration 15 --
+bool(false)
+NULL
+
+-- Iteration 16 --
+bool(false)
+NULL
+
+-- Iteration 17 --
+bool(false)
+NULL
+
+-- Iteration 18 --
+int(3)
+array(1) {
+ [0]=>
+ string(3) "str"
+}
+
+-- Iteration 19 --
+int(3)
+array(1) {
+ [0]=>
+ string(3) "str"
+}
+
+-- Iteration 20 --
+bool(false)
+NULL
+
+-- Iteration 21 --
+bool(false)
+NULL
+
+-- Iteration 22 --
+bool(false)
+NULL
+
+-- Iteration 23 --
+bool(false)
+NULL
+
+-- Iteration 24 --
+
+Warning: mb_ereg() expects parameter 2 to be string, resource given in %s on line %d
+bool(false)
+NULL
+Done
diff --git a/ext/mbstring/tests/mb_ereg_variation3.phpt b/ext/mbstring/tests/mb_ereg_variation3.phpt
new file mode 100644
index 0000000..d30ddc7
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_variation3.phpt
@@ -0,0 +1,159 @@
+--TEST--
+Test mb_ereg() function : usage variations - pass different character classes to see they match correctly
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_ereg(string $pattern, string $string [, array $registers])
+ * Description: Regular expression match for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * test that mb_ereg can match correctly when passed different character classes.
+ */
+
+echo "*** Testing mb_ereg() : variation ***\n";
+
+
+mb_regex_encoding('utf-8'); // have to set otherwise won't match $mb properly
+$mb = base64_decode('5pel5pys6Kqe');
+$character_classes = array (b'aB1' => b'[[:alnum:]]+', /*1*/
+ b'aBcD' => b'[[:alpha:]]+',
+ b'ab/=' => b'[[:ascii:]]+',
+ b" \t" => b'[[:blank:]]+',
+ b'234' => b'[[:digit:]]+', /*5*/
+ "$mb" => b'[[:graph:]]+',
+ b'fjds' => b'[[:lower:]]+',
+ b"$mb\t" => b'[[:print:]]+',
+ b'.!"*@' => b'[[:punct:]]+',
+ b"\t" => b'[[:space:]]+', /*10*/
+ b'IDSJV' => b'[[:upper:]]+',
+ b'3b5D' => b'[[:xdigit:]]+'); /*12*/
+
+$iterator = 1;
+foreach($character_classes as $string => $pattern) {
+ if (is_array(@$regs)) {
+ $regs = null;
+ }
+ // make sure any multibyte output is in base 64
+ echo "\n-- Iteration $iterator --\n";
+ var_dump(mb_ereg($pattern, $string, $regs));
+ base64_encode_var_dump($regs);
+ $iterator++;
+}
+/**
+ * replicate a var dump of an array but outputted string values are base64 encoded
+ *
+ * @param array $regs
+ */
+function base64_encode_var_dump($regs) {
+ if ($regs) {
+ echo "array(" . count($regs) . ") {\n";
+ foreach ($regs as $key => $value) {
+ echo " [$key]=>\n ";
+ if (is_string($value)) {
+ var_dump(base64_encode($value));
+ } else {
+ var_dump($value);
+ }
+ }
+ echo "}\n";
+ } else {
+ echo "NULL\n";
+ }
+}
+
+echo "Done";
+?>
+
+--EXPECT--
+*** Testing mb_ereg() : variation ***
+
+-- Iteration 1 --
+int(3)
+array(1) {
+ [0]=>
+ string(4) "YUIx"
+}
+
+-- Iteration 2 --
+int(4)
+array(1) {
+ [0]=>
+ string(8) "YUJjRA=="
+}
+
+-- Iteration 3 --
+int(4)
+array(1) {
+ [0]=>
+ string(8) "YWIvPQ=="
+}
+
+-- Iteration 4 --
+int(2)
+array(1) {
+ [0]=>
+ string(4) "IAk="
+}
+
+-- Iteration 5 --
+int(3)
+array(1) {
+ [0]=>
+ string(4) "MjM0"
+}
+
+-- Iteration 6 --
+int(9)
+array(1) {
+ [0]=>
+ string(12) "5pel5pys6Kqe"
+}
+
+-- Iteration 7 --
+int(4)
+array(1) {
+ [0]=>
+ string(8) "Zmpkcw=="
+}
+
+-- Iteration 8 --
+int(10)
+array(1) {
+ [0]=>
+ string(16) "5pel5pys6KqeCQ=="
+}
+
+-- Iteration 9 --
+int(5)
+array(1) {
+ [0]=>
+ string(8) "LiEiKkA="
+}
+
+-- Iteration 10 --
+int(1)
+array(1) {
+ [0]=>
+ string(4) "CQ=="
+}
+
+-- Iteration 11 --
+int(5)
+array(1) {
+ [0]=>
+ string(8) "SURTSlY="
+}
+
+-- Iteration 12 --
+int(4)
+array(1) {
+ [0]=>
+ string(8) "M2I1RA=="
+}
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_ereg_variation4.phpt b/ext/mbstring/tests/mb_ereg_variation4.phpt
new file mode 100644
index 0000000..788d4fe
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_variation4.phpt
@@ -0,0 +1,149 @@
+--TEST--
+Test mb_ereg() function : usage variations - pass different character classes as pattern for multibyte string
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_ereg(string $pattern, string $string [, array $registers])
+ * Description: Regular expression match for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Test how character classes match a multibyte string
+ */
+
+echo "*** Testing mb_ereg() : usage variations ***\n";
+
+mb_regex_encoding('utf-8');
+
+//contains japanese characters, ASCII digits and different, UTF-8 encoded digits
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+$character_classes = array (b'[[:alnum:]]+', /*1*/
+ b'[[:alpha:]]+',
+ b'[[:ascii:]]+',
+ b'[[:blank:]]+',
+ b'[[:cntrl:]]+',/*5*/
+ b'[[:digit:]]+',
+ b'[[:graph:]]+',
+ b'[[:lower:]]+',
+ b'[[:print:]]+',
+ b'[[:punct:]]+', /*10*/
+ b'[[:space:]]+',
+ b'[[:upper:]]+',
+ b'[[:xdigit:]]+'); /*13*/
+
+$iterator = 1;
+foreach ($character_classes as $pattern) {
+ if (is_array(@$regs)) {
+ $regs = null;
+ }
+ echo "\n-- Iteration $iterator --\n";
+ var_dump(mb_ereg($pattern, $string_mb, $regs));
+ if ($regs) {
+ base64_encode_var_dump($regs);
+ }
+ $iterator++;
+}
+/**
+ * replicate a var dump of an array but outputted string values are base64 encoded
+ *
+ * @param array $regs
+ */
+function base64_encode_var_dump($regs) {
+ if ($regs) {
+ echo "array(" . count($regs) . ") {\n";
+ foreach ($regs as $key => $value) {
+ echo " [$key]=>\n ";
+ if (is_string($value)) {
+ var_dump(base64_encode($value));
+ } else {
+ var_dump($value);
+ }
+ }
+ echo "}\n";
+ } else {
+ echo "NULL\n";
+ }
+}
+echo "Done";
+
+?>
+--EXPECTF--
+*** Testing mb_ereg() : usage variations ***
+
+-- Iteration 1 --
+int(47)
+array(1) {
+ [0]=>
+ string(64) "5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZMDEyMzTvvJXvvJbvvJfvvJjvvJk="
+}
+
+-- Iteration 2 --
+int(27)
+array(1) {
+ [0]=>
+ string(36) "5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ"
+}
+
+-- Iteration 3 --
+int(5)
+array(1) {
+ [0]=>
+ string(8) "MDEyMzQ="
+}
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+int(20)
+array(1) {
+ [0]=>
+ string(28) "MDEyMzTvvJXvvJbvvJfvvJjvvJk="
+}
+
+-- Iteration 7 --
+int(50)
+array(1) {
+ [0]=>
+ string(68) "5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
+}
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+int(50)
+array(1) {
+ [0]=>
+ string(68) "5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
+}
+
+-- Iteration 10 --
+int(3)
+array(1) {
+ [0]=>
+ string(4) "44CC"
+}
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+int(5)
+array(1) {
+ [0]=>
+ string(8) "MDEyMzQ="
+}
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_ereg_variation5.phpt b/ext/mbstring/tests/mb_ereg_variation5.phpt
new file mode 100644
index 0000000..1cecb09
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_variation5.phpt
@@ -0,0 +1,82 @@
+--TEST--
+Test mb_ereg() function : usage variations - Test anchors in regex
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_ereg(string $pattern, string $string [, array $registers])
+ * Description: Regular expression match for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Test mb_ereg with anchors (start and end of string) in $pattern
+ */
+
+echo "*** Testing mb_ereg() : usage variations ***\n";
+
+mb_regex_encoding('utf-8');
+
+$string_ascii = b'This is an English string. 0123456789.';
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+$regex = b'^.*?[[:blank:]]?[[:punct:][:digit:]]+\.?$';
+
+echo "\nASCII String without \$regs arg:\t\t";
+var_dump(mb_ereg($regex, $string_ascii));
+echo "ASCII String with \$regs arg:\n";
+var_dump(mb_ereg($regex, $string_ascii, $regs_ascii));
+base64_encode_var_dump($regs_ascii);
+
+echo "\nMultibyte String without \$regs arg:\t";
+var_dump(mb_ereg($regex, $string_mb));
+echo "Multubyte String with \$regs arg:\n";
+var_dump(mb_ereg($regex, $string_mb, $regs_mb));
+base64_encode_var_dump($regs_mb);
+
+echo "Done";
+
+/**
+ * replicate a var dump of an array but outputted string values are base64 encoded
+ *
+ * @param array $regs
+ */
+function base64_encode_var_dump($regs) {
+ if ($regs) {
+ echo "array(" . count($regs) . ") {\n";
+ foreach ($regs as $key => $value) {
+ echo " [$key]=>\n ";
+ if (is_string($value)) {
+ var_dump(base64_encode($value));
+ } else {
+ var_dump($value);
+ }
+ }
+ echo "}\n";
+ } else {
+ echo "NULL\n";
+ }
+}
+?>
+--EXPECTF--
+*** Testing mb_ereg() : usage variations ***
+
+ASCII String without $regs arg: int(1)
+ASCII String with $regs arg:
+int(38)
+array(1) {
+ [0]=>
+ string(52) "VGhpcyBpcyBhbiBFbmdsaXNoIHN0cmluZy4gMDEyMzQ1Njc4OS4="
+}
+
+Multibyte String without $regs arg: int(1)
+Multubyte String with $regs arg:
+int(53)
+array(1) {
+ [0]=>
+ string(72) "5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
+}
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_ereg_variation6.phpt b/ext/mbstring/tests/mb_ereg_variation6.phpt
new file mode 100644
index 0000000..0d8687b
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_variation6.phpt
@@ -0,0 +1,192 @@
+--TEST--
+Test mb_ereg() function : usage variations - match special characters
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_ereg(string $pattern, string $string [, array $registers])
+ * Description: Regular expression match for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Test how mb_ereg() matches special characters for $pattern
+ */
+
+echo "*** Testing mb_ereg() : usage variations ***\n";
+
+if(mb_regex_encoding('utf-8') == true) {
+ echo "Regex encoding set to utf-8\n";
+} else {
+ echo "Could not set regex encoding to utf-8\n";
+}
+
+$regex_char = array ('\w+' => b'\w+',
+ '\W+' => b'\W+',
+ '\s+' => b'\s+',
+ '\S+' => b'\S+',
+ '\d+' => b'\d+',
+ '\D+' => b'\D+',
+ '\b' => b'\b',
+ '\B' => b'\B');
+
+$string_ascii = b'This is an English string. 0123456789.';
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+foreach ($regex_char as $displayChar => $char) {
+ echo "\n--** Pattern is: $displayChar **--\n";
+ if (@$regs_ascii || @$regs_mb) {
+ $regs_ascii = null;
+ $regs_mb = null;
+ }
+ echo "-- ASCII String: --\n";
+ var_dump(mb_ereg($char, $string_ascii, $regs_ascii));
+ base64_encode_var_dump($regs_ascii);
+
+ echo "-- Multibyte String: --\n";
+ var_dump(mb_ereg($char, $string_mb, $regs_mb));
+ base64_encode_var_dump($regs_mb);
+
+}
+
+/**
+ * replicate a var dump of an array but outputted string values are base64 encoded
+ *
+ * @param array $regs
+ */
+function base64_encode_var_dump($regs) {
+ if ($regs) {
+ echo "array(" . count($regs) . ") {\n";
+ foreach ($regs as $key => $value) {
+ echo " [$key]=>\n ";
+ if (is_string($value)) {
+ var_dump(base64_encode($value));
+ } else {
+ var_dump($value);
+ }
+ }
+ echo "}\n";
+ } else {
+ echo "NULL\n";
+ }
+}
+
+echo "Done";
+
+?>
+--EXPECT--
+*** Testing mb_ereg() : usage variations ***
+Regex encoding set to utf-8
+
+--** Pattern is: \w+ **--
+-- ASCII String: --
+int(4)
+array(1) {
+ [0]=>
+ string(8) "VGhpcw=="
+}
+-- Multibyte String: --
+int(27)
+array(1) {
+ [0]=>
+ string(36) "5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ"
+}
+
+--** Pattern is: \W+ **--
+-- ASCII String: --
+int(1)
+array(1) {
+ [0]=>
+ string(4) "IA=="
+}
+-- Multibyte String: --
+int(3)
+array(1) {
+ [0]=>
+ string(4) "44CC"
+}
+
+--** Pattern is: \s+ **--
+-- ASCII String: --
+int(1)
+array(1) {
+ [0]=>
+ string(4) "IA=="
+}
+-- Multibyte String: --
+bool(false)
+NULL
+
+--** Pattern is: \S+ **--
+-- ASCII String: --
+int(4)
+array(1) {
+ [0]=>
+ string(8) "VGhpcw=="
+}
+-- Multibyte String: --
+int(53)
+array(1) {
+ [0]=>
+ string(72) "5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
+}
+
+--** Pattern is: \d+ **--
+-- ASCII String: --
+int(10)
+array(1) {
+ [0]=>
+ string(16) "MDEyMzQ1Njc4OQ=="
+}
+-- Multibyte String: --
+int(20)
+array(1) {
+ [0]=>
+ string(28) "MDEyMzTvvJXvvJbvvJfvvJjvvJk="
+}
+
+--** Pattern is: \D+ **--
+-- ASCII String: --
+int(27)
+array(1) {
+ [0]=>
+ string(36) "VGhpcyBpcyBhbiBFbmdsaXNoIHN0cmluZy4g"
+}
+-- Multibyte String: --
+int(30)
+array(1) {
+ [0]=>
+ string(40) "5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC"
+}
+
+--** Pattern is: \b **--
+-- ASCII String: --
+int(1)
+array(1) {
+ [0]=>
+ bool(false)
+}
+-- Multibyte String: --
+int(1)
+array(1) {
+ [0]=>
+ bool(false)
+}
+
+--** Pattern is: \B **--
+-- ASCII String: --
+int(1)
+array(1) {
+ [0]=>
+ bool(false)
+}
+-- Multibyte String: --
+int(1)
+array(1) {
+ [0]=>
+ bool(false)
+}
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_ereg_variation7.phpt b/ext/mbstring/tests/mb_ereg_variation7.phpt
new file mode 100644
index 0000000..170497d
--- /dev/null
+++ b/ext/mbstring/tests/mb_ereg_variation7.phpt
@@ -0,0 +1,94 @@
+--TEST--
+Test mb_ereg() function : usage variations - different regex features in $pattern
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_ereg(string $pattern, string $string [, array $registers])
+ * Description: Regular expression match for multibyte string
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Testing the following regular expression features match correctly:
+ * 1. definite quantifiers
+ * 2. Alternation
+ * 3. subpatterns in parentheses
+ */
+
+echo "*** Testing mb_ereg() : usage variations ***\n";
+
+if(mb_regex_encoding('utf-8') == true) {
+ echo "Regex encoding set to utf-8\n";
+} else {
+ echo "Could not set regex encoding to utf-8\n";
+}
+
+$string_ascii = b'This is an English string. 0123456789.';
+$regex_ascii = b'([A-Z]\w{1,4}is( [aeiou]|h)) ?.*\.\s[0-9]+(5([6-9][79]){2})[[:punct:]]$';
+var_dump(mb_ereg($regex_ascii, $string_ascii, $regs_ascii));
+base64_encode_var_dump($regs_ascii);
+
+$string_mb = base64_decode('zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg==');
+$regex_mb = base64_decode("W86RLc6pXShcdysgKSvOtVvOsS3PiVxzXSvOui4qKM+MfM6/KS4qXC5cc1swLTldKyg1KFs2LTldWzc5XSl7Mn0pW1s6cHVuY3Q6XV0k");
+var_dump(mb_ereg($regex_mb, $string_mb, $regs_mb));
+base64_encode_var_dump($regs_mb);
+
+/**
+ * replicate a var dump of an array but outputted string values are base64 encoded
+ *
+ * @param array $regs
+ */
+function base64_encode_var_dump($regs) {
+ if ($regs) {
+ echo "array(" . count($regs) . ") {\n";
+ foreach ($regs as $key => $value) {
+ echo " [$key]=>\n ";
+ if (is_string($value)) {
+ var_dump(base64_encode($value));
+ } else {
+ var_dump($value);
+ }
+ }
+ echo "}\n";
+ } else {
+ echo "NULL\n";
+ }
+}
+
+echo "Done";
+
+?>
+--EXPECT--
+*** Testing mb_ereg() : usage variations ***
+Regex encoding set to utf-8
+int(38)
+array(5) {
+ [0]=>
+ string(52) "VGhpcyBpcyBhbiBFbmdsaXNoIHN0cmluZy4gMDEyMzQ1Njc4OS4="
+ [1]=>
+ string(8) "VGhpcyBp"
+ [2]=>
+ string(4) "IGk="
+ [3]=>
+ string(8) "NTY3ODk="
+ [4]=>
+ string(4) "ODk="
+}
+int(64)
+array(5) {
+ [0]=>
+ string(88) "zpHPhc+Ez4wgzrXOr869zrHOuSDOtc67zrvOt869zrnOus+MIM66zrXOr868zrXOvc6/LiAwMTIzNDU2Nzg5Lg=="
+ [1]=>
+ string(16) "zrXOr869zrHOuSA="
+ [2]=>
+ string(4) "zr8="
+ [3]=>
+ string(8) "NTY3ODk="
+ [4]=>
+ string(4) "ODk="
+}
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_eregi.phpt b/ext/mbstring/tests/mb_eregi.phpt
new file mode 100644
index 0000000..ced6fad
--- /dev/null
+++ b/ext/mbstring/tests/mb_eregi.phpt
@@ -0,0 +1,20 @@
+--TEST--
+mb_eregi() and invalid arguments
+--SKIPIF--
+<?php
+if (!extension_loaded('mbstring')) die('skip mbstring not enabled');
+if (!function_exists("mb_eregi")) print "skip mb_eregi() not available";
+?>
+--FILE--
+<?php
+
+mb_regex_encoding('utf-8');
+
+var_dump(mb_eregi('z', 'XYZ'));
+var_dump(mb_eregi('xyzp', 'XYZ'));
+var_dump(mb_eregi('旦', '辰端'));
+?>
+--EXPECT--
+int(1)
+bool(false)
+int(1)
diff --git a/ext/mbstring/tests/mb_eregi_invalid_arguments.phpt b/ext/mbstring/tests/mb_eregi_invalid_arguments.phpt
new file mode 100644
index 0000000..ced6fad
--- /dev/null
+++ b/ext/mbstring/tests/mb_eregi_invalid_arguments.phpt
@@ -0,0 +1,20 @@
+--TEST--
+mb_eregi() and invalid arguments
+--SKIPIF--
+<?php
+if (!extension_loaded('mbstring')) die('skip mbstring not enabled');
+if (!function_exists("mb_eregi")) print "skip mb_eregi() not available";
+?>
+--FILE--
+<?php
+
+mb_regex_encoding('utf-8');
+
+var_dump(mb_eregi('z', 'XYZ'));
+var_dump(mb_eregi('xyzp', 'XYZ'));
+var_dump(mb_eregi('旦', '辰端'));
+?>
+--EXPECT--
+int(1)
+bool(false)
+int(1)
diff --git a/ext/mbstring/tests/mb_eregi_replace.phpt b/ext/mbstring/tests/mb_eregi_replace.phpt
new file mode 100644
index 0000000..22ba0af
--- /dev/null
+++ b/ext/mbstring/tests/mb_eregi_replace.phpt
@@ -0,0 +1,37 @@
+--TEST--
+Testing mb_eregi_replace() function
+--SKIPIF--
+<?php
+if (!extension_loaded('mbstring')) die('skip mbstring not enabled');
+function_exists('mb_eregi_replace') or die("skip mb_eregi_replace() is not available in this build");
+?>
+--FILE--
+<?php
+function do_translit($st) {
+ $replacement = array(
+ "亶"=>"i",""=>"c",""=>"u","从"=>"k","亠"=>"e","仆"=>"n",
+ "亞"=>"g",""=>"sh",""=>"sh","亰"=>"z",""=>"x",""=>"\'",
+ ""=>"f",""=>"i","于"=>"v","舒"=>"a","仗"=>"p",""=>"r",
+ "仂"=>"o","仍"=>"l","亟"=>"d","亢"=>"zh",""=>"ie",""=>"e",
+ ""=>"ya",""=>"ch",""=>"c","仄"=>"m","亳"=>"i",""=>"t",
+ ""=>"\'","弍"=>"b",""=>"yu",
+ ""=>"I","丶"=>"C","丕"=>"U",""=>"K",""=>"E",""=>"N",
+ ""=>"G","丿"=>"SH","乂"=>"SH",""=>"Z","丱"=>"X","乖"=>"\'",
+ "个"=>"F","乘"=>"I",""=>"V",""=>"A",""=>"P",""=>"R",
+ ""=>"O",""=>"L",""=>"D",""=>"ZH","亅"=>"IE",""=>"E",
+ "亊"=>"YA","丼"=>"CH","弌"=>"C",""=>"M",""=>"I","丐"=>"T",
+ "亂"=>"\'",""=>"B","豫"=>"YU",
+ );
+
+ foreach($replacement as $i=>$u) {
+ $st = mb_eregi_replace($i,$u,$st);
+ }
+ return $st;
+}
+
+echo do_translit("亠舒");
+?>
+--EXPECT--
+Pear
+--CREDITS--
+Testfest Wuerzburg 2009-06-20 (modified by rui 2011-10-15)
diff --git a/ext/mbstring/tests/mb_get_info.phpt b/ext/mbstring/tests/mb_get_info.phpt
new file mode 100644
index 0000000..a3739e1
--- /dev/null
+++ b/ext/mbstring/tests/mb_get_info.phpt
@@ -0,0 +1,190 @@
+--TEST--
+Test mb_get_info() function
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip'); ?>
+--INI--
+mbstring.encoding_translation=1
+mbstring.language=Korean
+mbstring.internal_encoding=UTF-8
+mbstring.http_input=ISO-8859-1
+mbstring.http_output=ISO-8859-15
+mbstring.http_output_conv_mimetypes=abc
+mbstring.func_overload=2
+mbstring.detect_order=UTF-8,ISO-8859-15,ISO-8859-1,ASCII
+mbstring.substitute_character=123
+mbstring.strict_detection=1
+--FILE--
+<?php
+mb_parse_str("abc=def", $dummy);
+mb_convert_encoding("\xff\xff", "Shift_JIS", "UCS-2BE");
+$result = mb_get_info();
+var_dump($result);
+foreach (array_keys($result) as $key) {
+ var_dump($result[$key], mb_get_info($key));
+}
+?>
+--EXPECT--
+array(15) {
+ ["internal_encoding"]=>
+ string(5) "UTF-8"
+ ["http_input"]=>
+ string(10) "ISO-8859-1"
+ ["http_output"]=>
+ string(11) "ISO-8859-15"
+ ["http_output_conv_mimetypes"]=>
+ string(3) "abc"
+ ["func_overload"]=>
+ int(2)
+ ["func_overload_list"]=>
+ array(12) {
+ ["strlen"]=>
+ string(9) "mb_strlen"
+ ["strpos"]=>
+ string(9) "mb_strpos"
+ ["strrpos"]=>
+ string(10) "mb_strrpos"
+ ["stripos"]=>
+ string(10) "mb_stripos"
+ ["strripos"]=>
+ string(11) "mb_strripos"
+ ["strstr"]=>
+ string(9) "mb_strstr"
+ ["strrchr"]=>
+ string(10) "mb_strrchr"
+ ["stristr"]=>
+ string(10) "mb_stristr"
+ ["substr"]=>
+ string(9) "mb_substr"
+ ["strtolower"]=>
+ string(13) "mb_strtolower"
+ ["strtoupper"]=>
+ string(13) "mb_strtoupper"
+ ["substr_count"]=>
+ string(15) "mb_substr_count"
+ }
+ ["mail_charset"]=>
+ string(11) "ISO-2022-KR"
+ ["mail_header_encoding"]=>
+ string(6) "BASE64"
+ ["mail_body_encoding"]=>
+ string(4) "7bit"
+ ["illegal_chars"]=>
+ int(1)
+ ["encoding_translation"]=>
+ string(2) "On"
+ ["language"]=>
+ string(6) "Korean"
+ ["detect_order"]=>
+ array(4) {
+ [0]=>
+ string(5) "UTF-8"
+ [1]=>
+ string(11) "ISO-8859-15"
+ [2]=>
+ string(10) "ISO-8859-1"
+ [3]=>
+ string(5) "ASCII"
+ }
+ ["substitute_character"]=>
+ int(123)
+ ["strict_detection"]=>
+ string(2) "On"
+}
+string(5) "UTF-8"
+string(5) "UTF-8"
+string(10) "ISO-8859-1"
+string(10) "ISO-8859-1"
+string(11) "ISO-8859-15"
+string(11) "ISO-8859-15"
+string(3) "abc"
+string(3) "abc"
+int(2)
+int(2)
+array(12) {
+ ["strlen"]=>
+ string(9) "mb_strlen"
+ ["strpos"]=>
+ string(9) "mb_strpos"
+ ["strrpos"]=>
+ string(10) "mb_strrpos"
+ ["stripos"]=>
+ string(10) "mb_stripos"
+ ["strripos"]=>
+ string(11) "mb_strripos"
+ ["strstr"]=>
+ string(9) "mb_strstr"
+ ["strrchr"]=>
+ string(10) "mb_strrchr"
+ ["stristr"]=>
+ string(10) "mb_stristr"
+ ["substr"]=>
+ string(9) "mb_substr"
+ ["strtolower"]=>
+ string(13) "mb_strtolower"
+ ["strtoupper"]=>
+ string(13) "mb_strtoupper"
+ ["substr_count"]=>
+ string(15) "mb_substr_count"
+}
+array(12) {
+ ["strlen"]=>
+ string(9) "mb_strlen"
+ ["strpos"]=>
+ string(9) "mb_strpos"
+ ["strrpos"]=>
+ string(10) "mb_strrpos"
+ ["stripos"]=>
+ string(10) "mb_stripos"
+ ["strripos"]=>
+ string(11) "mb_strripos"
+ ["strstr"]=>
+ string(9) "mb_strstr"
+ ["strrchr"]=>
+ string(10) "mb_strrchr"
+ ["stristr"]=>
+ string(10) "mb_stristr"
+ ["substr"]=>
+ string(9) "mb_substr"
+ ["strtolower"]=>
+ string(13) "mb_strtolower"
+ ["strtoupper"]=>
+ string(13) "mb_strtoupper"
+ ["substr_count"]=>
+ string(15) "mb_substr_count"
+}
+string(11) "ISO-2022-KR"
+string(11) "ISO-2022-KR"
+string(6) "BASE64"
+string(6) "BASE64"
+string(4) "7bit"
+string(4) "7bit"
+int(1)
+int(1)
+string(2) "On"
+string(2) "On"
+string(6) "Korean"
+string(6) "Korean"
+array(4) {
+ [0]=>
+ string(5) "UTF-8"
+ [1]=>
+ string(11) "ISO-8859-15"
+ [2]=>
+ string(10) "ISO-8859-1"
+ [3]=>
+ string(5) "ASCII"
+}
+array(4) {
+ [0]=>
+ string(5) "UTF-8"
+ [1]=>
+ string(11) "ISO-8859-15"
+ [2]=>
+ string(10) "ISO-8859-1"
+ [3]=>
+ string(5) "ASCII"
+}
+int(123)
+int(123)
+string(2) "On"
+string(2) "On"
diff --git a/ext/mbstring/tests/mb_http_input.phpt b/ext/mbstring/tests/mb_http_input.phpt
new file mode 100644
index 0000000..6e72c5d
--- /dev/null
+++ b/ext/mbstring/tests/mb_http_input.phpt
@@ -0,0 +1,51 @@
+--TEST--
+mb_http_input()
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+(php_sapi_name()=='cgi') or die("skip sapi is not a cgi version");
+die("skip disabled temporarily");
+?>
+--POST--
+a=日本語0123456789日本語カタカナひらがな
+--GET--
+b=日本語0123456789日本語カタカナひらがな
+--FILE--
+<?php
+// TODO: This is not a real test.... Need to change so that it does real testing
+//$debug = true;
+ini_set('include_path', dirname(__FILE__));
+include_once('common.inc');
+
+$ini = ini_get('mbstring.http_input');
+
+// It must be url encoded....
+// echo vars
+echo $_POST['a']."\n";
+echo $_GET['b']."\n";
+
+// Get encoding
+$enc = mb_http_input('P');
+
+// check
+if (empty($ini)) {
+ // Must be pass
+ if ($enc === 'pass') {
+ echo "OK\n";
+ }
+ else {
+ echo "NG\n";
+ }
+}
+else {
+ // Some encoding
+ echo "This heppens when php.ini-dist is not used\n";
+}
+
+?>
+
+--EXPECT--
+日本語0123456789日本語カタカナひらがな
+日本語0123456789日本語カタカナひらがな
+OK
+
diff --git a/ext/mbstring/tests/mb_http_output.phpt b/ext/mbstring/tests/mb_http_output.phpt
new file mode 100644
index 0000000..7fb3335
--- /dev/null
+++ b/ext/mbstring/tests/mb_http_output.phpt
@@ -0,0 +1,84 @@
+--TEST--
+mb_http_output()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+//TODO: Add more encoding. Wrong paramter type test.
+//$debug = true;
+ini_set('include_path', dirname(__FILE__));
+include_once('common.inc');
+
+// Set HTTP output encoding to ASCII
+$r = mb_http_output('ASCII');
+($r === TRUE) ? print "OK_ASCII_SET\n" : print "NG_ASCII_SET\n";
+$enc = mb_http_output();
+print "$enc\n";
+
+// Set HTTP output encoding to SJIS
+$r = mb_http_output('SJIS');
+($r === TRUE) ? print "OK_SJIS_SET\n" : print "NG_SJIS_SET\n";
+$enc = mb_http_output();
+print "$enc\n";
+
+// Set HTTP output encoding to JIS
+$r = mb_http_output('JIS');
+($r === TRUE) ? print "OK_JIS_SET\n" : print "NG_JIS_SET\n";
+$enc = mb_http_output();
+print "$enc\n";
+
+// Set HTTP output encoding to UTF8
+$r = mb_http_output('UTF-8');
+($r === TRUE) ? print "OK_UTF-8_SET\n" : print "NG_UTF-8_SET\n";
+$enc = mb_http_output();
+print "$enc\n";
+
+// Set HTTP output encoding to EUC-JP
+$r = mb_http_output('EUC-JP');
+($r === TRUE) ? print "OK_EUC-JP_SET\n" : print "NG_EUC-JP_SET\n";
+$enc = mb_http_output();
+print "$enc\n";
+
+// Invalid parameters
+print "== INVALID PARAMETER ==\n";
+
+// Note: Bad string raise Warning. Bad Type raise Notice (Type Conversion) and Warning....
+$r = mb_http_output('BAD_NAME');
+($r === FALSE) ? print "OK_BAD_SET\n" : print "NG_BAD_SET\n";
+$enc = mb_http_output();
+print "$enc\n";
+
+$r = mb_http_output($t_ary);
+($r === FALSE) ? print "OK_BAD_ARY_SET\n" : print "NG_BAD_ARY_SET\n";
+$enc = mb_http_output();
+print "$enc\n";
+
+$r = mb_http_output($t_obj);
+($r === FALSE) ? print "OK_BAD_OBJ_SET\n" : print "NG_BAD_OBJ_SET\n";
+$enc = mb_http_output();
+print "$enc\n";
+
+?>
+
+--EXPECT--
+OK_ASCII_SET
+ASCII
+OK_SJIS_SET
+SJIS
+OK_JIS_SET
+JIS
+OK_UTF-8_SET
+UTF-8
+OK_EUC-JP_SET
+EUC-JP
+== INVALID PARAMETER ==
+ERR: Warning
+OK_BAD_SET
+EUC-JP
+ERR: Warning
+OK_BAD_ARY_SET
+EUC-JP
+ERR: Warning
+OK_BAD_OBJ_SET
+EUC-JP
+
diff --git a/ext/mbstring/tests/mb_internal_encoding.phpt b/ext/mbstring/tests/mb_internal_encoding.phpt
new file mode 100644
index 0000000..e1b99c3
--- /dev/null
+++ b/ext/mbstring/tests/mb_internal_encoding.phpt
@@ -0,0 +1,68 @@
+--TEST--
+mb_internal_encoding()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+// TODO:
+//$debug = true;
+ini_set('include_path', dirname(__FILE__));
+include_once('common.inc');
+
+// EUC-JP
+$r = mb_internal_encoding('EUC-JP');
+($r === TRUE) ? print "OK_EUC-JP_SET\n" : print "NG_EUC-JP_SET\n";
+$enc = mb_internal_encoding();
+print "$enc\n";
+
+// UTF-8
+$r = mb_internal_encoding('UTF-8');
+($r === TRUE) ? print "OK_UTF-8_SET\n" : print "NG_UTF-8_SET\n";
+$enc = mb_internal_encoding();
+print "$enc\n";
+
+// ASCII
+$r = mb_internal_encoding('ASCII');
+($r === TRUE) ? print "OK_ASCII_SET\n" : print "NG_ASCII_SET\n";
+$enc = mb_internal_encoding();
+print "$enc\n";
+
+// Invalid Parameter
+print "== INVALID PARAMETER ==\n";
+
+// Note: Other than string type, PHP raises Warning
+$r = mb_internal_encoding('BAD');
+($r === FALSE) ? print "OK_BAD_SET\n" : print "NG_BAD_SET\n";
+$enc = mb_internal_encoding();
+print "$enc\n";
+
+$r = mb_internal_encoding($t_ary);
+($r === FALSE) ? print "OK_BAD_ARY_SET\n" : print "NG_BAD_ARY_SET\n";
+$enc = mb_internal_encoding();
+print "$enc\n";
+
+$r = mb_internal_encoding($t_obj);
+($r === FALSE) ? print "OK_BAD_OBJ_SET\n" : print "NG_BAD_OBJ_SET\n";
+$enc = mb_internal_encoding();
+print "$enc\n";
+
+?>
+
+--EXPECT--
+OK_EUC-JP_SET
+EUC-JP
+OK_UTF-8_SET
+UTF-8
+OK_ASCII_SET
+ASCII
+== INVALID PARAMETER ==
+ERR: Warning
+OK_BAD_SET
+ASCII
+ERR: Warning
+OK_BAD_ARY_SET
+ASCII
+ERR: Warning
+OK_BAD_OBJ_SET
+ASCII
+
diff --git a/ext/mbstring/tests/mb_internal_encoding_basic.phpt b/ext/mbstring/tests/mb_internal_encoding_basic.phpt
new file mode 100644
index 0000000..a289dcf
--- /dev/null
+++ b/ext/mbstring/tests/mb_internal_encoding_basic.phpt
@@ -0,0 +1,36 @@
+--TEST--
+Test mb_internal_encoding() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_internal_encoding') or die("skip mb_internal_encoding() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_internal_encoding([string $encoding])
+ * Description: Sets the current internal encoding or Returns
+ * the current internal encoding as a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test basic functionality of mb_internal_encoding
+ */
+
+echo "*** Testing mb_internal_encoding() : basic functionality ***\n";
+
+var_dump(mb_internal_encoding()); //default internal encoding
+
+var_dump(mb_internal_encoding('UTF-8')); //change internal encoding to UTF-8
+
+var_dump(mb_internal_encoding()); //check internal encoding is now set to UTF-8
+
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_internal_encoding() : basic functionality ***
+string(%d) "%s"
+bool(true)
+string(5) "UTF-8"
+Done
diff --git a/ext/mbstring/tests/mb_internal_encoding_error1.phpt b/ext/mbstring/tests/mb_internal_encoding_error1.phpt
new file mode 100644
index 0000000..61f133a
--- /dev/null
+++ b/ext/mbstring/tests/mb_internal_encoding_error1.phpt
@@ -0,0 +1,36 @@
+--TEST--
+Test mb_internal_encoding() function : error conditions - pass incorrect number of args
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_internal_encoding') or die("skip mb_internal_encoding() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_internal_encoding([string $encoding])
+ * Description: Sets the current internal encoding or
+ * Returns the current internal encoding as a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test mb_internal_encoding with one more than the expected number of arguments
+ */
+
+echo "*** Testing mb_internal_encoding() : error conditions ***\n";
+
+echo "\n-- Testing mb_internal_encoding() function with more than expected no. of arguments --\n";
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_internal_encoding($encoding, $extra_arg) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_internal_encoding() : error conditions ***
+
+-- Testing mb_internal_encoding() function with more than expected no. of arguments --
+
+Warning: mb_internal_encoding() expects at most 1 parameter, 2 given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_internal_encoding_error2.phpt b/ext/mbstring/tests/mb_internal_encoding_error2.phpt
new file mode 100644
index 0000000..d0a1653
--- /dev/null
+++ b/ext/mbstring/tests/mb_internal_encoding_error2.phpt
@@ -0,0 +1,31 @@
+--TEST--
+Test mb_internal_encoding() function : error conditions - pass an unknown encoding
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_internal_encoding') or die("skip mb_internal_encoding() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_internal_encoding([string $encoding])
+ * Description: Sets the current internal encoding or
+ * Returns the current internal encoding as a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass mb_internal_encoding an unknown encoding
+ */
+
+echo "*** Testing mb_internal_encoding() : error conditions ***\n";
+
+var_dump(mb_internal_encoding('unknown-encoding'));
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_internal_encoding() : error conditions ***
+
+Warning: mb_internal_encoding(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_internal_encoding_ini_basic2.phpt b/ext/mbstring/tests/mb_internal_encoding_ini_basic2.phpt
new file mode 100644
index 0000000..241e1a6
--- /dev/null
+++ b/ext/mbstring/tests/mb_internal_encoding_ini_basic2.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Test INI mbstring.internal_encoding basic - encoding when valid specified
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--INI--
+mbstring.internal_encoding=ISO-8859-7
+--FILE--
+<?php
+
+echo "*** Testing INI mbstring.internal_encoding : basic functionality ***\n";
+
+echo mb_internal_encoding()."\n";
+echo ini_get('mbstring.internal_encoding')."\n";
+mb_internal_encoding('UTF-8');
+echo mb_internal_encoding()."\n";
+echo ini_get('mbstring.internal_encoding')."\n";
+
+?>
+===DONE===
+--EXPECT--
+*** Testing INI mbstring.internal_encoding : basic functionality ***
+ISO-8859-7
+ISO-8859-7
+UTF-8
+ISO-8859-7
+===DONE===
diff --git a/ext/mbstring/tests/mb_internal_encoding_variation1.phpt b/ext/mbstring/tests/mb_internal_encoding_variation1.phpt
new file mode 100644
index 0000000..94bb0cf
--- /dev/null
+++ b/ext/mbstring/tests/mb_internal_encoding_variation1.phpt
@@ -0,0 +1,217 @@
+--TEST--
+Test mb_internal_encoding() function : usage variations - Pass different data types as $encoding arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_internal_encoding') or die("skip mb_internal_encoding() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_internal_encoding([string $encoding])
+ * Description: Sets the current internal encoding or Returns
+ * the current internal encoding as a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass different data types as $encoding to mb_internal_encoding() to test behaviour
+ * Where possible 'UTF-8' has been entered as a string value
+ */
+
+echo "*** Testing mb_internal_encoding() : usage variations ***\n";
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_internal_encoding()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_internal_encoding($input) );
+ $iterator++;
+};
+
+fclose($fp);
+echo "Done";
+?>
+--EXPECTF--
+
+*** Testing mb_internal_encoding() : usage variations ***
+
+-- Iteration 1 --
+
+Warning: mb_internal_encoding(): Unknown encoding "0" in %s on line %d
+bool(false)
+
+-- Iteration 2 --
+
+Warning: mb_internal_encoding(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 3 --
+
+Warning: mb_internal_encoding(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_internal_encoding(): Unknown encoding "-2345" in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_internal_encoding(): Unknown encoding "10.5" in %s on line %d
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_internal_encoding(): Unknown encoding "-10.5" in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_internal_encoding(): Unknown encoding "123456789000" in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+
+Warning: mb_internal_encoding(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+-- Iteration 9 --
+
+Warning: mb_internal_encoding(): Unknown encoding "0.5" in %s on line %d
+bool(false)
+
+-- Iteration 10 --
+
+Warning: mb_internal_encoding(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 11 --
+
+Warning: mb_internal_encoding(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 12 --
+
+Warning: mb_internal_encoding(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 13 --
+
+Warning: mb_internal_encoding(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 14 --
+
+Warning: mb_internal_encoding(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 15 --
+
+Warning: mb_internal_encoding(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 16 --
+
+Warning: mb_internal_encoding(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_internal_encoding(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+bool(true)
+
+-- Iteration 19 --
+bool(true)
+
+-- Iteration 20 --
+bool(true)
+
+-- Iteration 21 --
+bool(true)
+
+-- Iteration 22 --
+
+Warning: mb_internal_encoding(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 23 --
+
+Warning: mb_internal_encoding(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_internal_encoding() expects parameter 1 to be string, resource given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_internal_encoding_variation2.phpt b/ext/mbstring/tests/mb_internal_encoding_variation2.phpt
new file mode 100644
index 0000000..914041c
--- /dev/null
+++ b/ext/mbstring/tests/mb_internal_encoding_variation2.phpt
@@ -0,0 +1,374 @@
+--TEST--
+Test mb_internal_encoding() function : usage variations - Test different encodings
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_internal_encoding') or die("skip mb_internal_encoding() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_internal_encoding([string $encoding])
+ * Description: Sets the current internal encoding or Returns
+ * the current internal encoding as a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test all listed encoding types from php.net to check all are known to function
+ * NB: The strings passed are *NOT* necessarily encoded in the encoding passed to the function.
+ * This test is purely to see whether the function recognises the encoding.
+ */
+
+echo "*** Testing mb_internal_encoding() : usage variations ***\n";
+
+$encoding = array('UCS-4', /*1*/
+ 'UCS-4BE',
+ 'UCS-4LE',
+ 'UCS-2',
+ 'UCS-2BE', /*5*/
+ 'UCS-2LE',
+ 'UTF-32',
+ 'UTF-32BE',
+ 'UTF-32LE',
+ 'UTF-16', /*10*/
+ 'UTF-16BE',
+ 'UTF-16LE',
+ 'UTF-7',
+ 'UTF7-IMAP',
+ 'UTF-8', /*15*/
+ 'ASCII',
+ 'EUC-JP',
+ 'SJIS',
+ 'eucJP-win',
+ 'SJIS-win', /*20*/
+ 'ISO-2022-JP',
+ 'JIS',
+ 'ISO-8859-1',
+ 'ISO-8859-2',
+ 'ISO-8859-3', /*25*/
+ 'ISO-8859-4',
+ 'ISO-8859-5',
+ 'ISO-8859-6',
+ 'ISO-8859-7',
+ 'ISO-8859-8', /*30*/
+ 'ISO-8859-9',
+ 'ISO-8859-10',
+ 'ISO-8859-13',
+ 'ISO-8859-14',
+ 'ISO-8859-15', /*35*/
+ 'byte2be',
+ 'byte2le',
+ 'byte4be',
+ 'byte4le',
+ 'BASE64', /*40*/
+ 'HTML-ENTITIES',
+ '7bit',
+ '8bit',
+ 'EUC-CN',
+ 'CP936', /*45*/
+ 'HZ',
+ 'EUC-TW',
+ 'CP950',
+ 'BIG-5',
+ 'EUC-KR', /*50*/
+ 'UHC',
+ 'ISO-2022-KR',
+ 'Windows-1251',
+ 'Windows-1252',
+ 'CP866', /*55*/
+ 'KOI8-R'); /*56*/
+
+$iterator = 1;
+foreach($encoding as $enc) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump(mb_internal_encoding());
+ var_dump(mb_internal_encoding($enc));
+ var_dump(mb_internal_encoding());
+ $iterator++;
+}
+echo "Done";
+?>
+--EXPECTF--
+
+*** Testing mb_internal_encoding() : usage variations ***
+
+-- Iteration 1 --
+string(%d) "%s"
+bool(true)
+string(5) "UCS-4"
+
+-- Iteration 2 --
+string(5) "UCS-4"
+bool(true)
+string(7) "UCS-4BE"
+
+-- Iteration 3 --
+string(7) "UCS-4BE"
+bool(true)
+string(7) "UCS-4LE"
+
+-- Iteration 4 --
+string(7) "UCS-4LE"
+bool(true)
+string(5) "UCS-2"
+
+-- Iteration 5 --
+string(5) "UCS-2"
+bool(true)
+string(7) "UCS-2BE"
+
+-- Iteration 6 --
+string(7) "UCS-2BE"
+bool(true)
+string(7) "UCS-2LE"
+
+-- Iteration 7 --
+string(7) "UCS-2LE"
+bool(true)
+string(6) "UTF-32"
+
+-- Iteration 8 --
+string(6) "UTF-32"
+bool(true)
+string(8) "UTF-32BE"
+
+-- Iteration 9 --
+string(8) "UTF-32BE"
+bool(true)
+string(8) "UTF-32LE"
+
+-- Iteration 10 --
+string(8) "UTF-32LE"
+bool(true)
+string(6) "UTF-16"
+
+-- Iteration 11 --
+string(6) "UTF-16"
+bool(true)
+string(8) "UTF-16BE"
+
+-- Iteration 12 --
+string(8) "UTF-16BE"
+bool(true)
+string(8) "UTF-16LE"
+
+-- Iteration 13 --
+string(8) "UTF-16LE"
+bool(true)
+string(5) "UTF-7"
+
+-- Iteration 14 --
+string(5) "UTF-7"
+bool(true)
+string(9) "UTF7-IMAP"
+
+-- Iteration 15 --
+string(9) "UTF7-IMAP"
+bool(true)
+string(5) "UTF-8"
+
+-- Iteration 16 --
+string(5) "UTF-8"
+bool(true)
+string(5) "ASCII"
+
+-- Iteration 17 --
+string(5) "ASCII"
+bool(true)
+string(6) "EUC-JP"
+
+-- Iteration 18 --
+string(6) "EUC-JP"
+bool(true)
+string(4) "SJIS"
+
+-- Iteration 19 --
+string(4) "SJIS"
+bool(true)
+string(9) "eucJP-win"
+
+-- Iteration 20 --
+string(9) "eucJP-win"
+bool(true)
+string(8) "SJIS-win"
+
+-- Iteration 21 --
+string(8) "SJIS-win"
+bool(true)
+string(11) "ISO-2022-JP"
+
+-- Iteration 22 --
+string(11) "ISO-2022-JP"
+bool(true)
+string(3) "JIS"
+
+-- Iteration 23 --
+string(3) "JIS"
+bool(true)
+string(10) "ISO-8859-1"
+
+-- Iteration 24 --
+string(10) "ISO-8859-1"
+bool(true)
+string(10) "ISO-8859-2"
+
+-- Iteration 25 --
+string(10) "ISO-8859-2"
+bool(true)
+string(10) "ISO-8859-3"
+
+-- Iteration 26 --
+string(10) "ISO-8859-3"
+bool(true)
+string(10) "ISO-8859-4"
+
+-- Iteration 27 --
+string(10) "ISO-8859-4"
+bool(true)
+string(10) "ISO-8859-5"
+
+-- Iteration 28 --
+string(10) "ISO-8859-5"
+bool(true)
+string(10) "ISO-8859-6"
+
+-- Iteration 29 --
+string(10) "ISO-8859-6"
+bool(true)
+string(10) "ISO-8859-7"
+
+-- Iteration 30 --
+string(10) "ISO-8859-7"
+bool(true)
+string(10) "ISO-8859-8"
+
+-- Iteration 31 --
+string(10) "ISO-8859-8"
+bool(true)
+string(10) "ISO-8859-9"
+
+-- Iteration 32 --
+string(10) "ISO-8859-9"
+bool(true)
+string(11) "ISO-8859-10"
+
+-- Iteration 33 --
+string(11) "ISO-8859-10"
+bool(true)
+string(11) "ISO-8859-13"
+
+-- Iteration 34 --
+string(11) "ISO-8859-13"
+bool(true)
+string(11) "ISO-8859-14"
+
+-- Iteration 35 --
+string(11) "ISO-8859-14"
+bool(true)
+string(11) "ISO-8859-15"
+
+-- Iteration 36 --
+string(11) "ISO-8859-15"
+bool(true)
+string(7) "byte2be"
+
+-- Iteration 37 --
+string(7) "byte2be"
+bool(true)
+string(7) "byte2le"
+
+-- Iteration 38 --
+string(7) "byte2le"
+bool(true)
+string(7) "byte4be"
+
+-- Iteration 39 --
+string(7) "byte4be"
+bool(true)
+string(7) "byte4le"
+
+-- Iteration 40 --
+string(7) "byte4le"
+bool(true)
+string(6) "BASE64"
+
+-- Iteration 41 --
+string(6) "BASE64"
+bool(true)
+string(13) "HTML-ENTITIES"
+
+-- Iteration 42 --
+string(13) "HTML-ENTITIES"
+bool(true)
+string(4) "7bit"
+
+-- Iteration 43 --
+string(4) "7bit"
+bool(true)
+string(4) "8bit"
+
+-- Iteration 44 --
+string(4) "8bit"
+bool(true)
+string(6) "EUC-CN"
+
+-- Iteration 45 --
+string(6) "EUC-CN"
+bool(true)
+string(5) "CP936"
+
+-- Iteration 46 --
+string(5) "CP936"
+bool(true)
+string(2) "HZ"
+
+-- Iteration 47 --
+string(2) "HZ"
+bool(true)
+string(6) "EUC-TW"
+
+-- Iteration 48 --
+string(6) "EUC-TW"
+bool(true)
+string(5) "CP950"
+
+-- Iteration 49 --
+string(5) "CP950"
+bool(true)
+string(5) "BIG-5"
+
+-- Iteration 50 --
+string(5) "BIG-5"
+bool(true)
+string(6) "EUC-KR"
+
+-- Iteration 51 --
+string(6) "EUC-KR"
+bool(true)
+string(3) "UHC"
+
+-- Iteration 52 --
+string(3) "UHC"
+bool(true)
+string(11) "ISO-2022-KR"
+
+-- Iteration 53 --
+string(11) "ISO-2022-KR"
+bool(true)
+string(12) "Windows-1251"
+
+-- Iteration 54 --
+string(12) "Windows-1251"
+bool(true)
+string(12) "Windows-1252"
+
+-- Iteration 55 --
+string(12) "Windows-1252"
+bool(true)
+string(5) "CP866"
+
+-- Iteration 56 --
+string(5) "CP866"
+bool(true)
+string(6) "KOI8-R"
+Done
diff --git a/ext/mbstring/tests/mb_list_encodings.phpt b/ext/mbstring/tests/mb_list_encodings.phpt
new file mode 100644
index 0000000..135a9ef
--- /dev/null
+++ b/ext/mbstring/tests/mb_list_encodings.phpt
@@ -0,0 +1,16 @@
+--TEST--
+mb_list_encodings
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+var_dump(in_array("7bit", mb_list_encodings()));
+var_dump(in_array("8bit", mb_list_encodings()));
+var_dump(in_array("ASCII", mb_list_encodings()));
+var_dump(in_array("non-existent", mb_list_encodings()));
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(false)
diff --git a/ext/mbstring/tests/mb_output_handler_euc_jp.phpt b/ext/mbstring/tests/mb_output_handler_euc_jp.phpt
new file mode 100644
index 0000000..dff5c97
--- /dev/null
+++ b/ext/mbstring/tests/mb_output_handler_euc_jp.phpt
@@ -0,0 +1,21 @@
+--TEST--
+mb_output_handler() (EUC-JP)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+// TODO: Do real test
+
+// EUC-JP
+$euc_jp = "テスト用日本語文字列。このモジュールはPHPにマルチバイト関数を提供します。";
+mb_http_output('EUC-JP') or print("mb_http_output() failed\n");
+ob_start('mb_output_handler');
+echo $euc_jp;
+$output = ob_get_clean();
+
+var_dump( $output );
+
+?>
+
+--EXPECT--
+string(73) "テスト用日本語文字列。このモジュールはPHPにマルチバイト関数を提供します。"
diff --git a/ext/mbstring/tests/mb_output_handler_pattern-01.phpt b/ext/mbstring/tests/mb_output_handler_pattern-01.phpt
new file mode 100644
index 0000000..62825b6
--- /dev/null
+++ b/ext/mbstring/tests/mb_output_handler_pattern-01.phpt
@@ -0,0 +1,18 @@
+--TEST--
+mb_output_handler() and mbstring.http_output_conv_mimetypes (1)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=UTF-8
+--FILE--
+<?php
+mb_http_output("EUC-JP");
+header("Content-Type: text/html");
+ob_start();
+ob_start('mb_output_handler');
+echo "鴻";
+ob_end_flush();
+var_dump(bin2hex(ob_get_clean()));
+?>
+--EXPECT--
+string(12) "a5c6a5b9a5c8"
diff --git a/ext/mbstring/tests/mb_output_handler_pattern-02.phpt b/ext/mbstring/tests/mb_output_handler_pattern-02.phpt
new file mode 100644
index 0000000..e20b115
--- /dev/null
+++ b/ext/mbstring/tests/mb_output_handler_pattern-02.phpt
@@ -0,0 +1,18 @@
+--TEST--
+mb_output_handler() and mbstring.http_output_conv_mimetypes (2)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=UTF-8
+--FILE--
+<?php
+mb_http_output("EUC-JP");
+header("Content-Type: text/plain");
+ob_start();
+ob_start('mb_output_handler');
+echo "鴻";
+ob_end_flush();
+var_dump(bin2hex(ob_get_clean()));
+?>
+--EXPECT--
+string(12) "a5c6a5b9a5c8"
diff --git a/ext/mbstring/tests/mb_output_handler_pattern-03.phpt b/ext/mbstring/tests/mb_output_handler_pattern-03.phpt
new file mode 100644
index 0000000..c4e9886
--- /dev/null
+++ b/ext/mbstring/tests/mb_output_handler_pattern-03.phpt
@@ -0,0 +1,18 @@
+--TEST--
+mb_output_handler() and mbstring.http_output_conv_mimetypes (3)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=UTF-8
+--FILE--
+<?php
+mb_http_output("EUC-JP");
+header("Content-Type: application/xhtml+xml");
+ob_start();
+ob_start('mb_output_handler');
+echo "鴻";
+ob_end_flush();
+var_dump(bin2hex(ob_get_clean()));
+?>
+--EXPECT--
+string(12) "a5c6a5b9a5c8"
diff --git a/ext/mbstring/tests/mb_output_handler_pattern-04.phpt b/ext/mbstring/tests/mb_output_handler_pattern-04.phpt
new file mode 100644
index 0000000..bf8bd76
--- /dev/null
+++ b/ext/mbstring/tests/mb_output_handler_pattern-04.phpt
@@ -0,0 +1,18 @@
+--TEST--
+mb_output_handler() and mbstring.http_output_conv_mimetypes (4)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=UTF-8
+--FILE--
+<?php
+mb_http_output("EUC-JP");
+header("Content-Type: application/octet-stream");
+ob_start();
+ob_start('mb_output_handler');
+echo "鴻";
+ob_end_flush();
+var_dump(bin2hex(ob_get_clean()));
+?>
+--EXPECT--
+string(18) "e38386e382b9e38388"
diff --git a/ext/mbstring/tests/mb_output_handler_pattern-05.phpt b/ext/mbstring/tests/mb_output_handler_pattern-05.phpt
new file mode 100644
index 0000000..c63724e
--- /dev/null
+++ b/ext/mbstring/tests/mb_output_handler_pattern-05.phpt
@@ -0,0 +1,17 @@
+--TEST--
+mb_output_handler() and mbstring.http_output_conv_mimetypes (5)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=UTF-8
+--FILE--
+<?php
+mb_http_output("EUC-JP");
+ob_start();
+ob_start('mb_output_handler');
+echo "鴻";
+ob_end_flush();
+var_dump(bin2hex(ob_get_clean()));
+?>
+--EXPECT--
+string(12) "a5c6a5b9a5c8"
diff --git a/ext/mbstring/tests/mb_output_handler_pattern-06.phpt b/ext/mbstring/tests/mb_output_handler_pattern-06.phpt
new file mode 100644
index 0000000..00cf4af
--- /dev/null
+++ b/ext/mbstring/tests/mb_output_handler_pattern-06.phpt
@@ -0,0 +1,18 @@
+--TEST--
+mb_output_handler() and mbstring.http_output_conv_mimetypes (6)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=UTF-8
+--FILE--
+<?php
+mb_http_output("EUC-JP");
+header("Content-Type: text/html");
+ob_start();
+ob_start('mb_output_handler');
+echo "鴻";
+ob_end_flush();
+var_dump(bin2hex(ob_get_clean()));
+?>
+--EXPECT--
+string(12) "a5c6a5b9a5c8"
diff --git a/ext/mbstring/tests/mb_output_handler_pattern-07.phpt b/ext/mbstring/tests/mb_output_handler_pattern-07.phpt
new file mode 100644
index 0000000..3cc9305
--- /dev/null
+++ b/ext/mbstring/tests/mb_output_handler_pattern-07.phpt
@@ -0,0 +1,19 @@
+--TEST--
+mb_output_handler() and mbstring.http_output_conv_mimetypes (7)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=UTF-8
+mbstring.http_output_conv_mimetypes=html
+--FILE--
+<?php
+mb_http_output("EUC-JP");
+header("Content-Type: text/html");
+ob_start();
+ob_start('mb_output_handler');
+echo "鴻";
+ob_end_flush();
+var_dump(bin2hex(ob_get_clean()));
+?>
+--EXPECT--
+string(12) "a5c6a5b9a5c8"
diff --git a/ext/mbstring/tests/mb_output_handler_pattern-08.phpt b/ext/mbstring/tests/mb_output_handler_pattern-08.phpt
new file mode 100644
index 0000000..5117dec
--- /dev/null
+++ b/ext/mbstring/tests/mb_output_handler_pattern-08.phpt
@@ -0,0 +1,19 @@
+--TEST--
+mb_output_handler() and mbstring.http_output_conv_mimetypes (8)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=UTF-8
+mbstring.http_output_conv_mimetypes=html
+--FILE--
+<?php
+mb_http_output("EUC-JP");
+header("Content-Type: text/plain");
+ob_start();
+ob_start('mb_output_handler');
+echo "鴻";
+ob_end_flush();
+var_dump(bin2hex(ob_get_clean()));
+?>
+--EXPECT--
+string(18) "e38386e382b9e38388"
diff --git a/ext/mbstring/tests/mb_output_handler_pattern-09.phpt b/ext/mbstring/tests/mb_output_handler_pattern-09.phpt
new file mode 100644
index 0000000..e119da0
--- /dev/null
+++ b/ext/mbstring/tests/mb_output_handler_pattern-09.phpt
@@ -0,0 +1,19 @@
+--TEST--
+mb_output_handler() and mbstring.http_output_conv_mimetypes (9)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=UTF-8
+mbstring.http_output_conv_mimetypes=html
+--FILE--
+<?php
+mb_http_output("EUC-JP");
+header("Content-Type: application/xhtml+xml");
+ob_start();
+ob_start('mb_output_handler');
+echo "鴻";
+ob_end_flush();
+var_dump(bin2hex(ob_get_clean()));
+?>
+--EXPECT--
+string(12) "a5c6a5b9a5c8"
diff --git a/ext/mbstring/tests/mb_output_handler_pattern-10.phpt b/ext/mbstring/tests/mb_output_handler_pattern-10.phpt
new file mode 100644
index 0000000..7aec886
--- /dev/null
+++ b/ext/mbstring/tests/mb_output_handler_pattern-10.phpt
@@ -0,0 +1,19 @@
+--TEST--
+mb_output_handler() and mbstring.http_output_conv_mimetypes (10)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=UTF-8
+mbstring.http_output_conv_mimetypes=html
+--FILE--
+<?php
+mb_http_output("EUC-JP");
+header("Content-Type: application/octet-stream");
+ob_start();
+ob_start('mb_output_handler');
+echo "鴻";
+ob_end_flush();
+var_dump(bin2hex(ob_get_clean()));
+?>
+--EXPECT--
+string(18) "e38386e382b9e38388"
diff --git a/ext/mbstring/tests/mb_output_handler_pattern-11.phpt b/ext/mbstring/tests/mb_output_handler_pattern-11.phpt
new file mode 100644
index 0000000..2b16479
--- /dev/null
+++ b/ext/mbstring/tests/mb_output_handler_pattern-11.phpt
@@ -0,0 +1,17 @@
+--TEST--
+mb_output_handler() and mbstring.http_output_conv_mimetypes (11)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=UTF-8
+--FILE--
+<?php
+mb_http_output("EUC-JP");
+ob_start();
+ob_start('mb_output_handler');
+echo "鴻";
+ob_end_flush();
+var_dump(bin2hex(ob_get_clean()));
+?>
+--EXPECT--
+string(12) "a5c6a5b9a5c8"
diff --git a/ext/mbstring/tests/mb_output_handler_pattern-12.phpt b/ext/mbstring/tests/mb_output_handler_pattern-12.phpt
new file mode 100644
index 0000000..d27510b
--- /dev/null
+++ b/ext/mbstring/tests/mb_output_handler_pattern-12.phpt
@@ -0,0 +1,18 @@
+--TEST--
+mb_output_handler() and mbstring.http_output_conv_mimetypes (12)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=UTF-8
+--FILE--
+<?php
+mb_http_output("EUC-JP");
+header("Content-Type: text/html");
+ob_start();
+ob_start('mb_output_handler');
+echo "鴻";
+ob_end_flush();
+var_dump(bin2hex(ob_get_clean()));
+?>
+--EXPECT--
+string(12) "a5c6a5b9a5c8"
diff --git a/ext/mbstring/tests/mb_output_handler_runtime_ini_alteration-01.phpt b/ext/mbstring/tests/mb_output_handler_runtime_ini_alteration-01.phpt
new file mode 100644
index 0000000..b7d71f9
--- /dev/null
+++ b/ext/mbstring/tests/mb_output_handler_runtime_ini_alteration-01.phpt
@@ -0,0 +1,20 @@
+--TEST--
+mb_output_handler() and mbstring.http_output_conv_mimetypes alteration in runtime (1)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=UTF-8
+mbstring.http_output_conv_mimetypes=plain
+--FILE--
+<?php
+mb_http_output("EUC-JP");
+ini_set('mbstring.http_output_conv_mimetypes', 'text');
+header("Content-Type: text/html");
+ob_start();
+ob_start('mb_output_handler');
+echo "鴻";
+ob_end_flush();
+var_dump(bin2hex(ob_get_clean()));
+?>
+--EXPECT--
+string(12) "a5c6a5b9a5c8"
diff --git a/ext/mbstring/tests/mb_output_handler_runtime_ini_alteration-02.phpt b/ext/mbstring/tests/mb_output_handler_runtime_ini_alteration-02.phpt
new file mode 100644
index 0000000..d8c21f4
--- /dev/null
+++ b/ext/mbstring/tests/mb_output_handler_runtime_ini_alteration-02.phpt
@@ -0,0 +1,20 @@
+--TEST--
+mb_output_handler() and mbstring.http_output_conv_mimetypes alteration in runtime (2)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=UTF-8
+mbstring.http_output_conv_mimetypes=html
+--FILE--
+<?php
+mb_http_output("EUC-JP");
+ini_set('mbstring.http_output_conv_mimetypes', 'application');
+header("Content-Type: text/html");
+ob_start();
+ob_start('mb_output_handler');
+echo "鴻";
+ob_end_flush();
+var_dump(bin2hex(ob_get_clean()));
+?>
+--EXPECT--
+string(18) "e38386e382b9e38388"
diff --git a/ext/mbstring/tests/mb_output_handler_shift_jis.phpt b/ext/mbstring/tests/mb_output_handler_shift_jis.phpt
new file mode 100644
index 0000000..d4612d9
--- /dev/null
+++ b/ext/mbstring/tests/mb_output_handler_shift_jis.phpt
@@ -0,0 +1,16 @@
+--TEST--
+mb_output_handler() (Shift_JIS)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+output_handler=mb_output_handler
+mbstring.internal_encoding=Shift_JIS
+mbstring.http_output=EUC-JP
+--FILE--
+<?php
+// Shift_JIS
+var_dump("eXgp{BW[PHP}`oCgB");
+?>
+
+--EXPECT--
+string(73) "テスト用日本語文字列。このモジュールはPHPにマルチバイト関数を提供します。"
diff --git a/ext/mbstring/tests/mb_parse_str.phpt b/ext/mbstring/tests/mb_parse_str.phpt
new file mode 100644
index 0000000..59d187b
--- /dev/null
+++ b/ext/mbstring/tests/mb_parse_str.phpt
@@ -0,0 +1,81 @@
+--TEST--
+mb_parse_str()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FAIL--
+register_globals calls killed the ability for mb_parse_str() to register into the global scope
+--INI--
+arg_separator.input=&
+--FILE--
+<?php
+$queries = array(
+ "foo=abc&bar=def",
+ "%2bfoo=def&-bar=jkl",
+ "foo[]=abc&foo[]=def&foo[]=ghi&bar[]=jkl"
+);
+function test($query) {
+ $foo = '';
+ $bar = '';
+ mb_parse_str($query, $array);
+ var_dump($array);
+ var_dump($foo);
+ var_dump($bar);
+ mb_parse_str($query);
+ var_dump($foo);
+ var_dump($bar);
+}
+foreach ($queries as $query) {
+ test($query);
+}
+?>
+--EXPECT--
+array(2) {
+ ["foo"]=>
+ string(3) "abc"
+ ["bar"]=>
+ string(3) "def"
+}
+string(0) ""
+string(0) ""
+string(3) "abc"
+string(3) "def"
+array(2) {
+ ["+foo"]=>
+ string(3) "def"
+ ["-bar"]=>
+ string(3) "jkl"
+}
+string(0) ""
+string(0) ""
+string(0) ""
+string(0) ""
+array(2) {
+ ["foo"]=>
+ array(3) {
+ [0]=>
+ string(3) "abc"
+ [1]=>
+ string(3) "def"
+ [2]=>
+ string(3) "ghi"
+ }
+ ["bar"]=>
+ array(1) {
+ [0]=>
+ string(3) "jkl"
+ }
+}
+string(0) ""
+string(0) ""
+array(3) {
+ [0]=>
+ string(3) "abc"
+ [1]=>
+ string(3) "def"
+ [2]=>
+ string(3) "ghi"
+}
+array(1) {
+ [0]=>
+ string(3) "jkl"
+}
diff --git a/ext/mbstring/tests/mb_parse_str02.phpt b/ext/mbstring/tests/mb_parse_str02.phpt
new file mode 100644
index 0000000..f356999
--- /dev/null
+++ b/ext/mbstring/tests/mb_parse_str02.phpt
@@ -0,0 +1,106 @@
+--TEST--
+mb_parse_str() test 2
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FAIL--
+register_globals calls killed the ability for mb_parse_str() to register into the global scope
+--INI--
+arg_separator.input=&#
+--FILE--
+<?php
+$queries = array(
+ "foo=abc#bar=def&fubar=ghi",
+ "%2bfoo=def&-bar=jkl#+fubar",
+ " foo[]=abc&foo[]=def#foo[]=ghi#bar[]=#foo[]&fubar[]=="
+);
+function test($query) {
+ $foo = '';
+ $bar = '';
+ $fubar = '';
+ mb_parse_str($query, $array);
+ var_dump($array);
+ var_dump($foo);
+ var_dump($bar);
+ var_dump($fubar);
+ mb_parse_str($query);
+ var_dump($foo);
+ var_dump($bar);
+ var_dump($fubar);
+}
+foreach ($queries as $query) {
+ test($query);
+}
+?>
+--EXPECT--
+array(3) {
+ ["foo"]=>
+ string(3) "abc"
+ ["bar"]=>
+ string(3) "def"
+ ["fubar"]=>
+ string(3) "ghi"
+}
+string(0) ""
+string(0) ""
+string(0) ""
+string(3) "abc"
+string(3) "def"
+string(3) "ghi"
+array(3) {
+ ["+foo"]=>
+ string(3) "def"
+ ["-bar"]=>
+ string(3) "jkl"
+ ["fubar"]=>
+ string(0) ""
+}
+string(0) ""
+string(0) ""
+string(0) ""
+string(0) ""
+string(0) ""
+string(0) ""
+array(3) {
+ ["foo"]=>
+ array(4) {
+ [0]=>
+ string(3) "abc"
+ [1]=>
+ string(3) "def"
+ [2]=>
+ string(3) "ghi"
+ [3]=>
+ string(0) ""
+ }
+ ["bar"]=>
+ array(1) {
+ [0]=>
+ string(0) ""
+ }
+ ["fubar"]=>
+ array(1) {
+ [0]=>
+ string(1) "="
+ }
+}
+string(0) ""
+string(0) ""
+string(0) ""
+array(4) {
+ [0]=>
+ string(3) "abc"
+ [1]=>
+ string(3) "def"
+ [2]=>
+ string(3) "ghi"
+ [3]=>
+ string(0) ""
+}
+array(1) {
+ [0]=>
+ string(0) ""
+}
+array(1) {
+ [0]=>
+ string(1) "="
+}
diff --git a/ext/mbstring/tests/mb_preferred_mime_name.phpt b/ext/mbstring/tests/mb_preferred_mime_name.phpt
new file mode 100644
index 0000000..9a71ce2
--- /dev/null
+++ b/ext/mbstring/tests/mb_preferred_mime_name.phpt
@@ -0,0 +1,61 @@
+--TEST--
+mb_preferred_mime_name()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+// TODO: Add more encoding names
+
+//$debug=true;
+ini_set('include_path', dirname(__FILE__));
+include_once('common.inc');
+
+
+$str = mb_preferred_mime_name('sjis-win');
+echo "$str\n";
+
+$str = mb_preferred_mime_name('SJIS');
+echo "$str\n";
+
+$str = mb_preferred_mime_name('EUC-JP');
+echo "$str\n";
+
+$str = mb_preferred_mime_name('UTF-8');
+echo "$str\n";
+
+$str = mb_preferred_mime_name('ISO-2022-JP');
+echo "$str\n";
+
+$str = mb_preferred_mime_name('JIS');
+echo "$str\n";
+
+$str = mb_preferred_mime_name('ISO-8859-1');
+echo "$str\n";
+
+$str = mb_preferred_mime_name('UCS2');
+echo "$str\n";
+
+$str = mb_preferred_mime_name('UCS4');
+echo "$str\n";
+
+echo "== INVALID PARAMETER ==\n";
+// Invalid name
+$r = mb_preferred_mime_name('BAD_NAME');
+($r === FALSE) ? print("OK_BAD_NAME\n") : print("NG_BAD_NAME\n");
+
+?>
+
+--EXPECT--
+Shift_JIS
+Shift_JIS
+EUC-JP
+UTF-8
+ISO-2022-JP
+ISO-2022-JP
+ISO-8859-1
+UCS-2
+UCS-4
+== INVALID PARAMETER ==
+ERR: Warning
+OK_BAD_NAME
+
diff --git a/ext/mbstring/tests/mb_regex_encoding_basic.phpt b/ext/mbstring/tests/mb_regex_encoding_basic.phpt
new file mode 100644
index 0000000..a0a41e9
--- /dev/null
+++ b/ext/mbstring/tests/mb_regex_encoding_basic.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_regex_encoding() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_regex_encoding') or die("skip mb_regex_encoding() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto string mb_regex_encoding([string encoding])
+ * Description: Returns the current encoding for regex as a string.
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Test Basic functionality of mb_regex_encoding
+ */
+
+echo "*** Testing mb_regex_encoding() : basic functionality ***\n";
+
+var_dump(mb_regex_encoding());
+
+var_dump(mb_regex_encoding('UTF-8'));
+
+var_dump(mb_regex_encoding());
+
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_regex_encoding() : basic functionality ***
+string(%d) "%s"
+bool(true)
+string(5) "UTF-8"
+Done
diff --git a/ext/mbstring/tests/mb_regex_encoding_error1.phpt b/ext/mbstring/tests/mb_regex_encoding_error1.phpt
new file mode 100644
index 0000000..4c5456d
--- /dev/null
+++ b/ext/mbstring/tests/mb_regex_encoding_error1.phpt
@@ -0,0 +1,36 @@
+--TEST--
+Test mb_regex_encoding() function : error conditions - pass incorrect number of args
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_regex_encoding') or die("skip mb_regex_encoding() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_regex_encoding([string $encoding])
+ * Description: Returns the current encoding for regex as a string.
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Test mb_regex_encoding with one more than expected number of arguments
+ */
+
+echo "*** Testing mb_regex_encoding() : error conditions ***\n";
+
+
+echo "\n-- Testing mb_regex_encoding() function with more than expected no. of arguments --\n";
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_regex_encoding($encoding, $extra_arg) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_regex_encoding() : error conditions ***
+
+-- Testing mb_regex_encoding() function with more than expected no. of arguments --
+
+Warning: mb_regex_encoding() expects at most 1 parameter, 2 given in %s on line %d
+NULL
+Done
diff --git a/ext/mbstring/tests/mb_regex_encoding_error2.phpt b/ext/mbstring/tests/mb_regex_encoding_error2.phpt
new file mode 100644
index 0000000..c752609
--- /dev/null
+++ b/ext/mbstring/tests/mb_regex_encoding_error2.phpt
@@ -0,0 +1,31 @@
+--TEST--
+Test mb_regex_encoding() function : error conditions - Pass an unknown encoding
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_regex_encoding') or die("skip mb_regex_encoding() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_regex_encoding([string $encoding])
+ * Description: Returns the current encoding for regex as a string.
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Pass mb_regex_encoding an unknown type of encoding
+ */
+
+echo "*** Testing mb_regex_encoding() : error conditions ***\n";
+
+var_dump(mb_regex_encoding('unknown'));
+
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_regex_encoding() : error conditions ***
+
+Warning: mb_regex_encoding(): Unknown encoding "unknown" in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_regex_encoding_variation1.phpt b/ext/mbstring/tests/mb_regex_encoding_variation1.phpt
new file mode 100644
index 0000000..09b263d
--- /dev/null
+++ b/ext/mbstring/tests/mb_regex_encoding_variation1.phpt
@@ -0,0 +1,215 @@
+--TEST--
+Test mb_regex_encoding() function : usage variations - Pass different data types as $encoding arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_regex_encoding') or die("skip mb_regex_encoding() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_regex_encoding([string $encoding])
+ * Description: Returns the current encoding for regex as a string.
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Pass different data types as $encoding argument to mb_regex_encoding() to test behaviour
+ * Where possible, 'UTF-8' has been entered as a string value
+ */
+
+echo "*** Testing mb_regex_encoding() : usage variations ***\n";
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_regex_encoding()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_regex_encoding($input) );
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_regex_encoding() : usage variations ***
+
+-- Iteration 1 --
+
+Warning: mb_regex_encoding(): Unknown encoding "0" in %s on line %d
+bool(false)
+
+-- Iteration 2 --
+
+Warning: mb_regex_encoding(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 3 --
+
+Warning: mb_regex_encoding(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_regex_encoding(): Unknown encoding "-2345" in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_regex_encoding(): Unknown encoding "10.5" in %s on line %d
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_regex_encoding(): Unknown encoding "-10.5" in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_regex_encoding(): Unknown encoding "123456789000" in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+
+Warning: mb_regex_encoding(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+-- Iteration 9 --
+
+Warning: mb_regex_encoding(): Unknown encoding "0.5" in %s on line %d
+bool(false)
+
+-- Iteration 10 --
+
+Warning: mb_regex_encoding(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 11 --
+
+Warning: mb_regex_encoding(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 12 --
+
+Warning: mb_regex_encoding(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 13 --
+
+Warning: mb_regex_encoding(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 14 --
+
+Warning: mb_regex_encoding(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 15 --
+
+Warning: mb_regex_encoding(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 16 --
+
+Warning: mb_regex_encoding(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_regex_encoding(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+bool(true)
+
+-- Iteration 19 --
+bool(true)
+
+-- Iteration 20 --
+bool(true)
+
+-- Iteration 21 --
+bool(true)
+
+-- Iteration 22 --
+
+Warning: mb_regex_encoding(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 23 --
+
+Warning: mb_regex_encoding(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_regex_encoding() expects parameter 1 to be string, resource given in %s on line %d
+NULL
+Done
diff --git a/ext/mbstring/tests/mb_regex_encoding_variation2.phpt b/ext/mbstring/tests/mb_regex_encoding_variation2.phpt
new file mode 100644
index 0000000..fc9c600
--- /dev/null
+++ b/ext/mbstring/tests/mb_regex_encoding_variation2.phpt
@@ -0,0 +1,420 @@
+--TEST--
+Test mb_regex_encoding() function : usage variations - test different encodings
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_regex_encoding') or die("skip mb_regex_encoding() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_regex_encoding([string $encoding])
+ * Description: Returns the current encoding for regex as a string.
+ * Source code: ext/mbstring/php_mbregex.c
+ */
+
+/*
+ * Test all listed encoding types from php.net to check all are known to function
+ * NB: The strings passed are *NOT* necessarily encoded in the encoding passed to the function.
+ * This test is purely to see whether the function recognises the encoding.
+ */
+
+echo "*** Testing mb_regex_encoding() : usage variations ***\n";
+
+$encoding = array('UCS-4', /*1*/
+ 'UCS-4BE',
+ 'UCS-4LE',
+ 'UCS-2',
+ 'UCS-2BE', /*5*/
+ 'UCS-2LE',
+ 'UTF-32',
+ 'UTF-32BE',
+ 'UTF-32LE',
+ 'UTF-16', /*10*/
+ 'UTF-16BE',
+ 'UTF-16LE',
+ 'UTF-7',
+ 'UTF7-IMAP',
+ 'UTF-8', /*15*/
+ 'ASCII',
+ 'EUC-JP',
+ 'SJIS',
+ 'eucJP-win',
+ 'SJIS-win', /*20*/
+ 'ISO-2022-JP',
+ 'JIS',
+ 'ISO-8859-1',
+ 'ISO-8859-2',
+ 'ISO-8859-3', /*25*/
+ 'ISO-8859-4',
+ 'ISO-8859-5',
+ 'ISO-8859-6',
+ 'ISO-8859-7',
+ 'ISO-8859-8', /*30*/
+ 'ISO-8859-9',
+ 'ISO-8859-10',
+ 'ISO-8859-13',
+ 'ISO-8859-14',
+ 'ISO-8859-15', /*35*/
+ 'byte2be',
+ 'byte2le',
+ 'byte4be',
+ 'byte4le',
+ 'BASE64', /*40*/
+ 'HTML-ENTITIES',
+ '7bit',
+ '8bit',
+ 'EUC-CN',
+ 'CP936', /*45*/
+ 'HZ',
+ 'EUC-TW',
+ 'CP950',
+ 'BIG-5',
+ 'EUC-KR', /*50*/
+ 'UHC',
+ 'ISO-2022-KR',
+ 'Windows-1251',
+ 'Windows-1252',
+ 'CP866', /*55*/
+ 'KOI8-R'); /*56*/
+
+$iterator = 1;
+foreach($encoding as $enc) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump(mb_regex_encoding());
+ var_dump(mb_regex_encoding($enc));
+ var_dump(mb_regex_encoding());
+ $iterator++;
+}
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_regex_encoding() : usage variations ***
+
+-- Iteration 1 --
+string(%d) "%s"
+bool(true)
+string(5) "UCS-4"
+
+-- Iteration 2 --
+string(5) "UCS-4"
+
+Warning: mb_regex_encoding(): Unknown encoding "UCS-4BE" in %s on line %d
+bool(false)
+string(5) "UCS-4"
+
+-- Iteration 3 --
+string(5) "UCS-4"
+bool(true)
+string(7) "UCS-4LE"
+
+-- Iteration 4 --
+string(7) "UCS-4LE"
+
+Warning: mb_regex_encoding(): Unknown encoding "UCS-2" in %s on line %d
+bool(false)
+string(7) "UCS-4LE"
+
+-- Iteration 5 --
+string(7) "UCS-4LE"
+
+Warning: mb_regex_encoding(): Unknown encoding "UCS-2BE" in %s on line %d
+bool(false)
+string(7) "UCS-4LE"
+
+-- Iteration 6 --
+string(7) "UCS-4LE"
+
+Warning: mb_regex_encoding(): Unknown encoding "UCS-2LE" in %s on line %d
+bool(false)
+string(7) "UCS-4LE"
+
+-- Iteration 7 --
+string(7) "UCS-4LE"
+bool(true)
+string(5) "UCS-4"
+
+-- Iteration 8 --
+string(5) "UCS-4"
+bool(true)
+string(5) "UCS-4"
+
+-- Iteration 9 --
+string(5) "UCS-4"
+bool(true)
+string(7) "UCS-4LE"
+
+-- Iteration 10 --
+string(7) "UCS-4LE"
+bool(true)
+string(6) "UTF-16"
+
+-- Iteration 11 --
+string(6) "UTF-16"
+bool(true)
+string(6) "UTF-16"
+
+-- Iteration 12 --
+string(6) "UTF-16"
+bool(true)
+string(8) "UTF-16LE"
+
+-- Iteration 13 --
+string(8) "UTF-16LE"
+
+Warning: mb_regex_encoding(): Unknown encoding "UTF-7" in %s on line %d
+bool(false)
+string(8) "UTF-16LE"
+
+-- Iteration 14 --
+string(8) "UTF-16LE"
+
+Warning: mb_regex_encoding(): Unknown encoding "UTF7-IMAP" in %s on line %d
+bool(false)
+string(8) "UTF-16LE"
+
+-- Iteration 15 --
+string(8) "UTF-16LE"
+bool(true)
+string(5) "UTF-8"
+
+-- Iteration 16 --
+string(5) "UTF-8"
+bool(true)
+string(5) "ASCII"
+
+-- Iteration 17 --
+string(5) "ASCII"
+bool(true)
+string(6) "EUC-JP"
+
+-- Iteration 18 --
+string(6) "EUC-JP"
+bool(true)
+string(4) "SJIS"
+
+-- Iteration 19 --
+string(4) "SJIS"
+bool(true)
+string(6) "EUC-JP"
+
+-- Iteration 20 --
+string(6) "EUC-JP"
+bool(true)
+string(4) "SJIS"
+
+-- Iteration 21 --
+string(4) "SJIS"
+
+Warning: mb_regex_encoding(): Unknown encoding "ISO-2022-JP" in %s on line %d
+bool(false)
+string(4) "SJIS"
+
+-- Iteration 22 --
+string(4) "SJIS"
+
+Warning: mb_regex_encoding(): Unknown encoding "JIS" in %s on line %d
+bool(false)
+string(4) "SJIS"
+
+-- Iteration 23 --
+string(4) "SJIS"
+bool(true)
+string(10) "ISO-8859-1"
+
+-- Iteration 24 --
+string(10) "ISO-8859-1"
+bool(true)
+string(10) "ISO-8859-2"
+
+-- Iteration 25 --
+string(10) "ISO-8859-2"
+bool(true)
+string(10) "ISO-8859-3"
+
+-- Iteration 26 --
+string(10) "ISO-8859-3"
+bool(true)
+string(10) "ISO-8859-4"
+
+-- Iteration 27 --
+string(10) "ISO-8859-4"
+bool(true)
+string(10) "ISO-8859-5"
+
+-- Iteration 28 --
+string(10) "ISO-8859-5"
+bool(true)
+string(10) "ISO-8859-6"
+
+-- Iteration 29 --
+string(10) "ISO-8859-6"
+bool(true)
+string(10) "ISO-8859-7"
+
+-- Iteration 30 --
+string(10) "ISO-8859-7"
+bool(true)
+string(10) "ISO-8859-8"
+
+-- Iteration 31 --
+string(10) "ISO-8859-8"
+bool(true)
+string(10) "ISO-8859-9"
+
+-- Iteration 32 --
+string(10) "ISO-8859-9"
+bool(true)
+string(11) "ISO-8859-10"
+
+-- Iteration 33 --
+string(11) "ISO-8859-10"
+bool(true)
+string(11) "ISO-8859-13"
+
+-- Iteration 34 --
+string(11) "ISO-8859-13"
+bool(true)
+string(11) "ISO-8859-14"
+
+-- Iteration 35 --
+string(11) "ISO-8859-14"
+bool(true)
+string(11) "ISO-8859-15"
+
+-- Iteration 36 --
+string(11) "ISO-8859-15"
+
+Warning: mb_regex_encoding(): Unknown encoding "byte2be" in %s on line %d
+bool(false)
+string(11) "ISO-8859-15"
+
+-- Iteration 37 --
+string(11) "ISO-8859-15"
+
+Warning: mb_regex_encoding(): Unknown encoding "byte2le" in %s on line %d
+bool(false)
+string(11) "ISO-8859-15"
+
+-- Iteration 38 --
+string(11) "ISO-8859-15"
+
+Warning: mb_regex_encoding(): Unknown encoding "byte4be" in %s on line %d
+bool(false)
+string(11) "ISO-8859-15"
+
+-- Iteration 39 --
+string(11) "ISO-8859-15"
+
+Warning: mb_regex_encoding(): Unknown encoding "byte4le" in %s on line %d
+bool(false)
+string(11) "ISO-8859-15"
+
+-- Iteration 40 --
+string(11) "ISO-8859-15"
+
+Warning: mb_regex_encoding(): Unknown encoding "BASE64" in %s on line %d
+bool(false)
+string(11) "ISO-8859-15"
+
+-- Iteration 41 --
+string(11) "ISO-8859-15"
+
+Warning: mb_regex_encoding(): Unknown encoding "HTML-ENTITIES" in %s on line %d
+bool(false)
+string(11) "ISO-8859-15"
+
+-- Iteration 42 --
+string(11) "ISO-8859-15"
+
+Warning: mb_regex_encoding(): Unknown encoding "7bit" in %s on line %d
+bool(false)
+string(11) "ISO-8859-15"
+
+-- Iteration 43 --
+string(11) "ISO-8859-15"
+
+Warning: mb_regex_encoding(): Unknown encoding "8bit" in %s on line %d
+bool(false)
+string(11) "ISO-8859-15"
+
+-- Iteration 44 --
+string(11) "ISO-8859-15"
+bool(true)
+string(6) "EUC-CN"
+
+-- Iteration 45 --
+string(6) "EUC-CN"
+
+Warning: mb_regex_encoding(): Unknown encoding "CP936" in %s on line %d
+bool(false)
+string(6) "EUC-CN"
+
+-- Iteration 46 --
+string(6) "EUC-CN"
+
+Warning: mb_regex_encoding(): Unknown encoding "HZ" in %s on line %d
+bool(false)
+string(6) "EUC-CN"
+
+-- Iteration 47 --
+string(6) "EUC-CN"
+bool(true)
+string(6) "EUC-TW"
+
+-- Iteration 48 --
+string(6) "EUC-TW"
+
+Warning: mb_regex_encoding(): Unknown encoding "CP950" in %s on line %d
+bool(false)
+string(6) "EUC-TW"
+
+-- Iteration 49 --
+string(6) "EUC-TW"
+bool(true)
+string(4) "BIG5"
+
+-- Iteration 50 --
+string(4) "BIG5"
+bool(true)
+string(6) "EUC-KR"
+
+-- Iteration 51 --
+string(6) "EUC-KR"
+
+Warning: mb_regex_encoding(): Unknown encoding "UHC" in %s on line %d
+bool(false)
+string(6) "EUC-KR"
+
+-- Iteration 52 --
+string(6) "EUC-KR"
+
+Warning: mb_regex_encoding(): Unknown encoding "ISO-2022-KR" in %s on line %d
+bool(false)
+string(6) "EUC-KR"
+
+-- Iteration 53 --
+string(6) "EUC-KR"
+
+Warning: mb_regex_encoding(): Unknown encoding "Windows-1251" in %s on line %d
+bool(false)
+string(6) "EUC-KR"
+
+-- Iteration 54 --
+string(6) "EUC-KR"
+
+Warning: mb_regex_encoding(): Unknown encoding "Windows-1252" in %s on line %d
+bool(false)
+string(6) "EUC-KR"
+
+-- Iteration 55 --
+string(6) "EUC-KR"
+
+Warning: mb_regex_encoding(): Unknown encoding "CP866" in %s on line %d
+bool(false)
+string(6) "EUC-KR"
+
+-- Iteration 56 --
+string(6) "EUC-KR"
+bool(true)
+string(5) "KOI8R"
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_regex_set_options.phpt b/ext/mbstring/tests/mb_regex_set_options.phpt
new file mode 100644
index 0000000..88ee9c9
--- /dev/null
+++ b/ext/mbstring/tests/mb_regex_set_options.phpt
@@ -0,0 +1,18 @@
+--TEST--
+mb_regex_set_options()
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die("skip mbstring not available\n");
+function_exists('mb_regex_set_options') or die("skip\n");
+?>
+--FILE--
+<?php
+ mb_regex_set_options( 'x' );
+ print mb_ereg_replace(' -', '+', '- - - - -' );
+
+ mb_regex_set_options( '' );
+ print mb_ereg_replace(' -', '+', '- - - - -' );
+?>
+
+--EXPECT--
++ + + + +-++++
diff --git a/ext/mbstring/tests/mb_send_mail01.phpt b/ext/mbstring/tests/mb_send_mail01.phpt
new file mode 100644
index 0000000..8ed9ea9
--- /dev/null
+++ b/ext/mbstring/tests/mb_send_mail01.phpt
@@ -0,0 +1,42 @@
+--TEST--
+mb_send_mail() test 1 (lang=neutral)
+--SKIPIF--
+<?php
+if (substr(PHP_OS, 0, 3) == 'WIN') {
+ die('skip.. Not valid for Windows');
+}
+if (!function_exists("mb_send_mail") || !mb_language("neutral")) {
+ die("skip mb_send_mail() not available");
+}
+?>
+--INI--
+sendmail_path=/bin/cat
+mail.add_x_header=off
+--FILE--
+<?php
+$to = 'example@example.com';
+
+/* default setting */
+mb_send_mail($to, mb_language(), "test");
+
+/* neutral (UTF-8) */
+if (mb_language("neutral")) {
+ mb_internal_encoding("none");
+ mb_send_mail($to, "test ".mb_language(), "test");
+}
+?>
+--EXPECTF--
+To: example@example.com
+Subject: %s
+MIME-Version: 1.0
+Content-Type: text/plain; charset=%s
+Content-Transfer-Encoding: %s
+
+%s
+To: example@example.com
+Subject: test neutral
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: BASE64
+
+dGVzdA==
diff --git a/ext/mbstring/tests/mb_send_mail02.phpt b/ext/mbstring/tests/mb_send_mail02.phpt
new file mode 100644
index 0000000..923f571
--- /dev/null
+++ b/ext/mbstring/tests/mb_send_mail02.phpt
@@ -0,0 +1,42 @@
+--TEST--
+mb_send_mail() test 2 (lang=Japanese)
+--SKIPIF--
+<?php
+if (substr(PHP_OS, 0, 3) == 'WIN') {
+ die('skip.. Not valid for Windows');
+}
+if (!function_exists("mb_send_mail") || !mb_language("japanese")) {
+ die("skip mb_send_mail() not available");
+}
+?>
+--INI--
+sendmail_path=/bin/cat
+mail.add_x_header=off
+--FILE--
+<?php
+$to = 'example@example.com';
+
+/* default setting */
+mb_send_mail($to, mb_language(), "test");
+
+/* Japanese (EUC-JP) */
+if (mb_language("japanese")) {
+ mb_internal_encoding('EUC-JP');
+ mb_send_mail($to, "テスト ".mb_language(), "テスト");
+}
+?>
+--EXPECTF--
+To: example@example.com
+Subject: %s
+MIME-Version: 1.0
+Content-Type: text/plain; charset=%s
+Content-Transfer-Encoding: %s
+
+%s
+To: example@example.com
+Subject: =?ISO-2022-JP?B?GyRCJUYlOSVIGyhCIEphcGFuZXNl?=
+MIME-Version: 1.0
+Content-Type: text/plain; charset=ISO-2022-JP
+Content-Transfer-Encoding: 7bit
+
+$B%F%9%H(B
diff --git a/ext/mbstring/tests/mb_send_mail03.phpt b/ext/mbstring/tests/mb_send_mail03.phpt
new file mode 100644
index 0000000..1b16529
--- /dev/null
+++ b/ext/mbstring/tests/mb_send_mail03.phpt
@@ -0,0 +1,42 @@
+--TEST--
+mb_send_mail() test 3 (lang=English)
+--SKIPIF--
+<?php
+if (substr(PHP_OS, 0, 3) == 'WIN') {
+ die('skip.. Not valid for Windows');
+}
+if (!function_exists("mb_send_mail") || !mb_language("english")) {
+ die("skip mb_send_mail() not available");
+}
+?>
+--INI--
+sendmail_path=/bin/cat
+mail.add_x_header=off
+--FILE--
+<?php
+$to = 'example@example.com';
+
+/* default setting */
+mb_send_mail($to, mb_language(), "test");
+
+/* English (iso-8859-1) */
+if (mb_language("english")) {
+ mb_internal_encoding("ISO-8859-1");
+ mb_send_mail($to, "test ".mb_language(), "test");
+}
+?>
+--EXPECTF--
+To: example@example.com
+Subject: %s
+MIME-Version: 1.0
+Content-Type: text/plain; charset=%s
+Content-Transfer-Encoding: %s
+
+%s
+To: example@example.com
+Subject: test English
+MIME-Version: 1.0
+Content-Type: text/plain; charset=%s-8859-1
+Content-Transfer-Encoding: 8bit
+
+test
diff --git a/ext/mbstring/tests/mb_send_mail04.phpt b/ext/mbstring/tests/mb_send_mail04.phpt
new file mode 100644
index 0000000..fbff4cd
--- /dev/null
+++ b/ext/mbstring/tests/mb_send_mail04.phpt
@@ -0,0 +1,42 @@
+--TEST--
+mb_send_mail() test 4 (lang=German)
+--SKIPIF--
+<?php
+if (substr(PHP_OS, 0, 3) == 'WIN') {
+ die('skip.. Not valid for Windows');
+}
+if (!function_exists("mb_send_mail") || !mb_language("german")) {
+ die("skip mb_send_mail() not available");
+}
+?>
+--INI--
+sendmail_path=/bin/cat
+mail.add_x_header=off
+--FILE--
+<?php
+$to = 'example@example.com';
+
+/* default setting */
+mb_send_mail($to, mb_language(), "test");
+
+/* German (iso-8859-15) */
+if (mb_language("german")) {
+ mb_internal_encoding("ISO-8859-15");
+ mb_send_mail($to, "Pr"."\xfc"."fung ".mb_language(), "Pr"."\xfc"."fung");
+}
+?>
+--EXPECTF--
+To: example@example.com
+Subject: %s
+MIME-Version: 1.0
+Content-Type: text/plain; charset=%s
+Content-Transfer-Encoding: %s
+
+%s
+To: example@example.com
+Subject: =?ISO-8859-15?Q?Pr=FCfung=20German?=
+MIME-Version: 1.0
+Content-Type: text/plain; charset=%s-8859-15
+Content-Transfer-Encoding: 8bit
+
+Prfung
diff --git a/ext/mbstring/tests/mb_send_mail05.phpt b/ext/mbstring/tests/mb_send_mail05.phpt
new file mode 100644
index 0000000..aa68ab8
--- /dev/null
+++ b/ext/mbstring/tests/mb_send_mail05.phpt
@@ -0,0 +1,46 @@
+--TEST--
+mb_send_mail() test 5 (lang=Simplified Chinese)
+--SKIPIF--
+<?php
+if (substr(PHP_OS, 0, 3) == 'WIN') {
+ die('skip.. Not valid for Windows');
+}
+if (!function_exists("mb_send_mail") || !mb_language("Simplified Chinese")) {
+ die("skip mb_send_mail() not available");
+}
+if (!@mb_internal_encoding('GB2312')) {
+ die("skip GB2312 encoding is not available on this platform");
+}
+?>
+--INI--
+sendmail_path=/bin/cat
+mail.add_x_header=off
+--FILE--
+<?php
+$to = 'example@example.com';
+
+/* default setting */
+mb_send_mail($to, mb_language(), "test");
+
+/* Simplified Chinese (HK-GB-2312) */
+if (mb_language("simplified chinese")) {
+ mb_internal_encoding('GB2312');
+ mb_send_mail($to, "霞刮 ".mb_language(), "霞刮");
+}
+?>
+--EXPECTF--
+To: example@example.com
+Subject: %s
+MIME-Version: 1.0
+Content-Type: text/plain; charset=%s
+Content-Transfer-Encoding: %s
+
+%s
+To: example@example.com
+Subject: =?HZ-GB-2312?B?fnsyYlFpfn0gU2ltcGxpZmllZCBD?=
+ =?HZ-GB-2312?B?aGluZXNl?=
+MIME-Version: 1.0
+Content-Type: text/plain; charset=HZ-GB-2312
+Content-Transfer-Encoding: 7bit
+
+~{2bQi~}
diff --git a/ext/mbstring/tests/mb_send_mail06.phpt b/ext/mbstring/tests/mb_send_mail06.phpt
new file mode 100644
index 0000000..df3f065
--- /dev/null
+++ b/ext/mbstring/tests/mb_send_mail06.phpt
@@ -0,0 +1,45 @@
+--TEST--
+mb_send_mail() test 6 (lang=Traditional Chinese)
+--SKIPIF--
+<?php
+if (substr(PHP_OS, 0, 3) == 'WIN') {
+ die('skip.. Not valid for Windows');
+}
+if (!function_exists("mb_send_mail") || !mb_language("Traditional Chinese")) {
+ die("skip mb_send_mail() not available");
+}
+if (!@mb_internal_encoding('BIG5')) {
+ die("skip BIG5 encoding is not available on this platform");
+}
+?>
+--INI--
+sendmail_path=/bin/cat
+mail.add_x_header=off
+--FILE--
+<?php
+$to = 'example@example.com';
+
+/* default setting */
+mb_send_mail($to, mb_language(), "test");
+
+/* Traditional Chinese () */
+if (mb_language("traditional chinese")) {
+ mb_internal_encoding('BIG5');
+ mb_send_mail($to, "旗島 ".mb_language(), "旗島");
+}
+?>
+--EXPECTF--
+To: example@example.com
+Subject: %s
+MIME-Version: 1.0
+Content-Type: text/plain; charset=%s
+Content-Transfer-Encoding: %s
+
+%s
+To: example@example.com
+Subject: =?BIG5?B?tPrF5yBUcmFkaXRpb25hbCBDaGluZXNl?=
+MIME-Version: 1.0
+Content-Type: text/plain; charset=BIG5
+Content-Transfer-Encoding: 8bit
+
+旗島
diff --git a/ext/mbstring/tests/mb_send_mail07.phpt b/ext/mbstring/tests/mb_send_mail07.phpt
new file mode 100644
index 0000000..f62eccb
--- /dev/null
+++ b/ext/mbstring/tests/mb_send_mail07.phpt
@@ -0,0 +1,45 @@
+--TEST--
+mb_send_mail() test 7 (lang=Korean)
+--SKIPIF--
+<?php
+if (substr(PHP_OS, 0, 3) == 'WIN') {
+ die('skip.. Not valid for Windows');
+}
+if (!function_exists("mb_send_mail") || !mb_language("Korean")) {
+ die("skip mb_send_mail() not available");
+}
+if (!@mb_internal_encoding('ISO-2022-KR')) {
+ die("skip ISO-2022-KR encoding is not available on this platform");
+}
+?>
+--INI--
+sendmail_path=/bin/cat
+mail.add_x_header=off
+--FILE--
+<?php
+$to = 'example@example.com';
+
+/* default setting */
+mb_send_mail($to, mb_language(), "test");
+
+/* Korean */
+if (mb_language("korean")) {
+ mb_internal_encoding('EUC-KR');
+ mb_send_mail($to, "砺什闘 ".mb_language(), "砺什闘");
+}
+?>
+--EXPECTF--
+To: example@example.com
+Subject: %s
+MIME-Version: 1.0
+Content-Type: text/plain; charset=%s
+Content-Transfer-Encoding: %s
+
+%s
+To: example@example.com
+Subject: =?ISO-2022-KR?B?GyQpQw5FVz06Ri4PIEtvcmVhbg8=?=
+MIME-Version: 1.0
+Content-Type: text/plain; charset=ISO-2022-KR
+Content-Transfer-Encoding: 7bit
+
+$)CEW=:F.
diff --git a/ext/mbstring/tests/mb_split-compat-01.phpt b/ext/mbstring/tests/mb_split-compat-01.phpt
new file mode 100644
index 0000000..8dbc82c
--- /dev/null
+++ b/ext/mbstring/tests/mb_split-compat-01.phpt
@@ -0,0 +1,23 @@
+--TEST--
+mb_split() compat test 1
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_split') or die("skip mb_split() is not available in this build");
+?>
+--FILE--
+<?php
+/* (counterpart: ext/standard/tests/reg/009.phpt) */
+ $a=mb_split("[[:space:]]","this is a
+test");
+ echo count($a) . "\n";
+ for ($i = 0; $i < count($a); $i++) {
+ echo $a[$i] . "\n";
+ }
+?>
+--EXPECT--
+4
+this
+is
+a
+test
diff --git a/ext/mbstring/tests/mb_split.phpt b/ext/mbstring/tests/mb_split.phpt
new file mode 100644
index 0000000..c10b0d7
--- /dev/null
+++ b/ext/mbstring/tests/mb_split.phpt
@@ -0,0 +1,67 @@
+--TEST--
+mb_split()
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+function_exists('mb_split') or die("skip mb_split() is not available in this build");
+?>
+--INI--
+mbstring.func_overload=0
+--FILE--
+<?php
+ mb_regex_set_options( '' );
+ mb_regex_encoding( 'EUC-JP' );
+
+ function verify_split( $spliton, $str, $count = 0 )
+ {
+ $result1 = mb_split( $spliton, $str, $count );
+ $result2 = split( $spliton, $str, $count );
+ if ( $result1 == $result2 ) {
+ print "ok\n";
+ } else {
+ print count($result1).'-'.count($result2)."\n";
+ }
+ }
+
+ var_dump( mb_split( b" ", b"a b c d e f g" )
+ == mb_split( b"[[:space:]]", b"a\nb\tc\nd e f g" ) );
+
+ for ( $i = 0; $i < 5; ++$i ) {
+ verify_split( b" ", b"a\tb\tc\td e\tf g", $i );
+ }
+
+ for ( $i = 1; $i < 5; ++$i ) {
+ verify_split( b"\xa1\xa1+", b"\xa1\xa1\xa1\xa2\xa2\xa1\xa1\xa1\xa1\xa1\xa1\xa2\xa2\xa1\xa1\xa1", $i );
+ }
+?>
+
+--EXPECTF--
+bool(true)
+
+Deprecated: Function split() is deprecated in %s on line %d
+ok
+
+Deprecated: Function split() is deprecated in %s on line %d
+ok
+
+Deprecated: Function split() is deprecated in %s on line %d
+ok
+
+Deprecated: Function split() is deprecated in %s on line %d
+ok
+
+Deprecated: Function split() is deprecated in %s on line %d
+ok
+
+Deprecated: Function split() is deprecated in %s on line %d
+ok
+
+Deprecated: Function split() is deprecated in %s on line %d
+2-2
+
+Deprecated: Function split() is deprecated in %s on line %d
+3-3
+
+Deprecated: Function split() is deprecated in %s on line %d
+4-4
+
diff --git a/ext/mbstring/tests/mb_split_empty_match.phpt b/ext/mbstring/tests/mb_split_empty_match.phpt
new file mode 100644
index 0000000..df3a22c
--- /dev/null
+++ b/ext/mbstring/tests/mb_split_empty_match.phpt
@@ -0,0 +1,23 @@
+--TEST--
+mb_split() empty match
+--
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_split') or die("skip mb_split() is not available in this build");
+?>
+--FILE--
+<?php
+mb_regex_set_options('m');
+var_dump(mb_split('^', "a\nb\nc"));
+--EXPECT--
+array(3) {
+ [0]=>
+ string(2) "a
+"
+ [1]=>
+ string(2) "b
+"
+ [2]=>
+ string(1) "c"
+}
diff --git a/ext/mbstring/tests/mb_split_error.phpt b/ext/mbstring/tests/mb_split_error.phpt
new file mode 100644
index 0000000..b48e215
--- /dev/null
+++ b/ext/mbstring/tests/mb_split_error.phpt
@@ -0,0 +1,50 @@
+--TEST--
+Test mb_split() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_split') or die("skip mb_split() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto array mb_split(string pattern, string string [, int limit])
+ * Description: split multibyte string into array by regular expression
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+/*
+ * test too few and too many parameters
+ */
+
+echo "*** Testing mb_split() : error conditions ***\n";
+
+
+//Test mb_split with one more than the expected number of arguments
+echo "\n-- Testing mb_split() function with more than expected no. of arguments --\n";
+$pattern = ' ';
+$string = 'a b c d e f g';
+$limit = 0;
+$extra_arg = 10;
+var_dump( mb_split($pattern, $string, $limit, $extra_arg) );
+
+// Testing mb_split with one less than the expected number of arguments
+echo "\n-- Testing mb_split() function with less than expected no. of arguments --\n";
+$pattern = 'string_val';
+var_dump( mb_split($pattern) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_split() : error conditions ***
+
+-- Testing mb_split() function with more than expected no. of arguments --
+
+Warning: mb_split() expects at most 3 parameters, 4 given in %s on line %d
+bool(false)
+
+-- Testing mb_split() function with less than expected no. of arguments --
+
+Warning: mb_split() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_split_variation1.phpt b/ext/mbstring/tests/mb_split_variation1.phpt
new file mode 100644
index 0000000..b508049
--- /dev/null
+++ b/ext/mbstring/tests/mb_split_variation1.phpt
@@ -0,0 +1,246 @@
+--TEST--
+Test mb_split() function : usage variations - different parameter types for pattern
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_split') or die("skip mb_split() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto array mb_split(string pattern, string string [, int limit])
+ * Description: split multibyte string into array by regular expression
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_split() : usage variations ***\n";
+
+// Initialise function arguments not being substituted (if any)
+$string = 'a b c d e f g';
+$limit = 10;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of the array for pattern
+
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_split($input, $string, $limit) );
+ $iterator++;
+};
+fclose($fp);
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_split() : usage variations ***
+
+-- Iteration 1 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 2 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 3 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 4 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 5 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 6 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 7 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 8 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 9 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 10 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 11 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 12 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 13 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 14 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 15 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 16 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 17 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 18 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 19 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 20 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 21 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 22 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 23 --
+array(1) {
+ [0]=>
+ string(13) "a b c d e f g"
+}
+
+-- Iteration 24 --
+
+Warning: mb_split() expects parameter 1 to be string, resource given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_split_variation2.phpt b/ext/mbstring/tests/mb_split_variation2.phpt
new file mode 100644
index 0000000..a6db2cc
--- /dev/null
+++ b/ext/mbstring/tests/mb_split_variation2.phpt
@@ -0,0 +1,248 @@
+--TEST--
+Test mb_split() function : usage variations - different parameter types for string
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_split') or die("skip mb_split() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto array mb_split(string pattern, string string [, int limit])
+ * Description: split multibyte string into array by regular expression
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+
+echo "*** Testing mb_split() : usage variations ***\n";
+
+// Initialise function arguments not being substituted (if any)
+$pattern = '[a-z]';
+$limit = 10;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of the array for pattern
+
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_split($pattern, $input, $limit) );
+ $iterator++;
+};
+
+fclose($fp);
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_split() : usage variations ***
+
+-- Iteration 1 --
+array(1) {
+ [0]=>
+ string(1) "0"
+}
+
+-- Iteration 2 --
+array(1) {
+ [0]=>
+ string(1) "1"
+}
+
+-- Iteration 3 --
+array(1) {
+ [0]=>
+ string(5) "12345"
+}
+
+-- Iteration 4 --
+array(1) {
+ [0]=>
+ string(5) "-2345"
+}
+
+-- Iteration 5 --
+array(1) {
+ [0]=>
+ string(4) "10.5"
+}
+
+-- Iteration 6 --
+array(1) {
+ [0]=>
+ string(5) "-10.5"
+}
+
+-- Iteration 7 --
+array(1) {
+ [0]=>
+ string(12) "123456789000"
+}
+
+-- Iteration 8 --
+array(1) {
+ [0]=>
+ string(13) "1.23456789E-9"
+}
+
+-- Iteration 9 --
+array(1) {
+ [0]=>
+ string(3) "0.5"
+}
+
+-- Iteration 10 --
+array(1) {
+ [0]=>
+ string(0) ""
+}
+
+-- Iteration 11 --
+array(1) {
+ [0]=>
+ string(0) ""
+}
+
+-- Iteration 12 --
+array(1) {
+ [0]=>
+ string(1) "1"
+}
+
+-- Iteration 13 --
+array(1) {
+ [0]=>
+ string(0) ""
+}
+
+-- Iteration 14 --
+array(1) {
+ [0]=>
+ string(1) "1"
+}
+
+-- Iteration 15 --
+array(1) {
+ [0]=>
+ string(0) ""
+}
+
+-- Iteration 16 --
+array(1) {
+ [0]=>
+ string(0) ""
+}
+
+-- Iteration 17 --
+array(1) {
+ [0]=>
+ string(0) ""
+}
+
+-- Iteration 18 --
+array(1) {
+ [0]=>
+ string(5) "UTF-8"
+}
+
+-- Iteration 19 --
+array(1) {
+ [0]=>
+ string(5) "UTF-8"
+}
+
+-- Iteration 20 --
+array(1) {
+ [0]=>
+ string(5) "UTF-8"
+}
+
+-- Iteration 21 --
+array(1) {
+ [0]=>
+ string(5) "UTF-8"
+}
+
+-- Iteration 22 --
+array(1) {
+ [0]=>
+ string(0) ""
+}
+
+-- Iteration 23 --
+array(1) {
+ [0]=>
+ string(0) ""
+}
+
+-- Iteration 24 --
+
+Warning: mb_split() expects parameter 2 to be string, resource given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_split_variation3.phpt b/ext/mbstring/tests/mb_split_variation3.phpt
new file mode 100644
index 0000000..5422b16
--- /dev/null
+++ b/ext/mbstring/tests/mb_split_variation3.phpt
@@ -0,0 +1,331 @@
+--TEST--
+Test mb_split() function : usage variations - different parameter types for limit
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_split') or die("skip mb_split() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : proto array mb_split(string pattern, string string [, int limit])
+ * Description: split multibyte string into array by regular expression
+ * Source code: ext/mbstring/php_mbregex.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_split() : usage variations ***\n";
+
+// Initialise function arguments not being substituted (if any)
+$pattern = '[a-z]';
+$string = 'string_val';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of the array for pattern
+
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_split($pattern, $string, $input) );
+ $iterator++;
+};
+
+fclose($fp);
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_split() : usage variations ***
+
+-- Iteration 1 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 2 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 3 --
+array(10) {
+ [0]=>
+ string(0) ""
+ [1]=>
+ string(0) ""
+ [2]=>
+ string(0) ""
+ [3]=>
+ string(0) ""
+ [4]=>
+ string(0) ""
+ [5]=>
+ string(0) ""
+ [6]=>
+ string(1) "_"
+ [7]=>
+ string(0) ""
+ [8]=>
+ string(0) ""
+ [9]=>
+ string(0) ""
+}
+
+-- Iteration 4 --
+array(10) {
+ [0]=>
+ string(0) ""
+ [1]=>
+ string(0) ""
+ [2]=>
+ string(0) ""
+ [3]=>
+ string(0) ""
+ [4]=>
+ string(0) ""
+ [5]=>
+ string(0) ""
+ [6]=>
+ string(1) "_"
+ [7]=>
+ string(0) ""
+ [8]=>
+ string(0) ""
+ [9]=>
+ string(0) ""
+}
+
+-- Iteration 5 --
+array(10) {
+ [0]=>
+ string(0) ""
+ [1]=>
+ string(0) ""
+ [2]=>
+ string(0) ""
+ [3]=>
+ string(0) ""
+ [4]=>
+ string(0) ""
+ [5]=>
+ string(0) ""
+ [6]=>
+ string(1) "_"
+ [7]=>
+ string(0) ""
+ [8]=>
+ string(0) ""
+ [9]=>
+ string(0) ""
+}
+
+-- Iteration 6 --
+array(10) {
+ [0]=>
+ string(0) ""
+ [1]=>
+ string(0) ""
+ [2]=>
+ string(0) ""
+ [3]=>
+ string(0) ""
+ [4]=>
+ string(0) ""
+ [5]=>
+ string(0) ""
+ [6]=>
+ string(1) "_"
+ [7]=>
+ string(0) ""
+ [8]=>
+ string(0) ""
+ [9]=>
+ string(0) ""
+}
+
+-- Iteration 7 --
+array(10) {
+ [0]=>
+ string(0) ""
+ [1]=>
+ string(0) ""
+ [2]=>
+ string(0) ""
+ [3]=>
+ string(0) ""
+ [4]=>
+ string(0) ""
+ [5]=>
+ string(0) ""
+ [6]=>
+ string(1) "_"
+ [7]=>
+ string(0) ""
+ [8]=>
+ string(0) ""
+ [9]=>
+ string(0) ""
+}
+
+-- Iteration 8 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 9 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 10 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 11 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 12 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 13 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 14 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 15 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 16 --
+
+Warning: mb_split() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_split() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+
+Warning: mb_split() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 19 --
+
+Warning: mb_split() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 20 --
+
+Warning: mb_split() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 21 --
+
+Warning: mb_split() expects parameter 3 to be long, object given in %s on line %d
+bool(false)
+
+-- Iteration 22 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 23 --
+array(1) {
+ [0]=>
+ string(10) "string_val"
+}
+
+-- Iteration 24 --
+
+Warning: mb_split() expects parameter 3 to be long, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_str_functions_opt-parameter.phpt b/ext/mbstring/tests/mb_str_functions_opt-parameter.phpt
new file mode 100644
index 0000000..5fb642f
--- /dev/null
+++ b/ext/mbstring/tests/mb_str_functions_opt-parameter.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Optional long parameter might be null
+--FILE--
+<?php
+echo mb_strpos('abb', 'b', null, 'UTF-8') . "\n";
+echo mb_strrpos('abb', 'b', null, 'UTF-8') . "\n";
+echo mb_stripos('abb', 'B', null, 'UTF-8') . "\n";
+echo mb_strripos('abb', 'B', null, 'UTF-8') . "\n";
+echo mb_strstr('foobarbaz', 'ba', null, 'UTF-8') . "\n";
+echo mb_strrchr('foobarbaz', 'ba', null, 'UTF-8') . "\n";
+echo mb_stristr('foobarbaz', 'BA', null, 'UTF-8') . "\n";
+echo mb_strrichr('foobarbaz', 'BA', null, 'UTF-8') . "\n";
+echo mb_substr('foobarbaz', 6, null, 'UTF-8') . "\n";
+echo mb_strcut('foobarbaz', 6, null, 'UTF-8') . "\n";
+echo mb_strimwidth('foobar', 0, 3, null, 'UTF-8') . "\n";
+?>
+==DONE==
+--EXPECT--
+1
+2
+1
+2
+barbaz
+baz
+barbaz
+baz
+baz
+baz
+foo
+==DONE==
diff --git a/ext/mbstring/tests/mb_strcut.phpt b/ext/mbstring/tests/mb_strcut.phpt
new file mode 100644
index 0000000..7c78ffe
--- /dev/null
+++ b/ext/mbstring/tests/mb_strcut.phpt
@@ -0,0 +1,34 @@
+--TEST--
+mb_strcut()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+output_handler=
+--FILE--
+<?php
+// TODO: Add more encodings
+ini_set('include_path', dirname(__FILE__));
+include_once('common.inc');
+
+// EUC-JP
+$euc_jp = '0123この文字列は日本語です。EUC-JPを使っています。日本語は面倒臭い。';
+
+print mb_strcut($euc_jp, 6, 5,'EUC-JP') . "\n";
+print mb_strcut($euc_jp, 0, 100,'EUC-JP') . "\n";
+
+$str = mb_strcut($euc_jp, 100, 10,'EUC-JP');
+($str === false) ? print "OK\n" : print "NG: $str\n";
+
+$str = mb_strcut($euc_jp, -100, 10,'EUC-JP');
+($str !== "") ? print "OK: $str\n" : print "NG:\n";
+
+
+?>
+
+--EXPECT--
+の文
+0123この文字列は日本語です。EUC-JPを使っています。日本語は面倒臭い。
+OK
+OK: 0123この文
+
+
diff --git a/ext/mbstring/tests/mb_strcut_missing_boundary_check.phpt b/ext/mbstring/tests/mb_strcut_missing_boundary_check.phpt
new file mode 100644
index 0000000..a67b99e
--- /dev/null
+++ b/ext/mbstring/tests/mb_strcut_missing_boundary_check.phpt
@@ -0,0 +1,31 @@
+--TEST--
+mb_strcut() missing boundary check.
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_convert_encoding') or die("skip mb_convert_encoding() is not available in this build");
+?>
+--FILE--
+<?php
+mb_internal_encoding("UCS-4LE");
+var_dump(bin2hex(mb_strcut("\x61\x00\x00\x00\x62\x00\x00\x00\x63\x00\x00\x00", 0, 32)));
+mb_internal_encoding("UCS-4BE");
+var_dump(bin2hex(mb_strcut("\x00\x00\x00\x61\x00\x00\x00\x62\x00\x00\x00\x63", 0, 32)));
+mb_internal_encoding("UCS-2LE");
+var_dump(bin2hex(mb_strcut("\x61\x00\x62\x00\x63\x00", 0, 32)));
+mb_internal_encoding("UCS-2BE");
+var_dump(bin2hex(mb_strcut("\x00\x61\x00\x62\x00\x63", 0, 32)));
+mb_internal_encoding("UTF-16");
+var_dump(bin2hex(mb_strcut("\x00\x61\x00\x62\x00\x63", 0, 32)));
+mb_internal_encoding("UTF-8");
+var_dump(bin2hex(mb_strcut("abc", 0, 32)));
+mb_internal_encoding("ISO-8859-1");
+var_dump(bin2hex(mb_strcut("abc", 0, 32)));
+--EXPECT--
+string(24) "610000006200000063000000"
+string(24) "000000610000006200000063"
+string(12) "610062006300"
+string(12) "006100620063"
+string(12) "006100620063"
+string(6) "616263"
+string(6) "616263"
diff --git a/ext/mbstring/tests/mb_strimwidth.phpt b/ext/mbstring/tests/mb_strimwidth.phpt
new file mode 100644
index 0000000..82780d6
--- /dev/null
+++ b/ext/mbstring/tests/mb_strimwidth.phpt
@@ -0,0 +1,43 @@
+--TEST--
+mb_strimwidth()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+output_handler=
+--FILE--
+<?php
+// TODO: Add more encoding
+//$debug = true;
+ini_set('include_path', dirname(__FILE__));
+include_once('common.inc');
+
+// EUC-JP
+$euc_jp = '0123この文字列は日本語です。EUC-JPを使っています。日本語は面倒臭い。';
+
+print "1: ". mb_strimwidth($euc_jp, 0, 15,'...','EUC-JP') . "\n";
+print "2: ". mb_strimwidth($euc_jp, 0, 100,'...','EUC-JP') . "\n";
+print "3: ". mb_strimwidth($euc_jp, 15, 100,'...','EUC-JP') . "\n";
+// Note: Did not start form -22 offset. Staring from 0.
+$str = mb_strimwidth($euc_jp,-22, 100,'...','EUC-JP');
+($str === FALSE) ? print "4 OK\n" : print "NG: $str\n";
+
+$str = mb_strimwidth($euc_jp, 100, -10,'...','EUC-JP');
+($str === FALSE) ? print "5 OK\n" : print "NG: $str\n";
+
+$str = mb_strimwidth($euc_jp, -100, 10,'...','EUC-JP');
+($str === FALSE) ? print "6 OK\n" : print "NG: $str\n";
+
+?>
+
+--EXPECT--
+1: 0123この文字...
+2: 0123この文字列は日本語です。EUC-JPを使っています。日本語は面倒臭い。
+3: 。EUC-JPを使っています。日本語は面倒臭い。
+ERR: Warning
+4 OK
+ERR: Warning
+5 OK
+ERR: Warning
+6 OK
+
+
diff --git a/ext/mbstring/tests/mb_stripos.phpt b/ext/mbstring/tests/mb_stripos.phpt
new file mode 100644
index 0000000..c21cdf3
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos.phpt
@@ -0,0 +1,178 @@
+--TEST--
+mb_stripos()
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+// TODO: Add more encodings
+
+//$debug=true;
+ini_set('include_path','.');
+include_once('common.inc');
+
+
+// Test string
+$euc_jp = b'0123この文字列は日本語です。EUC-JPを使っています。0123日本語は面倒臭い。';
+
+// EUC-JP - With encoding parameter
+mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n");
+
+echo "== POSITIVE OFFSET ==\n";
+print mb_stripos($euc_jp,b'日本語', 0, 'EUC-JP') . "\n";
+print mb_stripos($euc_jp, b'0', 0, 'EUC-JP') . "\n";
+print mb_stripos($euc_jp, 3, 0, 'EUC-JP') . "\n";
+print mb_stripos($euc_jp, 0, 0, 'EUC-JP') . "\n";
+print mb_stripos($euc_jp,b'日本語', 15, 'EUC-JP') . "\n";
+print mb_stripos($euc_jp, b'0', 15, 'EUC-JP') . "\n";
+print mb_stripos($euc_jp, 3, 15, 'EUC-JP') . "\n";
+print mb_stripos($euc_jp, 0, 15, 'EUC-JP') . "\n";
+
+// Negative offset
+// Note: PHP Warning - offset is negative.
+// Note: For offset(-15). It does not return position of latter string. (ie the same result as -50)
+echo "== NEGATIVE OFFSET ==\n";
+$r = mb_stripos($euc_jp,b'日本語', -15, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_stripos($euc_jp, b'0', -15, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_stripos($euc_jp, 3, -15, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_stripos($euc_jp, 0, -15, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_stripos($euc_jp,b'日本語', -50, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_stripos($euc_jp, b'0', -50, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_stripos($euc_jp, 3, -50, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_stripos($euc_jp, 0, -50, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+
+// Out of range - should return false
+print ("== OUT OF RANGE ==\n");
+$r = mb_stripos($euc_jp,b'日本語', 40, 'EUC-JP');
+($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
+$r = mb_stripos($euc_jp, b'0', 40, 'EUC-JP');
+($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
+$r = mb_stripos($euc_jp, 3, 40, 'EUC-JP');
+($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
+$r = mb_stripos($euc_jp, 0, 40, 'EUC-JP');
+($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
+// Note: Returned NULL string
+// echo gettype($r). ' val '. $r ."\n";
+
+
+// Non-existent
+echo "== NON-EXISTENT ==\n";
+$r = mb_stripos($euc_jp, b'韓国語', 0, 'EUC-JP');
+($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
+$r = mb_stripos($euc_jp, b"\n", 0, 'EUC-JP');
+($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n";
+
+
+// EUC-JP - No encoding parameter
+echo "== NO ENCODING PARAMETER ==\n";
+mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n");
+
+print mb_stripos($euc_jp,b'日本語', 0) . "\n";
+print mb_stripos($euc_jp, b'0', 0) . "\n";
+print mb_stripos($euc_jp, 3, 0) . "\n";
+print mb_stripos($euc_jp, 0, 0) . "\n";
+
+$r = mb_stripos($euc_jp,b'韓国語', 0);
+($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
+$r = mb_stripos($euc_jp,b"\n", 0);
+($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n";
+
+// EUC-JP - No offset and encoding parameter
+echo "== NO OFFSET AND ENCODING PARAMETER ==\n";
+mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n");
+
+print mb_stripos($euc_jp,b'日本語') . "\n";
+print mb_stripos($euc_jp, b'0') . "\n";
+print mb_stripos($euc_jp, 3) . "\n";
+print mb_stripos($euc_jp, 0) . "\n";
+
+$r = mb_stripos($euc_jp,b'韓国語');
+($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
+$r = mb_stripos($euc_jp,b"\n");
+($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n";
+
+
+// Invalid Parameters
+echo "== INVALID PARAMETER TEST ==\n";
+
+$r = mb_stripos($euc_jp,'','EUC-JP');
+($r === FALSE) ? print("OK_NULL\n") : print("NG_NULL\n");
+$r = mb_stripos($euc_jp, $t_ary, 'EUC-JP');
+($r === FALSE) ? print("OK_ARRAY\n") : print("NG_ARRAY\n");
+$r = mb_stripos($euc_jp, $t_obj, 'EUC-JP');
+($r === FALSE) ? print("OK_OBJECT\n") : print("NG_OBJECT\n");
+$r = mb_stripos($euc_jp, $t_obj, 'BAD_ENCODING');
+($r === FALSE) ? print("OK_BAD_ENCODING\n") : print("NG_BAD_ENCODING\n");
+
+
+?>
+
+--EXPECT--
+== POSITIVE OFFSET ==
+10
+0
+3
+0
+34
+30
+33
+30
+== NEGATIVE OFFSET ==
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+== OUT OF RANGE ==
+OK_OUT_RANGE
+OK_OUT_RANGE
+OK_OUT_RANGE
+OK_OUT_RANGE
+== NON-EXISTENT ==
+OK_STR
+OK_NEWLINE
+== NO ENCODING PARAMETER ==
+10
+0
+3
+0
+OK_STR
+OK_NEWLINE
+== NO OFFSET AND ENCODING PARAMETER ==
+10
+0
+3
+0
+OK_STR
+OK_NEWLINE
+== INVALID PARAMETER TEST ==
+ERR: Warning
+OK_NULL
+ERR: Warning
+OK_ARRAY
+ERR: Warning
+OK_OBJECT
+ERR: Warning
+OK_BAD_ENCODING
+
diff --git a/ext/mbstring/tests/mb_stripos_basic.phpt b/ext/mbstring/tests/mb_stripos_basic.phpt
new file mode 100644
index 0000000..bb33bb1
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_basic.phpt
@@ -0,0 +1,158 @@
+--TEST--
+Test mb_stripos() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Test basic functionality of mb_stripos with ASCII and multibyte characters
+ */
+
+echo "*** Testing mb_stripos() : basic functionality***\n";
+
+mb_internal_encoding('UTF-8');
+
+//ascii strings
+$ascii_haystacks = array(
+ b'abc defabc def',
+ b'ABC DEFABC DEF',
+ b'Abc dEFaBC Def',
+);
+
+$ascii_needles = array(
+ // 4 good ones
+ b'DE',
+ b'de',
+ b'De',
+ b'dE',
+
+ //flag a swap between good and bad
+ '!',
+
+ // 4 bad ones
+ b'df',
+ b'Df',
+ b'dF',
+ b'DF'
+);
+
+//greek strings in UTF-8
+$greek_lower = base64_decode('zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J');
+$greek_upper = base64_decode('zpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6p');
+$greek_mixed = base64_decode('zrHOss6TzpTOlc6WzpfOmM65zrrOu868zr3Ovs6fzqDOoc6jzqTOpc+Gz4fPiM+J');
+$greek_haystacks = array($greek_lower, $greek_upper, $greek_mixed);
+
+$greek_nlower = base64_decode('zrzOvc6+zr8=');
+$greek_nupper = base64_decode('zpzOnc6ezp8=');
+$greek_nmixed1 = base64_decode('zpzOnc6+zr8=');
+$greek_nmixed2 = base64_decode('zrzOvc6+zp8=');
+
+$greek_blower = base64_decode('zpzOns6f');
+$greek_bupper = base64_decode('zrzOvs6/');
+$greek_bmixed1 = base64_decode('zpzOvs6/');
+$greek_bmixed2 = base64_decode('zrzOvs6f');
+$greek_needles = array(
+ // 4 good ones
+ $greek_nlower, $greek_nupper, $greek_nmixed1, $greek_nmixed2,
+
+ '!', // used to flag a swap between good and bad
+
+ // 4 bad ones
+ $greek_blower, $greek_bupper, $greek_bmixed1, $greek_bmixed2,
+);
+
+// try the basic options
+echo "\n -- ASCII Strings, needle should be found --\n";
+foreach ($ascii_needles as $needle) {
+ if ($needle == '!') {
+ echo "\n -- ASCII Strings, needle should not be found --\n";
+ }
+ else {
+ foreach ($ascii_haystacks as $haystack) {
+ var_dump(mb_stripos($haystack, $needle));
+ }
+ }
+}
+
+echo "\n -- Greek Strings, needle should be found --\n";
+foreach ($greek_needles as $needle) {
+ if ($needle == '!') {
+ echo "\n -- ASCII Strings, needle should not be found --\n";
+ }
+ else {
+ foreach ($greek_haystacks as $haystack) {
+ var_dump(mb_stripos($haystack, $needle));
+ }
+ }
+}
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_stripos() : basic functionality***
+
+ -- ASCII Strings, needle should be found --
+int(4)
+int(4)
+int(4)
+int(4)
+int(4)
+int(4)
+int(4)
+int(4)
+int(4)
+int(4)
+int(4)
+int(4)
+
+ -- ASCII Strings, needle should not be found --
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+
+ -- Greek Strings, needle should be found --
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+
+ -- ASCII Strings, needle should not be found --
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_stripos_basic2.phpt b/ext/mbstring/tests/mb_stripos_basic2.phpt
new file mode 100644
index 0000000..f9131d9
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_basic2.phpt
@@ -0,0 +1,129 @@
+--TEST--
+Test mb_stripos() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Test basic functionality of mb_stripos with ASCII and multibyte characters
+ */
+
+echo "*** Testing mb_stripos() : basic functionality***\n";
+
+mb_internal_encoding('UTF-8');
+
+//ascii strings
+$ascii_haystacks = array(
+ b'abc defabc def',
+ b'ABC DEFABC DEF',
+ b'Abc dEFaBC Def',
+);
+
+$ascii_needles = array(
+ // 4 good ones
+ b'DE',
+ b'de',
+ b'De',
+ b'dE',
+);
+
+//greek strings in UTF-8
+$greek_lower = base64_decode('zrrOu868zr3Ovs6/z4DPgSDOus67zrzOvc6+zr/PgA==');
+$greek_upper = base64_decode('zprOm86czp3Ons6fzqDOoSDOms6bzpzOnc6ezp/OoA==');
+$greek_mixed = base64_decode('zrrOu868zr3Ovs6fzqDOoSDOus67zpzOnc6+zr/OoA==');
+$greek_haystacks = array($greek_lower, $greek_upper, $greek_mixed);
+
+$greek_nlower = base64_decode('zrzOvc6+zr8=');
+$greek_nupper = base64_decode('zpzOnc6ezp8=');
+$greek_nmixed1 = base64_decode('zpzOnc6+zr8=');
+$greek_nmixed2 = base64_decode('zrzOvc6+zp8=');
+
+$greek_needles = array(
+ // 4 good ones
+ $greek_nlower, $greek_nupper, $greek_nmixed1, $greek_nmixed2,
+);
+
+// try the basic options
+echo "\n -- ASCII Strings --\n";
+foreach ($ascii_needles as $needle) {
+ foreach ($ascii_haystacks as $haystack) {
+ var_dump(mb_stripos($haystack, $needle));
+ var_dump(mb_stripos($haystack, $needle, 6));
+ }
+}
+
+echo "\n -- Greek Strings --\n";
+foreach ($greek_needles as $needle) {
+ foreach ($greek_haystacks as $haystack) {
+ var_dump(mb_stripos($haystack, $needle));
+ var_dump(mb_stripos($haystack, $needle, 4));
+ }
+}
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_stripos() : basic functionality***
+
+ -- ASCII Strings --
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+int(4)
+int(13)
+
+ -- Greek Strings --
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+int(2)
+int(11)
+Done
+
diff --git a/ext/mbstring/tests/mb_stripos_error1.phpt b/ext/mbstring/tests/mb_stripos_error1.phpt
new file mode 100644
index 0000000..c4ea5d7
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_error1.phpt
@@ -0,0 +1,51 @@
+--TEST--
+Test mb_stripos() function : error conditions - Pass incorrect number of args
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Test how mb_stripos behaves when passed an incorrect number of arguments
+ */
+
+echo "*** Testing mb_stripos() : error conditions ***\n";
+
+
+//Test mb_stripos with one more than the expected number of arguments
+echo "\n-- Testing mb_stripos() function with more than expected no. of arguments --\n";
+$haystack = b'string_val';
+$needle = b'string_val';
+$offset = 10;
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_stripos($haystack, $needle, $offset, $encoding, $extra_arg) );
+
+// Testing mb_stripos with one less than the expected number of arguments
+echo "\n-- Testing mb_stripos() function with less than expected no. of arguments --\n";
+$haystack = b'string_val';
+var_dump( mb_stripos($haystack) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_stripos() : error conditions ***
+
+-- Testing mb_stripos() function with more than expected no. of arguments --
+
+Warning: mb_stripos() expects at most 4 parameters, 5 given in %s on line %d
+bool(false)
+
+-- Testing mb_stripos() function with less than expected no. of arguments --
+
+Warning: mb_stripos() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_stripos_error2.phpt b/ext/mbstring/tests/mb_stripos_error2.phpt
new file mode 100644
index 0000000..c5e5c8d
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_error2.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_stripos() function : error conditions - Pass unknown encoding
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass an unknown encoding to mb_stripos() to test behaviour
+ */
+
+echo "*** Testing mb_stripos() : error conditions ***\n";
+$haystack = b'Hello, world';
+$needle = b'world';
+$offset = 2;
+$encoding = 'unknown-encoding';
+
+var_dump( mb_stripos($haystack, $needle, $offset, $encoding) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_stripos() : error conditions ***
+
+Warning: mb_stripos(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_stripos_variation1.phpt b/ext/mbstring/tests/mb_stripos_variation1.phpt
new file mode 100644
index 0000000..ab7f75e
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_variation1.phpt
@@ -0,0 +1,183 @@
+--TEST--
+Test mb_stripos() function : usage variations - pass different data types to $haystack arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass mb_stripos different data types as $haystack arg to test behaviour
+ */
+
+echo "*** Testing mb_stripos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$needle = b'string_val';
+$offset = 0;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $haystack argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "string",
+ 'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_stripos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_stripos($input, $needle, $offset, $encoding));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_stripos() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(false)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_stripos() expects parameter 1 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_stripos_variation2.phpt b/ext/mbstring/tests/mb_stripos_variation2.phpt
new file mode 100644
index 0000000..1b5263a
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_variation2.phpt
@@ -0,0 +1,200 @@
+--TEST--
+Test mb_stripos() function : usage variations - pass different data types as $needle arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass mb_stripos different data types as $needle arg to test behaviour
+ */
+
+echo "*** Testing mb_stripos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$haystack = b'string_val';
+$offset = 0;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $needle argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ b"string",
+ b'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_stripos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_stripos($haystack, $input, $offset, $encoding));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_stripos() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+
+Warning: mb_stripos(): Empty delimiter in %s on line %d
+bool(false)
+
+-- Iteration 11 --
+
+Warning: mb_stripos(): Empty delimiter in %s on line %d
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+
+Warning: mb_stripos(): Empty delimiter in %s on line %d
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+
+Warning: mb_stripos(): Empty delimiter in %s on line %d
+bool(false)
+
+-- Iteration 16 --
+
+Warning: mb_stripos(): Empty delimiter in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_stripos(): Empty delimiter in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+int(0)
+
+-- Iteration 19 --
+int(0)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+
+Warning: mb_stripos(): Empty delimiter in %s on line %d
+bool(false)
+
+-- Iteration 23 --
+
+Warning: mb_stripos(): Empty delimiter in %s on line %d
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_stripos() expects parameter 2 to be string, resource given in %s on line %d
+bool(false)
+Done
+
diff --git a/ext/mbstring/tests/mb_stripos_variation3.phpt b/ext/mbstring/tests/mb_stripos_variation3.phpt
new file mode 100644
index 0000000..41a365a
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_variation3.phpt
@@ -0,0 +1,203 @@
+--TEST--
+Test mb_stripos() function : usage variations - pass different data types as $offset arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass mb_stripos different data types as $offset arg to test behaviour
+ */
+
+echo "*** Testing mb_stripos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$needle = b'A';
+$haystack = b'string_val';
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $offest argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "string",
+ 'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_stripos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_stripos($haystack, $needle, $input, $encoding));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_stripos() : usage variations ***
+
+-- Iteration 1 --
+int(8)
+
+-- Iteration 2 --
+int(8)
+
+-- Iteration 3 --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+int(8)
+
+-- Iteration 9 --
+int(8)
+
+-- Iteration 10 --
+int(8)
+
+-- Iteration 11 --
+int(8)
+
+-- Iteration 12 --
+int(8)
+
+-- Iteration 13 --
+int(8)
+
+-- Iteration 14 --
+int(8)
+
+-- Iteration 15 --
+int(8)
+
+-- Iteration 16 --
+
+Warning: mb_stripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_stripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+
+Warning: mb_stripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 19 --
+
+Warning: mb_stripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 20 --
+
+Warning: mb_stripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 21 --
+
+Warning: mb_stripos() expects parameter 3 to be long, object given in %s on line %d
+bool(false)
+
+-- Iteration 22 --
+int(8)
+
+-- Iteration 23 --
+int(8)
+
+-- Iteration 24 --
+
+Warning: mb_stripos() expects parameter 3 to be long, resource given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_stripos_variation4.phpt b/ext/mbstring/tests/mb_stripos_variation4.phpt
new file mode 100644
index 0000000..f330bbd
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_variation4.phpt
@@ -0,0 +1,223 @@
+--TEST--
+Test mb_stripos() function : usage variations - pass different data types as $encoding arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass mb_stripos different data types as $encoding arg to test behaviour
+ * Where possible 'UTF-8' has been entered as a string value
+ */
+
+echo "*** Testing mb_stripos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$haystack = b'string_val';
+$needle = b'VaL';
+$offset = 0;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $input argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_stripos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_stripos($haystack, $needle, $offset, $input));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_stripos() : usage variations ***
+
+-- Iteration 1 --
+
+Warning: mb_stripos(): Unknown encoding "0" in %s on line %d
+bool(false)
+
+-- Iteration 2 --
+
+Warning: mb_stripos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 3 --
+
+Warning: mb_stripos(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_stripos(): Unknown encoding "-2345" in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_stripos(): Unknown encoding "10.5" in %s on line %d
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_stripos(): Unknown encoding "-10.5" in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_stripos(): Unknown encoding "123456789000" in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+
+Warning: mb_stripos(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+-- Iteration 9 --
+
+Warning: mb_stripos(): Unknown encoding "0.5" in %s on line %d
+bool(false)
+
+-- Iteration 10 --
+
+Warning: mb_stripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 11 --
+
+Warning: mb_stripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 12 --
+
+Warning: mb_stripos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 13 --
+
+Warning: mb_stripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 14 --
+
+Warning: mb_stripos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 15 --
+
+Warning: mb_stripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 16 --
+
+Warning: mb_stripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_stripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+int(7)
+
+-- Iteration 19 --
+int(7)
+
+-- Iteration 20 --
+int(7)
+
+-- Iteration 21 --
+int(7)
+
+-- Iteration 22 --
+
+Warning: mb_stripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 23 --
+
+Warning: mb_stripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_stripos() expects parameter 4 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_stripos_variation5_Bug45923.phpt b/ext/mbstring/tests/mb_stripos_variation5_Bug45923.phpt
new file mode 100644
index 0000000..fbe4937
--- /dev/null
+++ b/ext/mbstring/tests/mb_stripos_variation5_Bug45923.phpt
@@ -0,0 +1,119 @@
+--TEST--
+Test mb_stripos() function : usage variations - Pass different integers as $offset argument
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Test how mb_stripos() behaves when passed different integers as $offset argument
+ * The character length of $string_ascii and $string_mb is the same,
+ * and the needle appears at the same positions in both strings
+ */
+
+mb_internal_encoding('UTF-8');
+
+echo "*** Testing mb_stripos() : usage variations ***\n";
+
+$string_ascii = b'+Is an English string'; //21 chars
+$needle_ascii = b'G';
+
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); //21 chars
+$needle_mb = base64_decode('44CC');
+
+/*
+ * Loop through integers as multiples of ten for $offset argument
+ * mb_stripos should not be able to accept negative values as $offset.
+ * 60 is larger than *BYTE* count for $string_mb
+ */
+for ($i = -10; $i <= 60; $i += 10) {
+ echo "\n**-- Offset is: $i --**\n";
+ echo "-- ASCII String --\n";
+ var_dump(mb_stripos($string_ascii, $needle_ascii, $i));
+ echo "--Multibyte String --\n";
+ var_dump(mb_stripos($string_mb, $needle_mb, $i, 'UTF-8'));
+}
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_stripos() : usage variations ***
+
+**-- Offset is: -10 --**
+-- ASCII String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+**-- Offset is: 0 --**
+-- ASCII String --
+int(9)
+--Multibyte String --
+int(9)
+
+**-- Offset is: 10 --**
+-- ASCII String --
+int(20)
+--Multibyte String --
+int(20)
+
+**-- Offset is: 20 --**
+-- ASCII String --
+int(20)
+--Multibyte String --
+int(20)
+
+**-- Offset is: 30 --**
+-- ASCII String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+**-- Offset is: 40 --**
+-- ASCII String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+**-- Offset is: 50 --**
+-- ASCII String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+
+**-- Offset is: 60 --**
+-- ASCII String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_stripos(): Offset not contained in string in %s on line %d
+bool(false)
+Done
+
diff --git a/ext/mbstring/tests/mb_stristr_basic.phpt b/ext/mbstring/tests/mb_stristr_basic.phpt
new file mode 100644
index 0000000..9340d35
--- /dev/null
+++ b/ext/mbstring/tests/mb_stristr_basic.phpt
@@ -0,0 +1,70 @@
+--TEST--
+Test mb_stristr() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stristr') or die("skip mb_stristr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_stristr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_stristr() : basic functionality ***\n";
+
+mb_internal_encoding('UTF-8');
+
+$string_ascii = b'abcdef';
+$needle_ascii_upper = b"BCD";
+$needle_ascii_mixed = b"bCd";
+$needle_ascii_lower = b"bcd";
+
+//Greek string in lower case UTF-8
+$string_mb = base64_decode('zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J');
+$needle_mb_upper = base64_decode('zpzOnc6ezp8=');
+$needle_mb_lower = base64_decode('zrzOvc6+zr8=');
+$needle_mb_mixed = base64_decode('zpzOnc6+zr8=');
+
+echo "\n-- ASCII string: needle exists --\n";
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_upper, false, 'ISO-8859-1')));
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_lower)));
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_mixed, true)));
+
+
+echo "\n-- ASCII string: needle doesn't exist --\n";
+var_dump(mb_stristr($string_ascii, '123'));
+
+echo "\n-- Multibyte string: needle exists --\n";
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_upper)));
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_lower, false, 'utf-8')));
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_mixed, true)));
+
+
+echo "\n-- Multibyte string: needle doesn't exist --\n";
+$needle2 = base64_decode("zrzOvs6/");
+var_dump(mb_stristr($string_mb, $needle2));
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_stristr() : basic functionality ***
+
+-- ASCII string: needle exists --
+string(10) "6263646566"
+string(10) "6263646566"
+string(2) "61"
+
+-- ASCII string: needle doesn't exist --
+bool(false)
+
+-- Multibyte string: needle exists --
+string(52) "cebccebdcebecebfcf80cf81cf83cf84cf85cf86cf87cf88cf89"
+string(52) "cebccebdcebecebfcf80cf81cf83cf84cf85cf86cf87cf88cf89"
+string(44) "ceb1ceb2ceb3ceb4ceb5ceb6ceb7ceb8ceb9cebacebb"
+
+-- Multibyte string: needle doesn't exist --
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_stristr_error1.phpt b/ext/mbstring/tests/mb_stristr_error1.phpt
new file mode 100644
index 0000000..3c766c4
--- /dev/null
+++ b/ext/mbstring/tests/mb_stristr_error1.phpt
@@ -0,0 +1,47 @@
+--TEST--
+Test mb_stristr() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stristr') or die("skip mb_stristr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_stristr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_stristr() : error conditions ***\n";
+
+
+//Test mb_stristr with one more than the expected number of arguments
+echo "\n-- Testing mb_stristr() function with more than expected no. of arguments --\n";
+$haystack = b'string_val';
+$needle = b'string_val';
+$part = true;
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_stristr($haystack, $needle, $part, $encoding, $extra_arg) );
+
+// Testing mb_stristr with one less than the expected number of arguments
+echo "\n-- Testing mb_stristr() function with less than expected no. of arguments --\n";
+$haystack = b'string_val';
+var_dump( mb_stristr($haystack) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_stristr() : error conditions ***
+
+-- Testing mb_stristr() function with more than expected no. of arguments --
+
+Warning: mb_stristr() expects at most 4 parameters, 5 given in %s on line %d
+bool(false)
+
+-- Testing mb_stristr() function with less than expected no. of arguments --
+
+Warning: mb_stristr() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_stristr_error2.phpt b/ext/mbstring/tests/mb_stristr_error2.phpt
new file mode 100644
index 0000000..73f13dc
--- /dev/null
+++ b/ext/mbstring/tests/mb_stristr_error2.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_stristr() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stristr') or die("skip mb_stristr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_stristr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_stristr() : error conditions ***\n";
+
+
+echo "\n-- Testing mb_stristr() with unknown encoding --\n";
+$haystack = b'Hello, world';
+$needle = b'world';
+$encoding = 'unknown-encoding';
+$part = true;
+var_dump( mb_stristr($haystack, $needle, $part, $encoding) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_stristr() : error conditions ***
+
+-- Testing mb_stristr() with unknown encoding --
+
+Warning: mb_stristr(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_stristr_variation1.phpt b/ext/mbstring/tests/mb_stristr_variation1.phpt
new file mode 100644
index 0000000..fc69bd0
--- /dev/null
+++ b/ext/mbstring/tests/mb_stristr_variation1.phpt
@@ -0,0 +1,208 @@
+--TEST--
+Test mb_stristr() function : usage variation - various haystacks, needle won't be found
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stristr') or die("skip mb_stristr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_stristr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_stristr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$needle = b'string_val';
+$part = true;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for haystack
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_stristr($value, $needle, $part, $encoding) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_stristr() : usage variation ***
+
+--int 0--
+bool(false)
+
+--int 1--
+bool(false)
+
+--int 12345--
+bool(false)
+
+--int -12345--
+bool(false)
+
+--float 10.5--
+bool(false)
+
+--float -10.5--
+bool(false)
+
+--float 12.3456789000e10--
+bool(false)
+
+--float -12.3456789000e10--
+bool(false)
+
+--float .5--
+bool(false)
+
+--empty array--
+Error: 2 - mb_stristr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_stristr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_stristr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_stristr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+bool(false)
+
+--lowercase null--
+bool(false)
+
+--lowercase true--
+bool(false)
+
+--lowercase false--
+bool(false)
+
+--uppercase TRUE--
+bool(false)
+
+--uppercase FALSE--
+bool(false)
+
+--empty string DQ--
+bool(false)
+
+--empty string SQ--
+bool(false)
+
+--instance of classWithToString--
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_stristr() expects parameter 1 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+bool(false)
+
+--unset var--
+bool(false)
+
+--resource--
+Error: 2 - mb_stristr() expects parameter 1 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
+
diff --git a/ext/mbstring/tests/mb_stristr_variation2.phpt b/ext/mbstring/tests/mb_stristr_variation2.phpt
new file mode 100644
index 0000000..bfa1835
--- /dev/null
+++ b/ext/mbstring/tests/mb_stristr_variation2.phpt
@@ -0,0 +1,216 @@
+--TEST--
+Test mb_stristr() function : usage variation - different types of needle.
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stristr') or die("skip mb_stristr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_stristr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_stristr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$part = true;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for needle
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_stristr($haystack, $value, $part, $encoding) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_stristr() : usage variation ***
+
+--int 0--
+bool(false)
+
+--int 1--
+bool(false)
+
+--int 12345--
+bool(false)
+
+--int -12345--
+bool(false)
+
+--float 10.5--
+bool(false)
+
+--float -10.5--
+bool(false)
+
+--float 12.3456789000e10--
+bool(false)
+
+--float -12.3456789000e10--
+bool(false)
+
+--float .5--
+bool(false)
+
+--empty array--
+Error: 2 - mb_stristr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_stristr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_stristr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_stristr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+Error: 2 - mb_stristr(): Empty delimiter, %s(%d)
+bool(false)
+
+--lowercase null--
+Error: 2 - mb_stristr(): Empty delimiter, %s(%d)
+bool(false)
+
+--lowercase true--
+bool(false)
+
+--lowercase false--
+Error: 2 - mb_stristr(): Empty delimiter, %s(%d)
+bool(false)
+
+--uppercase TRUE--
+bool(false)
+
+--uppercase FALSE--
+Error: 2 - mb_stristr(): Empty delimiter, %s(%d)
+bool(false)
+
+--empty string DQ--
+Error: 2 - mb_stristr(): Empty delimiter, %s(%d)
+bool(false)
+
+--empty string SQ--
+Error: 2 - mb_stristr(): Empty delimiter, %s(%d)
+bool(false)
+
+--instance of classWithToString--
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_stristr() expects parameter 2 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+Error: 2 - mb_stristr(): Empty delimiter, %s(%d)
+bool(false)
+
+--unset var--
+Error: 2 - mb_stristr(): Empty delimiter, %s(%d)
+bool(false)
+
+--resource--
+Error: 2 - mb_stristr() expects parameter 2 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
+
diff --git a/ext/mbstring/tests/mb_stristr_variation3.phpt b/ext/mbstring/tests/mb_stristr_variation3.phpt
new file mode 100644
index 0000000..30a7e49
--- /dev/null
+++ b/ext/mbstring/tests/mb_stristr_variation3.phpt
@@ -0,0 +1,232 @@
+--TEST--
+Test mb_stristr() function : usage variation - different values for part
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stristr') or die("skip mb_stristr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_stristr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_stristr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$needle = b'_';
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // string data
+ 'string DQ' => "string",
+ 'string SQ' => 'string',
+ 'mixed case string' => "sTrInG",
+ 'heredoc' => $heredoc,
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for part
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ $res = mb_stristr($haystack, $needle, $value, $encoding);
+ if ($res === false) {
+ var_dump($res);
+ }
+ else {
+ var_dump(bin2hex($res));
+ }
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_stristr() : usage variation ***
+
+--int 0--
+string(8) "5f76616c"
+
+--int 1--
+string(12) "737472696e67"
+
+--int 12345--
+string(12) "737472696e67"
+
+--int -12345--
+string(12) "737472696e67"
+
+--float 10.5--
+string(12) "737472696e67"
+
+--float -10.5--
+string(12) "737472696e67"
+
+--float 12.3456789000e10--
+string(12) "737472696e67"
+
+--float -12.3456789000e10--
+string(12) "737472696e67"
+
+--float .5--
+string(12) "737472696e67"
+
+--empty array--
+Error: 2 - mb_stristr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_stristr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_stristr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_stristr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+string(8) "5f76616c"
+
+--lowercase null--
+string(8) "5f76616c"
+
+--lowercase true--
+string(12) "737472696e67"
+
+--lowercase false--
+string(8) "5f76616c"
+
+--uppercase TRUE--
+string(12) "737472696e67"
+
+--uppercase FALSE--
+string(8) "5f76616c"
+
+--empty string DQ--
+string(8) "5f76616c"
+
+--empty string SQ--
+string(8) "5f76616c"
+
+--string DQ--
+string(12) "737472696e67"
+
+--string SQ--
+string(12) "737472696e67"
+
+--mixed case string--
+string(12) "737472696e67"
+
+--heredoc--
+string(12) "737472696e67"
+
+--instance of classWithToString--
+Error: 2 - mb_stristr() expects parameter 3 to be boolean, object given, %s(%d)
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_stristr() expects parameter 3 to be boolean, object given, %s(%d)
+bool(false)
+
+--undefined var--
+string(8) "5f76616c"
+
+--unset var--
+string(8) "5f76616c"
+
+--resource--
+Error: 2 - mb_stristr() expects parameter 3 to be boolean, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_stristr_variation4.phpt b/ext/mbstring/tests/mb_stristr_variation4.phpt
new file mode 100644
index 0000000..d547543
--- /dev/null
+++ b/ext/mbstring/tests/mb_stristr_variation4.phpt
@@ -0,0 +1,227 @@
+--TEST--
+Test mb_stristr() function : usage variation - different encoding types
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stristr') or die("skip mb_stristr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_stristr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_stristr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$needle = b'_';
+$part = true;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return "invalid";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = <<<EOT
+utf-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for encoding
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_stristr($haystack, $needle, $part, $value) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_stristr() : usage variation ***
+
+--int 0--
+Error: 2 - mb_stristr(): Unknown encoding "0", %s(%d)
+bool(false)
+
+--int 1--
+Error: 2 - mb_stristr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--int 12345--
+Error: 2 - mb_stristr(): Unknown encoding "12345", %s(%d)
+bool(false)
+
+--int -12345--
+Error: 2 - mb_stristr(): Unknown encoding "-2345", %s(%d)
+bool(false)
+
+--float 10.5--
+Error: 2 - mb_stristr(): Unknown encoding "10.5", %s(%d)
+bool(false)
+
+--float -10.5--
+Error: 2 - mb_stristr(): Unknown encoding "-10.5", %s(%d)
+bool(false)
+
+--float 12.3456789000e10--
+Error: 2 - mb_stristr(): Unknown encoding "123456789000", %s(%d)
+bool(false)
+
+--float -12.3456789000e10--
+Error: 2 - mb_stristr(): Unknown encoding "-123456789000", %s(%d)
+bool(false)
+
+--float .5--
+Error: 2 - mb_stristr(): Unknown encoding "0.5", %s(%d)
+bool(false)
+
+--empty array--
+Error: 2 - mb_stristr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_stristr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_stristr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_stristr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+Error: 2 - mb_stristr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--lowercase null--
+Error: 2 - mb_stristr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--lowercase true--
+Error: 2 - mb_stristr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--lowercase false--
+Error: 2 - mb_stristr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--uppercase TRUE--
+Error: 2 - mb_stristr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--uppercase FALSE--
+Error: 2 - mb_stristr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--empty string DQ--
+Error: 2 - mb_stristr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--empty string SQ--
+Error: 2 - mb_stristr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--instance of classWithToString--
+Error: 2 - mb_stristr(): Unknown encoding "invalid", %s(%d)
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_stristr() expects parameter 4 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+Error: 2 - mb_stristr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--unset var--
+Error: 2 - mb_stristr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--resource--
+Error: 2 - mb_stristr() expects parameter 4 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_stristr_variation5.phpt b/ext/mbstring/tests/mb_stristr_variation5.phpt
new file mode 100644
index 0000000..5d54820
--- /dev/null
+++ b/ext/mbstring/tests/mb_stristr_variation5.phpt
@@ -0,0 +1,69 @@
+--TEST--
+Test mb_stristr() function : usage variation - multiple needles
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_stristr') or die("skip mb_stristr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_stristr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_stristr() : basic functionality ***\n";
+
+mb_internal_encoding('UTF-8');
+
+//ascii mixed case, multiple needles
+$string_ascii = b'abcDef zBcDyx';
+$needle_ascii_upper = b"BCD";
+$needle_ascii_mixed = b"bCd";
+$needle_ascii_lower = b"bcd";
+
+//Greek string in mixed case UTF-8 with multiple needles
+$string_mb = base64_decode('zrrOu868zr3Ovs6fzqDOoSDOus67zpzOnc6+zr/OoA==');
+$needle_mb_upper = base64_decode('zpzOnc6ezp8=');
+$needle_mb_lower = base64_decode('zrzOvc6+zr8=');
+$needle_mb_mixed = base64_decode('zpzOnc6+zr8=');
+
+echo "\n-- ASCII string: needle exists --\n";
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_upper, false)));
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_upper, true)));
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_lower, false)));
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_lower, true)));
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_mixed, false)));
+var_dump(bin2hex(mb_stristr($string_ascii, $needle_ascii_mixed, true)));
+
+
+echo "\n-- Multibyte string: needle exists --\n";
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_upper, false)));
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_upper, true)));
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_lower, false)));
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_lower, true)));
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_mixed, false)));
+var_dump(bin2hex(mb_stristr($string_mb, $needle_mb_mixed, true)));
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_stristr() : basic functionality ***
+
+-- ASCII string: needle exists --
+string(24) "6263446566207a4263447978"
+string(2) "61"
+string(24) "6263446566207a4263447978"
+string(2) "61"
+string(24) "6263446566207a4263447978"
+string(2) "61"
+
+-- Multibyte string: needle exists --
+string(54) "cebccebdcebece9fcea0cea120cebacebbce9cce9dcebecebfcea0"
+string(8) "cebacebb"
+string(54) "cebccebdcebece9fcea0cea120cebacebbce9cce9dcebecebfcea0"
+string(8) "cebacebb"
+string(54) "cebccebdcebece9fcea0cea120cebacebbce9cce9dcebecebfcea0"
+string(8) "cebacebb"
+===DONE===
diff --git a/ext/mbstring/tests/mb_strlen.phpt b/ext/mbstring/tests/mb_strlen.phpt
new file mode 100644
index 0000000..97c09a7
--- /dev/null
+++ b/ext/mbstring/tests/mb_strlen.phpt
@@ -0,0 +1,101 @@
+--TEST--
+mb_strlen()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.func_overload=0
+--FILE--
+<?php
+// TODO: Add more encodings
+
+//$debug=true;
+ini_set('include_path', dirname(__FILE__));
+include_once('common.inc');
+
+// restore detect_order to 'auto'
+mb_detect_order('auto');
+
+// Test string
+$euc_jp = '0123この文字列は日本語です。EUC-JPを使っています。0123日本語は面倒臭い。';
+$ascii = 'abcdefghijklmnopqrstuvwxyz;]=#0123456789';
+
+// ASCII
+echo "== ASCII ==\n";
+print mb_strlen($ascii,'ASCII') . "\n";
+print strlen($ascii) . "\n";
+
+// EUC-JP
+echo "== EUC-JP ==\n";
+print mb_strlen($euc_jp,'EUC-JP') . "\n";
+mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n");
+print strlen($euc_jp) . "\n";
+
+// SJIS
+echo "== SJIS ==\n";
+$sjis = mb_convert_encoding($euc_jp, 'SJIS','EUC-JP');
+print mb_strlen($sjis,'SJIS') . "\n";
+mb_internal_encoding('SJIS') or print("mb_internal_encoding() failed\n");
+print strlen($sjis) . "\n";
+
+// JIS
+// Note: either convert_encoding or strlen has problem
+echo "== JIS ==\n";
+$jis = mb_convert_encoding($euc_jp, 'JIS','EUC-JP');
+print mb_strlen($jis,'JIS') . "\n";
+mb_internal_encoding('JIS') or print("mb_internal_encoding() failed\n");
+print strlen($jis) . "\n";
+
+// UTF-8
+// Note: either convert_encoding or strlen has problem
+echo "== UTF-8 ==\n";
+$utf8 = mb_convert_encoding($euc_jp, 'UTF-8','EUC-JP');
+print mb_strlen($utf8,'UTF-8') . "\n";
+mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n");
+print strlen($utf8) . "\n";
+
+
+// Wrong Parameters
+echo "== WRONG PARAMETERS ==\n";
+// Array
+// Note: PHP Warning, strlen() expects parameter 1 to be string, array given
+$r = strlen($t_ary);
+echo $r."\n";
+// Object
+// Note: PHP Warning, strlen() expects parameter 1 to be string, object given
+$r = strlen($t_obj);
+echo $r."\n";
+// Wrong encoding
+mb_internal_encoding('EUC-JP');
+$r = mb_strlen($euc_jp, 'BAD_NAME');
+echo $r."\n";
+
+
+
+
+?>
+
+--EXPECT--
+== ASCII ==
+40
+40
+== EUC-JP ==
+43
+72
+== SJIS ==
+43
+72
+== JIS ==
+43
+90
+== UTF-8 ==
+43
+101
+== WRONG PARAMETERS ==
+ERR: Warning
+
+ERR: Warning
+
+ERR: Warning
+
+
+
diff --git a/ext/mbstring/tests/mb_strlen_basic.phpt b/ext/mbstring/tests/mb_strlen_basic.phpt
new file mode 100644
index 0000000..a5dbe51
--- /dev/null
+++ b/ext/mbstring/tests/mb_strlen_basic.phpt
@@ -0,0 +1,43 @@
+--TEST--
+Test mb_strlen() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strlen') or die("skip mb_strlen() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strlen(string $str [, string $encoding])
+ * Description: Get character numbers of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test basic functionality of mb_strlen()
+ */
+
+echo "*** Testing mb_strlen() : basic functionality***\n";
+
+$string_ascii = b'abc def';
+//Japanese string in UTF-8
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+echo "\n-- ASCII String --\n";
+var_dump(mb_strlen($string_ascii));
+
+echo "\n-- Multibyte String --\n";
+var_dump(mb_strlen($string_mb, 'UTF-8'));
+
+echo "\nDone";
+?>
+
+--EXPECTF--
+*** Testing mb_strlen() : basic functionality***
+
+-- ASCII String --
+int(7)
+
+-- Multibyte String --
+int(21)
+
+Done
diff --git a/ext/mbstring/tests/mb_strlen_error1.phpt b/ext/mbstring/tests/mb_strlen_error1.phpt
new file mode 100644
index 0000000..8fcd87e
--- /dev/null
+++ b/ext/mbstring/tests/mb_strlen_error1.phpt
@@ -0,0 +1,46 @@
+--TEST--
+Test mb_strlen() function : error conditions - pass incorrect number of args
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strlen') or die("skip mb_strlen() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strlen(string $str [, string $encoding])
+ * Description: Get character numbers of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass mb_strlen an incorrect number of arguments to test behaviour
+ */
+
+echo "*** Testing mb_strlen() : error conditions ***\n";
+
+// Zero arguments
+echo "\n-- Testing mb_strlen() function with Zero arguments --\n";
+var_dump( mb_strlen() );
+
+//Test mb_strlen with one more than the expected number of arguments
+echo "\n-- Testing mb_strlen() function with more than expected no. of arguments --\n";
+$str = 'string_val';
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_strlen($str, $encoding, $extra_arg) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strlen() : error conditions ***
+
+-- Testing mb_strlen() function with Zero arguments --
+
+Warning: mb_strlen() expects at least 1 parameter, 0 given in %s on line %d
+bool(false)
+
+-- Testing mb_strlen() function with more than expected no. of arguments --
+
+Warning: mb_strlen() expects at most 2 parameters, 3 given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strlen_error2.phpt b/ext/mbstring/tests/mb_strlen_error2.phpt
new file mode 100644
index 0000000..a530a84
--- /dev/null
+++ b/ext/mbstring/tests/mb_strlen_error2.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Test mb_strlen() function : error conditions - pass an unknown encoding
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strlen') or die("skip mb_strlen() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strlen(string $str [, string $encoding])
+ * Description: Get character numbers of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test mb_strlen when passed an unknown encoding
+ */
+
+echo "*** Testing mb_strlen() : error ***\n";
+
+$string = 'abcdef';
+
+$encoding = 'unknown-encoding';
+
+var_dump(mb_strlen($string, $encoding));
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strlen() : error ***
+
+Warning: mb_strlen(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strlen_variation1.phpt b/ext/mbstring/tests/mb_strlen_variation1.phpt
new file mode 100644
index 0000000..3c9cfe3
--- /dev/null
+++ b/ext/mbstring/tests/mb_strlen_variation1.phpt
@@ -0,0 +1,180 @@
+--TEST--
+Test mb_strlen() function : usage variations - Pass different data types as $str arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strlen') or die("skip mb_strlen() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strlen(string $str [, string $encoding])
+ * Description: Get character numbers of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test mb_strlen by passing different data types as $str argument
+ */
+
+echo "*** Testing mb_strlen() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $str argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ b"string",
+ b'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strlen()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strlen($input, $encoding));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strlen() : usage variations ***
+
+-- Iteration 1 --
+int(1)
+
+-- Iteration 2 --
+int(1)
+
+-- Iteration 3 --
+int(5)
+
+-- Iteration 4 --
+int(5)
+
+-- Iteration 5 --
+int(4)
+
+-- Iteration 6 --
+int(5)
+
+-- Iteration 7 --
+int(12)
+
+-- Iteration 8 --
+int(13)
+
+-- Iteration 9 --
+int(3)
+
+-- Iteration 10 --
+int(0)
+
+-- Iteration 11 --
+int(0)
+
+-- Iteration 12 --
+int(1)
+
+-- Iteration 13 --
+int(0)
+
+-- Iteration 14 --
+int(1)
+
+-- Iteration 15 --
+int(0)
+
+-- Iteration 16 --
+int(0)
+
+-- Iteration 17 --
+int(0)
+
+-- Iteration 18 --
+int(6)
+
+-- Iteration 19 --
+int(6)
+
+-- Iteration 20 --
+int(11)
+
+-- Iteration 21 --
+int(14)
+
+-- Iteration 22 --
+int(0)
+
+-- Iteration 23 --
+int(0)
+
+-- Iteration 24 --
+
+Warning: mb_strlen() expects parameter 1 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strlen_variation2.phpt b/ext/mbstring/tests/mb_strlen_variation2.phpt
new file mode 100644
index 0000000..8504bbc
--- /dev/null
+++ b/ext/mbstring/tests/mb_strlen_variation2.phpt
@@ -0,0 +1,220 @@
+--TEST--
+Test mb_strlen() function : usage variations - Pass different data types as $encoding arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strlen') or die("skip mb_strlen() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strlen(string $str [, string $encoding])
+ * Description: Get character numbers of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test mb_strlen() by passing different data types as $encoding argument.
+ * Where possible 'UTF-8' has been entered as a string value
+ */
+
+echo "*** Testing mb_strlen() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$str = 'string value';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $input argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strlen()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strlen($str, $input));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strlen() : usage variations ***
+
+-- Iteration 1 --
+
+Warning: mb_strlen(): Unknown encoding "0" in %s on line %d
+bool(false)
+
+-- Iteration 2 --
+
+Warning: mb_strlen(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 3 --
+
+Warning: mb_strlen(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_strlen(): Unknown encoding "-2345" in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_strlen(): Unknown encoding "10.5" in %s on line %d
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_strlen(): Unknown encoding "-10.5" in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_strlen(): Unknown encoding "123456789000" in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+
+Warning: mb_strlen(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+-- Iteration 9 --
+
+Warning: mb_strlen(): Unknown encoding "0.5" in %s on line %d
+bool(false)
+
+-- Iteration 10 --
+
+Warning: mb_strlen(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 11 --
+
+Warning: mb_strlen(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 12 --
+
+Warning: mb_strlen(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 13 --
+
+Warning: mb_strlen(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 14 --
+
+Warning: mb_strlen(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 15 --
+
+Warning: mb_strlen(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 16 --
+
+Warning: mb_strlen(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_strlen(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+int(12)
+
+-- Iteration 19 --
+int(12)
+
+-- Iteration 20 --
+int(12)
+
+-- Iteration 21 --
+int(12)
+
+-- Iteration 22 --
+
+Warning: mb_strlen(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 23 --
+
+Warning: mb_strlen(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_strlen() expects parameter 2 to be string, resource given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strlen_variation3.phpt b/ext/mbstring/tests/mb_strlen_variation3.phpt
new file mode 100644
index 0000000..efa11ad
--- /dev/null
+++ b/ext/mbstring/tests/mb_strlen_variation3.phpt
@@ -0,0 +1,445 @@
+--TEST--
+Test mb_strlen() function : usage variations - Pass list of encodings
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strlen') or die("skip mb_strlen() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strlen(string $str [, string $encoding])
+ * Description: Get character numbers of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass all encodings listed on php.net to mb_strlen to test that function recognises them
+ * NB: The strings passed are *NOT* necessarily encoded in the encoding passed to the function.
+ * This test is purely to see whether the function recognises the encoding.
+ */
+
+echo "*** Testing mb_strlen() : usage variations ***\n";
+
+$encoding = array('UCS-4', /*1*/
+ 'UCS-4BE',
+ 'UCS-4LE',
+ 'UCS-2',
+ 'UCS-2BE', /*5*/
+ 'UCS-2LE',
+ 'UTF-32',
+ 'UTF-32BE',
+ 'UTF-32LE',
+ 'UTF-16', /*10*/
+ 'UTF-16BE',
+ 'UTF-16LE',
+ 'UTF-7',
+ 'UTF7-IMAP',
+ 'UTF-8', /*15*/
+ 'ASCII',
+ 'EUC-JP',
+ 'SJIS',
+ 'eucJP-win',
+ 'SJIS-win', /*20*/
+ 'ISO-2022-JP',
+ 'JIS',
+ 'ISO-8859-1',
+ 'ISO-8859-2',
+ 'ISO-8859-3', /*25*/
+ 'ISO-8859-4',
+ 'ISO-8859-5',
+ 'ISO-8859-6',
+ 'ISO-8859-7',
+ 'ISO-8859-8', /*30*/
+ 'ISO-8859-9',
+ 'ISO-8859-10',
+ 'ISO-8859-13',
+ 'ISO-8859-14',
+ 'ISO-8859-15', /*35*/
+ 'byte2be',
+ 'byte2le',
+ 'byte4be',
+ 'byte4le',
+ 'BASE64', /*40*/
+ 'HTML-ENTITIES',
+ '7bit',
+ '8bit',
+ 'EUC-CN',
+ 'CP936', /*45*/
+ 'HZ',
+ 'EUC-TW',
+ 'CP950',
+ 'BIG-5',
+ 'EUC-KR', /*50*/
+ 'UHC',
+ 'ISO-2022-KR',
+ 'Windows-1251',
+ 'Windows-1252',
+ 'CP866', /*55*/
+ 'KOI8-R'); /*56*/
+
+
+
+$iterator = 1;
+$string_ascii = 'abc def';
+$string_mb = base64_decode('44K/44OT44Ol44Os44O844OG44Kj44Oz44Kw44O744Oe44K344O844Oz44O744Kr44Oz44OR44OL44O8');
+
+foreach($encoding as $enc) {
+ echo "\n-- Iteration $iterator: $enc --\n";
+
+ echo "-- ASCII String --\n";
+ if(mb_strlen($string_ascii, $enc)) {
+ echo "Encoding $enc recognised\n";
+ } else {
+ echo "Encoding $enc not recognised\n";
+ }
+
+ echo "-- Multibyte String --\n";
+ if(mb_strlen($string_mb, $enc)){
+ echo "Encoding $enc recognised\n";
+ } else {
+ echo "Encoding $enc not recognised\n";
+ }
+ $iterator++;
+}
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strlen() : usage variations ***
+
+-- Iteration 1: UCS-4 --
+-- ASCII String --
+Encoding UCS-4 recognised
+-- Multibyte String --
+Encoding UCS-4 recognised
+
+-- Iteration 2: UCS-4BE --
+-- ASCII String --
+Encoding UCS-4BE recognised
+-- Multibyte String --
+Encoding UCS-4BE recognised
+
+-- Iteration 3: UCS-4LE --
+-- ASCII String --
+Encoding UCS-4LE recognised
+-- Multibyte String --
+Encoding UCS-4LE recognised
+
+-- Iteration 4: UCS-2 --
+-- ASCII String --
+Encoding UCS-2 recognised
+-- Multibyte String --
+Encoding UCS-2 recognised
+
+-- Iteration 5: UCS-2BE --
+-- ASCII String --
+Encoding UCS-2BE recognised
+-- Multibyte String --
+Encoding UCS-2BE recognised
+
+-- Iteration 6: UCS-2LE --
+-- ASCII String --
+Encoding UCS-2LE recognised
+-- Multibyte String --
+Encoding UCS-2LE recognised
+
+-- Iteration 7: UTF-32 --
+-- ASCII String --
+Encoding UTF-32 recognised
+-- Multibyte String --
+Encoding UTF-32 recognised
+
+-- Iteration 8: UTF-32BE --
+-- ASCII String --
+Encoding UTF-32BE recognised
+-- Multibyte String --
+Encoding UTF-32BE recognised
+
+-- Iteration 9: UTF-32LE --
+-- ASCII String --
+Encoding UTF-32LE recognised
+-- Multibyte String --
+Encoding UTF-32LE recognised
+
+-- Iteration 10: UTF-16 --
+-- ASCII String --
+Encoding UTF-16 recognised
+-- Multibyte String --
+Encoding UTF-16 recognised
+
+-- Iteration 11: UTF-16BE --
+-- ASCII String --
+Encoding UTF-16BE recognised
+-- Multibyte String --
+Encoding UTF-16BE recognised
+
+-- Iteration 12: UTF-16LE --
+-- ASCII String --
+Encoding UTF-16LE recognised
+-- Multibyte String --
+Encoding UTF-16LE recognised
+
+-- Iteration 13: UTF-7 --
+-- ASCII String --
+Encoding UTF-7 recognised
+-- Multibyte String --
+Encoding UTF-7 recognised
+
+-- Iteration 14: UTF7-IMAP --
+-- ASCII String --
+Encoding UTF7-IMAP recognised
+-- Multibyte String --
+Encoding UTF7-IMAP recognised
+
+-- Iteration 15: UTF-8 --
+-- ASCII String --
+Encoding UTF-8 recognised
+-- Multibyte String --
+Encoding UTF-8 recognised
+
+-- Iteration 16: ASCII --
+-- ASCII String --
+Encoding ASCII recognised
+-- Multibyte String --
+Encoding ASCII recognised
+
+-- Iteration 17: EUC-JP --
+-- ASCII String --
+Encoding EUC-JP recognised
+-- Multibyte String --
+Encoding EUC-JP recognised
+
+-- Iteration 18: SJIS --
+-- ASCII String --
+Encoding SJIS recognised
+-- Multibyte String --
+Encoding SJIS recognised
+
+-- Iteration 19: eucJP-win --
+-- ASCII String --
+Encoding eucJP-win recognised
+-- Multibyte String --
+Encoding eucJP-win recognised
+
+-- Iteration 20: SJIS-win --
+-- ASCII String --
+Encoding SJIS-win recognised
+-- Multibyte String --
+Encoding SJIS-win recognised
+
+-- Iteration 21: ISO-2022-JP --
+-- ASCII String --
+Encoding ISO-2022-JP recognised
+-- Multibyte String --
+Encoding ISO-2022-JP recognised
+
+-- Iteration 22: JIS --
+-- ASCII String --
+Encoding JIS recognised
+-- Multibyte String --
+Encoding JIS recognised
+
+-- Iteration 23: ISO-8859-1 --
+-- ASCII String --
+Encoding ISO-8859-1 recognised
+-- Multibyte String --
+Encoding ISO-8859-1 recognised
+
+-- Iteration 24: ISO-8859-2 --
+-- ASCII String --
+Encoding ISO-8859-2 recognised
+-- Multibyte String --
+Encoding ISO-8859-2 recognised
+
+-- Iteration 25: ISO-8859-3 --
+-- ASCII String --
+Encoding ISO-8859-3 recognised
+-- Multibyte String --
+Encoding ISO-8859-3 recognised
+
+-- Iteration 26: ISO-8859-4 --
+-- ASCII String --
+Encoding ISO-8859-4 recognised
+-- Multibyte String --
+Encoding ISO-8859-4 recognised
+
+-- Iteration 27: ISO-8859-5 --
+-- ASCII String --
+Encoding ISO-8859-5 recognised
+-- Multibyte String --
+Encoding ISO-8859-5 recognised
+
+-- Iteration 28: ISO-8859-6 --
+-- ASCII String --
+Encoding ISO-8859-6 recognised
+-- Multibyte String --
+Encoding ISO-8859-6 recognised
+
+-- Iteration 29: ISO-8859-7 --
+-- ASCII String --
+Encoding ISO-8859-7 recognised
+-- Multibyte String --
+Encoding ISO-8859-7 recognised
+
+-- Iteration 30: ISO-8859-8 --
+-- ASCII String --
+Encoding ISO-8859-8 recognised
+-- Multibyte String --
+Encoding ISO-8859-8 recognised
+
+-- Iteration 31: ISO-8859-9 --
+-- ASCII String --
+Encoding ISO-8859-9 recognised
+-- Multibyte String --
+Encoding ISO-8859-9 recognised
+
+-- Iteration 32: ISO-8859-10 --
+-- ASCII String --
+Encoding ISO-8859-10 recognised
+-- Multibyte String --
+Encoding ISO-8859-10 recognised
+
+-- Iteration 33: ISO-8859-13 --
+-- ASCII String --
+Encoding ISO-8859-13 recognised
+-- Multibyte String --
+Encoding ISO-8859-13 recognised
+
+-- Iteration 34: ISO-8859-14 --
+-- ASCII String --
+Encoding ISO-8859-14 recognised
+-- Multibyte String --
+Encoding ISO-8859-14 recognised
+
+-- Iteration 35: ISO-8859-15 --
+-- ASCII String --
+Encoding ISO-8859-15 recognised
+-- Multibyte String --
+Encoding ISO-8859-15 recognised
+
+-- Iteration 36: byte2be --
+-- ASCII String --
+Encoding byte2be recognised
+-- Multibyte String --
+Encoding byte2be recognised
+
+-- Iteration 37: byte2le --
+-- ASCII String --
+Encoding byte2le recognised
+-- Multibyte String --
+Encoding byte2le recognised
+
+-- Iteration 38: byte4be --
+-- ASCII String --
+Encoding byte4be recognised
+-- Multibyte String --
+Encoding byte4be recognised
+
+-- Iteration 39: byte4le --
+-- ASCII String --
+Encoding byte4le recognised
+-- Multibyte String --
+Encoding byte4le recognised
+
+-- Iteration 40: BASE64 --
+-- ASCII String --
+Encoding BASE64 recognised
+-- Multibyte String --
+Encoding BASE64 recognised
+
+-- Iteration 41: HTML-ENTITIES --
+-- ASCII String --
+Encoding HTML-ENTITIES recognised
+-- Multibyte String --
+Encoding HTML-ENTITIES recognised
+
+-- Iteration 42: 7bit --
+-- ASCII String --
+Encoding 7bit recognised
+-- Multibyte String --
+Encoding 7bit recognised
+
+-- Iteration 43: 8bit --
+-- ASCII String --
+Encoding 8bit recognised
+-- Multibyte String --
+Encoding 8bit recognised
+
+-- Iteration 44: EUC-CN --
+-- ASCII String --
+Encoding EUC-CN recognised
+-- Multibyte String --
+Encoding EUC-CN recognised
+
+-- Iteration 45: CP936 --
+-- ASCII String --
+Encoding CP936 recognised
+-- Multibyte String --
+Encoding CP936 recognised
+
+-- Iteration 46: HZ --
+-- ASCII String --
+Encoding HZ recognised
+-- Multibyte String --
+Encoding HZ recognised
+
+-- Iteration 47: EUC-TW --
+-- ASCII String --
+Encoding EUC-TW recognised
+-- Multibyte String --
+Encoding EUC-TW recognised
+
+-- Iteration 48: CP950 --
+-- ASCII String --
+Encoding CP950 recognised
+-- Multibyte String --
+Encoding CP950 recognised
+
+-- Iteration 49: BIG-5 --
+-- ASCII String --
+Encoding BIG-5 recognised
+-- Multibyte String --
+Encoding BIG-5 recognised
+
+-- Iteration 50: EUC-KR --
+-- ASCII String --
+Encoding EUC-KR recognised
+-- Multibyte String --
+Encoding EUC-KR recognised
+
+-- Iteration 51: UHC --
+-- ASCII String --
+Encoding UHC recognised
+-- Multibyte String --
+Encoding UHC recognised
+
+-- Iteration 52: ISO-2022-KR --
+-- ASCII String --
+Encoding ISO-2022-KR recognised
+-- Multibyte String --
+Encoding ISO-2022-KR recognised
+
+-- Iteration 53: Windows-1251 --
+-- ASCII String --
+Encoding Windows-1251 recognised
+-- Multibyte String --
+Encoding Windows-1251 recognised
+
+-- Iteration 54: Windows-1252 --
+-- ASCII String --
+Encoding Windows-1252 recognised
+-- Multibyte String --
+Encoding Windows-1252 recognised
+
+-- Iteration 55: CP866 --
+-- ASCII String --
+Encoding CP866 recognised
+-- Multibyte String --
+Encoding CP866 recognised
+
+-- Iteration 56: KOI8-R --
+-- ASCII String --
+Encoding KOI8-R recognised
+-- Multibyte String --
+Encoding KOI8-R recognised
+Done
diff --git a/ext/mbstring/tests/mb_strpos.phpt b/ext/mbstring/tests/mb_strpos.phpt
new file mode 100644
index 0000000..1d613e9
--- /dev/null
+++ b/ext/mbstring/tests/mb_strpos.phpt
@@ -0,0 +1,175 @@
+--TEST--
+mb_strpos()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+// TODO: Add more encodings
+
+//$debug=true;
+ini_set('include_path','.');
+include_once('common.inc');
+
+
+// Test string
+$euc_jp = b'0123この文字列は日本語です。EUC-JPを使っています。0123日本語は面倒臭い。';
+
+// EUC-JP - With encoding parameter
+mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n");
+
+echo "== POSITIVE OFFSET ==\n";
+print mb_strpos($euc_jp, b'日本語', 0, 'EUC-JP') . "\n";
+print mb_strpos($euc_jp, b'0', 0, 'EUC-JP') . "\n";
+print mb_strpos($euc_jp, 3, 0, 'EUC-JP') . "\n";
+print mb_strpos($euc_jp, 0, 0, 'EUC-JP') . "\n";
+print mb_strpos($euc_jp, b'日本語', 15, 'EUC-JP') . "\n";
+print mb_strpos($euc_jp, b'0', 15, 'EUC-JP') . "\n";
+print mb_strpos($euc_jp, 3, 15, 'EUC-JP') . "\n";
+print mb_strpos($euc_jp, 0, 15, 'EUC-JP') . "\n";
+
+// Negative offset
+// Note: PHP Warning - offset is negative.
+// Note: For offset(-15). It does not return position of latter string. (ie the same result as -50)
+echo "== NEGATIVE OFFSET ==\n";
+$r = mb_strpos($euc_jp, b'日本語', -15, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_strpos($euc_jp, b'0', -15, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_strpos($euc_jp, 3, -15, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_strpos($euc_jp, 0, -15, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_strpos($euc_jp, b'日本語', -50, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_strpos($euc_jp, b'0', -50, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_strpos($euc_jp, 3, -50, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+$r = mb_strpos($euc_jp, 0, -50, 'EUC-JP');
+($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
+
+// Out of range - should return false
+print ("== OUT OF RANGE ==\n");
+$r = mb_strpos($euc_jp, b'日本語', 40, 'EUC-JP');
+($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
+$r = mb_strpos($euc_jp, b'0', 40, 'EUC-JP');
+($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
+$r = mb_strpos($euc_jp, 3, 40, 'EUC-JP');
+($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
+$r = mb_strpos($euc_jp, 0, 40, 'EUC-JP');
+($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
+// Note: Returned NULL string
+// echo gettype($r). ' val '. $r ."\n";
+
+
+// Non-existent
+echo "== NON-EXISTENT ==\n";
+$r = mb_strpos($euc_jp, b'韓国語', 0, 'EUC-JP');
+($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
+$r = mb_strpos($euc_jp, b"\n", 0, 'EUC-JP');
+($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n";
+
+
+// EUC-JP - No encoding parameter
+echo "== NO ENCODING PARAMETER ==\n";
+mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n");
+
+print mb_strpos($euc_jp, b'日本語', 0) . "\n";
+print mb_strpos($euc_jp, b'0', 0) . "\n";
+print mb_strpos($euc_jp, 3, 0) . "\n";
+print mb_strpos($euc_jp, 0, 0) . "\n";
+
+$r = mb_strpos($euc_jp, b'韓国語', 0);
+($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
+$r = mb_strpos($euc_jp, b"\n", 0);
+($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n";
+
+// EUC-JP - No offset and encoding parameter
+echo "== NO OFFSET AND ENCODING PARAMETER ==\n";
+mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n");
+
+print mb_strpos($euc_jp, b'日本語') . "\n";
+print mb_strpos($euc_jp, b'0') . "\n";
+print mb_strpos($euc_jp, 3) . "\n";
+print mb_strpos($euc_jp, 0) . "\n";
+
+$r = mb_strpos($euc_jp, b'韓国語');
+($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
+$r = mb_strpos($euc_jp, b"\n");
+($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n";
+
+
+// Invalid Parameters
+echo "== INVALID PARAMETER TEST ==\n";
+
+$r = mb_strpos($euc_jp,'','EUC-JP');
+($r === FALSE) ? print("OK_NULL\n") : print("NG_NULL\n");
+$r = mb_strpos($euc_jp, $t_ary, 'EUC-JP');
+($r === FALSE) ? print("OK_ARRAY\n") : print("NG_ARRAY\n");
+$r = mb_strpos($euc_jp, $t_obj, 'EUC-JP');
+($r === FALSE) ? print("OK_OBJECT\n") : print("NG_OBJECT\n");
+$r = mb_strpos($euc_jp, $t_obj, 'BAD_ENCODING');
+($r === FALSE) ? print("OK_BAD_ENCODING\n") : print("NG_BAD_ENCODING\n");
+
+
+?>
+
+--EXPECT--
+== POSITIVE OFFSET ==
+10
+0
+3
+0
+34
+30
+33
+30
+== NEGATIVE OFFSET ==
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+ERR: Warning
+OK_NEGATIVE_OFFSET
+== OUT OF RANGE ==
+OK_OUT_RANGE
+OK_OUT_RANGE
+OK_OUT_RANGE
+OK_OUT_RANGE
+== NON-EXISTENT ==
+OK_STR
+OK_NEWLINE
+== NO ENCODING PARAMETER ==
+10
+0
+3
+0
+OK_STR
+OK_NEWLINE
+== NO OFFSET AND ENCODING PARAMETER ==
+10
+0
+3
+0
+OK_STR
+OK_NEWLINE
+== INVALID PARAMETER TEST ==
+ERR: Warning
+OK_NULL
+ERR: Warning
+OK_ARRAY
+ERR: Warning
+OK_OBJECT
+ERR: Warning
+OK_BAD_ENCODING
+
diff --git a/ext/mbstring/tests/mb_strpos_basic.phpt b/ext/mbstring/tests/mb_strpos_basic.phpt
new file mode 100644
index 0000000..36641b1
--- /dev/null
+++ b/ext/mbstring/tests/mb_strpos_basic.phpt
@@ -0,0 +1,57 @@
+--TEST--
+Test mb_strpos() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strpos') or die("skip mb_strpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test basic functionality of mb_strpos with ASCII and multibyte characters
+ */
+
+echo "*** Testing mb_strpos() : basic functionality***\n";
+
+mb_internal_encoding('UTF-8');
+
+$string_ascii = b'abc def';
+//Japanese string in UTF-8
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+echo "\n-- ASCII string 1 --\n";
+var_dump(mb_strpos($string_ascii, b'd', 2, 'ISO-8859-1'));
+
+echo "\n-- ASCII string 2 --\n";
+var_dump(mb_strpos($string_ascii, '123'));
+
+echo "\n-- Multibyte string 1 --\n";
+$needle1 = base64_decode('5pel5pys6Kqe');
+var_dump(mb_strpos($string_mb, $needle1));
+
+echo "\n-- Multibyte string 2 --\n";
+$needle2 = base64_decode("44GT44KT44Gr44Gh44Gv44CB5LiW55WM");
+var_dump(mb_strpos($string_mb, $needle2));
+
+echo "Done";
+?>
+--EXPECT--
+*** Testing mb_strpos() : basic functionality***
+
+-- ASCII string 1 --
+int(4)
+
+-- ASCII string 2 --
+bool(false)
+
+-- Multibyte string 1 --
+int(0)
+
+-- Multibyte string 2 --
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strpos_error1.phpt b/ext/mbstring/tests/mb_strpos_error1.phpt
new file mode 100644
index 0000000..8f5ba85
--- /dev/null
+++ b/ext/mbstring/tests/mb_strpos_error1.phpt
@@ -0,0 +1,50 @@
+--TEST--
+Test mb_strpos() function : error conditions - Pass incorrect number of args
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strpos') or die("skip mb_strpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test how mb_strpos behaves when passed an incorrect number of arguments
+ */
+
+echo "*** Testing mb_strpos() : error conditions ***\n";
+
+
+//Test mb_strpos with one more than the expected number of arguments
+echo "\n-- Testing mb_strpos() function with more than expected no. of arguments --\n";
+$haystack = 'string_val';
+$needle = 'string_val';
+$offset = 10;
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_strpos($haystack, $needle, $offset, $encoding, $extra_arg) );
+
+// Testing mb_strpos with one less than the expected number of arguments
+echo "\n-- Testing mb_strpos() function with less than expected no. of arguments --\n";
+$haystack = 'string_val';
+var_dump( mb_strpos($haystack) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strpos() : error conditions ***
+
+-- Testing mb_strpos() function with more than expected no. of arguments --
+
+Warning: mb_strpos() expects at most 4 parameters, 5 given in %s on line %d
+bool(false)
+
+-- Testing mb_strpos() function with less than expected no. of arguments --
+
+Warning: mb_strpos() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strpos_error2.phpt b/ext/mbstring/tests/mb_strpos_error2.phpt
new file mode 100644
index 0000000..f75390f
--- /dev/null
+++ b/ext/mbstring/tests/mb_strpos_error2.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Test mb_strpos() function : error conditions - Pass unknown encoding
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strpos') or die("skip mb_strpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass an unknown encoding to mb_strpos() to test behaviour
+ */
+
+echo "*** Testing mb_strpos() : error conditions ***\n";
+$haystack = 'Hello, world';
+$needle = 'world';
+$offset = 2;
+$encoding = 'unknown-encoding';
+
+var_dump( mb_strpos($haystack, $needle, $offset, $encoding) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strpos() : error conditions ***
+
+Warning: mb_strpos(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strpos_variation1.phpt b/ext/mbstring/tests/mb_strpos_variation1.phpt
new file mode 100644
index 0000000..d665f8f
--- /dev/null
+++ b/ext/mbstring/tests/mb_strpos_variation1.phpt
@@ -0,0 +1,182 @@
+--TEST--
+Test mb_strpos() function : usage variations - pass different data types to $haystack arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strpos') or die("skip mb_strpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass mb_strpos different data types as $haystack arg to test behaviour
+ */
+
+echo "*** Testing mb_strpos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$needle = 'string_val';
+$offset = 0;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $haystack argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "string",
+ 'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strpos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strpos($input, $needle, $offset, $encoding));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strpos() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(false)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_strpos() expects parameter 1 to be string, resource given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strpos_variation2.phpt b/ext/mbstring/tests/mb_strpos_variation2.phpt
new file mode 100644
index 0000000..d6feb49
--- /dev/null
+++ b/ext/mbstring/tests/mb_strpos_variation2.phpt
@@ -0,0 +1,198 @@
+--TEST--
+Test mb_strpos() function : usage variations - pass different data types as $needle arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strpos') or die("skip mb_strpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass mb_strpos different data types as $needle arg to test behaviour
+ */
+
+echo "*** Testing mb_strpos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$haystack = b'string_val';
+$offset = 0;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $needle argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ b"string",
+ b'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strpos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strpos($haystack, $input, $offset, $encoding));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strpos() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+
+Warning: mb_strpos(): Empty delimiter in %s on line %d
+bool(false)
+
+-- Iteration 11 --
+
+Warning: mb_strpos(): Empty delimiter in %s on line %d
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+
+Warning: mb_strpos(): Empty delimiter in %s on line %d
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+
+Warning: mb_strpos(): Empty delimiter in %s on line %d
+bool(false)
+
+-- Iteration 16 --
+
+Warning: mb_strpos(): Empty delimiter in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_strpos(): Empty delimiter in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+int(0)
+
+-- Iteration 19 --
+int(0)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+
+Warning: mb_strpos(): Empty delimiter in %s on line %d
+bool(false)
+
+-- Iteration 23 --
+
+Warning: mb_strpos(): Empty delimiter in %s on line %d
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_strpos() expects parameter 2 to be string, resource given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strpos_variation3.phpt b/ext/mbstring/tests/mb_strpos_variation3.phpt
new file mode 100644
index 0000000..65572b5
--- /dev/null
+++ b/ext/mbstring/tests/mb_strpos_variation3.phpt
@@ -0,0 +1,202 @@
+--TEST--
+Test mb_strpos() function : usage variations - pass different data types as $offset arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strpos') or die("skip mb_strpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass mb_strpos different data types as $offset arg to test behaviour
+ */
+
+echo "*** Testing mb_strpos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$needle = b'a';
+$haystack = b'string_val';
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $offest argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "string",
+ 'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strpos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strpos($haystack, $needle, $input, $encoding));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strpos() : usage variations ***
+
+-- Iteration 1 --
+int(8)
+
+-- Iteration 2 --
+int(8)
+
+-- Iteration 3 --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+int(8)
+
+-- Iteration 9 --
+int(8)
+
+-- Iteration 10 --
+int(8)
+
+-- Iteration 11 --
+int(8)
+
+-- Iteration 12 --
+int(8)
+
+-- Iteration 13 --
+int(8)
+
+-- Iteration 14 --
+int(8)
+
+-- Iteration 15 --
+int(8)
+
+-- Iteration 16 --
+
+Warning: mb_strpos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_strpos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+
+Warning: mb_strpos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 19 --
+
+Warning: mb_strpos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 20 --
+
+Warning: mb_strpos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 21 --
+
+Warning: mb_strpos() expects parameter 3 to be long, object given in %s on line %d
+bool(false)
+
+-- Iteration 22 --
+int(8)
+
+-- Iteration 23 --
+int(8)
+
+-- Iteration 24 --
+
+Warning: mb_strpos() expects parameter 3 to be long, resource given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strpos_variation4.phpt b/ext/mbstring/tests/mb_strpos_variation4.phpt
new file mode 100644
index 0000000..0fca8bb
--- /dev/null
+++ b/ext/mbstring/tests/mb_strpos_variation4.phpt
@@ -0,0 +1,222 @@
+--TEST--
+Test mb_strpos() function : usage variations - pass different data types as $encoding arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strpos') or die("skip mb_strpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass mb_strpos different data types as $encoding arg to test behaviour
+ * Where possible 'UTF-8' has been entered as a string value
+ */
+
+echo "*** Testing mb_strpos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$haystack = b'string_val';
+$needle = b'val';
+$offset = 0;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $input argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strpos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strpos($haystack, $needle, $offset, $input));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strpos() : usage variations ***
+
+-- Iteration 1 --
+
+Warning: mb_strpos(): Unknown encoding "0" in %s on line %d
+bool(false)
+
+-- Iteration 2 --
+
+Warning: mb_strpos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 3 --
+
+Warning: mb_strpos(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_strpos(): Unknown encoding "-2345" in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_strpos(): Unknown encoding "10.5" in %s on line %d
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_strpos(): Unknown encoding "-10.5" in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_strpos(): Unknown encoding "123456789000" in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+
+Warning: mb_strpos(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+-- Iteration 9 --
+
+Warning: mb_strpos(): Unknown encoding "0.5" in %s on line %d
+bool(false)
+
+-- Iteration 10 --
+
+Warning: mb_strpos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 11 --
+
+Warning: mb_strpos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 12 --
+
+Warning: mb_strpos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 13 --
+
+Warning: mb_strpos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 14 --
+
+Warning: mb_strpos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 15 --
+
+Warning: mb_strpos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 16 --
+
+Warning: mb_strpos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_strpos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+int(7)
+
+-- Iteration 19 --
+int(7)
+
+-- Iteration 20 --
+int(7)
+
+-- Iteration 21 --
+int(7)
+
+-- Iteration 22 --
+
+Warning: mb_strpos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 23 --
+
+Warning: mb_strpos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_strpos() expects parameter 4 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strpos_variation5.phpt b/ext/mbstring/tests/mb_strpos_variation5.phpt
new file mode 100644
index 0000000..7a9604a
--- /dev/null
+++ b/ext/mbstring/tests/mb_strpos_variation5.phpt
@@ -0,0 +1,117 @@
+--TEST--
+Test mb_strpos() function : usage variations - Pass different integers as $offset argument
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strpos') or die("skip mb_strpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test how mb_strpos() behaves when passed different integers as $offset argument
+ * The character length of $string_ascii and $string_mb is the same,
+ * and the needle appears at the same positions in both strings
+ */
+
+mb_internal_encoding('UTF-8');
+
+echo "*** Testing mb_strpos() : usage variations ***\n";
+
+$string_ascii = b'+Is an English string'; //21 chars
+$needle_ascii = b'g';
+
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); //21 chars
+$needle_mb = base64_decode('44CC');
+
+/*
+ * Loop through integers as multiples of ten for $offset argument
+ * mb_strpos should not be able to accept negative values as $offset.
+ * 60 is larger than *BYTE* count for $string_mb
+ */
+for ($i = -10; $i <= 60; $i += 10) {
+ echo "\n**-- Offset is: $i --**\n";
+ echo "-- ASCII String --\n";
+ var_dump(mb_strpos($string_ascii, $needle_ascii, $i));
+ echo "--Multibyte String --\n";
+ var_dump(mb_strpos($string_mb, $needle_mb, $i, 'UTF-8'));
+}
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strpos() : usage variations ***
+
+**-- Offset is: -10 --**
+-- ASCII String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+**-- Offset is: 0 --**
+-- ASCII String --
+int(9)
+--Multibyte String --
+int(9)
+
+**-- Offset is: 10 --**
+-- ASCII String --
+int(20)
+--Multibyte String --
+int(20)
+
+**-- Offset is: 20 --**
+-- ASCII String --
+int(20)
+--Multibyte String --
+int(20)
+
+**-- Offset is: 30 --**
+-- ASCII String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+**-- Offset is: 40 --**
+-- ASCII String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+**-- Offset is: 50 --**
+-- ASCII String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+
+**-- Offset is: 60 --**
+-- ASCII String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strpos(): Offset not contained in string in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strrchr_basic.phpt b/ext/mbstring/tests/mb_strrchr_basic.phpt
new file mode 100644
index 0000000..595d808
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_basic.phpt
@@ -0,0 +1,64 @@
+--TEST--
+Test mb_strrchr() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : basic functionality ***\n";
+
+mb_internal_encoding('UTF-8');
+
+$string_ascii = b'abc def';
+//Japanese string in UTF-8
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+echo "\n-- ASCII string: needle exists --\n";
+var_dump(bin2hex(mb_strrchr($string_ascii, b'd', false, 'ISO-8859-1')));
+var_dump(bin2hex(mb_strrchr($string_ascii, b'd')));
+var_dump(bin2hex(mb_strrchr($string_ascii, b'd', true)));
+
+
+echo "\n-- ASCII string: needle doesn't exist --\n";
+var_dump(mb_strrchr($string_ascii, b'123'));
+
+echo "\n-- Multibyte string: needle exists --\n";
+$needle1 = base64_decode('5pel5pys6Kqe');
+var_dump(bin2hex(mb_strrchr($string_mb, $needle1)));
+var_dump(bin2hex(mb_strrchr($string_mb, $needle1, false, 'utf-8')));
+var_dump(bin2hex(mb_strrchr($string_mb, $needle1, true)));
+
+
+echo "\n-- Multibyte string: needle doesn't exist --\n";
+$needle2 = base64_decode('44GT44KT44Gr44Gh44Gv44CB5LiW55WM');
+var_dump(mb_strrchr($string_mb, $needle2));
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_strrchr() : basic functionality ***
+
+-- ASCII string: needle exists --
+string(6) "646566"
+string(6) "646566"
+string(8) "61626320"
+
+-- ASCII string: needle doesn't exist --
+bool(false)
+
+-- Multibyte string: needle exists --
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(0) ""
+
+-- Multibyte string: needle doesn't exist --
+bool(false)
+===DONE=== \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strrchr_error1.phpt b/ext/mbstring/tests/mb_strrchr_error1.phpt
new file mode 100644
index 0000000..5ebb3d0
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_error1.phpt
@@ -0,0 +1,47 @@
+--TEST--
+Test mb_strrchr() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : error conditions ***\n";
+
+
+//Test mb_strrchr with one more than the expected number of arguments
+echo "\n-- Testing mb_strrchr() function with more than expected no. of arguments --\n";
+$haystack = b'string_val';
+$needle = b'string_val';
+$part = true;
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_strrchr($haystack, $needle, $part, $encoding, $extra_arg) );
+
+// Testing mb_strrchr with one less than the expected number of arguments
+echo "\n-- Testing mb_strrchr() function with less than expected no. of arguments --\n";
+$haystack = b'string_val';
+var_dump( mb_strrchr($haystack) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrchr() : error conditions ***
+
+-- Testing mb_strrchr() function with more than expected no. of arguments --
+
+Warning: mb_strrchr() expects at most 4 parameters, 5 given in %s on line %d
+bool(false)
+
+-- Testing mb_strrchr() function with less than expected no. of arguments --
+
+Warning: mb_strrchr() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrchr_error2.phpt b/ext/mbstring/tests/mb_strrchr_error2.phpt
new file mode 100644
index 0000000..cfbcd66
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_error2.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_strrchr() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : error conditions ***\n";
+
+
+echo "\n-- Testing mb_strrchr() with unknown encoding --\n";
+$haystack = b'Hello, world';
+$needle = b'world';
+$encoding = 'unknown-encoding';
+$part = true;
+var_dump( mb_strrchr($haystack, $needle, $part, $encoding) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrchr() : error conditions ***
+
+-- Testing mb_strrchr() with unknown encoding --
+
+Warning: mb_strrchr(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrchr_variation1.phpt b/ext/mbstring/tests/mb_strrchr_variation1.phpt
new file mode 100644
index 0000000..18eb52e
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_variation1.phpt
@@ -0,0 +1,207 @@
+--TEST--
+Test mb_strrchr() function : usage variation - various haystacks, needle won't be found
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$needle = b'string_val';
+$part = true;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for haystack
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strrchr($value, $needle, $part, $encoding) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrchr() : usage variation ***
+
+--int 0--
+bool(false)
+
+--int 1--
+bool(false)
+
+--int 12345--
+bool(false)
+
+--int -12345--
+bool(false)
+
+--float 10.5--
+bool(false)
+
+--float -10.5--
+bool(false)
+
+--float 12.3456789000e10--
+bool(false)
+
+--float -12.3456789000e10--
+bool(false)
+
+--float .5--
+bool(false)
+
+--empty array--
+Error: 2 - mb_strrchr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strrchr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strrchr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strrchr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+bool(false)
+
+--lowercase null--
+bool(false)
+
+--lowercase true--
+bool(false)
+
+--lowercase false--
+bool(false)
+
+--uppercase TRUE--
+bool(false)
+
+--uppercase FALSE--
+bool(false)
+
+--empty string DQ--
+bool(false)
+
+--empty string SQ--
+bool(false)
+
+--instance of classWithToString--
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strrchr() expects parameter 1 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+bool(false)
+
+--unset var--
+bool(false)
+
+--resource--
+Error: 2 - mb_strrchr() expects parameter 1 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrchr_variation2.phpt b/ext/mbstring/tests/mb_strrchr_variation2.phpt
new file mode 100644
index 0000000..f9b7107
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_variation2.phpt
@@ -0,0 +1,207 @@
+--TEST--
+Test mb_strrchr() function : usage variation - different types of needle.
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$part = true;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for needle
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strrchr($haystack, $value, $part, $encoding) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrchr() : usage variation ***
+
+--int 0--
+bool(false)
+
+--int 1--
+bool(false)
+
+--int 12345--
+bool(false)
+
+--int -12345--
+bool(false)
+
+--float 10.5--
+bool(false)
+
+--float -10.5--
+bool(false)
+
+--float 12.3456789000e10--
+bool(false)
+
+--float -12.3456789000e10--
+bool(false)
+
+--float .5--
+bool(false)
+
+--empty array--
+Error: 2 - mb_strrchr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strrchr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strrchr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strrchr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+bool(false)
+
+--lowercase null--
+bool(false)
+
+--lowercase true--
+bool(false)
+
+--lowercase false--
+bool(false)
+
+--uppercase TRUE--
+bool(false)
+
+--uppercase FALSE--
+bool(false)
+
+--empty string DQ--
+bool(false)
+
+--empty string SQ--
+bool(false)
+
+--instance of classWithToString--
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strrchr() expects parameter 2 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+bool(false)
+
+--unset var--
+bool(false)
+
+--resource--
+Error: 2 - mb_strrchr() expects parameter 2 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrchr_variation3.phpt b/ext/mbstring/tests/mb_strrchr_variation3.phpt
new file mode 100644
index 0000000..4a16f55
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_variation3.phpt
@@ -0,0 +1,232 @@
+--TEST--
+Test mb_strrchr() function : usage variation - different values for part
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$needle = b'_';
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // string data
+ 'string DQ' => "string",
+ 'string SQ' => 'string',
+ 'mixed case string' => "sTrInG",
+ 'heredoc' => $heredoc,
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for part
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ $res = mb_strrchr($haystack, $needle, $value, $encoding);
+ if ($res === false) {
+ var_dump($res);
+ }
+ else {
+ var_dump(bin2hex($res));
+ }
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrchr() : usage variation ***
+
+--int 0--
+string(8) "5f76616c"
+
+--int 1--
+string(12) "737472696e67"
+
+--int 12345--
+string(12) "737472696e67"
+
+--int -12345--
+string(12) "737472696e67"
+
+--float 10.5--
+string(12) "737472696e67"
+
+--float -10.5--
+string(12) "737472696e67"
+
+--float 12.3456789000e10--
+string(12) "737472696e67"
+
+--float -12.3456789000e10--
+string(12) "737472696e67"
+
+--float .5--
+string(12) "737472696e67"
+
+--empty array--
+Error: 2 - mb_strrchr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strrchr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strrchr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strrchr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+string(8) "5f76616c"
+
+--lowercase null--
+string(8) "5f76616c"
+
+--lowercase true--
+string(12) "737472696e67"
+
+--lowercase false--
+string(8) "5f76616c"
+
+--uppercase TRUE--
+string(12) "737472696e67"
+
+--uppercase FALSE--
+string(8) "5f76616c"
+
+--empty string DQ--
+string(8) "5f76616c"
+
+--empty string SQ--
+string(8) "5f76616c"
+
+--string DQ--
+string(12) "737472696e67"
+
+--string SQ--
+string(12) "737472696e67"
+
+--mixed case string--
+string(12) "737472696e67"
+
+--heredoc--
+string(12) "737472696e67"
+
+--instance of classWithToString--
+Error: 2 - mb_strrchr() expects parameter 3 to be boolean, object given, %s(%d)
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strrchr() expects parameter 3 to be boolean, object given, %s(%d)
+bool(false)
+
+--undefined var--
+string(8) "5f76616c"
+
+--unset var--
+string(8) "5f76616c"
+
+--resource--
+Error: 2 - mb_strrchr() expects parameter 3 to be boolean, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrchr_variation4.phpt b/ext/mbstring/tests/mb_strrchr_variation4.phpt
new file mode 100644
index 0000000..b9e0147
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_variation4.phpt
@@ -0,0 +1,227 @@
+--TEST--
+Test mb_strrchr() function : usage variation - different encoding types
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$needle = b'_';
+$part = true;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return "invalid";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = <<<EOT
+invalid
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for encoding
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strrchr($haystack, $needle, $part, $value) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrchr() : usage variation ***
+
+--int 0--
+Error: 2 - mb_strrchr(): Unknown encoding "0", %s(%d)
+bool(false)
+
+--int 1--
+Error: 2 - mb_strrchr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--int 12345--
+Error: 2 - mb_strrchr(): Unknown encoding "12345", %s(%d)
+bool(false)
+
+--int -12345--
+Error: 2 - mb_strrchr(): Unknown encoding "-2345", %s(%d)
+bool(false)
+
+--float 10.5--
+Error: 2 - mb_strrchr(): Unknown encoding "10.5", %s(%d)
+bool(false)
+
+--float -10.5--
+Error: 2 - mb_strrchr(): Unknown encoding "-10.5", %s(%d)
+bool(false)
+
+--float 12.3456789000e10--
+Error: 2 - mb_strrchr(): Unknown encoding "123456789000", %s(%d)
+bool(false)
+
+--float -12.3456789000e10--
+Error: 2 - mb_strrchr(): Unknown encoding "-123456789000", %s(%d)
+bool(false)
+
+--float .5--
+Error: 2 - mb_strrchr(): Unknown encoding "0.5", %s(%d)
+bool(false)
+
+--empty array--
+Error: 2 - mb_strrchr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strrchr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strrchr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strrchr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+Error: 2 - mb_strrchr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--lowercase null--
+Error: 2 - mb_strrchr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--lowercase true--
+Error: 2 - mb_strrchr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--lowercase false--
+Error: 2 - mb_strrchr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--uppercase TRUE--
+Error: 2 - mb_strrchr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--uppercase FALSE--
+Error: 2 - mb_strrchr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--empty string DQ--
+Error: 2 - mb_strrchr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--empty string SQ--
+Error: 2 - mb_strrchr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--instance of classWithToString--
+Error: 2 - mb_strrchr(): Unknown encoding "invalid", %s(%d)
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strrchr() expects parameter 4 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+Error: 2 - mb_strrchr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--unset var--
+Error: 2 - mb_strrchr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--resource--
+Error: 2 - mb_strrchr() expects parameter 4 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrchr_variation5.phpt b/ext/mbstring/tests/mb_strrchr_variation5.phpt
new file mode 100644
index 0000000..84a73a2
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_variation5.phpt
@@ -0,0 +1,59 @@
+--TEST--
+Test mb_strrchr() function : variation - multiple needles
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : variation ***\n";
+
+mb_internal_encoding('UTF-8');
+
+//with repeated needles
+$string_ascii = b'abcdef zbcdyx';
+$needle_ascii = b"bcd";
+
+//Japanese string in UTF-8 with repeated needles
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OIMzTvvJXvvJbml6XmnKzoqp7jg4bjgq3jgrnjg4g=');
+$needle_mb = base64_decode('6Kqe44OG44Kt');
+
+echo "-- Ascii data --\n";
+var_dump(bin2hex(mb_strrchr($string_ascii, $needle_ascii, false)));
+var_dump(bin2hex(mb_strrchr($string_ascii, $needle_ascii, true)));
+
+echo "-- mb data in utf-8 --\n";
+$res = mb_strrchr($string_mb, $needle_mb, false);
+if ($res !== false) {
+ var_dump(bin2hex($res));
+}
+else {
+ echo "nothing found!\n";
+}
+$res = mb_strrchr($string_mb, $needle_mb, true);
+if ($res !== false) {
+ var_dump(bin2hex($res));
+}
+else {
+ echo "nothing found!\n";
+}
+
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_strrchr() : variation ***
+-- Ascii data --
+string(10) "6263647978"
+string(16) "616263646566207a"
+-- mb data in utf-8 --
+string(30) "e8aa9ee38386e382ade382b9e38388"
+string(70) "e697a5e69cace8aa9ee38386e382ade382b9e383883334efbc95efbc96e697a5e69cac"
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrchr_variation6.phpt b/ext/mbstring/tests/mb_strrchr_variation6.phpt
new file mode 100644
index 0000000..8600949
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrchr_variation6.phpt
@@ -0,0 +1,65 @@
+--TEST--
+Test mb_strrchr() function : variation - case sensitivity
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrchr() : variation ***\n";
+
+mb_internal_encoding('UTF-8');
+
+//ascii
+$string_ascii = b'abcdef';
+$needle_ascii_upper = b"BCD";
+$needle_ascii_mixed = b"bCd";
+$needle_ascii_lower = b"bcd";
+
+//Greek string in lower case UTF-8
+$string_mb = base64_decode('zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J');
+$needle_mb_upper = base64_decode('zpzOnc6ezp8=');
+$needle_mb_lower = base64_decode('zrzOvc6+zr8=');
+$needle_mb_mixed = base64_decode('zpzOnc6+zr8=');
+
+echo "-- Ascii data --\n";
+// needle should be found
+var_dump(bin2hex(mb_strrchr($string_ascii, $needle_ascii_lower)));
+// no needle should be found
+var_dump(mb_strrchr($string_ascii, $needle_ascii_upper));
+var_dump(mb_strrchr($string_ascii, $needle_ascii_mixed));
+
+echo "-- mb data in utf-8 --\n";
+// needle should be found
+$res = mb_strrchr($string_mb, $needle_mb_lower, false);
+if ($res !== false) {
+ var_dump(bin2hex($res));
+}
+else {
+ echo "nothing found!\n";
+}
+// no needle should be found
+var_dump(mb_strrchr($string_mb, $needle_mb_upper));
+var_dump(mb_strrchr($string_mb, $needle_mb_mixed));
+
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_strrchr() : variation ***
+-- Ascii data --
+string(10) "6263646566"
+bool(false)
+bool(false)
+-- mb data in utf-8 --
+string(52) "cebccebdcebecebfcf80cf81cf83cf84cf85cf86cf87cf88cf89"
+bool(false)
+bool(false)
+===DONE=== \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strrichr_basic.phpt b/ext/mbstring/tests/mb_strrichr_basic.phpt
new file mode 100644
index 0000000..5a38e65
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrichr_basic.phpt
@@ -0,0 +1,70 @@
+--TEST--
+Test mb_strrichr() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrichr') or die("skip mb_strrichr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrichr() : basic functionality ***\n";
+
+mb_internal_encoding('UTF-8');
+
+$string_ascii = b'abcdef';
+$needle_ascii_upper = b"BCD";
+$needle_ascii_mixed = b"bCd";
+$needle_ascii_lower = b"bcd";
+
+//Greek string in lower case UTF-8
+$string_mb = base64_decode('zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J');
+$needle_mb_upper = base64_decode('zpzOnc6ezp8=');
+$needle_mb_lower = base64_decode('zrzOvc6+zr8=');
+$needle_mb_mixed = base64_decode('zpzOnc6+zr8=');
+
+echo "\n-- ASCII string: needle exists --\n";
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_upper, false, 'ISO-8859-1')));
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_lower)));
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_mixed, true)));
+
+
+echo "\n-- ASCII string: needle doesn't exist --\n";
+var_dump(mb_strrichr($string_ascii, b'123'));
+
+echo "\n-- Multibyte string: needle exists --\n";
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_upper)));
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_lower, false, 'utf-8')));
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_mixed, true)));
+
+
+echo "\n-- Multibyte string: needle doesn't exist --\n";
+$needle2 = base64_decode('zrzOvs6/');
+var_dump(mb_strrichr($string_mb, $needle2));
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_strrichr() : basic functionality ***
+
+-- ASCII string: needle exists --
+string(10) "6263646566"
+string(10) "6263646566"
+string(2) "61"
+
+-- ASCII string: needle doesn't exist --
+bool(false)
+
+-- Multibyte string: needle exists --
+string(52) "cebccebdcebecebfcf80cf81cf83cf84cf85cf86cf87cf88cf89"
+string(52) "cebccebdcebecebfcf80cf81cf83cf84cf85cf86cf87cf88cf89"
+string(44) "ceb1ceb2ceb3ceb4ceb5ceb6ceb7ceb8ceb9cebacebb"
+
+-- Multibyte string: needle doesn't exist --
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrichr_error1.phpt b/ext/mbstring/tests/mb_strrichr_error1.phpt
new file mode 100644
index 0000000..2c2ed61
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrichr_error1.phpt
@@ -0,0 +1,47 @@
+--TEST--
+Test mb_strrichr() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrichr') or die("skip mb_strrichr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrichr() : error conditions ***\n";
+
+
+//Test mb_strrichr with one more than the expected number of arguments
+echo "\n-- Testing mb_strrichr() function with more than expected no. of arguments --\n";
+$haystack = b'string_val';
+$needle = b'string_val';
+$part = true;
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_strrichr($haystack, $needle, $part, $encoding, $extra_arg) );
+
+// Testing mb_strrichr with one less than the expected number of arguments
+echo "\n-- Testing mb_strrichr() function with less than expected no. of arguments --\n";
+$haystack = b'string_val';
+var_dump( mb_strrichr($haystack) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrichr() : error conditions ***
+
+-- Testing mb_strrichr() function with more than expected no. of arguments --
+
+Warning: mb_strrichr() expects at most 4 parameters, 5 given in %s on line %d
+bool(false)
+
+-- Testing mb_strrichr() function with less than expected no. of arguments --
+
+Warning: mb_strrichr() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrichr_error2.phpt b/ext/mbstring/tests/mb_strrichr_error2.phpt
new file mode 100644
index 0000000..e8f98ef
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrichr_error2.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_strrichr() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrichr') or die("skip mb_strrichr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrichr() : error conditions ***\n";
+
+
+echo "\n-- Testing mb_strrichr() with unknown encoding --\n";
+$haystack = b'Hello, world';
+$needle = b'world';
+$encoding = 'unknown-encoding';
+$part = true;
+var_dump( mb_strrichr($haystack, $needle, $part, $encoding) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrichr() : error conditions ***
+
+-- Testing mb_strrichr() with unknown encoding --
+
+Warning: mb_strrichr(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrichr_variation1.phpt b/ext/mbstring/tests/mb_strrichr_variation1.phpt
new file mode 100644
index 0000000..d826ccf
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrichr_variation1.phpt
@@ -0,0 +1,207 @@
+--TEST--
+Test mb_strrichr() function : usage variation - various haystacks, needle won't be found
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrichr') or die("skip mb_strrichr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrichr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$needle = b'string_val';
+$part = true;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for haystack
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strrichr($value, $needle, $part, $encoding) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrichr() : usage variation ***
+
+--int 0--
+bool(false)
+
+--int 1--
+bool(false)
+
+--int 12345--
+bool(false)
+
+--int -12345--
+bool(false)
+
+--float 10.5--
+bool(false)
+
+--float -10.5--
+bool(false)
+
+--float 12.3456789000e10--
+bool(false)
+
+--float -12.3456789000e10--
+bool(false)
+
+--float .5--
+bool(false)
+
+--empty array--
+Error: 2 - mb_strrichr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strrichr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strrichr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strrichr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+bool(false)
+
+--lowercase null--
+bool(false)
+
+--lowercase true--
+bool(false)
+
+--lowercase false--
+bool(false)
+
+--uppercase TRUE--
+bool(false)
+
+--uppercase FALSE--
+bool(false)
+
+--empty string DQ--
+bool(false)
+
+--empty string SQ--
+bool(false)
+
+--instance of classWithToString--
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strrichr() expects parameter 1 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+bool(false)
+
+--unset var--
+bool(false)
+
+--resource--
+Error: 2 - mb_strrichr() expects parameter 1 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrichr_variation2.phpt b/ext/mbstring/tests/mb_strrichr_variation2.phpt
new file mode 100644
index 0000000..1a4a73f
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrichr_variation2.phpt
@@ -0,0 +1,207 @@
+--TEST--
+Test mb_strrichr() function : usage variation - different types of needle.
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrichr') or die("skip mb_strrichr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrichr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$part = true;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for needle
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strrichr($haystack, $value, $part, $encoding) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrichr() : usage variation ***
+
+--int 0--
+bool(false)
+
+--int 1--
+bool(false)
+
+--int 12345--
+bool(false)
+
+--int -12345--
+bool(false)
+
+--float 10.5--
+bool(false)
+
+--float -10.5--
+bool(false)
+
+--float 12.3456789000e10--
+bool(false)
+
+--float -12.3456789000e10--
+bool(false)
+
+--float .5--
+bool(false)
+
+--empty array--
+Error: 2 - mb_strrichr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strrichr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strrichr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strrichr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+bool(false)
+
+--lowercase null--
+bool(false)
+
+--lowercase true--
+bool(false)
+
+--lowercase false--
+bool(false)
+
+--uppercase TRUE--
+bool(false)
+
+--uppercase FALSE--
+bool(false)
+
+--empty string DQ--
+bool(false)
+
+--empty string SQ--
+bool(false)
+
+--instance of classWithToString--
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strrichr() expects parameter 2 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+bool(false)
+
+--unset var--
+bool(false)
+
+--resource--
+Error: 2 - mb_strrichr() expects parameter 2 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrichr_variation3.phpt b/ext/mbstring/tests/mb_strrichr_variation3.phpt
new file mode 100644
index 0000000..68e8083
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrichr_variation3.phpt
@@ -0,0 +1,232 @@
+--TEST--
+Test mb_strrichr() function : usage variation - different values for part
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrichr') or die("skip mb_strrichr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrichr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$needle = b'_';
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // string data
+ 'string DQ' => "string",
+ 'string SQ' => 'string',
+ 'mixed case string' => "sTrInG",
+ 'heredoc' => $heredoc,
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for part
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ $res = mb_strrichr($haystack, $needle, $value, $encoding);
+ if ($res === false) {
+ var_dump($res);
+ }
+ else {
+ var_dump(bin2hex($res));
+ }
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrichr() : usage variation ***
+
+--int 0--
+string(8) "5f76616c"
+
+--int 1--
+string(12) "737472696e67"
+
+--int 12345--
+string(12) "737472696e67"
+
+--int -12345--
+string(12) "737472696e67"
+
+--float 10.5--
+string(12) "737472696e67"
+
+--float -10.5--
+string(12) "737472696e67"
+
+--float 12.3456789000e10--
+string(12) "737472696e67"
+
+--float -12.3456789000e10--
+string(12) "737472696e67"
+
+--float .5--
+string(12) "737472696e67"
+
+--empty array--
+Error: 2 - mb_strrichr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strrichr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strrichr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strrichr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+string(8) "5f76616c"
+
+--lowercase null--
+string(8) "5f76616c"
+
+--lowercase true--
+string(12) "737472696e67"
+
+--lowercase false--
+string(8) "5f76616c"
+
+--uppercase TRUE--
+string(12) "737472696e67"
+
+--uppercase FALSE--
+string(8) "5f76616c"
+
+--empty string DQ--
+string(8) "5f76616c"
+
+--empty string SQ--
+string(8) "5f76616c"
+
+--string DQ--
+string(12) "737472696e67"
+
+--string SQ--
+string(12) "737472696e67"
+
+--mixed case string--
+string(12) "737472696e67"
+
+--heredoc--
+string(12) "737472696e67"
+
+--instance of classWithToString--
+Error: 2 - mb_strrichr() expects parameter 3 to be boolean, object given, %s(%d)
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strrichr() expects parameter 3 to be boolean, object given, %s(%d)
+bool(false)
+
+--undefined var--
+string(8) "5f76616c"
+
+--unset var--
+string(8) "5f76616c"
+
+--resource--
+Error: 2 - mb_strrichr() expects parameter 3 to be boolean, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrichr_variation4.phpt b/ext/mbstring/tests/mb_strrichr_variation4.phpt
new file mode 100644
index 0000000..d2e5754
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrichr_variation4.phpt
@@ -0,0 +1,227 @@
+--TEST--
+Test mb_strrichr() function : usage variation - different encoding types
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrichr') or die("skip mb_strrichr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrichr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$needle = b'_';
+$part = true;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return "invalid";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = <<<EOT
+invalid
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for encoding
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strrichr($haystack, $needle, $part, $value) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strrichr() : usage variation ***
+
+--int 0--
+Error: 2 - mb_strrichr(): Unknown encoding "0", %s(%d)
+bool(false)
+
+--int 1--
+Error: 2 - mb_strrichr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--int 12345--
+Error: 2 - mb_strrichr(): Unknown encoding "12345", %s(%d)
+bool(false)
+
+--int -12345--
+Error: 2 - mb_strrichr(): Unknown encoding "-2345", %s(%d)
+bool(false)
+
+--float 10.5--
+Error: 2 - mb_strrichr(): Unknown encoding "10.5", %s(%d)
+bool(false)
+
+--float -10.5--
+Error: 2 - mb_strrichr(): Unknown encoding "-10.5", %s(%d)
+bool(false)
+
+--float 12.3456789000e10--
+Error: 2 - mb_strrichr(): Unknown encoding "123456789000", %s(%d)
+bool(false)
+
+--float -12.3456789000e10--
+Error: 2 - mb_strrichr(): Unknown encoding "-123456789000", %s(%d)
+bool(false)
+
+--float .5--
+Error: 2 - mb_strrichr(): Unknown encoding "0.5", %s(%d)
+bool(false)
+
+--empty array--
+Error: 2 - mb_strrichr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strrichr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strrichr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strrichr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+Error: 2 - mb_strrichr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--lowercase null--
+Error: 2 - mb_strrichr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--lowercase true--
+Error: 2 - mb_strrichr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--lowercase false--
+Error: 2 - mb_strrichr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--uppercase TRUE--
+Error: 2 - mb_strrichr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--uppercase FALSE--
+Error: 2 - mb_strrichr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--empty string DQ--
+Error: 2 - mb_strrichr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--empty string SQ--
+Error: 2 - mb_strrichr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--instance of classWithToString--
+Error: 2 - mb_strrichr(): Unknown encoding "invalid", %s(%d)
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strrichr() expects parameter 4 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+Error: 2 - mb_strrichr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--unset var--
+Error: 2 - mb_strrichr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--resource--
+Error: 2 - mb_strrichr() expects parameter 4 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strrichr_variation5.phpt b/ext/mbstring/tests/mb_strrichr_variation5.phpt
new file mode 100644
index 0000000..417f53f
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrichr_variation5.phpt
@@ -0,0 +1,69 @@
+--TEST--
+Test mb_strrichr() function : usage variation - multiple needles
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrichr') or die("skip mb_strrichr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds the last occurrence of a character in a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strrichr() : basic functionality ***\n";
+
+mb_internal_encoding('UTF-8');
+
+//ascii mixed case, multiple needles
+$string_ascii = b'abcDef zBcDyx';
+$needle_ascii_upper = b"BCD";
+$needle_ascii_mixed = b"bCd";
+$needle_ascii_lower = b"bcd";
+
+//Greek string in mixed case UTF-8 with multiple needles
+$string_mb = base64_decode('zrrOu868zr3Ovs6fzqDOoSDOus67zpzOnc6+zr/OoA==');
+$needle_mb_upper = base64_decode('zpzOnc6ezp8=');
+$needle_mb_lower = base64_decode('zrzOvc6+zr8=');
+$needle_mb_mixed = base64_decode('zpzOnc6+zr8=');
+
+echo "\n-- ASCII string: needle exists --\n";
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_upper, false)));
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_upper, true)));
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_lower, false)));
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_lower, true)));
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_mixed, false)));
+var_dump(bin2hex(mb_strrichr($string_ascii, $needle_ascii_mixed, true)));
+
+
+echo "\n-- Multibyte string: needle exists --\n";
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_upper, false)));
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_upper, true)));
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_lower, false)));
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_lower, true)));
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_mixed, false)));
+var_dump(bin2hex(mb_strrichr($string_mb, $needle_mb_mixed, true)));
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_strrichr() : basic functionality ***
+
+-- ASCII string: needle exists --
+string(10) "4263447978"
+string(16) "616263446566207a"
+string(10) "4263447978"
+string(16) "616263446566207a"
+string(10) "4263447978"
+string(16) "616263446566207a"
+
+-- Multibyte string: needle exists --
+string(20) "ce9cce9dcebecebfcea0"
+string(42) "cebacebbcebccebdcebece9fcea0cea120cebacebb"
+string(20) "ce9cce9dcebecebfcea0"
+string(42) "cebacebbcebccebdcebece9fcea0cea120cebacebb"
+string(20) "ce9cce9dcebecebfcea0"
+string(42) "cebacebbcebccebdcebece9fcea0cea120cebacebb"
+===DONE=== \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strripos_basic.phpt b/ext/mbstring/tests/mb_strripos_basic.phpt
new file mode 100644
index 0000000..32787a6
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_basic.phpt
@@ -0,0 +1,158 @@
+--TEST--
+Test mb_strripos() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Test basic functionality of mb_strripos with ASCII and multibyte characters
+ */
+
+echo "*** Testing mb_strripos() : basic functionality***\n";
+
+mb_internal_encoding('UTF-8');
+
+//ascii strings
+$ascii_haystacks = array(
+ b'abc defabc def',
+ b'ABC DEFABC DEF',
+ b'Abc dEFaBC Def',
+);
+
+$ascii_needles = array(
+ // 4 good ones
+ b'DE',
+ b'de',
+ b'De',
+ b'dE',
+
+ //flag a swap between good and bad
+ '!',
+
+ // 4 bad ones
+ b'df',
+ b'Df',
+ b'dF',
+ b'DF'
+);
+
+//greek strings in UTF-8
+$greek_lower = base64_decode('zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J');
+$greek_upper = base64_decode('zpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6p');
+$greek_mixed = base64_decode('zrHOss6TzpTOlc6WzpfOmM65zrrOu868zr3Ovs6fzqDOoc6jzqTOpc+Gz4fPiM+J');
+$greek_haystacks = array($greek_lower, $greek_upper, $greek_mixed);
+
+$greek_nlower = base64_decode('zrzOvc6+zr8=');
+$greek_nupper = base64_decode('zpzOnc6ezp8=');
+$greek_nmixed1 = base64_decode('zpzOnc6+zr8=');
+$greek_nmixed2 = base64_decode('zrzOvc6+zp8=');
+
+$greek_blower = base64_decode('zpzOns6f');
+$greek_bupper = base64_decode('zrzOvs6/');
+$greek_bmixed1 = base64_decode('zpzOvs6/');
+$greek_bmixed2 = base64_decode('zrzOvs6f');
+$greek_needles = array(
+ // 4 good ones
+ $greek_nlower, $greek_nupper, $greek_nmixed1, $greek_nmixed2,
+
+ '!', // used to flag a swap between good and bad
+
+ // 4 bad ones
+ $greek_blower, $greek_bupper, $greek_bmixed1, $greek_bmixed2,
+);
+
+// try the basic options
+echo "\n -- ASCII Strings, needle should be found --\n";
+foreach ($ascii_needles as $needle) {
+ if ($needle == '!') {
+ echo "\n -- ASCII Strings, needle should not be found --\n";
+ }
+ else {
+ foreach ($ascii_haystacks as $haystack) {
+ var_dump(mb_strripos($haystack, $needle));
+ }
+ }
+}
+
+echo "\n -- Greek Strings, needle should be found --\n";
+foreach ($greek_needles as $needle) {
+ if ($needle == '!') {
+ echo "\n -- ASCII Strings, needle should not be found --\n";
+ }
+ else {
+ foreach ($greek_haystacks as $haystack) {
+ var_dump(mb_strripos($haystack, $needle));
+ }
+ }
+}
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strripos() : basic functionality***
+
+ -- ASCII Strings, needle should be found --
+int(13)
+int(13)
+int(13)
+int(13)
+int(13)
+int(13)
+int(13)
+int(13)
+int(13)
+int(13)
+int(13)
+int(13)
+
+ -- ASCII Strings, needle should not be found --
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+
+ -- Greek Strings, needle should be found --
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+int(11)
+
+ -- ASCII Strings, needle should not be found --
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strripos_basic2.phpt b/ext/mbstring/tests/mb_strripos_basic2.phpt
new file mode 100644
index 0000000..9d7befc
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_basic2.phpt
@@ -0,0 +1,128 @@
+--TEST--
+Test mb_strripos() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Test basic functionality of mb_strripos with ASCII and multibyte characters
+ */
+
+echo "*** Testing mb_strripos() : basic functionality***\n";
+
+mb_internal_encoding('UTF-8');
+
+//ascii strings
+$ascii_haystacks = array(
+ b'abc defabc def',
+ b'ABC DEFABC DEF',
+ b'Abc dEFaBC Def',
+);
+
+$ascii_needles = array(
+ // 4 good ones
+ b'DE',
+ b'de',
+ b'De',
+ b'dE',
+);
+
+//greek strings in UTF-8
+$greek_lower = base64_decode('zrrOu868zr3Ovs6/z4DPgSDOus67zrzOvc6+zr/PgA==');
+$greek_upper = base64_decode('zprOm86czp3Ons6fzqDOoSDOms6bzpzOnc6ezp/OoA==');
+$greek_mixed = base64_decode('zrrOu868zr3Ovs6fzqDOoSDOus67zpzOnc6+zr/OoA==');
+$greek_haystacks = array($greek_lower, $greek_upper, $greek_mixed);
+
+$greek_nlower = base64_decode('zrzOvc6+zr8=');
+$greek_nupper = base64_decode('zpzOnc6ezp8=');
+$greek_nmixed1 = base64_decode('zpzOnc6+zr8=');
+$greek_nmixed2 = base64_decode('zrzOvc6+zp8=');
+
+$greek_needles = array(
+ // 4 good ones
+ $greek_nlower, $greek_nupper, $greek_nmixed1, $greek_nmixed2,
+);
+
+// try the basic options
+echo "\n -- ASCII Strings --\n";
+foreach ($ascii_needles as $needle) {
+ foreach ($ascii_haystacks as $haystack) {
+ var_dump(mb_strripos($haystack, $needle));
+ var_dump(mb_strripos($haystack, $needle, 14));
+ }
+}
+
+echo "\n -- Greek Strings --\n";
+foreach ($greek_needles as $needle) {
+ foreach ($greek_haystacks as $haystack) {
+ var_dump(mb_strripos($haystack, $needle));
+ var_dump(mb_strripos($haystack, $needle, 12));
+ }
+}
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strripos() : basic functionality***
+
+ -- ASCII Strings --
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+int(13)
+bool(false)
+
+ -- Greek Strings --
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+int(11)
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strripos_error1.phpt b/ext/mbstring/tests/mb_strripos_error1.phpt
new file mode 100644
index 0000000..9d114d5
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_error1.phpt
@@ -0,0 +1,51 @@
+--TEST--
+Test mb_strripos() function : error conditions - Pass incorrect number of args
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Test how mb_strripos behaves when passed an incorrect number of arguments
+ */
+
+echo "*** Testing mb_strripos() : error conditions ***\n";
+
+
+//Test mb_strripos with one more than the expected number of arguments
+echo "\n-- Testing mb_strripos() function with more than expected no. of arguments --\n";
+$haystack = b'string_val';
+$needle = b'string_val';
+$offset = 10;
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_strripos($haystack, $needle, $offset, $encoding, $extra_arg) );
+
+// Testing mb_strripos with one less than the expected number of arguments
+echo "\n-- Testing mb_strripos() function with less than expected no. of arguments --\n";
+$haystack = b'string_val';
+var_dump( mb_strripos($haystack) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strripos() : error conditions ***
+
+-- Testing mb_strripos() function with more than expected no. of arguments --
+
+Warning: mb_strripos() expects at most 4 parameters, 5 given in %s on line %d
+bool(false)
+
+-- Testing mb_strripos() function with less than expected no. of arguments --
+
+Warning: mb_strripos() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strripos_error2.phpt b/ext/mbstring/tests/mb_strripos_error2.phpt
new file mode 100644
index 0000000..4790ffb
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_error2.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_strripos() function : error conditions - Pass unknown encoding
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass an unknown encoding to mb_strripos() to test behaviour
+ */
+
+echo "*** Testing mb_strripos() : error conditions ***\n";
+$haystack = b'Hello, world';
+$needle = b'world';
+$offset = 2;
+$encoding = 'unknown-encoding';
+
+var_dump( mb_strripos($haystack, $needle, $offset, $encoding) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strripos() : error conditions ***
+
+Warning: mb_strripos(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strripos_variation1.phpt b/ext/mbstring/tests/mb_strripos_variation1.phpt
new file mode 100644
index 0000000..704b501
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_variation1.phpt
@@ -0,0 +1,183 @@
+--TEST--
+Test mb_strripos() function : usage variations - pass different data types to $haystack arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass mb_strripos different data types as $haystack arg to test behaviour
+ */
+
+echo "*** Testing mb_strripos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$needle = b'string_val';
+$offset = 0;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $haystack argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "string",
+ 'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strripos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strripos($input, $needle, $offset, $encoding));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strripos() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+bool(false)
+
+-- Iteration 19 --
+bool(false)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_strripos() expects parameter 1 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strripos_variation2.phpt b/ext/mbstring/tests/mb_strripos_variation2.phpt
new file mode 100644
index 0000000..61196f0
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_variation2.phpt
@@ -0,0 +1,183 @@
+--TEST--
+Test mb_strripos() function : usage variations - pass different data types as $needle arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass mb_strripos different data types as $needle arg to test behaviour
+ */
+
+echo "*** Testing mb_strripos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$haystack = b'string_val';
+$offset = 0;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $needle argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ b"string",
+ b'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strripos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strripos($haystack, $input, $offset, $encoding));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strripos() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+int(0)
+
+-- Iteration 19 --
+int(0)
+
+-- Iteration 20 --
+bool(false)
+
+-- Iteration 21 --
+bool(false)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_strripos() expects parameter 2 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strripos_variation3_Bug45923.phpt b/ext/mbstring/tests/mb_strripos_variation3_Bug45923.phpt
new file mode 100644
index 0000000..c8fb933
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_variation3_Bug45923.phpt
@@ -0,0 +1,206 @@
+--TEST--
+Test mb_strripos() function : usage variations - pass different data types as $offset arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass mb_strripos different data types as $offset arg to test behaviour
+ */
+
+echo "*** Testing mb_strripos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$needle = b'A';
+$haystack = b'string_val';
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $offest argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 12.5,
+ -12.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ b"string",
+ b'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strripos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strripos($haystack, $needle, $input, $encoding));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strripos() : usage variations ***
+
+-- Iteration 1 --
+int(8)
+
+-- Iteration 2 --
+int(8)
+
+-- Iteration 3 --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+int(8)
+
+-- Iteration 9 --
+int(8)
+
+-- Iteration 10 --
+int(8)
+
+-- Iteration 11 --
+int(8)
+
+-- Iteration 12 --
+int(8)
+
+-- Iteration 13 --
+int(8)
+
+-- Iteration 14 --
+int(8)
+
+-- Iteration 15 --
+int(8)
+
+-- Iteration 16 --
+
+Warning: mb_strripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_strripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+
+Warning: mb_strripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 19 --
+
+Warning: mb_strripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 20 --
+
+Warning: mb_strripos() expects parameter 3 to be long, string given in %s on line %d
+bool(false)
+
+-- Iteration 21 --
+
+Warning: mb_strripos() expects parameter 3 to be long, object given in %s on line %d
+bool(false)
+
+-- Iteration 22 --
+int(8)
+
+-- Iteration 23 --
+int(8)
+
+-- Iteration 24 --
+
+Warning: mb_strripos() expects parameter 3 to be long, resource given in %s on line %d
+bool(false)
+Done
+
diff --git a/ext/mbstring/tests/mb_strripos_variation4.phpt b/ext/mbstring/tests/mb_strripos_variation4.phpt
new file mode 100644
index 0000000..d617872
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_variation4.phpt
@@ -0,0 +1,223 @@
+--TEST--
+Test mb_strripos() function : usage variations - pass different data types as $encoding arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Pass mb_strripos different data types as $encoding arg to test behaviour
+ * Where possible 'UTF-8' has been entered as a string value
+ */
+
+echo "*** Testing mb_strripos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$haystack = b'string_val';
+$needle = b'VaL';
+$offset = 0;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $input argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strripos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strripos($haystack, $needle, $offset, $input));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strripos() : usage variations ***
+
+-- Iteration 1 --
+
+Warning: mb_strripos(): Unknown encoding "0" in %s on line %d
+bool(false)
+
+-- Iteration 2 --
+
+Warning: mb_strripos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 3 --
+
+Warning: mb_strripos(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_strripos(): Unknown encoding "-2345" in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_strripos(): Unknown encoding "10.5" in %s on line %d
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_strripos(): Unknown encoding "-10.5" in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_strripos(): Unknown encoding "123456789000" in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+
+Warning: mb_strripos(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+-- Iteration 9 --
+
+Warning: mb_strripos(): Unknown encoding "0.5" in %s on line %d
+bool(false)
+
+-- Iteration 10 --
+
+Warning: mb_strripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 11 --
+
+Warning: mb_strripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 12 --
+
+Warning: mb_strripos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 13 --
+
+Warning: mb_strripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 14 --
+
+Warning: mb_strripos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 15 --
+
+Warning: mb_strripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 16 --
+
+Warning: mb_strripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_strripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+int(7)
+
+-- Iteration 19 --
+int(7)
+
+-- Iteration 20 --
+int(7)
+
+-- Iteration 21 --
+int(7)
+
+-- Iteration 22 --
+
+Warning: mb_strripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 23 --
+
+Warning: mb_strripos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_strripos() expects parameter 4 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strripos_variation5_Bug45923.phpt b/ext/mbstring/tests/mb_strripos_variation5_Bug45923.phpt
new file mode 100644
index 0000000..8bd0e2e
--- /dev/null
+++ b/ext/mbstring/tests/mb_strripos_variation5_Bug45923.phpt
@@ -0,0 +1,115 @@
+--TEST--
+Test mb_strripos() function : usage variations - Pass different integers as $offset argument
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strripos(string haystack, string needle [, int offset [, string encoding]])
+ * Description: Finds position of last occurrence of a string within another, case insensitive
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+/*
+ * Test how mb_strripos() behaves when passed different integers as $offset argument
+ * The character length of $string_ascii and $string_mb is the same,
+ * and the needle appears at the same positions in both strings
+ */
+
+mb_internal_encoding('UTF-8');
+
+echo "*** Testing mb_strripos() : usage variations ***\n";
+
+$string_ascii = b'+Is an English string'; //21 chars
+$needle_ascii = b'G';
+
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); //21 chars
+$needle_mb = base64_decode('44CC');
+
+/*
+ * Loop through integers as multiples of ten for $offset argument
+ * mb_strripos should not be able to accept negative values as $offset.
+ * 60 is larger than *BYTE* count for $string_mb
+ */
+for ($i = -10; $i <= 60; $i += 10) {
+ echo "\n**-- Offset is: $i --**\n";
+ echo "-- ASCII String --\n";
+ var_dump(mb_strripos($string_ascii, $needle_ascii, $i));
+ echo "--Multibyte String --\n";
+ var_dump(mb_strripos($string_mb, $needle_mb, $i, 'UTF-8'));
+}
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strripos() : usage variations ***
+
+**-- Offset is: -10 --**
+-- ASCII String --
+int(9)
+--Multibyte String --
+int(9)
+
+**-- Offset is: 0 --**
+-- ASCII String --
+int(20)
+--Multibyte String --
+int(20)
+
+**-- Offset is: 10 --**
+-- ASCII String --
+int(20)
+--Multibyte String --
+int(20)
+
+**-- Offset is: 20 --**
+-- ASCII String --
+int(20)
+--Multibyte String --
+int(20)
+
+**-- Offset is: 30 --**
+-- ASCII String --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+**-- Offset is: 40 --**
+-- ASCII String --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+**-- Offset is: 50 --**
+-- ASCII String --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+**-- Offset is: 60 --**
+-- ASCII String --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+--Multibyte String --
+
+Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+Done
+
diff --git a/ext/mbstring/tests/mb_strrpos_basic.phpt b/ext/mbstring/tests/mb_strrpos_basic.phpt
new file mode 100644
index 0000000..ec6b86c
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrpos_basic.phpt
@@ -0,0 +1,58 @@
+--TEST--
+Test mb_strrpos() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrpos') or die("skip mb_strrpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strrpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of last occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test basic functionality of mb_strrpos()
+ */
+
+echo "*** Testing mb_strrpos() : basic ***\n";
+
+mb_internal_encoding('UTF-8');
+
+$string_ascii = b'This is an English string. 0123456789.';
+//Japanese string in UTF-8
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+echo "\n-- ASCII string 1 --\n";
+var_dump(mb_strrpos($string_ascii, b'is', 4, 'ISO-8859-1'));
+
+echo "\n-- ASCII string 2 --\n";
+var_dump(mb_strrpos($string_ascii, b'hello, world'));
+
+echo "\n-- Multibyte string 1 --\n";
+$needle1 = base64_decode('44CC');
+var_dump(mb_strrpos($string_mb, $needle1));
+
+echo "\n-- Multibyte string 2 --\n";
+$needle2 = base64_decode('44GT44KT44Gr44Gh44Gv44CB5LiW55WM');
+var_dump(mb_strrpos($string_mb, $needle2));
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strrpos() : basic ***
+
+-- ASCII string 1 --
+int(15)
+
+-- ASCII string 2 --
+bool(false)
+
+-- Multibyte string 1 --
+int(20)
+
+-- Multibyte string 2 --
+bool(false)
+Done
+
diff --git a/ext/mbstring/tests/mb_strrpos_error1.phpt b/ext/mbstring/tests/mb_strrpos_error1.phpt
new file mode 100644
index 0000000..15228fe
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrpos_error1.phpt
@@ -0,0 +1,50 @@
+--TEST--
+Test mb_strrpos() function : error conditions - pass incorrect number of args
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrpos') or die("skip mb_strrpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strrpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of last occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass mb_strrpos() an incorrect number of arguments
+ */
+
+echo "*** Testing mb_strrpos() : error conditions ***\n";
+
+
+//Test mb_strrpos with one more than the expected number of arguments
+echo "\n-- Testing mb_strrpos() function with more than expected no. of arguments --\n";
+$haystack = 'string_val';
+$needle = 'string_val';
+$offset = 10;
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_strrpos($haystack, $needle, $offset, $encoding, $extra_arg) );
+
+// Testing mb_strrpos with one less than the expected number of arguments
+echo "\n-- Testing mb_strrpos() function with less than expected no. of arguments --\n";
+$haystack = 'string_val';
+var_dump( mb_strrpos($haystack) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strrpos() : error conditions ***
+
+-- Testing mb_strrpos() function with more than expected no. of arguments --
+
+Warning: mb_strrpos() expects at most 4 parameters, 5 given in %s on line %d
+bool(false)
+
+-- Testing mb_strrpos() function with less than expected no. of arguments --
+
+Warning: mb_strrpos() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strrpos_error2.phpt b/ext/mbstring/tests/mb_strrpos_error2.phpt
new file mode 100644
index 0000000..fa37195
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrpos_error2.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_strrpos() function : error conditions - pass an unknown encoding
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrpos') or die("skip mb_strrpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strrpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of last occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass mb_strrpos() an encoding that doesn't exist
+ */
+
+echo "*** Testing mb_strrpos() : error conditions ***\n";
+
+$haystack = 'This is an English string. 0123456789.';
+$needle = '123';
+$offset = 5;
+$encoding = 'unknown-encoding';
+
+var_dump(mb_strrpos($haystack, $needle , $offset, $encoding));
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strrpos() : error conditions ***
+
+Warning: mb_strrpos(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strrpos_variation1.phpt b/ext/mbstring/tests/mb_strrpos_variation1.phpt
new file mode 100644
index 0000000..2d2db90
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrpos_variation1.phpt
@@ -0,0 +1,181 @@
+--TEST--
+Test mb_strrpos() function : usage variations - pass different data types to $haystack arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrpos') or die("skip mb_strrpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strrpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of last occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass mb_strrpos() different data types as $haystack argument to test behaviour
+ */
+
+echo "*** Testing mb_strrpos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$needle = b'world';
+$offset = 0;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return b"hello, world";
+ }
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello, world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $haystack argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ b"hello, world",
+ b'hello, world',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strrpos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strrpos($input, $needle, $offset, $encoding));
+ $iterator++;
+};
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strrpos() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+int(7)
+
+-- Iteration 19 --
+int(7)
+
+-- Iteration 20 --
+int(7)
+
+-- Iteration 21 --
+int(7)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_strrpos() expects parameter 1 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strrpos_variation2.phpt b/ext/mbstring/tests/mb_strrpos_variation2.phpt
new file mode 100644
index 0000000..1566b5c
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrpos_variation2.phpt
@@ -0,0 +1,183 @@
+--TEST--
+Test mb_strrpos() function : usage variations - Pass different data types to $needle arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrpos') or die("skip mb_strrpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strrpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of last occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass mb_strrpos() different data types as $needle argument to test behaviour
+ */
+
+echo "*** Testing mb_strrpos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$haystack = 'hello, world';
+$offset = 0;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "world";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $needle argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "world",
+ 'world',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strrpos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strrpos($haystack, $input, $offset, $encoding));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strrpos() : usage variations ***
+
+-- Iteration 1 --
+bool(false)
+
+-- Iteration 2 --
+bool(false)
+
+-- Iteration 3 --
+bool(false)
+
+-- Iteration 4 --
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+bool(false)
+
+-- Iteration 8 --
+bool(false)
+
+-- Iteration 9 --
+bool(false)
+
+-- Iteration 10 --
+bool(false)
+
+-- Iteration 11 --
+bool(false)
+
+-- Iteration 12 --
+bool(false)
+
+-- Iteration 13 --
+bool(false)
+
+-- Iteration 14 --
+bool(false)
+
+-- Iteration 15 --
+bool(false)
+
+-- Iteration 16 --
+bool(false)
+
+-- Iteration 17 --
+bool(false)
+
+-- Iteration 18 --
+int(7)
+
+-- Iteration 19 --
+int(7)
+
+-- Iteration 20 --
+int(7)
+
+-- Iteration 21 --
+int(7)
+
+-- Iteration 22 --
+bool(false)
+
+-- Iteration 23 --
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_strrpos() expects parameter 2 to be string, resource given in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strrpos_variation3.phpt b/ext/mbstring/tests/mb_strrpos_variation3.phpt
new file mode 100644
index 0000000..95840f9
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrpos_variation3.phpt
@@ -0,0 +1,153 @@
+--TEST--
+Test mb_strrpos() function : usage variations - Pass different data types as $offset arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrpos') or die("skip mb_strrpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strrpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of last occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass mb_strrpos() different data types as $offset argument to test behaviour
+ */
+
+echo "*** Testing mb_strrpos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$needle = b'a';
+$haystack = b'string_val';
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return b"7";
+ }
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// unexpected values to be passed to $offset argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // object data
+/*16*/ new classA(),
+
+ // undefined data
+/*17*/ @$undefined_var,
+
+ // unset data
+/*18*/ @$unset_var
+);
+
+// loop through each element of $inputs to check the behavior of mb_strrpos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strrpos($haystack, $needle, $input, $encoding));
+ $iterator++;
+};
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strrpos() : usage variations ***
+
+-- Iteration 1 --
+int(8)
+
+-- Iteration 2 --
+int(8)
+
+-- Iteration 3 --
+
+Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+int(8)
+
+-- Iteration 9 --
+int(8)
+
+-- Iteration 10 --
+int(8)
+
+-- Iteration 11 --
+int(8)
+
+-- Iteration 12 --
+int(8)
+
+-- Iteration 13 --
+int(8)
+
+-- Iteration 14 --
+int(8)
+
+-- Iteration 15 --
+int(8)
+
+-- Iteration 16 --
+
+Notice: Object of class classA could not be converted to int in %s on line %d
+int(8)
+
+-- Iteration 17 --
+int(8)
+
+-- Iteration 18 --
+int(8)
+Done
diff --git a/ext/mbstring/tests/mb_strrpos_variation4.phpt b/ext/mbstring/tests/mb_strrpos_variation4.phpt
new file mode 100644
index 0000000..198ce8f
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrpos_variation4.phpt
@@ -0,0 +1,222 @@
+--TEST--
+Test mb_strrpos() function : usage variations - pass different data types as $encoding arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrpos') or die("skip mb_strrpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strrpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of last occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass mb_strrpos() different data types as $encoding argument to test behaviour
+ * Where possible 'UTF-8' has been entered as a string value
+ */
+
+echo "*** Testing mb_strrpos() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$haystack = b'hello, world';
+$needle = b'world';
+$offset = 0;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strrpos()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strrpos($haystack, $needle, $offset, $input));
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strrpos() : usage variations ***
+
+-- Iteration 1 --
+
+Warning: mb_strrpos(): Unknown encoding "0" in %s on line %d
+bool(false)
+
+-- Iteration 2 --
+
+Warning: mb_strrpos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 3 --
+
+Warning: mb_strrpos(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_strrpos(): Unknown encoding "-2345" in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_strrpos(): Unknown encoding "10.5" in %s on line %d
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_strrpos(): Unknown encoding "-10.5" in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_strrpos(): Unknown encoding "123456789000" in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+
+Warning: mb_strrpos(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+-- Iteration 9 --
+
+Warning: mb_strrpos(): Unknown encoding "0.5" in %s on line %d
+bool(false)
+
+-- Iteration 10 --
+
+Warning: mb_strrpos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 11 --
+
+Warning: mb_strrpos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 12 --
+
+Warning: mb_strrpos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 13 --
+
+Warning: mb_strrpos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 14 --
+
+Warning: mb_strrpos(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 15 --
+
+Warning: mb_strrpos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 16 --
+
+Warning: mb_strrpos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_strrpos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+int(7)
+
+-- Iteration 19 --
+int(7)
+
+-- Iteration 20 --
+int(7)
+
+-- Iteration 21 --
+int(7)
+
+-- Iteration 22 --
+
+Warning: mb_strrpos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 23 --
+
+Warning: mb_strrpos(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_strrpos() expects parameter 4 to be string, resource given in %s on line %d
+bool(false)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strrpos_variation5.phpt b/ext/mbstring/tests/mb_strrpos_variation5.phpt
new file mode 100644
index 0000000..cb50896
--- /dev/null
+++ b/ext/mbstring/tests/mb_strrpos_variation5.phpt
@@ -0,0 +1,61 @@
+--TEST--
+Test mb_strrpos() function : usage variations - pass encoding as third argument (deprecated behaviour)
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strrpos') or die("skip mb_strrpos() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_strrpos(string $haystack, string $needle [, int $offset [, string $encoding]])
+ * Description: Find position of last occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Testing deprecated behaviour where third argument can be $encoding
+ */
+
+echo "*** Testing mb_strrpos() : usage variations ***\n";
+
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+$needle_mb = base64_decode('44CC');
+
+$stringh = <<<END
+utf-8
+END;
+
+$inputs = array('Double Quoted String' => "utf-8",
+ 'Single Quoted String' => 'utf-8',
+ 'Heredoc' => $stringh);
+foreach ($inputs as $type => $input) {
+ echo "\n-- $type --\n";
+ echo "-- With fourth encoding argument --\n";
+ var_dump(mb_strrpos($string_mb, $needle_mb, $input, 'utf-8'));
+ echo "-- Without fourth encoding argument --\n";
+ var_dump(mb_strrpos($string_mb, $needle_mb, $input));
+}
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strrpos() : usage variations ***
+
+-- Double Quoted String --
+-- With fourth encoding argument --
+int(20)
+-- Without fourth encoding argument --
+int(20)
+
+-- Single Quoted String --
+-- With fourth encoding argument --
+int(20)
+-- Without fourth encoding argument --
+int(20)
+
+-- Heredoc --
+-- With fourth encoding argument --
+int(20)
+-- Without fourth encoding argument --
+int(20)
+Done
diff --git a/ext/mbstring/tests/mb_strstr.phpt b/ext/mbstring/tests/mb_strstr.phpt
new file mode 100644
index 0000000..fcf9e85
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr.phpt
@@ -0,0 +1,35 @@
+--TEST--
+mb_strstr()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+mbstring.internal_encoding=UTF-8
+--FILE--
+<?php
+function EUC_JP($utf8str) {
+ return mb_convert_encoding($utf8str, "EUC-JP", "UTF-8");
+}
+
+function FROM_EUC_JP($eucjpstr) {
+ return mb_convert_encoding($eucjpstr, "UTF-8", "EUC-JP");
+}
+
+var_dump(mb_strstr("", ""));
+var_dump(mb_strstr("", "", false));
+var_dump(mb_strstr("", "", true));
+var_dump(FROM_EUC_JP(mb_strstr(EUC_JP(""), EUC_JP(""), false, "EUC-JP")));
+var_dump(FROM_EUC_JP(mb_strstr(EUC_JP(""), EUC_JP(""), true, "EUC-JP")));
+mb_internal_encoding("EUC-JP");
+var_dump(FROM_EUC_JP(mb_strstr(EUC_JP(""), EUC_JP(""))));
+var_dump(FROM_EUC_JP(mb_strstr(EUC_JP(""), EUC_JP(""), false)));
+var_dump(FROM_EUC_JP(mb_strstr(EUC_JP(""), EUC_JP(""), true)));
+?>
+--EXPECT--
+string(18) ""
+string(18) ""
+string(12) ""
+string(18) ""
+string(12) ""
+string(18) ""
+string(18) ""
+string(12) ""
diff --git a/ext/mbstring/tests/mb_strstr_basic.phpt b/ext/mbstring/tests/mb_strstr_basic.phpt
new file mode 100644
index 0000000..efa1105
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_basic.phpt
@@ -0,0 +1,64 @@
+--TEST--
+Test mb_strstr() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : basic functionality ***\n";
+
+mb_internal_encoding('UTF-8');
+
+$string_ascii = b'abc def';
+//Japanese string in UTF-8
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+echo "\n-- ASCII string: needle exists --\n";
+var_dump(bin2hex(mb_strstr($string_ascii, b'd', false, 'ISO-8859-1')));
+var_dump(bin2hex(mb_strstr($string_ascii, b'd')));
+var_dump(bin2hex(mb_strstr($string_ascii, b'd', true)));
+
+
+echo "\n-- ASCII string: needle doesn't exist --\n";
+var_dump(mb_strstr($string_ascii, b'123'));
+
+echo "\n-- Multibyte string: needle exists --\n";
+$needle1 = base64_decode('5pel5pys6Kqe');
+var_dump(bin2hex(mb_strstr($string_mb, $needle1)));
+var_dump(bin2hex(mb_strstr($string_mb, $needle1, false, 'utf-8')));
+var_dump(bin2hex(mb_strstr($string_mb, $needle1, true)));
+
+
+echo "\n-- Multibyte string: needle doesn't exist --\n";
+$needle2 = base64_decode('44GT44KT44Gr44Gh44Gv44CB5LiW55WM');
+var_dump(mb_strstr($string_mb, $needle2));
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_strstr() : basic functionality ***
+
+-- ASCII string: needle exists --
+string(6) "646566"
+string(6) "646566"
+string(8) "61626320"
+
+-- ASCII string: needle doesn't exist --
+bool(false)
+
+-- Multibyte string: needle exists --
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(106) "e697a5e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+string(0) ""
+
+-- Multibyte string: needle doesn't exist --
+bool(false)
+===DONE=== \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strstr_error1.phpt b/ext/mbstring/tests/mb_strstr_error1.phpt
new file mode 100644
index 0000000..f38d5c9
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_error1.phpt
@@ -0,0 +1,47 @@
+--TEST--
+Test mb_strstr() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : error conditions ***\n";
+
+
+//Test mb_strstr with one more than the expected number of arguments
+echo "\n-- Testing mb_strstr() function with more than expected no. of arguments --\n";
+$haystack = b'string_val';
+$needle = b'string_val';
+$part = true;
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_strstr($haystack, $needle, $part, $encoding, $extra_arg) );
+
+// Testing mb_strstr with one less than the expected number of arguments
+echo "\n-- Testing mb_strstr() function with less than expected no. of arguments --\n";
+$haystack = b'string_val';
+var_dump( mb_strstr($haystack) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strstr() : error conditions ***
+
+-- Testing mb_strstr() function with more than expected no. of arguments --
+
+Warning: mb_strstr() expects at most 4 parameters, 5 given in %s on line %d
+bool(false)
+
+-- Testing mb_strstr() function with less than expected no. of arguments --
+
+Warning: mb_strstr() expects at least 2 parameters, 1 given in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strstr_error2.phpt b/ext/mbstring/tests/mb_strstr_error2.phpt
new file mode 100644
index 0000000..163c800
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_error2.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_strstr() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : error conditions ***\n";
+
+
+echo "\n-- Testing mb_strstr() with unknown encoding --\n";
+$haystack = b'Hello, world';
+$needle = b'world';
+$encoding = 'unknown-encoding';
+$part = true;
+var_dump( mb_strstr($haystack, $needle, $part, $encoding) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strstr() : error conditions ***
+
+-- Testing mb_strstr() with unknown encoding --
+
+Warning: mb_strstr(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strstr_variation1.phpt b/ext/mbstring/tests/mb_strstr_variation1.phpt
new file mode 100644
index 0000000..48e7c53
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_variation1.phpt
@@ -0,0 +1,207 @@
+--TEST--
+Test mb_strstr() function : usage variation - various haystacks, needle won't be found
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$needle = b'string_val';
+$part = true;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for haystack
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strstr($value, $needle, $part, $encoding) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strstr() : usage variation ***
+
+--int 0--
+bool(false)
+
+--int 1--
+bool(false)
+
+--int 12345--
+bool(false)
+
+--int -12345--
+bool(false)
+
+--float 10.5--
+bool(false)
+
+--float -10.5--
+bool(false)
+
+--float 12.3456789000e10--
+bool(false)
+
+--float -12.3456789000e10--
+bool(false)
+
+--float .5--
+bool(false)
+
+--empty array--
+Error: 2 - mb_strstr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strstr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strstr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strstr() expects parameter 1 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+bool(false)
+
+--lowercase null--
+bool(false)
+
+--lowercase true--
+bool(false)
+
+--lowercase false--
+bool(false)
+
+--uppercase TRUE--
+bool(false)
+
+--uppercase FALSE--
+bool(false)
+
+--empty string DQ--
+bool(false)
+
+--empty string SQ--
+bool(false)
+
+--instance of classWithToString--
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strstr() expects parameter 1 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+bool(false)
+
+--unset var--
+bool(false)
+
+--resource--
+Error: 2 - mb_strstr() expects parameter 1 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strstr_variation2.phpt b/ext/mbstring/tests/mb_strstr_variation2.phpt
new file mode 100644
index 0000000..f70bb67
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_variation2.phpt
@@ -0,0 +1,215 @@
+--TEST--
+Test mb_strstr() function : usage variation - different types of needle.
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$part = true;
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for needle
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strstr($haystack, $value, $part, $encoding) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strstr() : usage variation ***
+
+--int 0--
+bool(false)
+
+--int 1--
+bool(false)
+
+--int 12345--
+bool(false)
+
+--int -12345--
+bool(false)
+
+--float 10.5--
+bool(false)
+
+--float -10.5--
+bool(false)
+
+--float 12.3456789000e10--
+bool(false)
+
+--float -12.3456789000e10--
+bool(false)
+
+--float .5--
+bool(false)
+
+--empty array--
+Error: 2 - mb_strstr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strstr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strstr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strstr() expects parameter 2 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+Error: 2 - mb_strstr(): Empty delimiter, %s(%d)
+bool(false)
+
+--lowercase null--
+Error: 2 - mb_strstr(): Empty delimiter, %s(%d)
+bool(false)
+
+--lowercase true--
+bool(false)
+
+--lowercase false--
+Error: 2 - mb_strstr(): Empty delimiter, %s(%d)
+bool(false)
+
+--uppercase TRUE--
+bool(false)
+
+--uppercase FALSE--
+Error: 2 - mb_strstr(): Empty delimiter, %s(%d)
+bool(false)
+
+--empty string DQ--
+Error: 2 - mb_strstr(): Empty delimiter, %s(%d)
+bool(false)
+
+--empty string SQ--
+Error: 2 - mb_strstr(): Empty delimiter, %s(%d)
+bool(false)
+
+--instance of classWithToString--
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strstr() expects parameter 2 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+Error: 2 - mb_strstr(): Empty delimiter, %s(%d)
+bool(false)
+
+--unset var--
+Error: 2 - mb_strstr(): Empty delimiter, %s(%d)
+bool(false)
+
+--resource--
+Error: 2 - mb_strstr() expects parameter 2 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strstr_variation3.phpt b/ext/mbstring/tests/mb_strstr_variation3.phpt
new file mode 100644
index 0000000..55c8f31
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_variation3.phpt
@@ -0,0 +1,232 @@
+--TEST--
+Test mb_strstr() function : usage variation - different values for part
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$needle = b'_';
+$encoding = 'utf-8';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return b"Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = b<<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // string data
+ 'string DQ' => "string",
+ 'string SQ' => 'string',
+ 'mixed case string' => "sTrInG",
+ 'heredoc' => $heredoc,
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for part
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ $res = mb_strstr($haystack, $needle, $value, $encoding);
+ if ($res === false) {
+ var_dump($res);
+ }
+ else {
+ var_dump(bin2hex($res));
+ }
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strstr() : usage variation ***
+
+--int 0--
+string(8) "5f76616c"
+
+--int 1--
+string(12) "737472696e67"
+
+--int 12345--
+string(12) "737472696e67"
+
+--int -12345--
+string(12) "737472696e67"
+
+--float 10.5--
+string(12) "737472696e67"
+
+--float -10.5--
+string(12) "737472696e67"
+
+--float 12.3456789000e10--
+string(12) "737472696e67"
+
+--float -12.3456789000e10--
+string(12) "737472696e67"
+
+--float .5--
+string(12) "737472696e67"
+
+--empty array--
+Error: 2 - mb_strstr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strstr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strstr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strstr() expects parameter 3 to be boolean, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+string(8) "5f76616c"
+
+--lowercase null--
+string(8) "5f76616c"
+
+--lowercase true--
+string(12) "737472696e67"
+
+--lowercase false--
+string(8) "5f76616c"
+
+--uppercase TRUE--
+string(12) "737472696e67"
+
+--uppercase FALSE--
+string(8) "5f76616c"
+
+--empty string DQ--
+string(8) "5f76616c"
+
+--empty string SQ--
+string(8) "5f76616c"
+
+--string DQ--
+string(12) "737472696e67"
+
+--string SQ--
+string(12) "737472696e67"
+
+--mixed case string--
+string(12) "737472696e67"
+
+--heredoc--
+string(12) "737472696e67"
+
+--instance of classWithToString--
+Error: 2 - mb_strstr() expects parameter 3 to be boolean, object given, %s(%d)
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strstr() expects parameter 3 to be boolean, object given, %s(%d)
+bool(false)
+
+--undefined var--
+string(8) "5f76616c"
+
+--unset var--
+string(8) "5f76616c"
+
+--resource--
+Error: 2 - mb_strstr() expects parameter 3 to be boolean, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strstr_variation4.phpt b/ext/mbstring/tests/mb_strstr_variation4.phpt
new file mode 100644
index 0000000..3a208d3
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_variation4.phpt
@@ -0,0 +1,227 @@
+--TEST--
+Test mb_strstr() function : usage variation - different encoding types
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'string_val';
+$needle = b'_';
+$part = true;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return "invalid";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = <<<EOT
+invalid
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+
+ // resource variable
+ 'resource' => $fp
+);
+
+// loop through each element of the array for encoding
+
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_strstr($haystack, $needle, $part, $value) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strstr() : usage variation ***
+
+--int 0--
+Error: 2 - mb_strstr(): Unknown encoding "0", %s(%d)
+bool(false)
+
+--int 1--
+Error: 2 - mb_strstr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--int 12345--
+Error: 2 - mb_strstr(): Unknown encoding "12345", %s(%d)
+bool(false)
+
+--int -12345--
+Error: 2 - mb_strstr(): Unknown encoding "-2345", %s(%d)
+bool(false)
+
+--float 10.5--
+Error: 2 - mb_strstr(): Unknown encoding "10.5", %s(%d)
+bool(false)
+
+--float -10.5--
+Error: 2 - mb_strstr(): Unknown encoding "-10.5", %s(%d)
+bool(false)
+
+--float 12.3456789000e10--
+Error: 2 - mb_strstr(): Unknown encoding "123456789000", %s(%d)
+bool(false)
+
+--float -12.3456789000e10--
+Error: 2 - mb_strstr(): Unknown encoding "-123456789000", %s(%d)
+bool(false)
+
+--float .5--
+Error: 2 - mb_strstr(): Unknown encoding "0.5", %s(%d)
+bool(false)
+
+--empty array--
+Error: 2 - mb_strstr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--int indexed array--
+Error: 2 - mb_strstr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--associative array--
+Error: 2 - mb_strstr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--nested arrays--
+Error: 2 - mb_strstr() expects parameter 4 to be string, array given, %s(%d)
+bool(false)
+
+--uppercase NULL--
+Error: 2 - mb_strstr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--lowercase null--
+Error: 2 - mb_strstr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--lowercase true--
+Error: 2 - mb_strstr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--lowercase false--
+Error: 2 - mb_strstr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--uppercase TRUE--
+Error: 2 - mb_strstr(): Unknown encoding "1", %s(%d)
+bool(false)
+
+--uppercase FALSE--
+Error: 2 - mb_strstr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--empty string DQ--
+Error: 2 - mb_strstr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--empty string SQ--
+Error: 2 - mb_strstr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--instance of classWithToString--
+Error: 2 - mb_strstr(): Unknown encoding "invalid", %s(%d)
+bool(false)
+
+--instance of classWithoutToString--
+Error: 2 - mb_strstr() expects parameter 4 to be string, object given, %s(%d)
+bool(false)
+
+--undefined var--
+Error: 2 - mb_strstr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--unset var--
+Error: 2 - mb_strstr(): Unknown encoding "", %s(%d)
+bool(false)
+
+--resource--
+Error: 2 - mb_strstr() expects parameter 4 to be string, resource given, %s(%d)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strstr_variation5.phpt b/ext/mbstring/tests/mb_strstr_variation5.phpt
new file mode 100644
index 0000000..3bfbd61
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_variation5.phpt
@@ -0,0 +1,59 @@
+--TEST--
+Test mb_strstr() function : variation - multiple needles
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : variation ***\n";
+
+mb_internal_encoding('UTF-8');
+
+//with repeated needles
+$string_ascii = b'abcdef zbcdyx';
+$needle_ascii = b"bcd";
+
+//Japanese string in UTF-8 with repeated needles
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OIMzTvvJXvvJbml6XmnKzoqp7jg4bjgq3jgrnjg4g=');
+$needle_mb = base64_decode('6Kqe44OG44Kt');
+
+echo "-- Ascii data --\n";
+var_dump(bin2hex(mb_strstr($string_ascii, $needle_ascii, false)));
+var_dump(bin2hex(mb_strstr($string_ascii, $needle_ascii, true)));
+
+echo "-- mb data in utf-8 --\n";
+$res = mb_strstr($string_mb, $needle_mb, false);
+if ($res !== false) {
+ var_dump(bin2hex($res));
+}
+else {
+ echo "nothing found!\n";
+}
+$res = mb_strstr($string_mb, $needle_mb, true);
+if ($res !== false) {
+ var_dump(bin2hex($res));
+}
+else {
+ echo "nothing found!\n";
+}
+
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_strstr() : variation ***
+-- Ascii data --
+string(24) "6263646566207a6263647978"
+string(2) "61"
+-- mb data in utf-8 --
+string(88) "e8aa9ee38386e382ade382b9e383883334efbc95efbc96e697a5e69cace8aa9ee38386e382ade382b9e38388"
+string(12) "e697a5e69cac"
+===DONE===
diff --git a/ext/mbstring/tests/mb_strstr_variation6.phpt b/ext/mbstring/tests/mb_strstr_variation6.phpt
new file mode 100644
index 0000000..1242e02
--- /dev/null
+++ b/ext/mbstring/tests/mb_strstr_variation6.phpt
@@ -0,0 +1,65 @@
+--TEST--
+Test mb_strstr() function : variation - case sensitivity
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strstr(string haystack, string needle[, bool part[, string encoding]])
+ * Description: Finds first occurrence of a string within another
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_strstr() : variation ***\n";
+
+mb_internal_encoding('UTF-8');
+
+//ascii
+$string_ascii = b'abcdef';
+$needle_ascii_upper = b"BCD";
+$needle_ascii_mixed = b"bCd";
+$needle_ascii_lower = b"bcd";
+
+//Greek string in lower case UTF-8
+$string_mb = base64_decode('zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J');
+$needle_mb_upper = base64_decode('zpzOnc6ezp8=');
+$needle_mb_lower = base64_decode('zrzOvc6+zr8=');
+$needle_mb_mixed = base64_decode('zpzOnc6+zr8=');
+
+echo "-- Ascii data --\n";
+// needle should be found
+var_dump(bin2hex(mb_strstr($string_ascii, $needle_ascii_lower)));
+// no needle should be found
+var_dump(mb_strstr($string_ascii, $needle_ascii_upper));
+var_dump(mb_strstr($string_ascii, $needle_ascii_mixed));
+
+echo "-- mb data in utf-8 --\n";
+// needle should be found
+$res = mb_strstr($string_mb, $needle_mb_lower, false);
+if ($res !== false) {
+ var_dump(bin2hex($res));
+}
+else {
+ echo "nothing found!\n";
+}
+// no needle should be found
+var_dump(mb_strstr($string_mb, $needle_mb_upper));
+var_dump(mb_strstr($string_mb, $needle_mb_mixed));
+
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_strstr() : variation ***
+-- Ascii data --
+string(10) "6263646566"
+bool(false)
+bool(false)
+-- mb data in utf-8 --
+string(52) "cebccebdcebecebfcf80cf81cf83cf84cf85cf86cf87cf88cf89"
+bool(false)
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strtolower_basic.phpt b/ext/mbstring/tests/mb_strtolower_basic.phpt
new file mode 100644
index 0000000..6d9cba7
--- /dev/null
+++ b/ext/mbstring/tests/mb_strtolower_basic.phpt
@@ -0,0 +1,58 @@
+--TEST--
+Test mb_strtolower() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strtolower') or die("skip mb_strtolower() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strtolower(string $sourcestring [, string $encoding])
+ * Description: Returns a lowercased version of $sourcestring
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test basic functionality of mb_strtolower
+ */
+
+echo "*** Testing mb_strtolower() : basic functionality***\n";
+
+$ascii_lower = 'abcdefghijklmnopqrstuvwxyz';
+$ascii_upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+$greek_lower = base64_decode('zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J');
+$greek_upper = base64_decode('zpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6p');
+
+echo "\n-- ASCII String --\n";
+$ascii = mb_strtolower($ascii_upper);
+var_dump($ascii);
+
+if($ascii == $ascii_lower) {
+ echo "Correctly converted\n";
+} else {
+ echo "Incorrectly converted\n";
+}
+
+echo "\n-- Multibyte String --\n";
+$mb = mb_strtolower($greek_upper, 'UTF-8');
+var_dump(base64_encode($mb));
+
+if ($mb == $greek_lower) {
+ echo "Correctly converted\n";
+} else {
+ echo "Incorreclty converted\n";
+}
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strtolower() : basic functionality***
+
+-- ASCII String --
+string(26) "abcdefghijklmnopqrstuvwxyz"
+Correctly converted
+
+-- Multibyte String --
+string(64) "zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J"
+Correctly converted
+Done
diff --git a/ext/mbstring/tests/mb_strtolower_error1.phpt b/ext/mbstring/tests/mb_strtolower_error1.phpt
new file mode 100644
index 0000000..20200aa
--- /dev/null
+++ b/ext/mbstring/tests/mb_strtolower_error1.phpt
@@ -0,0 +1,46 @@
+--TEST--
+Test mb_strtolower() function : error conditions - pass incorrect number of arguments
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strtolower') or die("skip mb_strtolower() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strtolower(string $sourcestring [, string $encoding])
+ * Description: Returns a lowercased version of $sourcestring
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass an incorrect number of arguments to mb_strtolower() to test behaviour
+ */
+
+echo "*** Testing mb_strtolower() : error conditions***\n";
+
+//Test mb_strtolower with one more than the expected number of arguments
+echo "\n-- Testing mb_strtolower() function with more than expected no. of arguments --\n";
+$sourcestring = 'string_value';
+$encoding = 'UTF-8';
+$extra_arg = 10;
+var_dump( mb_strtolower($sourcestring, $encoding, $extra_arg) );
+
+//Test mb_strtolower with zero arguments
+echo "\n-- Testing mb_strtolower() function with zero arguments --\n";
+var_dump( mb_strtolower() );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strtolower() : error conditions***
+
+-- Testing mb_strtolower() function with more than expected no. of arguments --
+
+Warning: mb_strtolower() expects at most 2 parameters, 3 given in %s on line %d
+NULL
+
+-- Testing mb_strtolower() function with zero arguments --
+
+Warning: mb_strtolower() expects at least 1 parameter, 0 given in %s on line %d
+NULL
+Done
diff --git a/ext/mbstring/tests/mb_strtolower_error2.phpt b/ext/mbstring/tests/mb_strtolower_error2.phpt
new file mode 100644
index 0000000..9a0aed0
--- /dev/null
+++ b/ext/mbstring/tests/mb_strtolower_error2.phpt
@@ -0,0 +1,32 @@
+--TEST--
+Test mb_strtolower() function : error conditions - pass an unknown encoding
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strtolower') or die("skip mb_strtolower() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strtolower(string $sourcestring [, string $encoding])
+ * Description: Returns a lowercased version of $sourcestring
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass an unknown encoding to mb_strtolower() to test behaviour
+ */
+
+echo "*** Testing mb_strtolower() : error conditions***\n";
+
+$sourcestring = 'hello, world';
+$encoding = 'unknown-encoding';
+
+var_dump( mb_strtolower($sourcestring, $encoding) );
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_strtolower() : error conditions***
+
+Warning: mb_strtolower(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_strtolower_variation1.phpt b/ext/mbstring/tests/mb_strtolower_variation1.phpt
new file mode 100644
index 0000000..3b151b9
--- /dev/null
+++ b/ext/mbstring/tests/mb_strtolower_variation1.phpt
@@ -0,0 +1,178 @@
+--TEST--
+Test mb_strtolower() function : usage variations - pass different data types as $sourcestring arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strtolower') or die("skip mb_strtolower() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strtolower(string $sourcestring [, string $encoding])
+ * Description: Returns a lowercased version of $sourcestring
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass different data types to $sourcestring argument to test behaviour of mb_strtolower()
+ */
+
+echo "*** Testing mb_strtolower() : usage variations ***\n";
+
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+Hello World
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $sourcestring argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "String",
+ 'String',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strtolower()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strtolower($input) );
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strtolower() : usage variations ***
+
+-- Iteration 1 --
+string(1) "0"
+
+-- Iteration 2 --
+string(1) "1"
+
+-- Iteration 3 --
+string(5) "12345"
+
+-- Iteration 4 --
+string(5) "-2345"
+
+-- Iteration 5 --
+string(4) "10.5"
+
+-- Iteration 6 --
+string(5) "-10.5"
+
+-- Iteration 7 --
+string(12) "123456789000"
+
+-- Iteration 8 --
+string(13) "1.23456789e-9"
+
+-- Iteration 9 --
+string(3) "0.5"
+
+-- Iteration 10 --
+string(0) ""
+
+-- Iteration 11 --
+string(0) ""
+
+-- Iteration 12 --
+string(1) "1"
+
+-- Iteration 13 --
+string(0) ""
+
+-- Iteration 14 --
+string(1) "1"
+
+-- Iteration 15 --
+string(0) ""
+
+-- Iteration 16 --
+string(0) ""
+
+-- Iteration 17 --
+string(0) ""
+
+-- Iteration 18 --
+string(6) "string"
+
+-- Iteration 19 --
+string(6) "string"
+
+-- Iteration 20 --
+string(11) "hello world"
+
+-- Iteration 21 --
+string(14) "class a object"
+
+-- Iteration 22 --
+string(0) ""
+
+-- Iteration 23 --
+string(0) ""
+
+-- Iteration 24 --
+
+Warning: mb_strtolower() expects parameter 1 to be string, resource given in %s on line %d
+NULL
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strtolower_variation2.phpt b/ext/mbstring/tests/mb_strtolower_variation2.phpt
new file mode 100644
index 0000000..293c955
--- /dev/null
+++ b/ext/mbstring/tests/mb_strtolower_variation2.phpt
@@ -0,0 +1,225 @@
+--TEST--
+Test mb_strtolower() function : usage variations - pass different data types as $encoding arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strtolower') or die("skip mb_strtolower() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strtolower(string $sourcestring [, string $encoding])
+ * Description: Returns a lowercased version of $sourcestring
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass different data types to $encoding argument to test behaviour of mb_strtolower()
+ * Where possible, 'UTF-8' has been entered as a string value
+ */
+
+echo "*** Testing mb_strtolower() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$sourcestring = b'Hello, World';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strtolower()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ $res = mb_strtolower($sourcestring, $input);
+ if ($res === false || $res == NULL) {
+ var_dump($res);
+ }
+ else {
+ var_dump(bin2hex($res));
+ }
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_strtolower() : usage variations ***
+
+-- Iteration 1 --
+
+Warning: mb_strtolower(): Unknown encoding "0" in %s on line %d
+bool(false)
+
+-- Iteration 2 --
+
+Warning: mb_strtolower(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 3 --
+
+Warning: mb_strtolower(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_strtolower(): Unknown encoding "-2345" in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_strtolower(): Unknown encoding "10.5" in %s on line %d
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_strtolower(): Unknown encoding "-10.5" in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_strtolower(): Unknown encoding "123456789000" in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+
+Warning: mb_strtolower(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+-- Iteration 9 --
+
+Warning: mb_strtolower(): Unknown encoding "0.5" in %s on line %d
+bool(false)
+
+-- Iteration 10 --
+
+Warning: mb_strtolower(): Unknown encoding "(null)" in %s on line %d
+bool(false)
+
+-- Iteration 11 --
+
+Warning: mb_strtolower(): Unknown encoding "(null)" in %s on line %d
+bool(false)
+
+-- Iteration 12 --
+
+Warning: mb_strtolower(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 13 --
+
+Warning: mb_strtolower(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 14 --
+
+Warning: mb_strtolower(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 15 --
+
+Warning: mb_strtolower(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 16 --
+
+Warning: mb_strtolower(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_strtolower(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 19 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 20 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 21 --
+string(24) "68656c6c6f2c20776f726c64"
+
+-- Iteration 22 --
+
+Warning: mb_strtolower(): Unknown encoding "(null)" in %s on line %d
+bool(false)
+
+-- Iteration 23 --
+
+Warning: mb_strtolower(): Unknown encoding "(null)" in %s on line %d
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_strtolower() expects parameter 2 to be string, resource given in %s on line %d
+NULL
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strtolower_variation3.phpt b/ext/mbstring/tests/mb_strtolower_variation3.phpt
new file mode 100644
index 0000000..08b3467
--- /dev/null
+++ b/ext/mbstring/tests/mb_strtolower_variation3.phpt
@@ -0,0 +1,57 @@
+--TEST--
+Test mb_strtolower() function : usage variations - pass mixed ASCII and non-ASCII strings
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strtolower') or die("skip mb_strtolower() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strtolower(string $sourcestring [, string $encoding])
+ * Description: Returns a lowercased version of $sourcestring
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass a Japanese string and a mixed Japanese and ASCII string to mb_strtolower
+ * to check correct conversion is occuring (Japanese characters should not be converted).
+ */
+
+echo "*** Testing mb_strtolower() : usage variations ***\n";
+
+$string_mixed = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCUEhQLiAwMTIzNO+8le+8lu+8l++8mO+8meOAgg==');
+$string_mixed_lower = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCcGhwLiAwMTIzNO+8le+8lu+8l++8mO+8meOAgg==');
+$string_all_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC');
+
+echo "\n-- Mixed string (mulitbyte and ASCII characters) --\n";
+$a = mb_strtolower($string_mixed, 'UTF-8');
+var_dump(base64_encode($a));
+if ($a == $string_mixed_lower) {
+ echo "Correctly Converted\n";
+} else {
+ echo "Incorrectly Converted\n";
+}
+
+echo "\n-- Multibyte Only String--\n";
+$b = mb_strtolower($string_all_mb, 'UTF-8');
+var_dump(base64_encode($b));
+if ($b == $string_all_mb) { // Japanese characters only - should not be any conversion
+ echo "Correctly Converted\n";
+} else {
+ echo "Incorrectly Converted\n";
+}
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strtolower() : usage variations ***
+
+-- Mixed string (mulitbyte and ASCII characters) --
+string(80) "5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCcGhwLiAwMTIzNO+8le+8lu+8l++8mO+8meOAgg=="
+Correctly Converted
+
+-- Multibyte Only String--
+string(40) "5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC"
+Correctly Converted
+Done
diff --git a/ext/mbstring/tests/mb_strtolower_variation4.phpt b/ext/mbstring/tests/mb_strtolower_variation4.phpt
new file mode 100644
index 0000000..37357a1
--- /dev/null
+++ b/ext/mbstring/tests/mb_strtolower_variation4.phpt
@@ -0,0 +1,56 @@
+--TEST--
+Test mb_strtolower() function : usage variations - pass different characters to check conversion is correct
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strtolower') or die("skip mb_strtolower() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strtolower(string $sourcestring [, string $encoding])
+ * Description: Returns a lowercased version of $sourcestring
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass accented characters and Russian characters to check case conversion is correct
+ */
+
+echo "*** Testing mb_strtolower() : usage variations ***\n";
+
+$uppers = array('Basic Latin' => b'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+ 'Characters With Accents' => base64_decode('w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/DkMORw5LDk8OUw5XDlg=='),
+ 'Russian' => base64_decode('0JDQkdCS0JPQlNCV0JbQlw=='));
+$lowers = array('Basic Latin' => b'abcdefghijklmnopqrstuvwxyz',
+ 'Characters With Accents' => base64_decode('w6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtg=='),
+ 'Russian' => base64_decode('0LDQsdCy0LPQtNC10LbQtw=='));
+
+foreach ($uppers as $lang => $sourcestring) {
+ echo "\n-- $lang --\n";
+ $a = mb_strtolower($sourcestring, 'utf-8');
+ var_dump(base64_encode($a));
+ if ($a == $lowers[$lang]) {
+ echo "Correctly Converted\n";
+ } else {
+ echo "Incorrectly Converted\n";
+ }
+}
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strtolower() : usage variations ***
+
+-- Basic Latin --
+string(36) "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo="
+Correctly Converted
+
+-- Characters With Accents --
+string(64) "w6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtg=="
+Correctly Converted
+
+-- Russian --
+string(24) "0LDQsdCy0LPQtNC10LbQtw=="
+Correctly Converted
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strtoupper_basic.phpt b/ext/mbstring/tests/mb_strtoupper_basic.phpt
new file mode 100644
index 0000000..e776469
--- /dev/null
+++ b/ext/mbstring/tests/mb_strtoupper_basic.phpt
@@ -0,0 +1,60 @@
+--TEST--
+Test mb_strtoupper() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strtoupper') or die("skip mb_strtoupper() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strtoupper(string $sourcestring [, string $encoding]
+ * Description: Returns a uppercased version of $sourcestring
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test basic functionality of mb_strtoupper
+ */
+
+echo "*** Testing mb_strtoupper() : basic functionality ***\n";
+
+mb_internal_encoding('utf-8');
+$ascii_lower = b'abcdefghijklmnopqrstuvwxyz';
+$ascii_upper = b'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+$greek_lower = base64_decode('zrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4TPhc+Gz4fPiM+J');
+$greek_upper = base64_decode('zpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6p');
+
+echo "\n-- ASCII String --\n";
+$ascii = mb_strtoupper($ascii_lower);
+var_dump(base64_encode($ascii));
+
+if($ascii == $ascii_upper) {
+ echo "Correctly converted\n";
+} else {
+ echo "Incorrectly converted\n";
+}
+
+echo "\n-- Multibyte String --\n";
+$mb = mb_strtoupper($greek_lower, 'UTF-8');
+var_dump(base64_encode($mb));
+
+if ($mb == $greek_upper) {
+ echo "Correctly converted\n";
+} else {
+ echo "Incorreclty converted\n";
+}
+
+echo "Done";
+?>
+
+--EXPECT--
+*** Testing mb_strtoupper() : basic functionality ***
+
+-- ASCII String --
+string(36) "QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo="
+Correctly converted
+
+-- Multibyte String --
+string(64) "zpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoc6jzqTOpc6mzqfOqM6p"
+Correctly converted
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strtoupper_error1.phpt b/ext/mbstring/tests/mb_strtoupper_error1.phpt
new file mode 100644
index 0000000..c14d2f1
--- /dev/null
+++ b/ext/mbstring/tests/mb_strtoupper_error1.phpt
@@ -0,0 +1,47 @@
+--TEST--
+Test mb_strtoupper() function : error conditions - pass incorrect number of args
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strtoupper') or die("skip mb_strtoupper() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strtoupper(string $sourcestring [, string $encoding]
+ * Description: Returns a uppercased version of $sourcestring
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass an incorrect number of arguments to mb_strtoupper() to test behaviour
+ */
+
+echo "*** Testing mb_strtoupper() : error conditions ***\n";
+
+//Test mb_strtoupper with one more than the expected number of arguments
+echo "\n-- Testing mb_strtoupper() function with more than expected no. of arguments --\n";
+$sourcestring = 'string_value';
+$encoding = 'UTF-8';
+$extra_arg = 10;
+var_dump( mb_strtoupper($sourcestring, $encoding, $extra_arg) );
+
+//Test mb_strtoupper with zero arguments
+echo "\n-- Testing mb_strtoupper() function with zero arguments --\n";
+var_dump( mb_strtoupper() );
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strtoupper() : error conditions ***
+
+-- Testing mb_strtoupper() function with more than expected no. of arguments --
+
+Warning: mb_strtoupper() expects at most 2 parameters, 3 given in %s on line %d
+NULL
+
+-- Testing mb_strtoupper() function with zero arguments --
+
+Warning: mb_strtoupper() expects at least 1 parameter, 0 given in %s on line %d
+NULL
+Done
diff --git a/ext/mbstring/tests/mb_strtoupper_error2.phpt b/ext/mbstring/tests/mb_strtoupper_error2.phpt
new file mode 100644
index 0000000..cf42926
--- /dev/null
+++ b/ext/mbstring/tests/mb_strtoupper_error2.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Test mb_strtoupper() function : error conditions - pass an unknown encoding
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strtoupper') or die("skip mb_strtoupper() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strtoupper(string $sourcestring [, string $encoding]
+ * Description: Returns a uppercased version of $sourcestring
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass an unknown encoding as $encoding argument to check behaviour of mbstrtoupper()
+ */
+
+echo "*** Testing mb_strtoupper() : error conditions ***\n";
+
+$sourcestring = 'hello, world';
+$encoding = 'unknown-encoding';
+
+var_dump( mb_strtoupper($sourcestring, $encoding) );
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strtoupper() : error conditions ***
+
+Warning: mb_strtoupper(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_strtoupper_variation1.phpt b/ext/mbstring/tests/mb_strtoupper_variation1.phpt
new file mode 100644
index 0000000..efe8845
--- /dev/null
+++ b/ext/mbstring/tests/mb_strtoupper_variation1.phpt
@@ -0,0 +1,181 @@
+--TEST--
+Test mb_strtoupper() function : usage varitations - pass different data types as $sourcestring arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strtoupper') or die("skip mb_strtoupper() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strtoupper(string $sourcestring [, string $encoding]
+ * Description: Returns a uppercased version of $sourcestring
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ *
+ * Pass different data types as $sourcestring argument to mb_strtoupper to test behaviour
+ */
+
+echo "*** Testing mb_strtoupper() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+Hello, World
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $sourcestring argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "String",
+ 'String',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strtoupper()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_strtoupper($input) );
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strtoupper() : usage variations ***
+
+-- Iteration 1 --
+string(1) "0"
+
+-- Iteration 2 --
+string(1) "1"
+
+-- Iteration 3 --
+string(5) "12345"
+
+-- Iteration 4 --
+string(5) "-2345"
+
+-- Iteration 5 --
+string(4) "10.5"
+
+-- Iteration 6 --
+string(5) "-10.5"
+
+-- Iteration 7 --
+string(12) "123456789000"
+
+-- Iteration 8 --
+string(13) "1.23456789E-9"
+
+-- Iteration 9 --
+string(3) "0.5"
+
+-- Iteration 10 --
+string(0) ""
+
+-- Iteration 11 --
+string(0) ""
+
+-- Iteration 12 --
+string(1) "1"
+
+-- Iteration 13 --
+string(0) ""
+
+-- Iteration 14 --
+string(1) "1"
+
+-- Iteration 15 --
+string(0) ""
+
+-- Iteration 16 --
+string(0) ""
+
+-- Iteration 17 --
+string(0) ""
+
+-- Iteration 18 --
+string(6) "STRING"
+
+-- Iteration 19 --
+string(6) "STRING"
+
+-- Iteration 20 --
+string(12) "HELLO, WORLD"
+
+-- Iteration 21 --
+string(14) "CLASS A OBJECT"
+
+-- Iteration 22 --
+string(0) ""
+
+-- Iteration 23 --
+string(0) ""
+
+-- Iteration 24 --
+
+Warning: mb_strtoupper() expects parameter 1 to be string, resource given in %s on line %d
+NULL
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strtoupper_variation2.phpt b/ext/mbstring/tests/mb_strtoupper_variation2.phpt
new file mode 100644
index 0000000..035cd63
--- /dev/null
+++ b/ext/mbstring/tests/mb_strtoupper_variation2.phpt
@@ -0,0 +1,226 @@
+--TEST--
+Test mb_strtoupper() function : usage varitations - Pass different data types as $encoding arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strtoupper') or die("skip mb_strtoupper() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strtoupper(string $sourcestring [, string $encoding]
+ * Description: Returns a uppercased version of $sourcestring
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass different data types as $encoding argument to mb_strtoupper() to test behaviour
+ * Where possible, 'UTF-8' is entered as string value
+ */
+
+echo "*** Testing mb_strtoupper() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$sourcestring = b'Hello, World';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_strtoupper()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ $res = mb_strtoupper($sourcestring, $input);
+ if ($res === false || $res == NULL) {
+ var_dump($res);
+ }
+ else {
+ var_dump(bin2hex($res));
+ }
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strtoupper() : usage variations ***
+
+-- Iteration 1 --
+
+Warning: mb_strtoupper(): Unknown encoding "0" in %s on line %d
+bool(false)
+
+-- Iteration 2 --
+
+Warning: mb_strtoupper(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 3 --
+
+Warning: mb_strtoupper(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_strtoupper(): Unknown encoding "-2345" in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_strtoupper(): Unknown encoding "10.5" in %s on line %d
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_strtoupper(): Unknown encoding "-10.5" in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_strtoupper(): Unknown encoding "123456789000" in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+
+Warning: mb_strtoupper(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+-- Iteration 9 --
+
+Warning: mb_strtoupper(): Unknown encoding "0.5" in %s on line %d
+bool(false)
+
+-- Iteration 10 --
+
+Warning: mb_strtoupper(): Unknown encoding "(null)" in %s on line %d
+bool(false)
+
+-- Iteration 11 --
+
+Warning: mb_strtoupper(): Unknown encoding "(null)" in %s on line %d
+bool(false)
+
+-- Iteration 12 --
+
+Warning: mb_strtoupper(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 13 --
+
+Warning: mb_strtoupper(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 14 --
+
+Warning: mb_strtoupper(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 15 --
+
+Warning: mb_strtoupper(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 16 --
+
+Warning: mb_strtoupper(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_strtoupper(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+string(24) "48454c4c4f2c20574f524c44"
+
+-- Iteration 19 --
+string(24) "48454c4c4f2c20574f524c44"
+
+-- Iteration 20 --
+string(24) "48454c4c4f2c20574f524c44"
+
+-- Iteration 21 --
+string(24) "48454c4c4f2c20574f524c44"
+
+-- Iteration 22 --
+
+Warning: mb_strtoupper(): Unknown encoding "(null)" in %s on line %d
+bool(false)
+
+-- Iteration 23 --
+
+Warning: mb_strtoupper(): Unknown encoding "(null)" in %s on line %d
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_strtoupper() expects parameter 2 to be string, resource given in %s on line %d
+NULL
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strtoupper_variation3.phpt b/ext/mbstring/tests/mb_strtoupper_variation3.phpt
new file mode 100644
index 0000000..a4bf3b1
--- /dev/null
+++ b/ext/mbstring/tests/mb_strtoupper_variation3.phpt
@@ -0,0 +1,58 @@
+--TEST--
+Test mb_strtoupper() function : usage varitations - pass mixed ASCII and non-ASCII strings
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strtoupper') or die("skip mb_strtoupper() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strtoupper(string $sourcestring [, string $encoding]
+ * Description: Returns a uppercased version of $sourcestring
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass a Japanese string and a mixed Japanese and ASCII string to mb_strtolower
+ * to check correct conversion is occuring (Japanese characters should not be converted).
+ */
+
+echo "*** Testing mb_strtoupper() : usage variations ***\n";
+
+$string_mixed_upper = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCUEhQLiAwMTIzNO+8le+8lu+8l++8mO+8meOAgg==');
+$string_mixed_lower = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCcGhwLiAwMTIzNO+8le+8lu+8l++8mO+8meOAgg==');
+$string_all_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC');
+
+
+echo "\n-- Mixed string (mulitbyte and ASCII characters) --\n";
+$a = mb_strtoupper($string_mixed_lower, 'UTF-8');
+var_dump(base64_encode($a));
+if ($a == $string_mixed_upper) {
+ echo "Correctly Converted\n";
+} else {
+ echo "Incorrectly Converted\n";
+}
+
+echo "\n-- Multibyte Only String--\n";
+$b = mb_strtoupper($string_all_mb, 'UTF-8');
+var_dump(base64_encode($b));
+if ($b == $string_all_mb) { // Japanese characters only - should not be any conversion
+ echo "Correctly Converted\n";
+} else {
+ echo "Incorrectly Converted\n";
+}
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strtoupper() : usage variations ***
+
+-- Mixed string (mulitbyte and ASCII characters) --
+string(80) "5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCUEhQLiAwMTIzNO+8le+8lu+8l++8mO+8meOAgg=="
+Correctly Converted
+
+-- Multibyte Only String--
+string(40) "5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CC"
+Correctly Converted
+Done
diff --git a/ext/mbstring/tests/mb_strtoupper_variation4.phpt b/ext/mbstring/tests/mb_strtoupper_variation4.phpt
new file mode 100644
index 0000000..7d91c8a
--- /dev/null
+++ b/ext/mbstring/tests/mb_strtoupper_variation4.phpt
@@ -0,0 +1,57 @@
+--TEST--
+Test mb_strtoupper() function : usage varitations - Pass different character types to check conversion is correct
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_strtoupper') or die("skip mb_strtoupper() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_strtoupper(string $sourcestring [, string $encoding]
+ * Description: Returns a uppercased version of $sourcestring
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass characters from different languages to check that mb_strtoupper is
+ * doing a correct case conversion
+ */
+
+echo "*** Testing mb_strtoupper() : usage variations ***\n";
+
+$uppers = array('Basic Latin' => b'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+ 'Characters With Accents' => base64_decode('w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/DkMORw5LDk8OUw5XDlg=='),
+ 'Russian' => base64_decode('0JDQkdCS0JPQlNCV0JbQlw=='));
+$lowers = array('Basic Latin' => b'abcdefghijklmnopqrstuvwxyz',
+ 'Characters With Accents' => base64_decode('w6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtg=='),
+ 'Russian' => base64_decode('0LDQsdCy0LPQtNC10LbQtw=='));
+
+foreach ($lowers as $lang => $sourcestring) {
+ echo "\n-- $lang --\n";
+ $a = mb_strtoupper($sourcestring, 'UTF-8');
+ var_dump(base64_encode($a));
+ if ($a == $uppers[$lang]) {
+ echo "Correctly Converted\n";
+ } else {
+ echo "Incorrectly Converted\n";
+ }
+}
+
+echo "Done";
+?>
+
+--EXPECTF--
+*** Testing mb_strtoupper() : usage variations ***
+
+-- Basic Latin --
+string(36) "QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVo="
+Correctly Converted
+
+-- Characters With Accents --
+string(64) "w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/DkMORw5LDk8OUw5XDlg=="
+Correctly Converted
+
+-- Russian --
+string(24) "0JDQkdCS0JPQlNCV0JbQlw=="
+Correctly Converted
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_strwidth.phpt b/ext/mbstring/tests/mb_strwidth.phpt
new file mode 100644
index 0000000..da439b4
--- /dev/null
+++ b/ext/mbstring/tests/mb_strwidth.phpt
@@ -0,0 +1,32 @@
+--TEST--
+mb_strwidth()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+// TODO: Add more encoding, strings.....
+//$debug = true;
+ini_set('include_path', dirname(__FILE__));
+include_once('common.inc');
+
+// EUC-JP
+$euc_jp = '0123この文字列は日本語です。EUC-JPを使っています。日本語は面倒臭い。';
+
+print "1: ". mb_strwidth($euc_jp, 'EUC-JP') . "\n";
+/*
+
+print "2: ". mb_strwidth($euc_jp, 'EUC-JP') . "\n";
+print "3: ". mb_strwidth($euc_jp, 'EUC-JP') . "\n";
+// Note: Did not start form -22 offset. Staring from 0.
+print "4: ". mb_strwidth($euc_jp, 'EUC-JP') . "\n";
+
+$str = mb_strwidth($euc_jp, 100, -10,'...','EUC-JP');
+($str === "") ? print "5 OK\n" : print "NG: $str\n";
+
+$str = mb_strwidth($euc_jp, -100, 10,'...','EUC-JP');
+($str !== "") ? print "6 OK: $str\n" : print "NG: $str\n";
+*/
+?>
+
+--EXPECT--
+1: 68
diff --git a/ext/mbstring/tests/mb_substitute_character.phpt b/ext/mbstring/tests/mb_substitute_character.phpt
new file mode 100644
index 0000000..db11988
--- /dev/null
+++ b/ext/mbstring/tests/mb_substitute_character.phpt
@@ -0,0 +1,45 @@
+--TEST--
+mb_substitute_character()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+//$debug = true;
+ini_set('include_path', dirname(__FILE__));
+include_once('common.inc');
+
+// Note: It does not return TRUE/FALSE for setting char
+
+var_dump(mb_substitute_character(0x3044));
+var_dump(mb_substitute_character());
+var_dump(bin2hex(mb_convert_encoding("\xe2\x99\xa0\xe3\x81\x82", "CP932", "UTF-8")));
+
+var_dump(mb_substitute_character('long'));
+var_dump(mb_substitute_character());
+var_dump(bin2hex(mb_convert_encoding("\xe2\x99\xa0\xe3\x81\x82", "CP932", "UTF-8")));
+
+var_dump(mb_substitute_character('none'));
+var_dump(mb_substitute_character());
+var_dump(bin2hex(mb_convert_encoding("\xe2\x99\xa0\xe3\x81\x82", "CP932", "UTF-8")));
+
+var_dump(mb_substitute_character('entity'));
+var_dump(mb_substitute_character());
+var_dump(bin2hex(mb_convert_encoding("\xe2\x99\xa0\xe3\x81\x82", "CP932", "UTF-8")));
+
+var_dump(mb_substitute_character('BAD_NAME'));
+?>
+--EXPECT--
+bool(true)
+int(12356)
+string(8) "82a282a0"
+bool(true)
+string(4) "long"
+string(16) "552b3236363082a0"
+bool(true)
+string(4) "none"
+string(4) "82a0"
+bool(true)
+string(6) "entity"
+string(20) "262378323636303b82a0"
+ERR: Warning
+bool(false)
diff --git a/ext/mbstring/tests/mb_substitute_character_basic.phpt b/ext/mbstring/tests/mb_substitute_character_basic.phpt
new file mode 100644
index 0000000..30cda8a
--- /dev/null
+++ b/ext/mbstring/tests/mb_substitute_character_basic.phpt
@@ -0,0 +1,43 @@
+--TEST--
+Test mb_substitute_character() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substitute_character') or die("skip mb_substitute_character() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : mixed mb_substitute_character([mixed substchar])
+ * Description: Sets the current substitute_character or returns the current substitute_character
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_substitute_character() : basic functionality ***\n";
+
+
+// Initialise all required variables
+var_dump( mb_substitute_character() );
+var_dump( mb_substitute_character(66) );
+var_dump( mb_substitute_character() );
+var_dump( mb_substitute_character(1234) );
+var_dump( mb_substitute_character() );
+var_dump( mb_substitute_character("none") );
+var_dump( mb_substitute_character() );
+var_dump( mb_substitute_character("b") );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_substitute_character() : basic functionality ***
+int(63)
+bool(true)
+int(66)
+bool(true)
+int(1234)
+bool(true)
+string(4) "none"
+
+Warning: mb_substitute_character(): Unknown character. in %s on line %d
+bool(false)
+===DONE===
diff --git a/ext/mbstring/tests/mb_substitute_character_error.phpt b/ext/mbstring/tests/mb_substitute_character_error.phpt
new file mode 100644
index 0000000..2a816b8
--- /dev/null
+++ b/ext/mbstring/tests/mb_substitute_character_error.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_substitute_character() function : error conditions
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substitute_character') or die("skip mb_substitute_character() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : mixed mb_substitute_character([mixed substchar])
+ * Description: Sets the current substitute_character or returns the current substitute_character
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_substitute_character() : error conditions ***\n";
+
+
+//Test mb_substitute_character with one more than the expected number of arguments
+echo "\n-- Testing mb_substitute_character() function with more than expected no. of arguments --\n";
+$substchar = 1;
+$extra_arg = 10;
+var_dump( mb_substitute_character($substchar, $extra_arg) );
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_substitute_character() : error conditions ***
+
+-- Testing mb_substitute_character() function with more than expected no. of arguments --
+
+Warning: mb_substitute_character() expects at most 1 parameter, 2 given in %s on line %d
+NULL
+===DONE===
+
diff --git a/ext/mbstring/tests/mb_substitute_character_variation1.phpt b/ext/mbstring/tests/mb_substitute_character_variation1.phpt
new file mode 100644
index 0000000..3458bc2
--- /dev/null
+++ b/ext/mbstring/tests/mb_substitute_character_variation1.phpt
@@ -0,0 +1,231 @@
+--TEST--
+Test mb_substitute_character() function : usage variation
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substitute_character') or die("skip mb_substitute_character() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : mixed mb_substitute_character([mixed substchar])
+ * Description: Sets the current substitute_character or returns the current substitute_character
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_substitute_character() : usage variation ***\n";
+
+// Define error handler
+function test_error_handler($err_no, $err_msg, $filename, $linenum, $vars) {
+ if (error_reporting() != 0) {
+ // report non-silenced errors
+ echo "Error: $err_no - $err_msg, $filename($linenum)\n";
+ }
+}
+set_error_handler('test_error_handler');
+
+// Initialise function arguments not being substituted (if any)
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// define some classes
+class classWithToString
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+class classWithoutToString
+{
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// add arrays
+$index_array = array (1, 2, 3);
+$assoc_array = array ('one' => 1, 'two' => 2);
+
+//array of values to iterate over
+$inputs = array(
+
+ // int data
+ 'int 0' => 0,
+ 'int 1' => 1,
+ 'int 12345' => 12345,
+ 'int -12345' => -2345,
+
+ // float data
+ 'float 10.5' => 10.5,
+ 'float -10.5' => -10.5,
+ 'float 12.3456789000e10' => 12.3456789000e10,
+ 'float -12.3456789000e10' => -12.3456789000e10,
+ 'float .5' => .5,
+
+ // array data
+ 'empty array' => array(),
+ 'int indexed array' => $index_array,
+ 'associative array' => $assoc_array,
+ 'nested arrays' => array('foo', $index_array, $assoc_array),
+
+ // null data
+ 'uppercase NULL' => NULL,
+ 'lowercase null' => null,
+
+ // boolean data
+ 'lowercase true' => true,
+ 'lowercase false' =>false,
+ 'uppercase TRUE' =>TRUE,
+ 'uppercase FALSE' =>FALSE,
+
+ // empty data
+ 'empty string DQ' => "",
+ 'empty string SQ' => '',
+
+ // string data
+ 'string DQ' => "string",
+ 'string SQ' => 'string',
+ 'mixed case string' => "sTrInG",
+ 'heredoc' => $heredoc,
+
+ // object data
+ 'instance of classWithToString' => new classWithToString(),
+ 'instance of classWithoutToString' => new classWithoutToString(),
+
+ // undefined data
+ 'undefined var' => @$undefined_var,
+
+ // unset data
+ 'unset var' => @$unset_var,
+);
+
+// loop through each element of the array for substchar
+
+mb_internal_encoding('utf-8');
+foreach($inputs as $key =>$value) {
+ echo "\n--$key--\n";
+ var_dump( mb_substitute_character($value) );
+};
+
+fclose($fp);
+
+?>
+===DONE===
+--EXPECTF--
+*** Testing mb_substitute_character() : usage variation ***
+
+--int 0--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--int 1--
+bool(true)
+
+--int 12345--
+bool(true)
+
+--int -12345--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--float 10.5--
+bool(true)
+
+--float -10.5--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--float 12.3456789000e10--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--float -12.3456789000e10--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--float .5--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--empty array--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--int indexed array--
+bool(true)
+
+--associative array--
+bool(true)
+
+--nested arrays--
+bool(true)
+
+--uppercase NULL--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--lowercase null--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--lowercase true--
+bool(true)
+
+--lowercase false--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--uppercase TRUE--
+bool(true)
+
+--uppercase FALSE--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--empty string DQ--
+bool(true)
+
+--empty string SQ--
+bool(true)
+
+--string DQ--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--string SQ--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--mixed case string--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--heredoc--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--instance of classWithToString--
+Error: 8 - Object of class classWithToString could not be converted to int, %s(%d)
+bool(true)
+
+--instance of classWithoutToString--
+Error: 8 - Object of class classWithoutToString could not be converted to int, %s(%d)
+bool(true)
+
+--undefined var--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+
+--unset var--
+Error: 2 - mb_substitute_character(): Unknown character., %s(%d)
+bool(false)
+===DONE===
+
diff --git a/ext/mbstring/tests/mb_substitute_character_variation2.phpt b/ext/mbstring/tests/mb_substitute_character_variation2.phpt
new file mode 100644
index 0000000..202561a
--- /dev/null
+++ b/ext/mbstring/tests/mb_substitute_character_variation2.phpt
@@ -0,0 +1,39 @@
+--TEST--
+Test mb_substitute_character() function : variation unmappable out char for convert encoding
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substitute_character') or die("skip mb_substitute_character() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : mixed mb_substitute_character([mixed substchar])
+ * Description: Sets the current substitute_character or returns the current substitute_character
+ * Source code: ext/mbstring/mbstring.c
+ * Alias to functions:
+ */
+
+echo "*** Testing mb_substitute_character() : variation ***\n";
+//japenese utf-8
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI');
+
+//output the default which is ? in ISO-8859-1, x3f
+var_dump(bin2hex(mb_convert_encoding($string_mb, "ISO-8859-1", "UTF-8")));
+
+mb_substitute_character(66); //'B' in ISO-8859-1, x42
+var_dump(bin2hex(mb_convert_encoding($string_mb, "ISO-8859-1", "UTF-8")));
+mb_substitute_character("none"); //no substitution
+var_dump(bin2hex(mb_convert_encoding($string_mb, "ISO-8859-1", "UTF-8")));
+mb_substitute_character(280); //not valid in ISO-8859-1
+var_dump(bin2hex(mb_convert_encoding($string_mb, "ISO-8859-1", "UTF-8")));
+
+
+?>
+===DONE===
+--EXPECT--
+*** Testing mb_substitute_character() : variation ***
+string(14) "3f3f3f3f3f3f3f"
+string(14) "42424242424242"
+string(0) ""
+string(0) ""
+===DONE===
diff --git a/ext/mbstring/tests/mb_substr.phpt b/ext/mbstring/tests/mb_substr.phpt
new file mode 100644
index 0000000..d9269c3
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr.phpt
@@ -0,0 +1,35 @@
+--TEST--
+mb_substr()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+output_handler=
+mbstring.func_overload=0
+--FILE--
+<?php
+// TODO: Add more encodings
+ini_set('include_path','.');
+include_once('common.inc');
+
+// EUC-JP
+$euc_jp = b'0123この文字列は日本語です。EUC-JPを使っています。日本語は面倒臭い。';
+
+print "1: ". bin2hex(mb_substr($euc_jp, 10, 10,'EUC-JP')) . "\n";
+print "2: ". bin2hex(mb_substr($euc_jp, 0, 100,'EUC-JP')) . "\n";
+
+$str = mb_substr($euc_jp, 100, 10,'EUC-JP');
+// Note: returns last character
+($str === "") ? print "3 OK\n" : print "NG: ".bin2hex($str)."\n";
+
+$str = mb_substr($euc_jp, -100, 10,'EUC-JP');
+($str !== "") ? print "4 OK: ".bin2hex($str)."\n" : print "NG: ".bin2hex($str)."\n";
+
+?>
+
+--EXPECT--
+1: c6fccbdcb8eca4c7a4b9a1a34555432d
+2: 30313233a4b3a4cecab8bbfacef3a4cfc6fccbdcb8eca4c7a4b9a1a34555432d4a50a4f2bbc8a4c3a4c6a4a4a4dea4b9a1a3c6fccbdcb8eca4cfccccc5ddbdada4a4a1a3
+3 OK
+4 OK: 30313233a4b3a4cecab8bbfacef3a4cf
+
+
diff --git a/ext/mbstring/tests/mb_substr_basic.phpt b/ext/mbstring/tests/mb_substr_basic.phpt
new file mode 100644
index 0000000..d6d6b75
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_basic.phpt
@@ -0,0 +1,57 @@
+--TEST--
+Test mb_substr() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr') or die("skip mb_substr() is not available in this build");
+?>
+--INI--
+mbstring.internal_encoding=ISO-8859-1
+--FILE--
+<?php
+/* Prototype : string mb_substr(string $str, int $start [, int $length [, string $encoding]])
+ * Description: Returns part of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test Basic Functionality of mb_substr with ASCII characters and multibyte strings.
+ */
+
+echo "*** Testing mb_substr() : basic functionality ***\n";
+
+$string_ascii = 'ABCDEF';
+//Japanese string in UTF-8
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+echo "\n-- ASCII string 1 --\n";
+var_dump(mb_substr($string_ascii, 3));
+
+echo "\n-- ASCII string 2 --\n";
+var_dump(mb_substr($string_ascii, 3, 5, 'ISO-8859-1'));
+
+echo "\n-- Multibyte string 1 --\n";
+$result_1 = mb_substr($string_mb, 2, 7);
+var_dump(base64_encode($result_1));
+
+echo "\n-- Multibyte string 2 --\n";
+$result_2 = mb_substr($string_mb, 2, 7, 'utf-8');
+var_dump(base64_encode($result_2));
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_substr() : basic functionality ***
+
+-- ASCII string 1 --
+string(3) "DEF"
+
+-- ASCII string 2 --
+string(3) "DEF"
+
+-- Multibyte string 1 --
+string(12) "peacrOiqng=="
+
+-- Multibyte string 2 --
+string(28) "6Kqe44OG44Kt44K544OI44Gn44GZ"
+Done
diff --git a/ext/mbstring/tests/mb_substr_count.phpt b/ext/mbstring/tests/mb_substr_count.phpt
new file mode 100644
index 0000000..5be5109
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_count.phpt
@@ -0,0 +1,44 @@
+--TEST--
+mb_substr_count()
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+output_handler=
+--FILE--
+<?php
+ mb_internal_encoding("EUC-JP");
+ var_dump(@mb_substr_count("", ""));
+ var_dump(@mb_substr_count("あ", ""));
+ var_dump(@mb_substr_count("", "あ"));
+ var_dump(@mb_substr_count("", "あ"));
+ var_dump(@mb_substr_count("", chr(0)));
+
+ $a = str_repeat("abcacba", 100);
+ var_dump(@mb_substr_count($a, "bca"));
+
+ $a = str_repeat("あいうあういあ", 100);
+ $b = "いうあ";
+ var_dump(@mb_substr_count($a, $b));
+
+ $to_enc = "UTF-8";
+ var_dump(@mb_substr_count(mb_convert_encoding($a, $to_enc),
+ mb_convert_encoding($b, $to_enc), $to_enc));
+
+ $to_enc = "Shift_JIS";
+ var_dump(@mb_substr_count(mb_convert_encoding($a, $to_enc),
+ mb_convert_encoding($b, $to_enc), $to_enc));
+
+ $a = str_repeat("abcacbabca", 100);
+ var_dump(@mb_substr_count($a, "bca"));
+?>
+--EXPECT--
+bool(false)
+bool(false)
+int(0)
+int(0)
+int(0)
+int(100)
+int(100)
+int(100)
+int(100)
+int(200)
diff --git a/ext/mbstring/tests/mb_substr_count_basic.phpt b/ext/mbstring/tests/mb_substr_count_basic.phpt
new file mode 100644
index 0000000..c4d1d78
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_count_basic.phpt
@@ -0,0 +1,47 @@
+--TEST--
+Test mb_substr_count() function : basic functionality
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr_count') or die("skip mb_substr_count() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_substr_count(string $haystack, string $needle [, string $encoding])
+ * Description: Count the number of substring occurrences
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test Basic functionality of mb_substr_count
+ */
+
+echo "*** Testing mb_substr_count() : basic functionality ***\n";
+
+$string_ascii = 'This is an English string. 0123456789.';
+
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+$needle_mb1 = base64_decode('44CC');
+$needle_mb2 = base64_decode('44GT44KT44Gr44Gh44Gv44CB5LiW55WM');
+
+echo "\n-- ASCII String --\n";
+var_dump(mb_substr_count($string_ascii, 'is'));
+var_dump(mb_substr_count($string_ascii, 'hello, world'));
+
+echo "\n-- Multibyte String --\n";
+var_dump(mb_substr_count($string_mb, $needle_mb1));
+var_dump(mb_substr_count($string_mb, $needle_mb2));
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_substr_count() : basic functionality ***
+
+-- ASCII String --
+int(3)
+int(0)
+
+-- Multibyte String --
+int(2)
+int(0)
+Done
diff --git a/ext/mbstring/tests/mb_substr_count_error1.phpt b/ext/mbstring/tests/mb_substr_count_error1.phpt
new file mode 100644
index 0000000..881ca0c
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_count_error1.phpt
@@ -0,0 +1,49 @@
+--TEST--
+Test mb_substr_count() function : error conditions - pass incorrect number of arguments
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr_count') or die("skip mb_substr_count() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_substr_count(string $haystack, string $needle [, string $encoding])
+ * Description: Count the number of substring occurrences
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass an incorrect number of arguments to mb_substr_count() to test behaviour
+ */
+
+echo "*** Testing mb_substr_count() : error conditions ***\n";
+
+
+//Test mb_substr_count with one more than the expected number of arguments
+echo "\n-- Testing mb_substr_count() function with more than expected no. of arguments --\n";
+$haystack = 'string_val';
+$needle = 'val';
+$encoding = 'utf-8';
+$extra_arg = 10;
+var_dump( mb_substr_count($haystack, $needle, $encoding, $extra_arg) );
+
+// Testing mb_substr_count with one less than the expected number of arguments
+echo "\n-- Testing mb_substr_count() function with less than expected no. of arguments --\n";
+$haystack = 'string_val';
+var_dump( mb_substr_count($haystack) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_substr_count() : error conditions ***
+
+-- Testing mb_substr_count() function with more than expected no. of arguments --
+
+Warning: mb_substr_count() expects at most 3 parameters, 4 given in %s on line %d
+NULL
+
+-- Testing mb_substr_count() function with less than expected no. of arguments --
+
+Warning: mb_substr_count() expects at least 2 parameters, 1 given in %s on line %d
+NULL
+Done
diff --git a/ext/mbstring/tests/mb_substr_count_error2.phpt b/ext/mbstring/tests/mb_substr_count_error2.phpt
new file mode 100644
index 0000000..aefb2c0
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_count_error2.phpt
@@ -0,0 +1,37 @@
+--TEST--
+Test mb_substr_count() function : error conditions - pass unknown encoding
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr_count') or die("skip mb_substr_count() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_substr_count(string $haystack, string $needle [, string $encoding])
+ * Description: Count the number of substring occurrences
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test behaviour of mb_substr_count() function when passed an unknown encoding
+ */
+
+echo "*** Testing mb_substr_count() : error conditions ***\n";
+
+$haystack = 'Hello, World!';
+$needle = 'Hello';
+$encoding = 'unknown-encoding';
+
+echo "\n-- Testing mb_substr_count() function with an unknown encoding --\n";
+var_dump(mb_substr_count($haystack, $needle, $encoding));
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_substr_count() : error conditions ***
+
+-- Testing mb_substr_count() function with an unknown encoding --
+
+Warning: mb_substr_count(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_substr_count_variation1.phpt b/ext/mbstring/tests/mb_substr_count_variation1.phpt
new file mode 100644
index 0000000..cc55135
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_count_variation1.phpt
@@ -0,0 +1,182 @@
+--TEST--
+Test mb_substr_count() function : usage variations - Pass different data types as $haystack arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr_count') or die("skip mb_substr_count() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype :int mb_substr_count(string $haystack, string $needle [, string $encoding])
+ * Description: Count the number of substring occurrences
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass different data types as $haystack argument to mb_substr_count() to test behaviour
+ */
+
+echo "*** Testing mb_substr_count() : usage variations ***\n";
+
+
+// Initialise function arguments not being substituted
+$needle = 'world';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "hello, world";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello, world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $haystack argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "hello, world",
+ 'hello, world',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_substr_count()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_substr_count($input, $needle) );
+ $iterator++;
+};
+
+fclose($fp);
+
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_substr_count() : usage variations ***
+
+-- Iteration 1 --
+int(0)
+
+-- Iteration 2 --
+int(0)
+
+-- Iteration 3 --
+int(0)
+
+-- Iteration 4 --
+int(0)
+
+-- Iteration 5 --
+int(0)
+
+-- Iteration 6 --
+int(0)
+
+-- Iteration 7 --
+int(0)
+
+-- Iteration 8 --
+int(0)
+
+-- Iteration 9 --
+int(0)
+
+-- Iteration 10 --
+int(0)
+
+-- Iteration 11 --
+int(0)
+
+-- Iteration 12 --
+int(0)
+
+-- Iteration 13 --
+int(0)
+
+-- Iteration 14 --
+int(0)
+
+-- Iteration 15 --
+int(0)
+
+-- Iteration 16 --
+int(0)
+
+-- Iteration 17 --
+int(0)
+
+-- Iteration 18 --
+int(1)
+
+-- Iteration 19 --
+int(1)
+
+-- Iteration 20 --
+int(1)
+
+-- Iteration 21 --
+int(1)
+
+-- Iteration 22 --
+int(0)
+
+-- Iteration 23 --
+int(0)
+
+-- Iteration 24 --
+
+Warning: mb_substr_count() expects parameter 1 to be string, resource given in %s on line %d
+NULL
+Done
diff --git a/ext/mbstring/tests/mb_substr_count_variation2.phpt b/ext/mbstring/tests/mb_substr_count_variation2.phpt
new file mode 100644
index 0000000..87b5eed
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_count_variation2.phpt
@@ -0,0 +1,196 @@
+--TEST--
+Test mb_substr_count() function : usage variations - pass different data types as $needle arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr_count') or die("skip mb_substr_count() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_substr_count(string $haystack, string $needle [, string $encoding])
+ * Description: Count the number of substring occurrences
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass different data types as $needle to mb_substr_count() to test behaviour
+ */
+
+echo "*** Testing mb_substr_count() : usage variations ***\n";
+
+// Initialise function arguments not being substituted (if any)
+$haystack = 'hello, world';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "world";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $needle argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "world",
+ 'world',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_substr_count()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_substr_count($haystack, $input) );
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_substr_count() : usage variations ***
+
+-- Iteration 1 --
+int(0)
+
+-- Iteration 2 --
+int(0)
+
+-- Iteration 3 --
+int(0)
+
+-- Iteration 4 --
+int(0)
+
+-- Iteration 5 --
+int(0)
+
+-- Iteration 6 --
+int(0)
+
+-- Iteration 7 --
+int(0)
+
+-- Iteration 8 --
+int(0)
+
+-- Iteration 9 --
+int(0)
+
+-- Iteration 10 --
+
+Warning: mb_substr_count(): Empty substring in %s on line %d
+bool(false)
+
+-- Iteration 11 --
+
+Warning: mb_substr_count(): Empty substring in %s on line %d
+bool(false)
+
+-- Iteration 12 --
+int(0)
+
+-- Iteration 13 --
+
+Warning: mb_substr_count(): Empty substring in %s on line %d
+bool(false)
+
+-- Iteration 14 --
+int(0)
+
+-- Iteration 15 --
+
+Warning: mb_substr_count(): Empty substring in %s on line %d
+bool(false)
+
+-- Iteration 16 --
+
+Warning: mb_substr_count(): Empty substring in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_substr_count(): Empty substring in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+int(1)
+
+-- Iteration 19 --
+int(1)
+
+-- Iteration 20 --
+int(1)
+
+-- Iteration 21 --
+int(1)
+
+-- Iteration 22 --
+
+Warning: mb_substr_count(): Empty substring in %s on line %d
+bool(false)
+
+-- Iteration 23 --
+
+Warning: mb_substr_count(): Empty substring in %s on line %d
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_substr_count() expects parameter 2 to be string, resource given in %s on line %d
+NULL
+Done
diff --git a/ext/mbstring/tests/mb_substr_count_variation3.phpt b/ext/mbstring/tests/mb_substr_count_variation3.phpt
new file mode 100644
index 0000000..65c8769
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_count_variation3.phpt
@@ -0,0 +1,220 @@
+--TEST--
+Test mb_substr_count() function :usage variations - pass different data types as $encoding arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr_count') or die("skip mb_substr_count() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_substr_count(string $haystack, string $needle [, string $encoding])
+ * Description: Count the number of substring occurrences
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass different data types as $encoding argument to mb_substr_count() to test behaviour
+ * Where possible, 'UTF-8' is entered as string value
+ */
+
+echo "*** Testing mb_substr_count() : usage variations ***\n";
+
+// Initialise function arguments not being substituted (if any)
+$haystack = b'hello, world';
+$needle = b'world';
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $encoding argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_substr_count()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_substr_count($haystack, $needle, $input) );
+ $iterator++;
+};
+
+fclose($fp);
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_substr_count() : usage variations ***
+
+-- Iteration 1 --
+
+Warning: mb_substr_count(): Unknown encoding "0" in %s on line %d
+bool(false)
+
+-- Iteration 2 --
+
+Warning: mb_substr_count(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 3 --
+
+Warning: mb_substr_count(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_substr_count(): Unknown encoding "-2345" in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_substr_count(): Unknown encoding "10.5" in %s on line %d
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_substr_count(): Unknown encoding "-10.5" in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_substr_count(): Unknown encoding "123456789000" in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+
+Warning: mb_substr_count(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+-- Iteration 9 --
+
+Warning: mb_substr_count(): Unknown encoding "0.5" in %s on line %d
+bool(false)
+
+-- Iteration 10 --
+
+Warning: mb_substr_count(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 11 --
+
+Warning: mb_substr_count(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 12 --
+
+Warning: mb_substr_count(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 13 --
+
+Warning: mb_substr_count(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 14 --
+
+Warning: mb_substr_count(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 15 --
+
+Warning: mb_substr_count(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 16 --
+
+Warning: mb_substr_count(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_substr_count(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+int(1)
+
+-- Iteration 19 --
+int(1)
+
+-- Iteration 20 --
+int(1)
+
+-- Iteration 21 --
+int(1)
+
+-- Iteration 22 --
+
+Warning: mb_substr_count(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 23 --
+
+Warning: mb_substr_count(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_substr_count() expects parameter 3 to be string, resource given in %s on line %d
+NULL
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_substr_count_variation4.phpt b/ext/mbstring/tests/mb_substr_count_variation4.phpt
new file mode 100644
index 0000000..624c95a
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_count_variation4.phpt
@@ -0,0 +1,44 @@
+--TEST--
+Test mb_substr_count() function : variation - pass a $needle that overlaps in $haystack
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr_count') or die("skip mb_substr_count() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : int mb_substr_count(string $haystack, string $needle [, string $encoding])
+ * Description: Count the number of substring occurrences
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass mb_substr_count() a $needle that overlaps in $haystack and see whether
+ * it counts only the first occurrence or all other occurrences regardless whether they
+ * were part of previous match
+ */
+
+echo "*** Testing mb_substr_count() : usage variations ***\n";
+
+
+echo "\n-- ASCII String --\n";
+$string_ascii = b'abcabcabc';
+var_dump(mb_substr_count($string_ascii, b'abcabc')); //needle overlaps in haystack
+
+echo "\n-- Multibyte String --\n";
+$string_mb = base64_decode('5pel5pys6Kqe5pel5pys6Kqe5pel5pys6Kqe');
+$needle_mb = base64_decode('5pel5pys6Kqe5pel5pys6Kqe');
+var_dump(mb_substr_count($string_mb, $needle_mb, 'utf-8'));
+
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_substr_count() : usage variations ***
+
+-- ASCII String --
+int(1)
+
+-- Multibyte String --
+int(1)
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_substr_error1.phpt b/ext/mbstring/tests/mb_substr_error1.phpt
new file mode 100644
index 0000000..e48b319
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_error1.phpt
@@ -0,0 +1,49 @@
+--TEST--
+Test mb_substr() function : error conditions - Pass incorrect number of args
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr') or die("skip mb_substr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_substr(string $str, int $start [, int $length [, string $encoding]])
+ * Description: Returns part of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass incorrect number of arguments to mb_substr() to test behaviour
+ */
+
+echo "*** Testing mb_substr() : error conditions ***\n";
+
+//Test mb_substr with one more than the expected number of arguments
+echo "\n-- Testing mb_substr() function with more than expected no. of arguments --\n";
+$str = 'string_val';
+$start = 10;
+$length = 10;
+$encoding = 'string_val';
+$extra_arg = 10;
+var_dump( mb_substr($str, $start, $length, $encoding, $extra_arg) );
+
+// Testing mb_substr with one less than the expected number of arguments
+echo "\n-- Testing mb_substr() function with less than expected no. of arguments --\n";
+$str = 'string_val';
+var_dump( mb_substr($str) );
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_substr() : error conditions ***
+
+-- Testing mb_substr() function with more than expected no. of arguments --
+
+Warning: mb_substr() expects at most 4 parameters, 5 given in %s on line %d
+NULL
+
+-- Testing mb_substr() function with less than expected no. of arguments --
+
+Warning: mb_substr() expects at least 2 parameters, 1 given in %s on line %d
+NULL
+Done
diff --git a/ext/mbstring/tests/mb_substr_error2.phpt b/ext/mbstring/tests/mb_substr_error2.phpt
new file mode 100644
index 0000000..72be974
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_error2.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test mb_substr() function : error conditions - Pass an unknown encoding
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr') or die("skip mb_substr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_substr(string $str, int $start [, int $length [, string $encoding]])
+ * Description: Returns part of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass an unknown encoding to mb_substr() to test behaviour
+ */
+
+echo "*** Testing mb_substr() : error conditions ***\n";
+
+$str = 'Hello, world';
+$start = 1;
+$length = 5;
+$encoding = 'unknown-encoding';
+
+var_dump( mb_substr($str, $start, $length, $encoding));
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_substr() : error conditions ***
+
+Warning: mb_substr(): Unknown encoding "unknown-encoding" in %s on line %d
+bool(false)
+Done
diff --git a/ext/mbstring/tests/mb_substr_variation1.phpt b/ext/mbstring/tests/mb_substr_variation1.phpt
new file mode 100644
index 0000000..b02daa3
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_variation1.phpt
@@ -0,0 +1,181 @@
+--TEST--
+Test mb_substr() function : usage variations - pass unexpected arguments (including strings) in place of $str
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr') or die("skip mb_substr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_substr(string $str, int $start [, int $length [, string $encoding]])
+ * Description: Returns part of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass different data types as $str to mb_substr() to test behaviour
+ */
+
+echo "*** Testing mb_substr() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$start = 0;
+$length = 5;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "Class A object";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+hello world
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $str argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "string",
+ 'string',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_substr()
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ var_dump( mb_substr($input, $start, $length));
+ $iterator++;
+};
+
+fclose($fp);
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_substr() : usage variations ***
+
+-- Iteration 1 --
+string(1) "0"
+
+-- Iteration 2 --
+string(1) "1"
+
+-- Iteration 3 --
+string(5) "12345"
+
+-- Iteration 4 --
+string(5) "-2345"
+
+-- Iteration 5 --
+string(4) "10.5"
+
+-- Iteration 6 --
+string(5) "-10.5"
+
+-- Iteration 7 --
+string(5) "12345"
+
+-- Iteration 8 --
+string(5) "1.234"
+
+-- Iteration 9 --
+string(3) "0.5"
+
+-- Iteration 10 --
+string(0) ""
+
+-- Iteration 11 --
+string(0) ""
+
+-- Iteration 12 --
+string(1) "1"
+
+-- Iteration 13 --
+string(0) ""
+
+-- Iteration 14 --
+string(1) "1"
+
+-- Iteration 15 --
+string(0) ""
+
+-- Iteration 16 --
+string(0) ""
+
+-- Iteration 17 --
+string(0) ""
+
+-- Iteration 18 --
+string(5) "strin"
+
+-- Iteration 19 --
+string(5) "strin"
+
+-- Iteration 20 --
+string(5) "hello"
+
+-- Iteration 21 --
+string(5) "Class"
+
+-- Iteration 22 --
+string(0) ""
+
+-- Iteration 23 --
+string(0) ""
+
+-- Iteration 24 --
+
+Warning: mb_substr() expects parameter 1 to be string, resource given in %s on line %d
+NULL
+Done
+
diff --git a/ext/mbstring/tests/mb_substr_variation2.phpt b/ext/mbstring/tests/mb_substr_variation2.phpt
new file mode 100644
index 0000000..7c02601
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_variation2.phpt
@@ -0,0 +1,227 @@
+--TEST--
+Test mb_substr() function : usage variations - Pass different data types as $encoding arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr') or die("skip mb_substr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_substr(string $str, int $start [, int $length [, string $encoding]])
+ * Description: Returns part of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass different data types as $encoding argument to mb_substr() to test behaviour
+ * Where possible, 'UTF-8' is entered as string value
+ */
+
+echo "*** Testing mb_substr() : usage variations ***\n";
+
+// Initialise function arguments not being substituted
+$str = b'string_val';
+$start = 1;
+$length = 5;
+
+//get an unset variable
+$unset_var = 10;
+unset ($unset_var);
+
+// get a class
+class classA
+{
+ public function __toString() {
+ return "UTF-8";
+ }
+}
+
+// heredoc string
+$heredoc = <<<EOT
+UTF-8
+EOT;
+
+// get a resource variable
+$fp = fopen(__FILE__, "r");
+
+// unexpected values to be passed to $input argument
+$inputs = array(
+
+ // int data
+/*1*/ 0,
+ 1,
+ 12345,
+ -2345,
+
+ // float data
+/*5*/ 10.5,
+ -10.5,
+ 12.3456789000e10,
+ 12.3456789000E-10,
+ .5,
+
+ // null data
+/*10*/ NULL,
+ null,
+
+ // boolean data
+/*12*/ true,
+ false,
+ TRUE,
+ FALSE,
+
+ // empty data
+/*16*/ "",
+ '',
+
+ // string data
+/*18*/ "UTF-8",
+ 'UTF-8',
+ $heredoc,
+
+ // object data
+/*21*/ new classA(),
+
+ // undefined data
+/*22*/ @$undefined_var,
+
+ // unset data
+/*23*/ @$unset_var,
+
+ // resource variable
+/*24*/ $fp
+);
+
+// loop through each element of $inputs to check the behavior of mb_substr
+$iterator = 1;
+foreach($inputs as $input) {
+ echo "\n-- Iteration $iterator --\n";
+ $res = mb_substr($str, $start, $length, $input);
+ if ($res === false) {
+ var_dump($res);
+ }
+ else {
+ var_dump(bin2hex($res));
+ }
+ $iterator++;
+};
+
+fclose($fp);
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_substr() : usage variations ***
+
+-- Iteration 1 --
+
+Warning: mb_substr(): Unknown encoding "0" in %s on line %d
+bool(false)
+
+-- Iteration 2 --
+
+Warning: mb_substr(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 3 --
+
+Warning: mb_substr(): Unknown encoding "12345" in %s on line %d
+bool(false)
+
+-- Iteration 4 --
+
+Warning: mb_substr(): Unknown encoding "-2345" in %s on line %d
+bool(false)
+
+-- Iteration 5 --
+
+Warning: mb_substr(): Unknown encoding "10.5" in %s on line %d
+bool(false)
+
+-- Iteration 6 --
+
+Warning: mb_substr(): Unknown encoding "-10.5" in %s on line %d
+bool(false)
+
+-- Iteration 7 --
+
+Warning: mb_substr(): Unknown encoding "123456789000" in %s on line %d
+bool(false)
+
+-- Iteration 8 --
+
+Warning: mb_substr(): Unknown encoding "1.23456789E-9" in %s on line %d
+bool(false)
+
+-- Iteration 9 --
+
+Warning: mb_substr(): Unknown encoding "0.5" in %s on line %d
+bool(false)
+
+-- Iteration 10 --
+
+Warning: mb_substr(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 11 --
+
+Warning: mb_substr(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 12 --
+
+Warning: mb_substr(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 13 --
+
+Warning: mb_substr(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 14 --
+
+Warning: mb_substr(): Unknown encoding "1" in %s on line %d
+bool(false)
+
+-- Iteration 15 --
+
+Warning: mb_substr(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 16 --
+
+Warning: mb_substr(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 17 --
+
+Warning: mb_substr(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 18 --
+string(10) "7472696e67"
+
+-- Iteration 19 --
+string(10) "7472696e67"
+
+-- Iteration 20 --
+string(10) "7472696e67"
+
+-- Iteration 21 --
+string(10) "7472696e67"
+
+-- Iteration 22 --
+
+Warning: mb_substr(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 23 --
+
+Warning: mb_substr(): Unknown encoding "" in %s on line %d
+bool(false)
+
+-- Iteration 24 --
+
+Warning: mb_substr() expects parameter 4 to be string, resource given in %s on line %d
+string(0) ""
+Done
+
diff --git a/ext/mbstring/tests/mb_substr_variation3.phpt b/ext/mbstring/tests/mb_substr_variation3.phpt
new file mode 100644
index 0000000..f0ba2bc
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_variation3.phpt
@@ -0,0 +1,445 @@
+--TEST--
+Test mb_substr() function : usage variations - test different encodings
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr') or die("skip mb_substr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_substr(string $str, int $start [, int $length [, string $encoding]])
+ * Description: Returns part of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Pass all encodings listed on php.net to test that function recognises them.
+ * NB: The strings passed are *NOT* necessarily encoded in the encoding passed to the function.
+ * This test is purely to see whether the function recognises the encoding.
+ */
+
+echo "*** Testing mb_substr() : usage variations ***\n";
+
+$encoding = array('UCS-4', /*1*/
+ 'UCS-4BE',
+ 'UCS-4LE',
+ 'UCS-2',
+ 'UCS-2BE', /*5*/
+ 'UCS-2LE',
+ 'UTF-32',
+ 'UTF-32BE',
+ 'UTF-32LE',
+ 'UTF-16', /*10*/
+ 'UTF-16BE',
+ 'UTF-16LE',
+ 'UTF-7',
+ 'UTF7-IMAP',
+ 'UTF-8', /*15*/
+ 'ASCII',
+ 'EUC-JP',
+ 'SJIS',
+ 'eucJP-win',
+ 'SJIS-win', /*20*/
+ 'ISO-2022-JP',
+ 'JIS',
+ 'ISO-8859-1',
+ 'ISO-8859-2',
+ 'ISO-8859-3', /*25*/
+ 'ISO-8859-4',
+ 'ISO-8859-5',
+ 'ISO-8859-6',
+ 'ISO-8859-7',
+ 'ISO-8859-8', /*30*/
+ 'ISO-8859-9',
+ 'ISO-8859-10',
+ 'ISO-8859-13',
+ 'ISO-8859-14',
+ 'ISO-8859-15', /*35*/
+ 'byte2be',
+ 'byte2le',
+ 'byte4be',
+ 'byte4le',
+ 'BASE64', /*40*/
+ 'HTML-ENTITIES',
+ '7bit',
+ '8bit',
+ 'EUC-CN',
+ 'CP936', /*45*/
+ 'HZ',
+ 'EUC-TW',
+ 'CP950',
+ 'BIG-5',
+ 'EUC-KR', /*50*/
+ 'UHC',
+ 'ISO-2022-KR',
+ 'Windows-1251',
+ 'Windows-1252',
+ 'CP866', /*55*/
+ 'KOI8-R'); /*56*/
+
+
+
+$iterator = 1;
+$string_ascii = 'abc def';
+//Japanese string encoded in UTF-8
+$string_mb = base64_decode('44K/44OT44Ol44Os44O844OG44Kj44Oz44Kw44O744Oe44K344O844Oz44O744Kr44Oz44OR44OL44O8');
+
+foreach($encoding as $enc) {
+ echo "\n-- Iteration $iterator: $enc --\n";
+
+ echo "-- ASCII String --\n";
+ if (mb_substr($string_ascii, 1, 5, $enc)) {
+ echo "Encoding $enc recognised\n";
+ } else {
+ echo "Encoding $enc not recognised\n";
+ }
+
+ echo "-- Multibyte String --\n";
+ if (mb_substr($string_mb, 1, 5, $enc)) {
+ echo "Encoding $enc recognised\n";
+ } else {
+ echo "Encoding $enc not recognised\n";
+ }
+}
+
+echo "Done";
+?>
+--EXPECTF--
+*** Testing mb_substr() : usage variations ***
+
+-- Iteration 1: UCS-4 --
+-- ASCII String --
+Encoding UCS-4 recognised
+-- Multibyte String --
+Encoding UCS-4 recognised
+
+-- Iteration 1: UCS-4BE --
+-- ASCII String --
+Encoding UCS-4BE recognised
+-- Multibyte String --
+Encoding UCS-4BE recognised
+
+-- Iteration 1: UCS-4LE --
+-- ASCII String --
+Encoding UCS-4LE recognised
+-- Multibyte String --
+Encoding UCS-4LE recognised
+
+-- Iteration 1: UCS-2 --
+-- ASCII String --
+Encoding UCS-2 recognised
+-- Multibyte String --
+Encoding UCS-2 recognised
+
+-- Iteration 1: UCS-2BE --
+-- ASCII String --
+Encoding UCS-2BE recognised
+-- Multibyte String --
+Encoding UCS-2BE recognised
+
+-- Iteration 1: UCS-2LE --
+-- ASCII String --
+Encoding UCS-2LE recognised
+-- Multibyte String --
+Encoding UCS-2LE recognised
+
+-- Iteration 1: UTF-32 --
+-- ASCII String --
+Encoding UTF-32 recognised
+-- Multibyte String --
+Encoding UTF-32 recognised
+
+-- Iteration 1: UTF-32BE --
+-- ASCII String --
+Encoding UTF-32BE recognised
+-- Multibyte String --
+Encoding UTF-32BE recognised
+
+-- Iteration 1: UTF-32LE --
+-- ASCII String --
+Encoding UTF-32LE recognised
+-- Multibyte String --
+Encoding UTF-32LE recognised
+
+-- Iteration 1: UTF-16 --
+-- ASCII String --
+Encoding UTF-16 recognised
+-- Multibyte String --
+Encoding UTF-16 recognised
+
+-- Iteration 1: UTF-16BE --
+-- ASCII String --
+Encoding UTF-16BE recognised
+-- Multibyte String --
+Encoding UTF-16BE recognised
+
+-- Iteration 1: UTF-16LE --
+-- ASCII String --
+Encoding UTF-16LE recognised
+-- Multibyte String --
+Encoding UTF-16LE recognised
+
+-- Iteration 1: UTF-7 --
+-- ASCII String --
+Encoding UTF-7 recognised
+-- Multibyte String --
+Encoding UTF-7 recognised
+
+-- Iteration 1: UTF7-IMAP --
+-- ASCII String --
+Encoding UTF7-IMAP recognised
+-- Multibyte String --
+Encoding UTF7-IMAP recognised
+
+-- Iteration 1: UTF-8 --
+-- ASCII String --
+Encoding UTF-8 recognised
+-- Multibyte String --
+Encoding UTF-8 recognised
+
+-- Iteration 1: ASCII --
+-- ASCII String --
+Encoding ASCII recognised
+-- Multibyte String --
+Encoding ASCII recognised
+
+-- Iteration 1: EUC-JP --
+-- ASCII String --
+Encoding EUC-JP recognised
+-- Multibyte String --
+Encoding EUC-JP recognised
+
+-- Iteration 1: SJIS --
+-- ASCII String --
+Encoding SJIS recognised
+-- Multibyte String --
+Encoding SJIS recognised
+
+-- Iteration 1: eucJP-win --
+-- ASCII String --
+Encoding eucJP-win recognised
+-- Multibyte String --
+Encoding eucJP-win recognised
+
+-- Iteration 1: SJIS-win --
+-- ASCII String --
+Encoding SJIS-win recognised
+-- Multibyte String --
+Encoding SJIS-win recognised
+
+-- Iteration 1: ISO-2022-JP --
+-- ASCII String --
+Encoding ISO-2022-JP recognised
+-- Multibyte String --
+Encoding ISO-2022-JP recognised
+
+-- Iteration 1: JIS --
+-- ASCII String --
+Encoding JIS recognised
+-- Multibyte String --
+Encoding JIS recognised
+
+-- Iteration 1: ISO-8859-1 --
+-- ASCII String --
+Encoding ISO-8859-1 recognised
+-- Multibyte String --
+Encoding ISO-8859-1 recognised
+
+-- Iteration 1: ISO-8859-2 --
+-- ASCII String --
+Encoding ISO-8859-2 recognised
+-- Multibyte String --
+Encoding ISO-8859-2 recognised
+
+-- Iteration 1: ISO-8859-3 --
+-- ASCII String --
+Encoding ISO-8859-3 recognised
+-- Multibyte String --
+Encoding ISO-8859-3 recognised
+
+-- Iteration 1: ISO-8859-4 --
+-- ASCII String --
+Encoding ISO-8859-4 recognised
+-- Multibyte String --
+Encoding ISO-8859-4 recognised
+
+-- Iteration 1: ISO-8859-5 --
+-- ASCII String --
+Encoding ISO-8859-5 recognised
+-- Multibyte String --
+Encoding ISO-8859-5 recognised
+
+-- Iteration 1: ISO-8859-6 --
+-- ASCII String --
+Encoding ISO-8859-6 recognised
+-- Multibyte String --
+Encoding ISO-8859-6 recognised
+
+-- Iteration 1: ISO-8859-7 --
+-- ASCII String --
+Encoding ISO-8859-7 recognised
+-- Multibyte String --
+Encoding ISO-8859-7 recognised
+
+-- Iteration 1: ISO-8859-8 --
+-- ASCII String --
+Encoding ISO-8859-8 recognised
+-- Multibyte String --
+Encoding ISO-8859-8 recognised
+
+-- Iteration 1: ISO-8859-9 --
+-- ASCII String --
+Encoding ISO-8859-9 recognised
+-- Multibyte String --
+Encoding ISO-8859-9 recognised
+
+-- Iteration 1: ISO-8859-10 --
+-- ASCII String --
+Encoding ISO-8859-10 recognised
+-- Multibyte String --
+Encoding ISO-8859-10 recognised
+
+-- Iteration 1: ISO-8859-13 --
+-- ASCII String --
+Encoding ISO-8859-13 recognised
+-- Multibyte String --
+Encoding ISO-8859-13 recognised
+
+-- Iteration 1: ISO-8859-14 --
+-- ASCII String --
+Encoding ISO-8859-14 recognised
+-- Multibyte String --
+Encoding ISO-8859-14 recognised
+
+-- Iteration 1: ISO-8859-15 --
+-- ASCII String --
+Encoding ISO-8859-15 recognised
+-- Multibyte String --
+Encoding ISO-8859-15 recognised
+
+-- Iteration 1: byte2be --
+-- ASCII String --
+Encoding byte2be recognised
+-- Multibyte String --
+Encoding byte2be recognised
+
+-- Iteration 1: byte2le --
+-- ASCII String --
+Encoding byte2le recognised
+-- Multibyte String --
+Encoding byte2le recognised
+
+-- Iteration 1: byte4be --
+-- ASCII String --
+Encoding byte4be recognised
+-- Multibyte String --
+Encoding byte4be recognised
+
+-- Iteration 1: byte4le --
+-- ASCII String --
+Encoding byte4le recognised
+-- Multibyte String --
+Encoding byte4le recognised
+
+-- Iteration 1: BASE64 --
+-- ASCII String --
+Encoding BASE64 recognised
+-- Multibyte String --
+Encoding BASE64 recognised
+
+-- Iteration 1: HTML-ENTITIES --
+-- ASCII String --
+Encoding HTML-ENTITIES recognised
+-- Multibyte String --
+Encoding HTML-ENTITIES recognised
+
+-- Iteration 1: 7bit --
+-- ASCII String --
+Encoding 7bit recognised
+-- Multibyte String --
+Encoding 7bit recognised
+
+-- Iteration 1: 8bit --
+-- ASCII String --
+Encoding 8bit recognised
+-- Multibyte String --
+Encoding 8bit recognised
+
+-- Iteration 1: EUC-CN --
+-- ASCII String --
+Encoding EUC-CN recognised
+-- Multibyte String --
+Encoding EUC-CN recognised
+
+-- Iteration 1: CP936 --
+-- ASCII String --
+Encoding CP936 recognised
+-- Multibyte String --
+Encoding CP936 recognised
+
+-- Iteration 1: HZ --
+-- ASCII String --
+Encoding HZ recognised
+-- Multibyte String --
+Encoding HZ recognised
+
+-- Iteration 1: EUC-TW --
+-- ASCII String --
+Encoding EUC-TW recognised
+-- Multibyte String --
+Encoding EUC-TW recognised
+
+-- Iteration 1: CP950 --
+-- ASCII String --
+Encoding CP950 recognised
+-- Multibyte String --
+Encoding CP950 recognised
+
+-- Iteration 1: BIG-5 --
+-- ASCII String --
+Encoding BIG-5 recognised
+-- Multibyte String --
+Encoding BIG-5 recognised
+
+-- Iteration 1: EUC-KR --
+-- ASCII String --
+Encoding EUC-KR recognised
+-- Multibyte String --
+Encoding EUC-KR recognised
+
+-- Iteration 1: UHC --
+-- ASCII String --
+Encoding UHC recognised
+-- Multibyte String --
+Encoding UHC recognised
+
+-- Iteration 1: ISO-2022-KR --
+-- ASCII String --
+Encoding ISO-2022-KR recognised
+-- Multibyte String --
+Encoding ISO-2022-KR recognised
+
+-- Iteration 1: Windows-1251 --
+-- ASCII String --
+Encoding Windows-1251 recognised
+-- Multibyte String --
+Encoding Windows-1251 recognised
+
+-- Iteration 1: Windows-1252 --
+-- ASCII String --
+Encoding Windows-1252 recognised
+-- Multibyte String --
+Encoding Windows-1252 recognised
+
+-- Iteration 1: CP866 --
+-- ASCII String --
+Encoding CP866 recognised
+-- Multibyte String --
+Encoding CP866 recognised
+
+-- Iteration 1: KOI8-R --
+-- ASCII String --
+Encoding KOI8-R recognised
+-- Multibyte String --
+Encoding KOI8-R recognised
+Done
diff --git a/ext/mbstring/tests/mb_substr_variation4.phpt b/ext/mbstring/tests/mb_substr_variation4.phpt
new file mode 100644
index 0000000..c4a723a
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_variation4.phpt
@@ -0,0 +1,132 @@
+--TEST--
+Test mb_substr() function : usage variations - pass different integers to $start arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr') or die("skip mb_substr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_substr(string $str, int $start [, int $length [, string $encoding]])
+ * Description: Returns part of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test how mb_substr() behaves when passed a range of integers as $start argument
+ */
+
+echo "*** Testing mb_substr() : usage variations ***\n";
+
+mb_internal_encoding('UTF-8');
+
+$string_ascii = b'+Is an English string'; //21 chars
+
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); //21 chars
+
+/*
+ * Loop through integers as multiples of ten for $offset argument
+ * 60 is larger than *BYTE* count for $string_mb
+ */
+for ($i = -60; $i <= 60; $i += 10) {
+ if (@$a || @$b) {
+ $a = null;
+ $b = null;
+ }
+ echo "\n**-- Offset is: $i --**\n";
+ echo "-- ASCII String --\n";
+ $a = mb_substr($string_ascii, $i, 4);
+ var_dump(base64_encode($a));
+ echo "--Multibyte String --\n";
+ $b = mb_substr($string_mb, $i, 4, 'UTF-8');
+ if (strlen($a) == mb_strlen($b, 'UTF-8')) { // should return same length
+ var_dump(base64_encode($b));
+ } else {
+ echo "Difference in length of ASCII string and multibyte string\n";
+ }
+
+}
+
+echo "Done";
+?>
+--EXPECT--
+*** Testing mb_substr() : usage variations ***
+
+**-- Offset is: -60 --**
+-- ASCII String --
+string(8) "K0lzIA=="
+--Multibyte String --
+string(16) "5pel5pys6Kqe44OG"
+
+**-- Offset is: -50 --**
+-- ASCII String --
+string(8) "K0lzIA=="
+--Multibyte String --
+string(16) "5pel5pys6Kqe44OG"
+
+**-- Offset is: -40 --**
+-- ASCII String --
+string(8) "K0lzIA=="
+--Multibyte String --
+string(16) "5pel5pys6Kqe44OG"
+
+**-- Offset is: -30 --**
+-- ASCII String --
+string(8) "K0lzIA=="
+--Multibyte String --
+string(16) "5pel5pys6Kqe44OG"
+
+**-- Offset is: -20 --**
+-- ASCII String --
+string(8) "SXMgYQ=="
+--Multibyte String --
+string(16) "5pys6Kqe44OG44Kt"
+
+**-- Offset is: -10 --**
+-- ASCII String --
+string(8) "aXNoIA=="
+--Multibyte String --
+string(8) "MTIzNA=="
+
+**-- Offset is: 0 --**
+-- ASCII String --
+string(8) "K0lzIA=="
+--Multibyte String --
+string(16) "5pel5pys6Kqe44OG"
+
+**-- Offset is: 10 --**
+-- ASCII String --
+string(8) "bGlzaA=="
+--Multibyte String --
+string(8) "MDEyMw=="
+
+**-- Offset is: 20 --**
+-- ASCII String --
+string(4) "Zw=="
+--Multibyte String --
+string(4) "44CC"
+
+**-- Offset is: 30 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: 40 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: 50 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: 60 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_substr_variation5.phpt b/ext/mbstring/tests/mb_substr_variation5.phpt
new file mode 100644
index 0000000..11caa9c
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_variation5.phpt
@@ -0,0 +1,133 @@
+--TEST--
+Test mb_substr() function : usage variations - pass different integers to $length arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr') or die("skip mb_substr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_substr(string $str, int $start [, int $length [, string $encoding]])
+ * Description: Returns part of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test how mb_substr() behaves when passed a range of integers as $length argument
+ */
+
+echo "*** Testing mb_substr() : usage variations ***\n";
+
+mb_internal_encoding('UTF-8');
+
+$string_ascii = b'+Is an English string'; //21 chars
+
+//Japanese string, 21 characters
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+/*
+ * Loop through integers as multiples of ten for $offset argument
+ * 60 is larger than *BYTE* count for $string_mb
+ */
+for ($i = -60; $i <= 60; $i += 10) {
+ if (@$a || @$b) {
+ $a = null;
+ $b = null;
+ }
+ echo "\n**-- Offset is: $i --**\n";
+ echo "-- ASCII String --\n";
+ $a = mb_substr($string_ascii, 1, $i);
+ var_dump(base64_encode($a));
+ echo "--Multibyte String --\n";
+ $b = mb_substr($string_mb, 1, $i, 'UTF-8');
+ if (strlen($a) == mb_strlen($b, 'UTF-8')) { // should return same length
+ var_dump(base64_encode($b));
+ } else {
+ echo "Difference in length of ASCII string and multibyte string\n";
+ }
+
+}
+
+echo "Done";
+?>
+--EXPECT--
+*** Testing mb_substr() : usage variations ***
+
+**-- Offset is: -60 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: -50 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: -40 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: -30 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: -20 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: -10 --**
+-- ASCII String --
+string(16) "SXMgYW4gRW5nbA=="
+--Multibyte String --
+string(40) "5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMA=="
+
+**-- Offset is: 0 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: 10 --**
+-- ASCII String --
+string(16) "SXMgYW4gRW5nbA=="
+--Multibyte String --
+string(40) "5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMA=="
+
+**-- Offset is: 20 --**
+-- ASCII String --
+string(28) "SXMgYW4gRW5nbGlzaCBzdHJpbmc="
+--Multibyte String --
+string(68) "5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
+
+**-- Offset is: 30 --**
+-- ASCII String --
+string(28) "SXMgYW4gRW5nbGlzaCBzdHJpbmc="
+--Multibyte String --
+string(68) "5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
+
+**-- Offset is: 40 --**
+-- ASCII String --
+string(28) "SXMgYW4gRW5nbGlzaCBzdHJpbmc="
+--Multibyte String --
+string(68) "5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
+
+**-- Offset is: 50 --**
+-- ASCII String --
+string(28) "SXMgYW4gRW5nbGlzaCBzdHJpbmc="
+--Multibyte String --
+string(68) "5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
+
+**-- Offset is: 60 --**
+-- ASCII String --
+string(28) "SXMgYW4gRW5nbGlzaCBzdHJpbmc="
+--Multibyte String --
+string(68) "5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII="
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_substr_variation6.phpt b/ext/mbstring/tests/mb_substr_variation6.phpt
new file mode 100644
index 0000000..20ee1ec
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_variation6.phpt
@@ -0,0 +1,137 @@
+--TEST--
+Test mb_substr() function : usage variations - pass different integers to $start arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr') or die("skip mb_substr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_substr(string $str, int $start [, int $length [, string $encoding]])
+ * Description: Returns part of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test how mb_substr() behaves when passed a range of integers as $start argument
+ */
+
+echo "*** Testing mb_substr() : usage variations ***\n";
+
+mb_internal_encoding('UTF-8');
+
+$string_ascii = b'+Is an English string'; //21 chars
+
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII='); //21 chars
+
+/*
+ * Loop through integers as multiples of ten for $offset argument
+ * 60 is larger than *BYTE* count for $string_mb
+ */
+for ($i = -60; $i <= 60; $i += 10) {
+ if (@$a || @$b) {
+ $a = null;
+ $b = null;
+ }
+ echo "\n**-- Offset is: $i --**\n";
+ echo "-- ASCII String --\n";
+ $a = mb_substr($string_ascii, $i, 4);
+ if ($a !== false) {
+ var_dump(bin2hex($a));
+ }
+ else {
+ var_dump($a);
+ }
+ echo "--Multibyte String --\n";
+ $b = mb_substr($string_mb, $i, 4, 'UTF-8');
+ if (strlen($a) == mb_strlen($b, 'UTF-8')) { // should return same length
+ var_dump(bin2hex($b));
+ } else {
+ echo "Difference in length of ASCII string and multibyte string\n";
+ }
+
+}
+
+echo "Done";
+?>
+--EXPECT--
+*** Testing mb_substr() : usage variations ***
+
+**-- Offset is: -60 --**
+-- ASCII String --
+string(8) "2b497320"
+--Multibyte String --
+string(24) "e697a5e69cace8aa9ee38386"
+
+**-- Offset is: -50 --**
+-- ASCII String --
+string(8) "2b497320"
+--Multibyte String --
+string(24) "e697a5e69cace8aa9ee38386"
+
+**-- Offset is: -40 --**
+-- ASCII String --
+string(8) "2b497320"
+--Multibyte String --
+string(24) "e697a5e69cace8aa9ee38386"
+
+**-- Offset is: -30 --**
+-- ASCII String --
+string(8) "2b497320"
+--Multibyte String --
+string(24) "e697a5e69cace8aa9ee38386"
+
+**-- Offset is: -20 --**
+-- ASCII String --
+string(8) "49732061"
+--Multibyte String --
+string(24) "e69cace8aa9ee38386e382ad"
+
+**-- Offset is: -10 --**
+-- ASCII String --
+string(8) "69736820"
+--Multibyte String --
+string(8) "31323334"
+
+**-- Offset is: 0 --**
+-- ASCII String --
+string(8) "2b497320"
+--Multibyte String --
+string(24) "e697a5e69cace8aa9ee38386"
+
+**-- Offset is: 10 --**
+-- ASCII String --
+string(8) "6c697368"
+--Multibyte String --
+string(8) "30313233"
+
+**-- Offset is: 20 --**
+-- ASCII String --
+string(2) "67"
+--Multibyte String --
+string(6) "e38082"
+
+**-- Offset is: 30 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: 40 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: 50 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: 60 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/mb_substr_variation7.phpt b/ext/mbstring/tests/mb_substr_variation7.phpt
new file mode 100644
index 0000000..4d68097
--- /dev/null
+++ b/ext/mbstring/tests/mb_substr_variation7.phpt
@@ -0,0 +1,138 @@
+--TEST--
+Test mb_substr() function : usage variations - pass different integers to $length arg
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_substr') or die("skip mb_substr() is not available in this build");
+?>
+--FILE--
+<?php
+/* Prototype : string mb_substr(string $str, int $start [, int $length [, string $encoding]])
+ * Description: Returns part of a string
+ * Source code: ext/mbstring/mbstring.c
+ */
+
+/*
+ * Test how mb_substr() behaves when passed a range of integers as $length argument
+ */
+
+echo "*** Testing mb_substr() : usage variations ***\n";
+
+mb_internal_encoding('UTF-8');
+
+$string_ascii = b'+Is an English string'; //21 chars
+
+//Japanese string, 21 characters
+$string_mb = base64_decode('5pel5pys6Kqe44OG44Kt44K544OI44Gn44GZ44CCMDEyMzTvvJXvvJbvvJfvvJjvvJnjgII=');
+
+/*
+ * Loop through integers as multiples of ten for $offset argument
+ * 60 is larger than *BYTE* count for $string_mb
+ */
+for ($i = -60; $i <= 60; $i += 10) {
+ if (@$a || @$b) {
+ $a = null;
+ $b = null;
+ }
+ echo "\n**-- Offset is: $i --**\n";
+ echo "-- ASCII String --\n";
+ $a = mb_substr($string_ascii, 1, $i);
+ if ($a !== false) {
+ var_dump(bin2hex($a));
+ }
+ else {
+ var_dump($a);
+ }
+ echo "--Multibyte String --\n";
+ $b = mb_substr($string_mb, 1, $i, 'UTF-8');
+ if (strlen($a) == mb_strlen($b, 'UTF-8')) { // should return same length
+ var_dump(bin2hex($b));
+ } else {
+ echo "Difference in length of ASCII string and multibyte string\n";
+ }
+
+}
+
+echo "Done";
+?>
+--EXPECT--
+*** Testing mb_substr() : usage variations ***
+
+**-- Offset is: -60 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: -50 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: -40 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: -30 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: -20 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: -10 --**
+-- ASCII String --
+string(20) "497320616e20456e676c"
+--Multibyte String --
+string(56) "e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e3808230"
+
+**-- Offset is: 0 --**
+-- ASCII String --
+string(0) ""
+--Multibyte String --
+string(0) ""
+
+**-- Offset is: 10 --**
+-- ASCII String --
+string(20) "497320616e20456e676c"
+--Multibyte String --
+string(56) "e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e3808230"
+
+**-- Offset is: 20 --**
+-- ASCII String --
+string(40) "497320616e20456e676c69736820737472696e67"
+--Multibyte String --
+string(100) "e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+
+**-- Offset is: 30 --**
+-- ASCII String --
+string(40) "497320616e20456e676c69736820737472696e67"
+--Multibyte String --
+string(100) "e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+
+**-- Offset is: 40 --**
+-- ASCII String --
+string(40) "497320616e20456e676c69736820737472696e67"
+--Multibyte String --
+string(100) "e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+
+**-- Offset is: 50 --**
+-- ASCII String --
+string(40) "497320616e20456e676c69736820737472696e67"
+--Multibyte String --
+string(100) "e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+
+**-- Offset is: 60 --**
+-- ASCII String --
+string(40) "497320616e20456e676c69736820737472696e67"
+--Multibyte String --
+string(100) "e69cace8aa9ee38386e382ade382b9e38388e381a7e38199e380823031323334efbc95efbc96efbc97efbc98efbc99e38082"
+Done \ No newline at end of file
diff --git a/ext/mbstring/tests/overload01.phpt b/ext/mbstring/tests/overload01.phpt
new file mode 100644
index 0000000..b0990e8
--- /dev/null
+++ b/ext/mbstring/tests/overload01.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Function overloading test 1
+--SKIPIF--
+<?php
+ extension_loaded('mbstring') or die('skip mbstring not available');
+ if (!function_exists("mail")) {
+ die('skip mail() function is not available.');
+ }
+?>
+--INI--
+output_handler=
+mbstring.func_overload=7
+mbstring.internal_encoding=EUC-JP
+--FILE--
+<?php
+echo mb_internal_encoding()."\n";
+
+$ngchars = array('能','表','蚕','ソ');
+$str = '元禄養蚕會社詐欺表現能力表示噂免停暴力貼付構文圭子予知饅頭ソファー';
+var_dump(strlen($str));
+var_dump(mb_strlen($str));
+--EXPECT--
+EUC-JP
+int(33)
+int(33)
diff --git a/ext/mbstring/tests/overload02.phpt b/ext/mbstring/tests/overload02.phpt
new file mode 100644
index 0000000..9b5cecd
--- /dev/null
+++ b/ext/mbstring/tests/overload02.phpt
@@ -0,0 +1,36 @@
+--TEST--
+Function overloading test 2
+--SKIPIF--
+<?php
+ extension_loaded('mbstring') or die('skip mbstring not available');
+ if (!function_exists("mail")) {
+ die('skip mail() function is not available.');
+ }
+ if (!function_exists("mb_ereg_replace")) {
+ die('skip mb_ereg_replace() function is not available.');
+ }
+?>
+--INI--
+output_handler=
+mbstring.func_overload=7
+mbstring.internal_encoding=EUC-JP
+--FILE--
+<?php
+echo mb_internal_encoding()."\n";
+
+$ngchars = array('能','表','蚕','ソ');
+$str = '元禄養蚕會社詐欺表現能力表示噂免停暴力貼付構文圭子予知饅頭ソファー';
+$converted_str = mb_convert_encoding($str, 'Shift_JIS');
+mb_regex_encoding('Shift_JIS');
+foreach($ngchars as $c) {
+ $c = mb_convert_encoding($c, 'Shift_JIS');
+ $replaced = mb_convert_encoding(ereg_replace($c, '!!', $converted_str), mb_internal_encoding(), 'Shift_JIS');
+ var_dump(strpos($replaced, '!!'));
+}
+?>
+--EXPECT--
+EUC-JP
+int(10)
+int(8)
+int(3)
+int(29)
diff --git a/ext/mbstring/tests/php_gr_jp_10830.phpt b/ext/mbstring/tests/php_gr_jp_10830.phpt
new file mode 100644
index 0000000..1cbfc2a
--- /dev/null
+++ b/ext/mbstring/tests/php_gr_jp_10830.phpt
@@ -0,0 +1,20 @@
+--TEST--
+php-users@php.gr.jp #10830
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+function_exists('mb_ereg') or die("skip mb_ereg() is not available in this build");
+?>
+--FILE--
+<?php
+$a="aaa\n<>";
+
+var_dump( mb_ereg("^[^><]+$",$a) );
+var_dump( ereg("^[^><]+$",$a) );
+?>
+
+--EXPECTF--
+bool(false)
+
+Deprecated: Function ereg() is deprecated in %s on line %d
+bool(false)
diff --git a/ext/mbstring/tests/php_gr_jp_16242.phpt b/ext/mbstring/tests/php_gr_jp_16242.phpt
new file mode 100644
index 0000000..f693cf8
--- /dev/null
+++ b/ext/mbstring/tests/php_gr_jp_16242.phpt
@@ -0,0 +1,21 @@
+--TEST--
+php-users@php.gr.jp #16242
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+?>
+--INI--
+mbstring.language=Japanese
+mbstring.internal_encoding=UTF-8
+--FILE--
+<?php
+
+var_dump(ini_get('mbstring.language'));
+var_dump(ini_get('mbstring.internal_encoding'));
+var_dump(mb_internal_encoding());
+
+?>
+--EXPECT--
+string(8) "Japanese"
+string(5) "UTF-8"
+string(5) "UTF-8"
diff --git a/ext/mbstring/tests/php_gr_jp_dev_884-1.phpt b/ext/mbstring/tests/php_gr_jp_dev_884-1.phpt
new file mode 100644
index 0000000..64fc054
--- /dev/null
+++ b/ext/mbstring/tests/php_gr_jp_dev_884-1.phpt
@@ -0,0 +1,19 @@
+--TEST--
+php-dev@php.gr.jp #884 (1)
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+set_time_limit(2);
+var_dump(ereg_replace(".*", "b", "a"));
+var_dump(preg_replace("/.*/", "b", "a"));
+var_dump(mb_ereg_replace(".*", "b", "a"));
+?>
+--EXPECTF--
+Deprecated: Function ereg_replace() is deprecated in %s on line %d
+string(2) "bb"
+string(2) "bb"
+string(2) "bb"
diff --git a/ext/mbstring/tests/php_gr_jp_dev_884-2.phpt b/ext/mbstring/tests/php_gr_jp_dev_884-2.phpt
new file mode 100644
index 0000000..937b217
--- /dev/null
+++ b/ext/mbstring/tests/php_gr_jp_dev_884-2.phpt
@@ -0,0 +1,23 @@
+--TEST--
+php-dev@php.gr.jp #884 (2)
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+function_exists('mb_ereg_replace') or die("skip mb_ereg_replace() is not available in this build");
+?>
+--FILE--
+<?php
+var_dump(mb_ereg_replace("C?$", "Z", "ABC"));
+var_dump(ereg_replace("C?$", "Z", "ABC"));
+var_dump(mb_ereg_replace("C*$", "Z", "ABC"));
+var_dump(ereg_replace("C*$", "Z", "ABC"));
+?>
+--EXPECTF--
+string(4) "ABZZ"
+
+Deprecated: Function ereg_replace() is deprecated in %s on line %d
+string(4) "ABZZ"
+string(4) "ABZZ"
+
+Deprecated: Function ereg_replace() is deprecated in %s on line %d
+string(4) "ABZZ"
diff --git a/ext/mbstring/tests/pictogram1.phpt b/ext/mbstring/tests/pictogram1.phpt
new file mode 100644
index 0000000..2c96099
--- /dev/null
+++ b/ext/mbstring/tests/pictogram1.phpt
@@ -0,0 +1,172 @@
+--TEST--
+Emoji (Pictogram characters for cellular phone in Japan) test based on Unicode 6.0
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+mb_substitute_character(0x3f);
+
+echo "SJIS-Mobile to Unicode\n";
+var_dump(bin2hex(mb_convert_encoding("\xf8\x9f", "UCS-4BE", "SJIS-Mobile#DOCOMO")));
+var_dump(bin2hex(mb_convert_encoding("\xf6\x60", "UCS-4BE", "SJIS-Mobile#KDDI")));
+var_dump(bin2hex(mb_convert_encoding("\xf9\x8b", "UCS-4BE", "SJIS-Mobile#SOFTBANK")));
+
+var_dump(bin2hex(mb_convert_encoding("\xf9\xe6", "UCS-4BE", "SJIS-Mobile#DOCOMO")));
+var_dump(bin2hex(mb_convert_encoding("\xf6\xec", "UCS-4BE", "SJIS-Mobile#KDDI")));
+var_dump(bin2hex(mb_convert_encoding("\xf7\x50", "UCS-4BE", "SJIS-Mobile#SOFTBANK")));
+
+var_dump(bin2hex(mb_convert_encoding("\xf9\x85", "UCS-4BE", "SJIS-Mobile#DOCOMO")));
+var_dump(bin2hex(mb_convert_encoding("\xf4\x89", "UCS-4BE", "SJIS-Mobile#KDDI")));
+var_dump(bin2hex(mb_convert_encoding("\xf7\xb0", "UCS-4BE", "SJIS-Mobile#SOFTBANK")));
+
+var_dump(bin2hex(mb_convert_encoding("\xf3\xd2", "UCS-4BE", "SJIS-Mobile#KDDI")));
+var_dump(bin2hex(mb_convert_encoding("\xfb\xb3", "UCS-4BE", "SJIS-Mobile#SOFTBANK")));
+
+echo "Unicode to SJIS-Mobile\n";
+var_dump(bin2hex(mb_convert_encoding("\x00\x00\x26\x00", "SJIS-Mobile#DOCOMO", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x00\x26\x00", "SJIS-Mobile#KDDI", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x00\x26\x00", "SJIS-Mobile#SOFTBANK", "UCS-4BE")));
+
+var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf3\x40", "SJIS-Mobile#DOCOMO", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf3\x40", "SJIS-Mobile#KDDI", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf3\x40", "SJIS-Mobile#SOFTBANK", "UCS-4BE")));
+
+var_dump(bin2hex(mb_convert_encoding("\x00\x00\x00\x23\x00\x00\x20\xe3", "SJIS-Mobile#DOCOMO", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x00\x00\x23\x00\x00\x20\xe3", "SJIS-Mobile#KDDI", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x00\x00\x23\x00\x00\x20\xe3", "SJIS-Mobile#SOFTBANK", "UCS-4BE")));
+
+var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf1\xe8\x00\x01\xf1\xf3", "SJIS-Mobile#DOCOMO", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf1\xe8\x00\x01\xf1\xf3", "SJIS-Mobile#KDDI", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf1\xe8\x00\x01\xf1\xf3", "SJIS-Mobile#SOFTBANK", "UCS-4BE")));
+
+echo "UTF-8-Mobile to Unicode\n";
+var_dump(bin2hex(mb_convert_encoding("\xee\x98\xbe", "UCS-4BE", "UTF-8-Mobile#DOCOMO")));
+var_dump(bin2hex(mb_convert_encoding("\xee\xbd\xa0", "UCS-4BE", "UTF-8-Mobile#KDDI")));
+var_dump(bin2hex(mb_convert_encoding("\xee\x81\x8a", "UCS-4BE", "UTF-8-Mobile#SOFTBANK")));
+
+var_dump(bin2hex(mb_convert_encoding("\xee\x9d\x81", "UCS-4BE", "UTF-8-Mobile#DOCOMO")));
+var_dump(bin2hex(mb_convert_encoding("\xee\xbf\xac", "UCS-4BE", "UTF-8-Mobile#KDDI")));
+var_dump(bin2hex(mb_convert_encoding("\xee\x84\x90", "UCS-4BE", "UTF-8-Mobile#SOFTBANK")));
+
+var_dump(bin2hex(mb_convert_encoding("\xee\x9b\xa0", "UCS-4BE", "UTF-8-Mobile#DOCOMO")));
+var_dump(bin2hex(mb_convert_encoding("\xee\xb6\x89", "UCS-4BE", "UTF-8-Mobile#KDDI")));
+var_dump(bin2hex(mb_convert_encoding("\xee\x88\x90", "UCS-4BE", "UTF-8-Mobile#SOFTBANK")));
+
+var_dump(bin2hex(mb_convert_encoding("\xee\xb3\x92", "UCS-4BE", "UTF-8-Mobile#KDDI")));
+var_dump(bin2hex(mb_convert_encoding("\xee\x94\x93", "UCS-4BE", "UTF-8-Mobile#SOFTBANK")));
+
+echo "Unicode to UTF8-Mobile\n";
+var_dump(bin2hex(mb_convert_encoding("\x00\x00\x26\x00", "UTF-8-Mobile#DOCOMO", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x00\x26\x00", "UTF-8-Mobile#KDDI", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x00\x26\x00", "UTF-8-Mobile#SOFTBANK", "UCS-4BE")));
+
+var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf3\x40", "UTF-8-Mobile#DOCOMO", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf3\x40", "UTF-8-Mobile#KDDI", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf3\x40", "UTF-8-Mobile#SOFTBANK", "UCS-4BE")));
+
+var_dump(bin2hex(mb_convert_encoding("\x00\x00\x00\x23\x00\x00\x20\xe3", "UTF-8-Mobile#DOCOMO", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x00\x00\x23\x00\x00\x20\xe3", "UTF-8-Mobile#KDDI", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x00\x00\x23\x00\x00\x20\xe3", "UTF-8-Mobile#SOFTBANK", "UCS-4BE")));
+
+var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf1\xe8\x00\x01\xf1\xf3", "UTF-8-Mobile#DOCOMO", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf1\xe8\x00\x01\xf1\xf3", "UTF-8-Mobile#KDDI", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf1\xe8\x00\x01\xf1\xf3", "UTF-8-Mobile#SOFTBANK", "UCS-4BE")));
+
+echo "Unicode to ISO-2022-JP-MOBILE#KDDI\n";
+var_dump(bin2hex(mb_convert_encoding("\x00\x00\x26\x00", "ISO-2022-JP-MOBILE#KDDI", "UCS-4BE")));
+
+echo "ISO-2022-JP-MOBILE#KDDI to Unicode\n";
+var_dump(bin2hex(mb_convert_encoding("\x1b\x24\x42\x75\x41\x1b\x28\x42", "UCS-4BE", "ISO-2022-JP-MOBILE#KDDI")));
+
+echo "SJIS-Mobile to Unicode (Google) \n";
+var_dump(bin2hex(mb_convert_encoding("\xf9\x86", "UCS-4BE", "SJIS-Mobile#DOCOMO")));
+var_dump(bin2hex(mb_convert_encoding("\xf7\x48", "UCS-4BE", "SJIS-Mobile#KDDI")));
+var_dump(bin2hex(mb_convert_encoding("\xfb\xd8", "UCS-4BE", "SJIS-Mobile#SOFTBANK")));
+
+echo "Unicode (Google) to SJIS-Mobile\n";
+var_dump(bin2hex(mb_convert_encoding("\x00\x0f\xe8\x2d", "SJIS-Mobile#DOCOMO", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x0f\xe8\x2d", "SJIS-Mobile#KDDI", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x0f\xee\x70", "SJIS-Mobile#SOFTBANK", "UCS-4BE")));
+
+echo "UTF-8-Mobile to Unicode (Google) \n";
+var_dump(bin2hex(mb_convert_encoding("\xee\x9b\xa1", "UCS-4BE", "UTF-8-Mobile#DOCOMO")));
+var_dump(bin2hex(mb_convert_encoding("\xef\x81\x88", "UCS-4BE", "UTF-8-Mobile#KDDI")));
+var_dump(bin2hex(mb_convert_encoding("\xee\x94\xb8", "UCS-4BE", "UTF-8-Mobile#SOFTBANK")));//
+
+echo "Unicode (Google) to UTF-8-Mobile\n";
+var_dump(bin2hex(mb_convert_encoding("\x00\x0f\xe8\x2d", "UTF-8-Mobile#DOCOMO", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x0f\xe8\x2d", "UTF-8-Mobile#KDDI", "UCS-4BE")));
+var_dump(bin2hex(mb_convert_encoding("\x00\x0f\xee\x70", "UTF-8-Mobile#SOFTBANK", "UCS-4BE")));//
+
+?>
+--EXPECT--
+SJIS-Mobile to Unicode
+string(8) "00002600"
+string(8) "00002600"
+string(8) "00002600"
+string(8) "0001f340"
+string(8) "0001f340"
+string(8) "0001f340"
+string(16) "00000023000020e3"
+string(16) "00000023000020e3"
+string(16) "00000023000020e3"
+string(16) "0001f1e80001f1f3"
+string(16) "0001f1e80001f1f3"
+Unicode to SJIS-Mobile
+string(4) "f89f"
+string(4) "f660"
+string(4) "f98b"
+string(4) "f9e6"
+string(4) "f6ec"
+string(4) "f750"
+string(4) "f985"
+string(4) "f489"
+string(4) "f7b0"
+string(4) "3f3f"
+string(4) "f3d2"
+string(4) "fbb3"
+UTF-8-Mobile to Unicode
+string(8) "00002600"
+string(8) "00002600"
+string(8) "00002600"
+string(8) "0001f340"
+string(8) "0001f340"
+string(8) "0001f340"
+string(16) "00000023000020e3"
+string(16) "00000023000020e3"
+string(16) "00000023000020e3"
+string(16) "0001f1e80001f1f3"
+string(16) "0001f1e80001f1f3"
+Unicode to UTF8-Mobile
+string(6) "ee98be"
+string(6) "eebda0"
+string(6) "ee818a"
+string(6) "ee9d81"
+string(6) "eebfac"
+string(6) "ee8490"
+string(6) "ee9ba0"
+string(6) "eeb689"
+string(6) "ee8890"
+string(16) "f09f87a8f09f87b3"
+string(6) "eeb392"
+string(6) "ee9493"
+Unicode to ISO-2022-JP-MOBILE#KDDI
+string(16) "1b244275411b2842"
+ISO-2022-JP-MOBILE#KDDI to Unicode
+string(8) "00002600"
+SJIS-Mobile to Unicode (Google)
+string(8) "000fe82d"
+string(8) "000fe82d"
+string(8) "000fee70"
+Unicode (Google) to SJIS-Mobile
+string(4) "f986"
+string(4) "f748"
+string(4) "fbd8"
+UTF-8-Mobile to Unicode (Google)
+string(8) "000fe82d"
+string(8) "000fe82d"
+string(8) "000fee70"
+Unicode (Google) to UTF-8-Mobile
+string(6) "ee9ba1"
+string(6) "ef8188"
+string(6) "ee94b8"
diff --git a/ext/mbstring/tests/simpletest.phpt b/ext/mbstring/tests/simpletest.phpt
new file mode 100644
index 0000000..80b2f72
--- /dev/null
+++ b/ext/mbstring/tests/simpletest.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Simple multi-byte print test (EUC-JP)
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--INI--
+output_handler=
+--FILE--
+<?php
+/*
+ * Test basic PHP functions to check if it works with multi-byte chars
+ */
+
+// EUC-JP strings
+$s1 = "マルチバイト関数が使えます。";
+$s2 = "この文字が連結されているはず。";
+
+// print directly
+echo "echo: ".$s1.$s2."\n";
+print("print: ".$s1.$s2."\n");
+printf("printf: %s%s\n",$s1, $s2);
+echo sprintf("sprintf: %s%s\n",$s1, $s2);
+
+// Assign to var
+$s3 = $s1.$s2."\n";
+echo "echo: ".$s3;
+
+?>
+--EXPECT--
+echo: マルチバイト関数が使えます。この文字が連結されているはず。
+print: マルチバイト関数が使えます。この文字が連結されているはず。
+printf: マルチバイト関数が使えます。この文字が連結されているはず。
+sprintf: マルチバイト関数が使えます。この文字が連結されているはず。
+echo: マルチバイト関数が使えます。この文字が連結されているはず。
+
diff --git a/ext/mbstring/tests/skipif.inc b/ext/mbstring/tests/skipif.inc
new file mode 100644
index 0000000..7eec8aa
--- /dev/null
+++ b/ext/mbstring/tests/skipif.inc
@@ -0,0 +1,14 @@
+<?php
+// This script prints "skip" if condition does not meet.
+
+/*
+if (!extension_loaded("mbstring") && ini_get("enable_dl")) {
+ $dlext = (substr(PHP_OS, 0, 3) == "WIN") ? ".dll" : ".so";
+ @dl("mbstring$dlext");
+}
+*/
+
+if (!extension_loaded("mbstring")) {
+ die("skip\n");
+}
+?>
diff --git a/ext/mbstring/tests/zend_multibyte-01.phpt b/ext/mbstring/tests/zend_multibyte-01.phpt
new file mode 100644
index 0000000..d96e0f0
--- /dev/null
+++ b/ext/mbstring/tests/zend_multibyte-01.phpt
@@ -0,0 +1,23 @@
+--TEST--
+zend multibyte (1)
+--SKIPIF--
+<?php
+ini_set("mbstring.script_encoding","SJIS");
+if (ini_set("mbstring.script_encoding","SJIS") != "SJIS") {
+ die("skip zend-multibyte is not available");
+}
+?>
+--INI--
+mbstring.script_encoding=Shift_JIS
+mbstring.internal_encoding=Shift_JIS
+--FILE--
+<?php
+ function \\\($)
+ {
+ echo $;
+ }
+
+ \\\("h~t@\");
+?>
+--EXPECT--
+h~t@\
diff --git a/ext/mbstring/tests/zend_multibyte-02.phpt b/ext/mbstring/tests/zend_multibyte-02.phpt
new file mode 100644
index 0000000..c94dee5
--- /dev/null
+++ b/ext/mbstring/tests/zend_multibyte-02.phpt
@@ -0,0 +1,18 @@
+--TEST--
+zend multibyte (2)
+--SKIPIF--
+<?php
+ini_set("mbstring.script_encoding","SJIS");
+if (ini_set("mbstring.script_encoding","SJIS") != "SJIS") {
+ die("skip zend-multibyte is not available");
+}
+?>
+--INI--
+mbstring.script_encoding=UTF-8
+mbstring.internal_encoding=CP932
+--FILE--
+<?php
+var_dump(bin2hex("鴻"));
+?>
+--EXPECT--
+string(12) "836583588367"
diff --git a/ext/mbstring/tests/zend_multibyte-03.phpt b/ext/mbstring/tests/zend_multibyte-03.phpt
new file mode 100644
index 0000000..46a262c
--- /dev/null
+++ b/ext/mbstring/tests/zend_multibyte-03.phpt
@@ -0,0 +1,18 @@
+--TEST--
+zend multibyte (3)
+--SKIPIF--
+<?php
+ini_set("mbstring.script_encoding","SJIS");
+if (ini_set("mbstring.script_encoding","SJIS") != "SJIS") {
+ die("skip zend-multibyte is not available");
+}
+?>
+--INI--
+mbstring.script_encoding=UTF-8
+mbstring.internal_encoding=EUC-JP
+--FILE--
+<?php
+var_dump(bin2hex("鴻"));
+?>
+--EXPECT--
+string(12) "a5c6a5b9a5c8"
diff --git a/ext/mbstring/tests/zend_multibyte-04.phpt b/ext/mbstring/tests/zend_multibyte-04.phpt
new file mode 100644
index 0000000..f1295b6
--- /dev/null
+++ b/ext/mbstring/tests/zend_multibyte-04.phpt
@@ -0,0 +1,18 @@
+--TEST--
+zend multibyte (4)
+--SKIPIF--
+<?php
+ini_set("mbstring.script_encoding","SJIS");
+if (ini_set("mbstring.script_encoding","SJIS") != "SJIS") {
+ die("skip zend-multibyte is not available");
+}
+?>
+--INI--
+mbstring.script_encoding=CP932
+mbstring.internal_encoding=UTF-8
+--FILE--
+<?php
+var_dump(bin2hex("eXg"));
+?>
+--EXPECT--
+string(18) "e38386e382b9e38388"
diff --git a/ext/mbstring/tests/zend_multibyte-05.phpt b/ext/mbstring/tests/zend_multibyte-05.phpt
new file mode 100644
index 0000000..0a01c23
--- /dev/null
+++ b/ext/mbstring/tests/zend_multibyte-05.phpt
@@ -0,0 +1,21 @@
+--TEST--
+zend multibyte (5)
+--SKIPIF--
+<?php
+ini_set("mbstring.script_encoding","SJIS");
+if (ini_set("mbstring.script_encoding","SJIS") != "SJIS") {
+ die("skip zend-multibyte is not available");
+}
+?>
+--INI--
+mbstring.script_encoding=EUC-JP
+mbstring.internal_encoding=UTF-8
+--FILE--
+<?php
+// forcefully interpret an UTF-8 encoded string as EUC-JP and then convert it
+// back to UTF-8. There should be only a pair of consecutive bytes that is
+// valid EUC-encoded character "藉".
+var_dump(bin2hex("鴻"));
+?>
+--EXPECT--
+string(16) "3f3f3fe9b4bb3f3f"
diff --git a/ext/mbstring/tests/zend_multibyte-06.phpt b/ext/mbstring/tests/zend_multibyte-06.phpt
new file mode 100644
index 0000000..9acd6a9
--- /dev/null
+++ b/ext/mbstring/tests/zend_multibyte-06.phpt
@@ -0,0 +1,19 @@
+--TEST--
+zend multibyte (6)
+--SKIPIF--
+<?php
+ini_set("mbstring.script_encoding","SJIS");
+if (ini_set("mbstring.script_encoding","SJIS") != "SJIS") {
+ die("skip zend-multibyte is not available");
+}
+?>
+--INI--
+mbstring.script_encoding=EUC-JP
+mbstring.internal_encoding=CP932
+--FILE--
+<?php
+declare(encoding="UTF-8");
+var_dump(bin2hex("鴻"));
+?>
+--EXPECT--
+string(12) "836583588367"
diff --git a/ext/mbstring/tests/zend_multibyte-07.phpt b/ext/mbstring/tests/zend_multibyte-07.phpt
new file mode 100644
index 0000000..30305f5
--- /dev/null
+++ b/ext/mbstring/tests/zend_multibyte-07.phpt
@@ -0,0 +1,19 @@
+--TEST--
+zend multibyte (7)
+--SKIPIF--
+<?php
+ini_set("mbstring.script_encoding","SJIS");
+if (ini_set("mbstring.script_encoding","SJIS") != "SJIS") {
+ die("skip zend-multibyte is not available");
+}
+?>
+--INI--
+mbstring.script_encoding=ISO-8859-1
+mbstring.internal_encoding=EUC-JP
+--FILE--
+<?php
+declare(encoding="UTF-8");
+var_dump(bin2hex("鴻"));
+?>
+--EXPECT--
+string(12) "a5c6a5b9a5c8"
diff --git a/ext/mbstring/tests/zend_multibyte-08.phpt b/ext/mbstring/tests/zend_multibyte-08.phpt
new file mode 100644
index 0000000..ab27461
--- /dev/null
+++ b/ext/mbstring/tests/zend_multibyte-08.phpt
@@ -0,0 +1,19 @@
+--TEST--
+zend multibyte (8)
+--SKIPIF--
+<?php
+ini_set("mbstring.script_encoding","SJIS");
+if (ini_set("mbstring.script_encoding","SJIS") != "SJIS") {
+ die("skip zend-multibyte is not available");
+}
+?>
+--INI--
+mbstring.script_encoding=ISO-8859-1
+mbstring.internal_encoding=UTF-8
+--FILE--
+<?php
+declare(encoding="CP932");
+var_dump(bin2hex("eXg"));
+?>
+--EXPECT--
+string(18) "e38386e382b9e38388"
diff --git a/ext/mbstring/tests/zend_multibyte-09.phpt b/ext/mbstring/tests/zend_multibyte-09.phpt
new file mode 100644
index 0000000..79ee435
--- /dev/null
+++ b/ext/mbstring/tests/zend_multibyte-09.phpt
@@ -0,0 +1,22 @@
+--TEST--
+zend multibyte (9)
+--SKIPIF--
+<?php
+ini_set("mbstring.script_encoding","SJIS");
+if (ini_set("mbstring.script_encoding","SJIS") != "SJIS") {
+ die("skip zend-multibyte is not available");
+}
+?>
+--INI--
+mbstring.script_encoding=cp1251
+mbstring.internal_encoding=UTF-8
+--FILE--
+<?php
+declare(encoding="EUC-JP");
+// forcefully interpret an UTF-8 encoded string as EUC-JP and then convert it
+// back to UTF-8. There should be only a pair of consecutive bytes that is
+// valid EUC-encoded character "藉".
+var_dump(bin2hex("鴻"));
+?>
+--EXPECT--
+string(16) "3f3f3fe9b4bb3f3f"
diff --git a/ext/mbstring/tests/zend_multibyte-10.phpt b/ext/mbstring/tests/zend_multibyte-10.phpt
new file mode 100644
index 0000000..435c339
--- /dev/null
+++ b/ext/mbstring/tests/zend_multibyte-10.phpt
@@ -0,0 +1,17 @@
+--TEST--
+zend multibyte (10)
+--SKIPIF--
+<?php
+ini_set("mbstring.script_encoding","SJIS");
+if (ini_set("mbstring.script_encoding","SJIS") != "SJIS") {
+ die("skip zend-multibyte is not available");
+}
+?>
+--FILE--
+<?php
+declare(encoding="ISO-8859-15");
+declare(encoding="ISO-8859-1");
+echo "ok\n";
+?>
+--EXPECTF--
+ok
diff --git a/ext/mbstring/tests/zend_multibyte-11.phpt b/ext/mbstring/tests/zend_multibyte-11.phpt
new file mode 100644
index 0000000..b79e433
--- /dev/null
+++ b/ext/mbstring/tests/zend_multibyte-11.phpt
@@ -0,0 +1,18 @@
+--TEST--
+zend multibyte (11)
+--SKIPIF--
+<?php
+ini_set("mbstring.script_encoding","SJIS");
+if (ini_set("mbstring.script_encoding","SJIS") != "SJIS") {
+ die("skip zend-multibyte is not available");
+}
+?>
+--FILE--
+<?php
+declare(encoding="ISO-8859-15") {
+ declare(encoding="ISO-8859-1");
+ echo "ok\n";
+}
+?>
+--EXPECTF--
+ok
diff --git a/ext/mbstring/tests/zend_multibyte-12.phpt b/ext/mbstring/tests/zend_multibyte-12.phpt
new file mode 100644
index 0000000..e1c8ce5
--- /dev/null
+++ b/ext/mbstring/tests/zend_multibyte-12.phpt
@@ -0,0 +1,17 @@
+--TEST--
+zend multibyte (12)
+--SKIPIF--
+<?php
+ini_set("mbstring.script_encoding","SJIS");
+if (ini_set("mbstring.script_encoding","SJIS") != "SJIS") {
+ die("skip zend-multibyte is not available");
+}
+?>
+--FILE--
+<?php
+declare(encoding="ISO-8859-15");
+echo 1;
+declare(encoding="ISO-8859-1");
+?>
+--EXPECTF--
+Fatal error: Encoding declaration pragma must be the very first statement in the script in %s on line 4
diff --git a/ext/mbstring/tests/zend_multibyte-13.phpt b/ext/mbstring/tests/zend_multibyte-13.phpt
new file mode 100644
index 0000000..e601a6c
--- /dev/null
+++ b/ext/mbstring/tests/zend_multibyte-13.phpt
@@ -0,0 +1,23 @@
+--TEST--
+zend multibyte (13)
+--SKIPIF--
+<?php
+ini_set("mbstring.script_encoding","SJIS");
+if (ini_set("mbstring.script_encoding","SJIS") != "SJIS") {
+ die("skip zend-multibyte is not available");
+}
+?>
+--INI--
+mbstring.script_encoding=UTF-8
+mbstring.internal_encoding=ISO-8859-1
+--FILE--
+<?php
+var_dump(substr(file_get_contents(__FILE__), __COMPILER_HALT_OFFSET__));
+var_dump(bin2hex("辰谷端叩辿炭"));
+__halt_compiler();test
+test
+--EXPECT--
+string(10) "test
+test
+"
+string(12) "e4ebfce1e9fa"
diff --git a/ext/mbstring/tests/zend_multibyte-14.phpt b/ext/mbstring/tests/zend_multibyte-14.phpt
new file mode 100644
index 0000000..04bc409
--- /dev/null
+++ b/ext/mbstring/tests/zend_multibyte-14.phpt
@@ -0,0 +1,23 @@
+--TEST--
+zend multibyte (14)
+--SKIPIF--
+<?php
+ini_set("mbstring.script_encoding","SJIS");
+if (ini_set("mbstring.script_encoding","SJIS") != "SJIS") {
+ die("skip zend-multibyte is not available");
+}
+?>
+--INI--
+mbstring.script_encoding=UTF-8
+mbstring.internal_encoding=UTF-8
+--FILE--
+<?php
+var_dump(substr(file_get_contents(__FILE__), __COMPILER_HALT_OFFSET__));
+var_dump(bin2hex("辰谷端叩辿炭"));
+__halt_compiler();test
+test
+--EXPECT--
+string(10) "test
+test
+"
+string(24) "c3a4c3abc3bcc3a1c3a9c3ba"