      assert_equal(expected, source.tr(from, to))
    end
  
-@@ -1362,9 +1371,8 @@ def test_str_succ
+   def test_tr_s
+-    combination(STRINGS, STRINGS, STRINGS) {|s1, s2, s3|
++    strings_3 {|s1, s2, s3|
+       desc = "#{encdump s1}.tr_s(#{encdump s2}, #{encdump s3})"
+       if s1.empty?
+         assert_equal(s1, s1.tr_s(s2, s3), desc)
+@@ -1362,9 +1382,8 @@ def test_str_succ
          s = t
        }
      }

       0.upto(s.length-1) {|i|
         u = s[i]
         assert_predicate(u, :valid_encoding?) if s.valid_encoding?
@@ -316,7 +320,7 @@ def test_str_aref
 
   def test_str_aref_len
     STRINGS.each {|s|

       if !s.empty? # xxx
         t = enccall(b("%s"), :%, s)
         assert_strenc(b(s), (b('')+s).encoding, t)
@@ -252,7 +267,7 @@ def test_str_eq_reflexive
   end
 
   def test_str_eq_symmetric
-    combination(STRINGS, STRINGS) {|s1, s2|
+    strings_2 {|s1, s2|
       if s1 == s2
         assert_equal(s2, s1, "#{encdump s2} == #{encdump s1}")
       else
@@ -262,7 +277,7 @@ def test_str_eq_symmetric
   end
 
   def test_str_eq_transitive
-    combination(STRINGS, STRINGS, STRINGS) {|s1, s2, s3|
+    strings_3 {|s1, s2, s3|
       if s1 == s2 && s2 == s3
         assert_equal(s1, s3, "transitive: #{encdump s1} == #{encdump s2} == #{encdump s3}")
       end
@@ -270,7 +285,7 @@ def test_str_eq_transitive
   end
 
   def test_str_eq
-    combination(STRINGS, STRINGS) {|s1, s2|
+    strings_2 {|s1, s2|
       desc_eq = "#{encdump s1} == #{encdump s2}"
       if b(s1) == b(s2) and
           (s1.ascii_only? && s2.ascii_only? or
@@ -289,7 +304,7 @@ def test_str_eq
   end
 
   def test_str_concat
-    combination(STRINGS, STRINGS) {|s1, s2|
+    strings_2 {|s1, s2|
       s = s1.dup
       if s1.ascii_only? || s2.ascii_only? || s1.encoding == s2.encoding
         s << s2
@@ -304,7 +319,7 @@ def test_str_concat
 
   def test_str_aref
     STRINGS.each {|s|
