Skip to content

Instantly share code, notes, and snippets.

@nayutaya
Created February 3, 2010 05:40
Show Gist options
  • Save nayutaya/293358 to your computer and use it in GitHub Desktop.
Save nayutaya/293358 to your computer and use it in GitHub Desktop.
module Enumerable
def retry_if(*klasses)
e = nil
self.each { |arg|
begin
return yield(arg)
rescue *klasses => e
next
end
}
raise(e)
end
end
if $0 == __FILE__
require "test/unit"
class RetryIfTest < Test::Unit::TestCase
def test_array__success
results = []
begin
value = [1, 2].retry_if(RuntimeError) { |i|
results << "i:#{i}"
i
}
rescue => e
results << "#{e.class.name}:#{e.message}"
end
assert_equal(["i:1"], results)
assert_equal(1, value)
end
def test_array__fail_success
results = []
begin
value = [1, 2].retry_if(RuntimeError) { |i|
results << "i:#{i}"
raise("1") if i == 1
i
}
rescue => e
results << "#{e.class.name}:#{e.message}"
end
assert_equal(["i:1", "i:2"], results)
assert_equal(2, value)
end
def test_array__fail
results = []
begin
value = [1, 2].retry_if(RuntimeError) { |i|
results << "i:#{i}"
raise("1") if i == 1
raise("2") if i == 2
i
}
rescue => e
results << "#{e.class.name}:#{e.message}"
end
assert_equal(["i:1", "i:2", "RuntimeError:2"], results)
assert_equal(nil, value)
end
def test_enum__fail_success
results = []
begin
value = 2.times.retry_if(RuntimeError) { |i|
results << "i:#{i}"
raise("0") if i == 0
i
}
rescue => e
results << "#{e.class.name}:#{e.message}"
end
assert_equal(["i:0", "i:1"], results)
assert_equal(1, value)
end
def test_multiple_exception_type
results = []
begin
value = [1, 2, 3].retry_if(ArgumentError, TypeError) { |i|
results << "i:#{i}"
raise(ArgumentError, "1") if i == 1
raise(TypeError, "2") if i == 2
i
}
rescue => e
results << "#{e.class.name}:#{e.message}"
end
assert_equal(["i:1", "i:2", "i:3"], results)
assert_equal(3, value)
end
def test_uncaught_exception_type
results = []
begin
value = [1, 2, 3].retry_if(ArgumentError, TypeError) { |i|
results << "i:#{i}"
raise("1") if i == 1
i
}
rescue => e
results << "#{e.class.name}:#{e.message}"
end
assert_equal(["i:1", "RuntimeError:1"], results)
assert_equal(nil, value)
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment