diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | string.c | 7 | ||||
-rw-r--r-- | test/ruby/test_string.rb | 65 |
3 files changed, 76 insertions, 1 deletions
@@ -1,3 +1,8 @@ +Tue Jul 8 00:22:58 2008 Nobuyoshi Nakada <[email protected]> + + * string.c (rb_str_succ): limit carrying in an alphanumeric region if + exists. [ruby-dev:35094] + Mon Jul 7 17:12:20 2008 Nobuyoshi Nakada <[email protected]> * lib/ipaddr.rb (IPAddr#initialize): get rid of ArgumentError in @@ -1416,6 +1416,10 @@ rb_str_succ(orig) if ((c = succ_char(s)) == 0) break; n = s - sbeg; } + else if (c != -1) { + n = ++s - sbeg; + break; + } s--; } if (c == -1) { /* str contains no alnum */ @@ -1425,8 +1429,9 @@ rb_str_succ(orig) if ((*s += 1) != 0) break; s--; } + c = 0; } - if (s < sbeg) { + if (s < sbeg || c > 0) { RESIZE_CAPA(str, RSTRING(str)->len + 1); s = RSTRING(str)->ptr + n; memmove(s+1, s, RSTRING(str)->len - n); diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb index f8938cad84..539a5a4623 100644 --- a/test/ruby/test_string.rb +++ b/test/ruby/test_string.rb @@ -7,6 +7,7 @@ class TestString < Test::Unit::TestCase sum = sum & ((1 << bits) - 1) if bits != 0 assert_equal(sum, str.sum(bits)) end + def test_sum assert_equal(0, "".sum) assert_equal(294, "abc".sum) @@ -16,4 +17,68 @@ class TestString < Test::Unit::TestCase check_sum("xyz", bits) } end + + def test_succ + assert_equal("abd", "abc".succ) + assert_equal("z", "y".succ) + assert_equal("aaa", "zz".succ) + + assert_equal("124", "123".succ) + assert_equal("1000", "999".succ) + + assert_equal("No.10", "No.9".succ) + assert_equal("2000aaa", "1999zzz".succ) + assert_equal("AAAAA000", "ZZZZ999".succ) + assert_equal("*+", "**".succ) + + assert_equal("abce", "abcd".succ) + assert_equal("THX1139", "THX1138".succ) + assert_equal("<<koalb>>", "<<koala>>".succ) + assert_equal("2000aaa", "1999zzz".succ) + assert_equal("AAAA0000", "ZZZ9999".succ) + assert_equal("**+", "***".succ) + end + + def test_succ! + a = "abc" + b = a.dup + assert_equal("abd", a.succ!) + assert_equal("abd", a) + assert_equal("abc", b) + + a = "y" + assert_equal("z", a.succ!) + assert_equal("z", a) + + a = "zz" + assert_equal("aaa", a.succ!) + assert_equal("aaa", a) + + a = "123" + assert_equal("124", a.succ!) + assert_equal("124", a) + + a = "999" + assert_equal("1000", a.succ!) + assert_equal("1000", a) + + a = "1999zzz" + assert_equal("2000aaa", a.succ!) + assert_equal("2000aaa", a) + + a = "ZZZZ999" + assert_equal("AAAAA000", a.succ!) + assert_equal("AAAAA000", a) + + a = "**" + assert_equal("*+", a.succ!) + assert_equal("*+", a) + + a = "No.9" + assert_equal("No.10", a.succ!) + assert_equal("No.10", a) + + assert_equal("aaaaaaaaaaaa", "zzzzzzzzzzz".succ!) + assert_equal("aaaaaaaaaaaaaaaaaaaaaaaa", "zzzzzzzzzzzzzzzzzzzzzzz".succ!) + end end |