summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrblib/string.rb22
-rw-r--r--test/t/string.rb29
2 files changed, 35 insertions, 16 deletions
diff --git a/mrblib/string.rb b/mrblib/string.rb
index 43dda16e5..9b11bb2e5 100644
--- a/mrblib/string.rb
+++ b/mrblib/string.rb
@@ -28,14 +28,13 @@ class String
#
# ISO 15.2.10.5.18
def gsub(*args, &block)
- unless (args.size == 1 && block) || args.size == 2
+ if args.size == 2
+ split(args[0]).join(args[1])
+ elsif args.size == 1 && block
+ split(args[0]).join(block.call(args[0]))
+ else
raise ArgumentError, "wrong number of arguments"
end
-
- ### *** TODO *** ###
- unless Object.const_defined?(:Regexp)
- raise NotImplementedError, "gsub not available (yet)"
- end
end
##
@@ -76,14 +75,13 @@ class String
#
# ISO 15.2.10.5.36
def sub(*args, &block)
- unless (args.size == 1 && block) || args.size == 2
+ if args.size == 2
+ split(args[0], 2).join(args[1])
+ elsif args.size == 1 && block
+ split(args[0], 2).join(block.call(args[0]))
+ else
raise ArgumentError, "wrong number of arguments"
end
-
- ### *** TODO *** ###
- unless Object.const_defined?(:Regexp)
- raise NotImplementedError, "sub not available (yet)"
- end
end
##
diff --git a/test/t/string.rb b/test/t/string.rb
index 05a610e00..fac77075b 100644
--- a/test/t/string.rb
+++ b/test/t/string.rb
@@ -192,9 +192,19 @@ assert('String#eql?', '15.2.10.5.17') do
'abc'.eql?('abc') and not 'abc'.eql?('cba')
end
-# TODO ATM broken assert('String#gsub', '15.2.10.5.18') do
+assert('String#gsub', '15.2.10.5.18') do
+ 'abcabc'.gsub('b', 'B') == 'aBcaBc' && 'abcabc'.gsub('b') { |w| w.capitalize } == 'aBcaBc'
+end
+
+assert('String#gsub!', '15.2.10.5.19') do
+ a = 'abcabc'
+ a.gsub!('b', 'B')
-# TODO ATM broken assert('String#gsub!', '15.2.10.5.19') do
+ b = 'abcabc'
+ b.gsub!('b') { |w| w.capitalize }
+
+ a == 'aBcaBc' && b == 'aBcaBc'
+end
assert('String#hash', '15.2.10.5.20') do
a = 'abc'
@@ -307,9 +317,20 @@ assert('String#split', '15.2.10.5.35') do
'abc'.split("") == ['a', 'b', 'c']
end
-# TODO ATM broken assert('String#sub', '15.2.10.5.36') do
+assert('String#sub', '15.2.10.5.36') do
+ 'abcabc'.sub('b', 'B') == 'aBcabc' && 'abcabc'.sub('b') { |w| w.capitalize } == 'aBcabc'
+end
+
+assert('String#sub!', '15.2.10.5.37') do
+ a = 'abcabc'
+ a.sub!('b', 'B')
+
+ b = 'abcabc'
+ b.sub!('b') { |w| w.capitalize }
+
+ a == 'aBcabc' && b == 'aBcabc'
+end
-# TODO ATM broken assert('String#sub!', '15.2.10.5.37') do
assert('String#to_i', '15.2.10.5.38') do
a = ''.to_i