summaryrefslogtreecommitdiff
path: root/test/-ext-
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-07-24 07:38:37 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-07-24 07:38:37 +0000
commit4ab69ebbd7cef8539f687e1f948845d076461dc6 (patch)
treeadbc2ce7f92b27cc3897212545afb862d7776810 /test/-ext-
parent4e58f21f798861453b08c281fae2ec3a57396ba5 (diff)
string.c: pool only bare strings in fstring
* string.c (fstr_update_callback): pool bare strings only. * string.c (rb_fstring): return the original string with sharing a fstring if it has extra attributes, not the fstring itself. [ruby-dev:49188] [Bug #11386] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51360 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/-ext-')
-rw-r--r--test/-ext-/string/test_fstring.rb64
1 files changed, 64 insertions, 0 deletions
diff --git a/test/-ext-/string/test_fstring.rb b/test/-ext-/string/test_fstring.rb
new file mode 100644
index 0000000000..3ad9a4c312
--- /dev/null
+++ b/test/-ext-/string/test_fstring.rb
@@ -0,0 +1,64 @@
+require 'test/unit'
+require '-test-/string'
+
+class Test_String_Fstring < Test::Unit::TestCase
+ def assert_fstring(str)
+ fstr = Bug::String.fstring(str)
+ yield str
+ yield fstr
+ end
+
+ def test_taint_shared_string
+ str = __method__.to_s.dup
+ str.taint
+ assert_fstring(str) {|s| assert_predicate(s, :tainted?)}
+ end
+
+ def test_taint_normal_string
+ str = __method__.to_s * 3
+ str.taint
+ assert_fstring(str) {|s| assert_predicate(s, :tainted?)}
+ end
+
+ def test_taint_registered_tainted
+ str = __method__.to_s * 3
+ str.taint
+ assert_fstring(str) {|s| assert_predicate(s, :tainted?)}
+
+ str = __method__.to_s * 3
+ assert_fstring(str) {|s| assert_not_predicate(s, :tainted?)}
+ end
+
+ def test_taint_registered_untainted
+ str = __method__.to_s * 3
+ assert_fstring(str) {|s| assert_not_predicate(s, :tainted?)}
+
+ str = __method__.to_s * 3
+ str.taint
+ assert_fstring(str) {|s| assert_predicate(s, :tainted?)}
+ end
+
+ def test_instance_variable
+ str = __method__.to_s * 3
+ str.instance_variable_set(:@test, 42)
+ str.freeze
+ assert_fstring(str) {|s| assert_send([s, :instance_variable_defined?, :@test])}
+ end
+
+ def test_singleton_method
+ str = __method__.to_s * 3
+ def str.foo
+ end
+ str.freeze
+ assert_fstring(str) {|s| assert_send([s, :respond_to?, :foo])}
+ end
+
+ class S < String
+ end
+
+ def test_subclass
+ str = S.new(__method__.to_s * 3)
+ str.freeze
+ assert_fstring(str) {|s| assert_instance_of(S, s)}
+ end
+end