どうも、 knu です。

 Perl/Ruby Con. で Advanced Ruby を聴講させていただきましたが、
おかげで少し躊躇していた XP の段階的な導入に踏み切る勇気が出ました。
実践的で分かりやすいプレゼンテーションをありがとうございました。

 残念ながら時間の都合で前半の石井さんの解説は聴き逃してしまったの
ですが、非常に素晴らしい資料を用意していただいたので、これだけでも
受講料の価値はあったと思っています。



 さて、 RubyUnit 0.3.0 を使っていて <=> メソッドなどのテストに
assert を使わざるを得ないのはちょっと不便だったため、次のような
メソッドを追加してみました。


    RUNIT::Assert#assert_test(obj1, op, obj2 [,message])

    !obj1.send(op, obj2) のときに RUNIT::AssertionFailedError
    例外を発生させる。第 3 引数が指定された場合は、 message
    文字列とともに例外を発生させる。(別名: assert_comparison)


 使い方は

	assert_test(VersionNumber.new('1.2.9'), :<, VersionNumber.new('1.2.10'))

や

	article1 = NewsArticle.new(str1)
	article2 = NewsArticle.new(str2)
	assert_comparison(article1.score, :>, article2.score)

のような感じです。失敗したときのメッセージは

	The condition is not satisfied: 1.2.9 < 1.2.10

のようになります。両オペランドを含む式が出て分かりやすいと思います。


 よろしければ採用してやってください。

-- 
                     /
                    /__  __            Akinori.org / MUSHA.org
                   / )  )  ) )  /     FreeBSD.org / Ruby-lang.org
Akinori MUSHA aka / (_ /  ( (__(  @ iDaemons.org / and.or.jp

"We're only at home when we're on the run, on the wing, on the fly"

--- rubyunit-0.3.0/doc_en/assert.rd.orig	Sat Nov 18 00:00:00 2000
+++ rubyunit-0.3.0/doc_en/assert.rd	Sun Dec 17 22:32:04 2000
@@ -55,4 +55,10 @@
       Raises RUNIT::AssertionFailedError if (({((|actual|)).equal?(((|expected|)))})) is (({false})).
       If third argument specified,
       raises RUNIT::AssertionFailedError with ((|message|)) string.
+
+--- RUNIT::Assert#assert_test(obj1, op, obj2 [,message])
+      Raises RUNIT::AssertionFailedError if (({!((|obj1|)).send(((|op|)), ((|obj2|)))})).
+      If third argument specified, 
+      raises RUNIT::AssertionFailedError with ((|message|)) string.
+
 =end
--- rubyunit-0.3.0/doc_ja/assert.rd.orig	Sat Nov 18 00:00:00 2000
+++ rubyunit-0.3.0/doc_ja/assert.rd	Sun Dec 17 22:31:59 2000
@@ -46,4 +46,8 @@
       (({((|actual|)).equal?(((|expected|)))})) が (({false})) のときにRUNIT::AssertionFailedError例外を発生させる。
       第3引数が指定された場合は、((|message|))文字列とともに例外を発生させる。
 
+--- RUNIT::Assert#assert_test(obj1, op, obj2 [,message])
+      (({!((|obj1|)).send(((|op|)), ((|obj2|)))}))のときにRUNIT::AssertionFailedError例外を発生させる。
+      第3引数が指定された場合は、((|message|))文字列とともに例外を発生させる。
+
 =end
--- rubyunit-0.3.0/runit/assert.rb.orig	Sat Nov 18 00:00:00 2000
+++ rubyunit-0.3.0/runit/assert.rb	Sun Dec 17 22:31:15 2000
@@ -54,6 +54,21 @@
     end
     alias assert_equals assert_equal
 
+    def assert_test(obj1, op, obj2, message="")
+      setup_assert
+      if !obj1.send(op, obj2)
+        msg = edit_message(message)
+        msg.concat "The condition is not satisfied: "
+	msg.concat to_str(obj1)
+        msg.concat " "
+	msg.concat op.to_s
+        msg.concat " "
+	msg.concat to_str(obj2)
+        raise_assertion_error(msg, 2) 
+      end
+    end
+    alias assert_comparison assert_test
+
     def assert_equal_float(expected, actual, e, message="")
       setup_assert
       if (expected - actual).abs > e
--- rubyunit-0.3.0/tests/testassert.rb.orig	Sat Nov 18 00:00:00 2000
+++ rubyunit-0.3.0/tests/testassert.rb	Sun Dec 17 22:32:36 2000
@@ -83,6 +83,17 @@
     sub_assert_raise_fail(assert_proc, 'expected:<2> but was:<3>')
   end
 
+  def test_assert_test
+    assert_proc = Proc.new {
+      @assert.assert_test(2, :<, 3)
+    }
+    sub_assert_pass(assert_proc)
+    assert_proc = Proc.new {
+      @assert.assert_test(2, :>, 3)
+    }
+    sub_assert_raise_fail(assert_proc, 'The condition is not satisfied: 2 > 3')
+  end
+
   def test_assert_nil
     obj = nil
     assert_proc = Proc.new {