読者です 読者をやめる 読者になる 読者になる

unit/test(1ファイルの場合)

Rubyテスト駆動開発するのはとても簡単です。test/unitをrequireして、TestCaseを継承したclassをファイルに作って実行するだけです(テストメソッドは多分"test_"で始まる必要がある)。test/unit.rbの方でテストの実行が記述してある(test/unit.rbの最後の行Test::Unit::Mini::autorun)のでユーザーはclassを実装するだけでokです。

また、RubyPythonと同様に各組み込みclassから標準ライブラリに至るまで、すでにテストがあります。それを読むと仕様がおおよそわかります。

#!/usr/local/bin/ruby
require 'test/unit'
class TestString < Test::Unit::TestCase
  def initialize(*args)
    @cls = String
    super
  end
  def S(str)
    @cls.new(str)
  end
  def test_s_new
    assert_equal("RUBY", S("RUBY"))
  end
  def test_AREF #[]
    #インデックスは0から始まる
    assert_equal("F", S("FooBar")[0])
    #後ろからn番目の要素を得るには[-n]を使う
    assert_equal("r", S("FooBar")[-1])
    #未定義の要素はnilを返す
    assert_equal(nil, S("FooBar")[6])
    #後ろからでも同じ
    assert_equal(nil, S("FooBar")[-7])

    #[from, size]かな? 
    assert_equal(S("Foo"), S("FooBar")[0, 3])
    assert_equal(S("Bar"), S("FooBar")[3, 3])
    assert_equal(S("Bar"), S("FooBar")[-3, 3])
    #[length, size]だと空文字列 
    assert_equal(S(""), S("FooBar")[6, 2])
    #後ろからだと空文字列にはならずnil。"FooBar"が'FooBar\0'だから?
    assert_equal(nil, S("FooBar")[-7, 2])
    #それより大きいとnil
    assert_equal(nil, S("FooBar")[1000, 2])
    assert_equal(nil, S("FooBar")[-1000, 2])
    #[a .. b]:  a <= x <= b
    assert_equal(S("Foo"), S("FooBar")[0..2])
    #[a ... b]: a <= x < b
    assert_equal(S("FooB"), S("FooBar")[0...4])
  end
end

上のテストはruby/test/ruby/test_string.rbを見ながら(ゆるく)写したテストの一部です(コメントはぼくが勝手に書いただけです)。すでにあるテストを写経するのは、仕様の知る、テストの書き方を学べる、文法に慣れるなど、学習には最適かなと思います。