昨日:macrowiki作業-2003/01/03の続き

テストプログラム(途中)

 #!/usr/bin/ruby
 require 'rubyunit'
 require '../wikipage.rb'
 class TestWikipage < RUNIT::TestCase
   def setup			
     @npage = Wikipage.new("NotExistTestPage")
     @page = Wikipage.new("ExistTestPage")
     @page.store(%Q(This is Test Page))
   end
   def teardown
     @page.delete
   end
   def test_contents		
     assert_fail("untested")
   end
   def test_delete		
     page = Wikipage.new("DeleteTestPage")
     page.store(%Q(This is Delete Test Page))
     page.delete
     assert(!page.exist?)
   end
   def test_edit
     assert_equals(%Q(<wiki:edit name="ExistTestPage" content="This is Test Page" />),@page.edit)
     assert_equals(%Q(<wiki:edit name="NotExistTestPage" content="" />),@npage.edit)
   end
   def test_exist?
     assert(@page.exist?)
     assert(!@npage.exist?)
   end
   def test_history
     assert_fail("untested")
   end
   def test_mtime
     assert_kind_of(Time,@page.mtime)
     assert_nil(@npage.mtime)
   end
   def test_name
     assert_equals("NotExistTestPage",@npage.name)
     assert_equals("ExistTestPage",@page.name)
   end
   def test_reference
     begin
       page=Wikipage.new("ReferenceTestPage")
       page.store(%Q(From [[ReferenceTestPage]] to [[ExistTestPage]]))
       assert_match(@page.reference,/ReferencesTestPage/)
     ensure
       page.delete
     end
   end
   def test_replace
     @page.replace("Test","Replace Test")
     assert_equals("This is Replace Test Page",@page.view)
   end
   def test_store
     @page.store(%Q(Second store testing..))
     assert_equals("Second store testing..",@page.view)
   end
   def test_upload
     assert_fail("untested")
   end
   def test_view
     assert_equals("This is Test Page",@page.view)
   end
   def test_s_new
     assert_instance_of(Wikipage,@page)
   end
 end

と、大体作ったのでこれから本体

 #!/usr/bin/ruby -Ke
 require &#39;nkf&#39;
 require &#39;cgi&#39;
 class Wikipage
   @@basedir=&#39;./data/&#39;		# クラス変数で保存ディレクトリを設定
   @@curfname=&#39;current.txt&#39;	# 現在の最新ページファイル名
   @@timefmt=&#39;%Y%m%d%H%M%S&#39;	# バックアップファイルの時間フォーマット
   @@pfix=&#39;.txt&#39;			# バックアップファイルの拡張子
   @@kcode=&#39;-e&#39;			# 保存漢字コード
   def initialize(name="Top")	# 特殊ページ名(検索,最近の更新,一覧)の時はpublicメソッドをオーバライドする 
     @name=name			# wiki名
     @dir=@@basedir+CGI::escape(NKF.nkf(@@kcode,@name))+&#39;/&#39; #eucの名前をurlエンコードする
   end
   def exist?			# ページの本文が存在するならば真を出力。 
     test(?e,@dir+@@curfname)
   end
   def name			# ページ名@nameを出力する。 
     @name
   end
   def mtime			# 最終更新時刻を出力する。Timeオブジェクトを返す。 
     File.mtime(@dir+@@curfname) if test(?e,@dir+@@curfname)
   end
   def view 			# 内容を出力する、もしページが存在しないならばeditメソッドを呼ぶ 
     fname=@dir+@@curfname
     test(?e,fname)?File.open(fname){|f| f.read}:edit
   end
   def edit 			# 内容を編集用に出力する(<→&gt;等) 全体を#edit()で囲む 
     fname=@dir+@@curfname
     %Q(<wiki:edit name="#{@name}" content="#{File.open(fname){|f| f.read} if test(?e,fname)}" />)
   end
   def history(timestamp="") 	# timestampである以前のページを出力する,timestampが""の時には履歴を出力する。 
     %Q(Test history)
   end
   def reference 		# 参照ページを検索しリストを出力する。[[ページ名]]で検索と同じ 
     %Q(Test reference)
   end
   def store(content="Damy")	#ページ内容を保存する。
     fname=@dir+@@curfname
     Dir.mkdir(@dir) unless test(?e,@dir)
     File.rename(fname,@dir+(File.mtime(fname).strftime(@@timefmt))+@@pfix) if test(?e,fname)
     File.open(fname,"w"){|f|f.write(NKF.nkf(@@kcode,content))} 
     #File.utime(Time.now,Time.now,@dir) # フォルダの更新時刻を最新にする
     `touch #{@dir}`		# だめだcgiでフォルダのtouchができない
     content			# とりあえず自身を返しておく
   end
   def replace(src="Damy src",dist="Damy dist",num=1) # コメント等の為に利用する。n回目マッチ規則が必要 
     content=&#39;&#39;
     fname=@dir+@@curfname
     File.open(fname){|f|content=f.read}
     Dir.mkdir(@dir) unless test(?e,@dir)
     File.rename(fname,@dir+(File.mtime(fname).strftime(@@timefmt))+@@pfix) if test(?e,fname)
     l=1
     #うう、ここでn回目にマッチした文字を置換するルーチンを入れる
     content.gsub!(src,dist)	# 軟着陸(1回目のみ)
     File.open(fname,"w"){|f|f.write(NKF.nkf(@@kcode,content))} 
     #File.utime(Time.now,Time.now,@dir) # フォルダの更新時刻を最新にする
     `touch #{@dir}`		# だめだcgiでフォルダのtouchができない
     content			# とりあえず自身を返しておく
   end
   def upload(content="Damy Stream data") # 画像用のアップローダ 
     %Q(Damy Upload Filename)
   end
   def contents 			# 画像等のコンテンツのリストを出す コンテンツの削除も必要かもしれない。 
     %Q(Damy Contents List)
   end
   def delete 			# ページを削除する。(管理者モード) 
     `rm -rf #{@dir}`		# ううっ外部コマンドで軟着陸
   end
 end

で、テスト結果

 TestWikipage#test_contents F.
 TestWikipage#test_delete .
 TestWikipage#test_edit .
 TestWikipage#test_exist? .
 TestWikipage#test_history F.
 TestWikipage#test_mtime .
 TestWikipage#test_name .
 TestWikipage#test_reference F.
 TestWikipage#test_replace .
 TestWikipage#test_s_new .
 TestWikipage#test_store .
 TestWikipage#test_upload F.
 TestWikipage#test_view .
 Time: 0.428136
 FAILURES!!!
 Test Results:
  Run: 13/13(17 asserts) Failures: 4 Errors: 0
 Failures: 4
 ./test-wikipage.rb:14:in `test_contents&#39;(TestWikipage): untested (RUNIT::AssertionFailedError)
 	from ./test-wikipage.rb:64
 ./test-wikipage.rb:31:in `test_history&#39;(TestWikipage): untested (RUNIT::AssertionFailedError)
 	from ./test-wikipage.rb:64
 ./test-wikipage.rb:45:in `test_reference&#39;(TestWikipage): </ReferencesTestPage/> not match <Test reference> (RUNIT::AssertionFailedError)
 	from ./test-wikipage.rb:64
 ./test-wikipage.rb:59:in `test_upload&#39;(TestWikipage): untested (RUNIT::AssertionFailedError)
 	from ./test-wikipage.rb:6

と、いうことであと5個のメソッドを何とかしましょう。
replaceの部分が軟着陸なので wiki2xhtml.rbを含め検討の必要あり。
#comment ->