Macのrubyのreadlineに不具合がある!?(7)

パッチを作成する前に、GNU Readline を使用した場合の ruby の Readline の仕様を明確にするため単体テストを記述する。
これがあればデグレードを防げる。

ext/readline/gnu-readline 以下に GNU Readline 5.2 版。
ext/readline/editline 以下に Mac OSX 10.5 の Edit Line(libedit) 版。

以下は GNU Readline 版でテストを実行した結果。全て通る。

~/work/ruby/ruby_1_9 $ ./ruby19trunk -Iext/readline/gnu-readline test/readline/test_readline_history.rb
Loaded suite test/readline/test_readline_history
Started
.................
Finished in 0.004555 seconds.

17 tests, 159 assertions, 0 failures, 0 errors

以下は libedit 版でテストを実行した結果。失敗しまくる。

~/work/ruby/ruby_1_9 $ ./ruby19trunk -Iext/readline/editline test/readline/test_readline_history.rb
Loaded suite test/readline/test_readline_history
Started
..F..FEF..EEFFF..
Finished in 0.017272 seconds.

  1) Failure:
test_each(Readline::TestHistory)
    [test/readline/test_readline_history.rb:144:in `block in test_each'
     test/readline/test_readline_history.rb:142:in `each'
     test/readline/test_readline_history.rb:142:in `test_each']:
<"1:a"> expected but was
<"2:b">.

  2) Failure:
test_get(Readline::TestHistory)
    [test/readline/test_readline_history.rb:22:in `block in test_get'
     test/readline/test_readline_history.rb:21:in `each'
     test/readline/test_readline_history.rb:21:in `each_with_index'
     test/readline/test_readline_history.rb:21:in `test_get']:
<"1:a"> expected but was
<"2:b">.

  3) Error:
test_get__negative(Readline::TestHistory):
IndexError: invalid index
    test/readline/test_readline_history.rb:29:in `[]'
    test/readline/test_readline_history.rb:29:in `block in test_get__negative'
    test/readline/test_readline_history.rb:28:in `each'
    test/readline/test_readline_history.rb:28:in `test_get__negative'

  4) Failure:
test_get__out_of_range(Readline::TestHistory)
    [test/readline/test_readline_history.rb:37:in `block in test_get__out_of_range'
     test/readline/test_readline_history.rb:36:in `each'
     test/readline/test_readline_history.rb:36:in `test_get__out_of_range']:
i=<-6>.
<IndexError> exception expected but none was thrown.

  5) Error:
test_push(Readline::TestHistory):
IndexError: invalid index
    test/readline/test_readline_history.rb:85:in `[]'
    test/readline/test_readline_history.rb:85:in `block in test_push'
    test/readline/test_readline_history.rb:83:in `times'
    test/readline/test_readline_history.rb:83:in `test_push'

  6) Error:
test_push__operator(Readline::TestHistory):
IndexError: invalid index
    test/readline/test_readline_history.rb:93:in `[]'
    test/readline/test_readline_history.rb:93:in `block in test_push__operator'
    test/readline/test_readline_history.rb:91:in `times'
    test/readline/test_readline_history.rb:91:in `test_push__operator'

  7) Failure:
test_push__plural(Readline::TestHistory)
    [test/readline/test_readline_history.rb:101:in `block in test_push__plural'
     test/readline/test_readline_history.rb:100:in `each'
     test/readline/test_readline_history.rb:100:in `test_push__plural']:
<"0"> expected but was
<"1">.

  8) Failure:
test_set(Readline::TestHistory)
    [test/readline/test_readline_history.rb:56:in `block in test_set'
     test/readline/test_readline_history.rb:53:in `times'
     test/readline/test_readline_history.rb:53:in `test_set']:
<"set: 0"> expected but was
<"2:b">.

  9) Failure:
test_set__out_of_range(Readline::TestHistory)
    [test/readline/test_readline_history.rb:68:in `block in test_set__out_of_range'
     test/readline/test_readline_history.rb:67:in `each'
     test/readline/test_readline_history.rb:67:in `test_set__out_of_range']:
index=<-6>.
<IndexError> exception expected but none was thrown.

17 tests, 98 assertions, 6 failures, 3 errors

さぁ、テストを通すぞ。