summaryrefslogtreecommitdiff
path: root/test/-ext-/string/test_fstring.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/-ext-/string/test_fstring.rb')
-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