A Day in the Life

2006-11-09

そろそろ季節だ

この日記はなれ合いとうんことオナニーについて書いてある日記なので全然ためにならないよ!unsubscribe はここらへん↑

test の結果を screen のステータスラインに表示

test まくってるときは、やっぱ視覚的にいつでもテストの結果がわかるとなんか楽しくてモチベーションにもつながるし、Red -> Green -> Red -> Green のサイクルも面白い。というわけで、テストの結果を screen のステータスラインにも表示させたら面白いんじゃ!と思ったのでやってみたyp。

f:id:secondlife:20061109015522p:image f:id:secondlife:20061109015543p:image

ZenTest の autotest での .autotest にフック追加して実現。

いろいろ書き換え。autotest 終わると元に戻すとか。デフォルトの hardstatus を文字列でする方法がわからん…

module Autotest::Screen
  STATUS = %q[%H %`%-w%{=b bw}%n %t%{-}%+w]

  SCREEN_CMD = 'screen'
  SCREEN_COLOR = {
    :black => 'dd',
    :green => 'gk',
    :red   => 'rw',
  }

  def self.message(msg, color = :black)
    col = SCREEN_COLOR[color]
    msg = %Q[ %{=b #{col}} #{msg} %{-}]
    send_cmd(msg)
  end

  def self.clear
    send_cmd('')
  end

  def self.run_screen_session?
    str = `#{SCREEN_CMD} -ls`
    str.match(/(\d+) Socket/) && ($1.to_i > 0)
  end

  def self.execute?
    !($TESTING || !run_screen_session?)
  end

  def self.send_cmd(msg)
    cmd = %Q[#{SCREEN_CMD} -X eval 'hardstatus alwayslastline "#{(STATUS + msg).gsub('"', '\"')}"']
    system cmd
  end

  Autotest.add_hook :run do  |at|
    message 'Run Tests' if execute?
  end

  Autotest.add_hook :quit do |at|
    clear if execute?
  end

  Autotest.add_hook :ran_command do |at|
    if execute?
      at.results.sub(/(\d+) failures, (\d+) errors/) do |m|
        if $1 == '0' && $2 == '0'
          message "All Green", :green
        else
          message "Red F:#{$1} E:#{$2}", :red
        end
      end
    end
  end
end

status はご自分の hardstatus で適当に。Test::Unit::TestCase でも UI::Console::Runner(だっけ?)ちょっとオーバーライドすればいけると思う。

記事の一覧 >