summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortompng <[email protected]>2024-01-17 01:16:31 +0900
committerJean Boussier <[email protected]>2024-06-13 18:27:02 +0200
commit04467218ce53292659ae74fb4558e651bfc41f0f (patch)
tree030e3eb5492b06e528c3ba5b2a9c88ae7cb731a3
parent9c7374b0e6cbfb00e4f71d0b2eddba128ba452f7 (diff)
Add rb_str_resize coderange test
-rw-r--r--ext/-test-/string/set_len.c8
-rw-r--r--test/-ext-/string/test_set_len.rb18
2 files changed, 26 insertions, 0 deletions
diff --git a/ext/-test-/string/set_len.c b/ext/-test-/string/set_len.c
index 049da2cdb5..b55ef6f469 100644
--- a/ext/-test-/string/set_len.c
+++ b/ext/-test-/string/set_len.c
@@ -16,9 +16,17 @@ bug_str_append(VALUE str, VALUE addendum)
return str;
}
+static VALUE
+bug_str_resize(VALUE str, VALUE len)
+{
+ rb_str_resize(str, NUM2LONG(len));
+ return str;
+}
+
void
Init_string_set_len(VALUE klass)
{
rb_define_method(klass, "set_len", bug_str_set_len, 1);
rb_define_method(klass, "append", bug_str_append, 1);
+ rb_define_method(klass, "resize", bug_str_resize, 1);
}
diff --git a/test/-ext-/string/test_set_len.rb b/test/-ext-/string/test_set_len.rb
index e3eff75d9b..1531d76167 100644
--- a/test/-ext-/string/test_set_len.rb
+++ b/test/-ext-/string/test_set_len.rb
@@ -63,4 +63,22 @@ class Test_StrSetLen < Test::Unit::TestCase
assert_not_predicate str, :ascii_only?
assert_equal u, str
end
+
+ def test_valid_encoding_after_resized
+ s = "\0\0".force_encoding(Encoding::UTF_16BE)
+ str = Bug::String.new(s)
+ assert_predicate str, :valid_encoding?
+ str.resize(1)
+ assert_not_predicate str, :valid_encoding?
+ str.resize(2)
+ assert_predicate str, :valid_encoding?
+ str.resize(3)
+ assert_not_predicate str, :valid_encoding?
+
+ s = "\xDB\x00\xDC\x00".force_encoding(Encoding::UTF_16BE)
+ str = Bug::String.new(s)
+ assert_predicate str, :valid_encoding?
+ str.resize(2)
+ assert_not_predicate str, :valid_encoding?
+ end
end