* string.c: Added UTF-16BE/LE and UTF-32BE/LE to supported encodings

for Unicode case mapping.
* test/ruby/enc/test_case_comprehensive.rb: Tests for above
  functionality; fixed an encoding issue in assertion error message.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55296 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
duerst 2016-06-06 09:36:36 +00:00
parent a4ccbb63cd
commit ab5f23f26c
3 changed files with 20 additions and 7 deletions

View File

@ -1,3 +1,11 @@
Mon Jun 6 18:36:34 2016 Martin Duerst <duerst@it.aoyama.ac.jp>
* string.c: Added UTF-16BE/LE and UTF-32BE/LE to supported encodings
for Unicode case mapping.
* test/ruby/enc/test_case_comprehensive.rb: Tests for above
functionality; fixed an encoding issue in assertion error message.
Mon Jun 6 17:29:35 2016 Martin Duerst <duerst@it.aoyama.ac.jp> Mon Jun 6 17:29:35 2016 Martin Duerst <duerst@it.aoyama.ac.jp>
* test/ruby/enc/test_case_comprehensive.rb: Speed up testing for small * test/ruby/enc/test_case_comprehensive.rb: Speed up testing for small

View File

@ -5858,7 +5858,7 @@ rb_str_upcase_bang(int argc, VALUE *argv, VALUE str)
enc = STR_ENC_GET(str); enc = STR_ENC_GET(str);
rb_str_check_dummy_enc(enc); rb_str_check_dummy_enc(enc);
s = RSTRING_PTR(str); send = RSTRING_END(str); s = RSTRING_PTR(str); send = RSTRING_END(str);
if (enc==rb_utf8_encoding()) { if (rb_enc_unicode_p(enc)) {
str_shared_replace(str, rb_str_casemap(str, &flags, enc)); str_shared_replace(str, rb_str_casemap(str, &flags, enc));
modify = ONIGENC_CASE_MODIFIED & flags; modify = ONIGENC_CASE_MODIFIED & flags;
} }
@ -5948,7 +5948,7 @@ rb_str_downcase_bang(int argc, VALUE *argv, VALUE str)
enc = STR_ENC_GET(str); enc = STR_ENC_GET(str);
rb_str_check_dummy_enc(enc); rb_str_check_dummy_enc(enc);
s = RSTRING_PTR(str); send = RSTRING_END(str); s = RSTRING_PTR(str); send = RSTRING_END(str);
if (enc==rb_utf8_encoding()) { if (rb_enc_unicode_p(enc)) {
str_shared_replace(str, rb_str_casemap(str, &flags, enc)); str_shared_replace(str, rb_str_casemap(str, &flags, enc));
modify = ONIGENC_CASE_MODIFIED & flags; modify = ONIGENC_CASE_MODIFIED & flags;
} }
@ -6037,8 +6037,9 @@ rb_str_downcase_bang(int argc, VALUE *argv, VALUE str)
* normalization (i.e. String#unicode_normalize) is not necessarily maintained * normalization (i.e. String#unicode_normalize) is not necessarily maintained
* by case mapping operations. * by case mapping operations.
* *
* Non-ASCII case mapping/folding is currently only supported for UTF-8 * Non-ASCII case mapping/folding is currently supported for UTF-8,
* Strings/Symbols, but this support will be extended to other encodings. * UTF-16BE/LE, and UTF-32BE/LE Strings/Symbols.
* This support will be extended to other encodings.
* *
* "hEllO".downcase #=> "hello" * "hEllO".downcase #=> "hello"
*/ */
@ -6083,7 +6084,7 @@ rb_str_capitalize_bang(int argc, VALUE *argv, VALUE str)
enc = STR_ENC_GET(str); enc = STR_ENC_GET(str);
rb_str_check_dummy_enc(enc); rb_str_check_dummy_enc(enc);
if (RSTRING_LEN(str) == 0 || !RSTRING_PTR(str)) return Qnil; if (RSTRING_LEN(str) == 0 || !RSTRING_PTR(str)) return Qnil;
if (enc==rb_utf8_encoding()) { if (rb_enc_unicode_p(enc)) {
str_shared_replace(str, rb_str_casemap(str, &flags, enc)); str_shared_replace(str, rb_str_casemap(str, &flags, enc));
modify = ONIGENC_CASE_MODIFIED & flags; modify = ONIGENC_CASE_MODIFIED & flags;
} }
@ -6159,7 +6160,7 @@ rb_str_swapcase_bang(int argc, VALUE *argv, VALUE str)
enc = STR_ENC_GET(str); enc = STR_ENC_GET(str);
rb_str_check_dummy_enc(enc); rb_str_check_dummy_enc(enc);
s = RSTRING_PTR(str); send = RSTRING_END(str); s = RSTRING_PTR(str); send = RSTRING_END(str);
if (enc==rb_utf8_encoding()) { if (rb_enc_unicode_p(enc)) {
str_shared_replace(str, rb_str_casemap(str, &flags, enc)); str_shared_replace(str, rb_str_casemap(str, &flags, enc));
modify = ONIGENC_CASE_MODIFIED & flags; modify = ONIGENC_CASE_MODIFIED & flags;
} }

View File

@ -119,7 +119,7 @@ class TestComprehensiveCaseFold < Test::Unit::TestCase
target = test.first_data[code].encode(encoding) + test.follow_data[code].encode(encoding) * 4 target = test.first_data[code].encode(encoding) + test.follow_data[code].encode(encoding) * 4
result = source.send(test.method_name, *test.attributes) result = source.send(test.method_name, *test.attributes)
assert_equal target, result, assert_equal target, result,
"from #{source} (#{source.dump}) expected #{target.dump} but was #{result.dump}" "from #{code*5} (#{source.dump}) expected #{target.dump} but was #{result.dump}"
rescue Encoding::UndefinedConversionError rescue Encoding::UndefinedConversionError
end end
end end
@ -139,4 +139,8 @@ class TestComprehensiveCaseFold < Test::Unit::TestCase
generate_casefold_tests 'US-ASCII' generate_casefold_tests 'US-ASCII'
generate_casefold_tests 'ASCII-8BIT' generate_casefold_tests 'ASCII-8BIT'
generate_casefold_tests 'UTF-8' generate_casefold_tests 'UTF-8'
generate_casefold_tests 'UTF-16BE'
generate_casefold_tests 'UTF-16LE'
generate_casefold_tests 'UTF-32BE'
generate_casefold_tests 'UTF-32LE'
end end