■
テストプログラム(途中)
#!/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 'nkf' require 'cgi' class Wikipage @@basedir='./data/' # クラス変数で保存ディレクトリを設定 @@curfname='current.txt' # 現在の最新ページファイル名 @@timefmt='%Y%m%d%H%M%S' # バックアップファイルの時間フォーマット @@pfix='.txt' # バックアップファイルの拡張子 @@kcode='-e' # 保存漢字コード def initialize(name="Top") # 特殊ページ名(検索,最近の更新,一覧)の時はpublicメソッドをオーバライドする @name=name # wiki名 @dir=@@basedir+CGI::escape(NKF.nkf(@@kcode,@name))+'/' #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='' 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'(TestWikipage): untested (RUNIT::AssertionFailedError) from ./test-wikipage.rb:64 ./test-wikipage.rb:31:in `test_history'(TestWikipage): untested (RUNIT::AssertionFailedError) from ./test-wikipage.rb:64 ./test-wikipage.rb:45:in `test_reference'(TestWikipage): </ReferencesTestPage/> not match <Test reference> (RUNIT::AssertionFailedError) from ./test-wikipage.rb:64 ./test-wikipage.rb:59:in `test_upload'(TestWikipage): untested (RUNIT::AssertionFailedError) from ./test-wikipage.rb:6
と、いうことであと5個のメソッドを何とかしましょう。
replaceの部分が軟着陸なので wiki2xhtml.rbを含め検討の必要あり。
#comment ->