スマートフォン用の表示で見る

xmpfilter

コンピュータ

xmpfilter

えっくすえむぴーふぃるたー

Rubyの試行錯誤支援・テスト支援ツール。

「# =>」という注釈記号を入れた行に式の値を注釈したり、Test::UnitのassertionやRSpecのexpectationを自動で入れてくれる便利なツール。

rcodetoolsパッケージに入っていて、RubyGemsパッケージがあるので、「gem install rcodetools」でインストールできる。

READMEより…

 a, b = "foo", "baz"
 a + b                                             # =>
 a.size                                            # =>

これを「xmpfilter」にかけると、

 a, b = "foo", "baz"
 a + b                                             # => "foobaz"
 a.size                                            # => 3

こうなる。

Test::Unitでは、

  def test_insertion
    @o.insert "bar"
    @o.insert "baz"
    @o.size                                        # =>
    @o.last                                        # =>
    @o.first                                       # =>
    @o.complex_computation                         # =>
    @o.last(2)                                     # =>
  end

これを「xmpfilter -t」にかけると、

  def test_insertion
    @o.insert "bar"
    @o.insert "baz"
    assert_equal(2, @o.size)
    assert_equal("baz", @o.last)
    assert_equal("bar", @o.first)
    assert_in_delta(3.14159265358979, @o.complex_computation, 0.0001)
    assert_equal(["baz", "bar"], @o.last(2))
  end

こんな感じになる。

RSpecでは、

  class X
    Y = Struct.new(:a)
    def foo(b); b ? Y.new(2) : 2 end
    def bar; raise "No good" end
    def baz; nil end
    def fubar(x); x ** 2.0 + 1 end
    def babar; [1,2] end
    A = 1
    A = 1
  end

  context "Testing xmpfilter's expectation expansion" do
    setup do
      @o = X.new
    end

    specify "Should expand should_equal expectations" do
      @o.foo(true)   # =>
      @o.foo(true).a # =>
      @o.foo(false)  # =>
    end

    specify "Should expand should_raise expectations" do
      @o.bar         # =>
    end

    specify "Should expand should_be_nil expectations" do
      @o.baz         # =>
    end

    specify "Should expand correct expectations for complex values" do
      @o.babar       # =>
    end

    specify "Should expand should_be_close expectations" do
      @o.fubar(10)   # =>
    end
  end

これを「xmpfilter -s」にかけると、

  class X
    Y = Struct.new(:a)
    def foo(b); b ? Y.new(2) : 2 end
    def bar; raise "No good" end
    def baz; nil end
    def fubar(x); x ** 2.0 + 1 end
    def babar; [1,2] end
    A = 1
    A = 1 # !> already initialized constant A
  end

  context "Testing xmpfilter's expectation expansion" do
    setup do
      @o = X.new
    end

    specify "Should expand should_equal expectations" do
      (@o.foo(true)).should_be_a_kind_of X::Y
      (@o.foo(true).inspect).should_equal "#<struct X::Y a=2>"
      (@o.foo(true).a).should_equal 2
      (@o.foo(false)).should_equal 2
    end

    specify "Should expand should_raise expectations" do
      lambda{(@o.bar)}.should_raise RuntimeError
    end

    specify "Should expand should_be_nil expectations" do
      (@o.baz).should_be_nil
    end

    specify "Should expand correct expectations for complex values" do
      (@o.babar).should_equal [1, 2]
    end

    specify "Should expand should_be_close expectations" do
      (@o.fubar(10)).should_be_close(101.0, 0.0001)
    end
  end

こうなる!