OSDN Git Service

pass test
[pettanr/pettanr.git] / spec / models / panel_spec.rb
index fd63b14..0ec0e91 100644 (file)
 # -*- encoding: utf-8 -*-\r
 # -*- encoding: utf-8 -*-\r
-require 'spec_helper'
-
-describe Panel do
-  before do
-    Factory :admin
-    @license = Factory :license
-    @user = Factory( :user_yas)
-    @author = @user.author
+require 'spec_helper'\r
+#コマ\r
+describe Panel do\r
+  before do\r
+    Factory :admin\r
+    @license = Factory :license\r
+    @user = Factory( :user_yas)\r
+    @author = @user.author\r
     @artist = Factory :artist_yas, :author_id => @author.id\r
     @artist = Factory :artist_yas, :author_id => @author.id\r
-    @other_user = Factory( :user_yas)
-    @other_author = @other_user.author
-    @other_artist = Factory :artist_yas, :author_id => @other_author.id
+    @other_user = Factory( :user_yas)\r
+    @other_author = @other_user.author\r
+    @other_artist = Factory :artist_yas, :author_id => @other_author.id\r
     @op = Factory :original_picture, :artist_id => @artist.id, :license_id => @license.id\r
     @op = Factory :original_picture, :artist_id => @artist.id, :license_id => @license.id\r
-    @rp = Factory :resource_picture, :original_picture_id => @op.id, :license_id => @license.id
+    @rp = Factory :resource_picture, :original_picture_id => @op.id, :license_id => @license.id\r
+    @sbt = Factory :speech_balloon_template\r
   end\r
   end\r
-  
-  describe '検証に於いて' do
+  \r
+  describe '検証に於いて' do\r
     before do\r
     before do\r
-      @comic = Factory :comic, :author_id => @author.id
-    end
-    
-    it 'オーソドックスなデータなら通る' do
-      @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id
-      @panel.should be_valid
-    end
-    
-    context 'comic_idを検証するとき' do
-      before do
-        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => nil
-      end
-      it 'テストデータの確認' do
-        @panel.comic_id = @comic.id
-        @panel.should be_valid
-      end
-      it 'nullなら失敗する' do
-        @panel.comic_id = nil
-        @panel.should_not be_valid
-      end
-      it '数値でなければ失敗する' do
-        @panel.comic_id = 'a'
-        @panel.should_not be_valid
-      end
-      it '存在するコミックでなければ失敗する' do
-        @panel.comic_id = 0
-        @panel.should_not be_valid
-      end
-      it 'コミックidとtが重複していると失敗する' do
-        @panel.save\r
-        @panel2 = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id
-        @panel2.should_not be_valid
-      end
-    end
-    context 'resource_picture_idを検証するとき' do
-      before do
-        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id
-      end
-      it 'テストデータの確認' do
-        @panel.resource_picture_id = @rp.id
-        @panel.should be_valid
-      end
-      it 'nullなら通る' do
-        @panel.resource_picture_id = nil
-        @panel.should be_valid
-      end
-      it '数値でなければ失敗する' do
-        @panel.resource_picture_id = 'a'
-        @panel.should_not be_valid
-      end
-    end
-    context 'widthを検証するとき' do
-      before do
-        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id
-      end
-      it 'テストデータの確認' do
-        @panel.width = 1
-        @panel.should be_valid
-      end
-      it 'nullなら失敗する' do
-        @panel.width = nil
-        @panel.should_not be_valid
-      end
-      it '数値でなければ失敗する' do
-        @panel.width = 'a'
-        @panel.should_not be_valid
-      end
-      it '0なら失敗する' do
-        @panel.width = '0'
-        @panel.should_not be_valid
-      end
-      it '負でも失敗する' do
-        @panel.width = -1
-        @panel.should_not be_valid
-      end
-    end
-    context 'heightを検証するとき' do
-      before do
-        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id
-      end
-      it 'テストデータの確認' do
-        @panel.height = '1'
-        @panel.should be_valid
-      end
-      it 'nullなら失敗する' do
-        @panel.height = nil
-        @panel.should_not be_valid
-      end
-      it '数値でなければ失敗する' do
-        @panel.height = 'a'
-        @panel.should_not be_valid
-      end
-      it '0なら失敗する' do
-        @panel.height = '0'
-        @panel.should_not be_valid
-      end
-      it '負でも失敗する' do
-        @panel.height = -1
-        @panel.should_not be_valid
-      end
-    end
-    context 'borderを検証するとき' do
-      before do
-        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id
-      end
-      it 'テストデータの確認' do
-        @panel.border = '1'
-        @panel.should be_valid
-      end
-      it 'nullなら失敗する' do
-        @panel.border = nil
-        @panel.should_not be_valid
-      end
-      it '数値でなければ失敗する' do
-        @panel.border = 'a'
-        @panel.should_not be_valid
-      end
-      it '負なら失敗する' do
-        @panel.border = '-1'
-        @panel.should_not be_valid
-      end
-      it '0なら通る' do
-        @panel.border = 0
-        @panel.should be_valid
-      end
-    end
-    context 'xを検証するとき' do
-      before do
-        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id
-      end
-      it 'テストデータの確認' do
-        @panel.x = '1'
-        @panel.should be_valid
-      end
-      it '数値でなければ失敗する' do
-        @panel.x = 'a'
-        @panel.should_not be_valid
-      end
-      it '0なら通る' do
-        @panel.x = '0'
-        @panel.should be_valid
-      end
-      it '負でも通る' do
-        @panel.x = -1
-        @panel.should be_valid
-      end
-    end
-    context 'yを検証するとき' do
-      before do
-        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id
-      end
-      it 'テストデータの確認' do
-        @panel.y = '1'
-        @panel.should be_valid
-      end
-      it '数値でなければ失敗する' do
-        @panel.y = 'a'
-        @panel.should_not be_valid
-      end
-      it '0なら通る' do
-        @panel.y = '0'
-        @panel.should be_valid
-      end
-      it '負でも通る' do
-        @panel.y = -1
-        @panel.should be_valid
-      end
-    end
-    context 'zを検証するとき' do
-      before do
-        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id
-      end
-      it 'テストデータの確認' do
-        @panel.z = '1'
-        @panel.should be_valid
-      end
-      it '数値でなければ失敗する' do
-        @panel.z = 'a'
-        @panel.should_not be_valid
-      end
-      it '0なら失敗する' do
-        @panel.z = '0'
-        @panel.should_not be_valid
-      end
-      it '負なら失敗する' do
-        @panel.z = -1
-        @panel.should_not be_valid
-      end
-    end
-    context 'tを検証するとき' do
-      before do
-        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id
-      end
-      it 'テストデータの確認' do
-        @panel.t = '1'
-        @panel.should be_valid
-      end
-      it '数値でなければ失敗する' do
-        @panel.t = 'a'
-        @panel.should_not be_valid
-      end
-      it '0なら通る' do
-        @panel.t = '0'
-        @panel.should be_valid
-      end
-      it '負でも失敗する' do
-        @panel.t = -1
-        @panel.should_not be_valid
-      end
-    end
-    context 'author_idを検証するとき' do
-      before do
-        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id
-      end
-      it 'テストデータの確認' do
-        @panel.author_id = @author.id
-        @panel.should be_valid
-      end
-      it 'nullなら失敗する' do
-        @panel.author_id = nil
-        @panel.should_not be_valid
-      end
-      it '数値でなければ失敗する' do
-        @panel.author_id = 'a'
-        @panel.should_not be_valid
-      end
-      it '存在する絵師でなければ失敗する' do
-        @panel.author_id = 0
-        @panel.should_not be_valid
-      end
-    end
-    context '全体を検証するとき' do
-      before do
-        @panel = Factory :panel, :author_id => @author.id, :comic_id => @comic.id
-      end
-    end
-  end
-  
-  describe 'データ補充に於いて' do
+      @comic = Factory :comic, :author_id => @author.id\r
+    end\r
+    \r
+    it 'オーソドックスなデータなら通る' do\r
+      @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id\r
+      @panel.should be_valid\r
+    end\r
+    \r
+    context 'comic_idを検証するとき' do\r
+      before do\r
+        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => nil\r
+      end\r
+      it 'テストデータの確認' do\r
+        @panel.comic_id = @comic.id\r
+        @panel.should be_valid\r
+      end\r
+    end\r
+    context 'widthを検証するとき' do\r
+      before do\r
+        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id\r
+      end\r
+      it 'テストデータの確認' do\r
+        @panel.width = 1\r
+        @panel.should be_valid\r
+      end\r
+      it 'nullなら失敗する' do\r
+        @panel.width = nil\r
+        @panel.should_not be_valid\r
+      end\r
+      it '数値でなければ失敗する' do\r
+        @panel.width = 'a'\r
+        @panel.should_not be_valid\r
+      end\r
+      it '0なら失敗する' do\r
+        @panel.width = '0'\r
+        @panel.should_not be_valid\r
+      end\r
+      it '負でも失敗する' do\r
+        @panel.width = -1\r
+        @panel.should_not be_valid\r
+      end\r
+    end\r
+    context 'heightを検証するとき' do\r
+      before do\r
+        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id\r
+      end\r
+      it 'テストデータの確認' do\r
+        @panel.height = '1'\r
+        @panel.should be_valid\r
+      end\r
+      it 'nullなら失敗する' do\r
+        @panel.height = nil\r
+        @panel.should_not be_valid\r
+      end\r
+      it '数値でなければ失敗する' do\r
+        @panel.height = 'a'\r
+        @panel.should_not be_valid\r
+      end\r
+      it '0なら失敗する' do\r
+        @panel.height = '0'\r
+        @panel.should_not be_valid\r
+      end\r
+      it '負でも失敗する' do\r
+        @panel.height = -1\r
+        @panel.should_not be_valid\r
+      end\r
+    end\r
+    context 'borderを検証するとき' do\r
+      before do\r
+        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id\r
+      end\r
+      it 'テストデータの確認' do\r
+        @panel.border = '1'\r
+        @panel.should be_valid\r
+      end\r
+      it 'nullなら失敗する' do\r
+        @panel.border = nil\r
+        @panel.should_not be_valid\r
+      end\r
+      it '数値でなければ失敗する' do\r
+        @panel.border = 'a'\r
+        @panel.should_not be_valid\r
+      end\r
+      it '負なら失敗する' do\r
+        @panel.border = '-1'\r
+        @panel.should_not be_valid\r
+      end\r
+      it '0なら通る' do\r
+        @panel.border = 0\r
+        @panel.should be_valid\r
+      end\r
+    end\r
+    context 'xを検証するとき' do\r
+      before do\r
+        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id\r
+      end\r
+      it 'テストデータの確認' do\r
+        @panel.x = '1'\r
+        @panel.should be_valid\r
+      end\r
+      it '数値でなければ失敗する' do\r
+        @panel.x = 'a'\r
+        @panel.should_not be_valid\r
+      end\r
+      it '0なら通る' do\r
+        @panel.x = '0'\r
+        @panel.should be_valid\r
+      end\r
+      it '負でも通る' do\r
+        @panel.x = -1\r
+        @panel.should be_valid\r
+      end\r
+    end\r
+    context 'yを検証するとき' do\r
+      before do\r
+        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id\r
+      end\r
+      it 'テストデータの確認' do\r
+        @panel.y = '1'\r
+        @panel.should be_valid\r
+      end\r
+      it '数値でなければ失敗する' do\r
+        @panel.y = 'a'\r
+        @panel.should_not be_valid\r
+      end\r
+      it '0なら通る' do\r
+        @panel.y = '0'\r
+        @panel.should be_valid\r
+      end\r
+      it '負でも通る' do\r
+        @panel.y = -1\r
+        @panel.should be_valid\r
+      end\r
+    end\r
+    context 'zを検証するとき' do\r
+      before do\r
+        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id\r
+      end\r
+      it 'テストデータの確認' do\r
+        @panel.z = '1'\r
+        @panel.should be_valid\r
+      end\r
+      it '数値でなければ失敗する' do\r
+        @panel.z = 'a'\r
+        @panel.should_not be_valid\r
+      end\r
+      it '0なら失敗する' do\r
+        @panel.z = '0'\r
+        @panel.should_not be_valid\r
+      end\r
+      it '負なら失敗する' do\r
+        @panel.z = -1\r
+        @panel.should_not be_valid\r
+      end\r
+    end\r
+    context 'tを検証するとき' do\r
+      before do\r
+        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id\r
+      end\r
+      it 'テストデータの確認' do\r
+        @panel.t = '1'\r
+        @panel.should be_valid\r
+      end\r
+      it '数値でなければ失敗する' do\r
+        @panel.t = 'a'\r
+        @panel.should_not be_valid\r
+      end\r
+      it '0なら通る' do\r
+        @panel.t = '0'\r
+        @panel.should be_valid\r
+      end\r
+      it '負でも失敗する' do\r
+        @panel.t = -1\r
+        @panel.should_not be_valid\r
+      end\r
+    end\r
+    context 'author_idを検証するとき' do\r
+      before do\r
+        @panel = Factory.build :panel, :author_id => @author.id, :comic_id => @comic.id\r
+      end\r
+      it 'テストデータの確認' do\r
+        @panel.author_id = @author.id\r
+        @panel.should be_valid\r
+      end\r
+      it 'nullなら失敗する' do\r
+        @panel.author_id = nil\r
+        @panel.should_not be_valid\r
+      end\r
+      it '数値でなければ失敗する' do\r
+        @panel.author_id = 'a'\r
+        @panel.should_not be_valid\r
+      end\r
+      it '存在する絵師でなければ失敗する' do\r
+        @panel.author_id = 0\r
+        @panel.should_not be_valid\r
+      end\r
+    end\r
+    context '全体を検証するとき' do\r
+      before do\r
+        @panel = Factory :panel, :author_id => @author.id, :comic_id => @comic.id\r
+      end\r
+    end\r
+  end\r
+  \r
+  describe 'データ補充に於いて' do\r
     before do\r
     before do\r
-      @comic = Factory :comic, :author_id => @author.id
-      @panel = Factory.build :panel, :comic_id => @comic.id
-    end
-    context 'widthを補充' do
+      @comic = Factory :comic, :author_id => @author.id\r
+      @panel = Factory.build :panel, :comic_id => @comic.id\r
+    end\r
+    context 'widthを補充' do\r
       it '空の時はコミックから補充する' do\r
       it '空の時はコミックから補充する' do\r
-        @panel.width = nil
+        @panel.width = nil\r
         @panel.supply_default @author\r
         @panel.supply_default @author\r
-        @panel.width.should eq @comic.width
-      end
+        @panel.width.should eq @comic.width\r
+      end\r
       it '空の時でもコミックが不在なら補充しない' do\r
       it '空の時でもコミックが不在なら補充しない' do\r
-        @panel.width = nil
-        @panel.comic_id = nil
+        @panel.width = nil\r
+        @panel.comic_id = nil\r
         @panel.supply_default @author\r
         @panel.supply_default @author\r
-        @panel.width.should be_nil
-      end
-      it '空でない時は変化しない' do
+        @panel.width.should be_nil\r
+      end\r
+      it '空でない時は変化しない' do\r
         @panel.width = 45\r
         @panel.width = 45\r
-        lambda {
+        lambda {\r
           @panel.supply_default @author\r
           @panel.supply_default @author\r
-        }.should_not change @panel, :width
-      end
-    end
-    context 'heightを補充' do
-      it '空の時はコミックから補充する' do
-        @panel.height = nil
+        }.should_not change @panel, :width\r
+      end\r
+    end\r
+    context 'heightを補充' do\r
+      it '空の時はコミックから補充する' do\r
+        @panel.height = nil\r
         @panel.supply_default @author\r
         @panel.supply_default @author\r
-        @panel.height.should eq @comic.height
-      end
+        @panel.height.should eq @comic.height\r
+      end\r
       it '空の時でもコミックが不在なら補充しない' do\r
       it '空の時でもコミックが不在なら補充しない' do\r
-        @panel.height = nil
-        @panel.comic_id = nil
+        @panel.height = nil\r
+        @panel.comic_id = nil\r
         @panel.supply_default @author\r
         @panel.supply_default @author\r
-        @panel.height.should be_nil
-      end
-      it '空でない時は変化しない' do
+        @panel.height.should be_nil\r
+      end\r
+      it '空でない時は変化しない' do\r
         @panel.height = 87\r
         @panel.height = 87\r
-        lambda {
+        lambda {\r
           @panel.supply_default @author\r
           @panel.supply_default @author\r
-        }.should_not change @panel, :height
-      end
-    end
-    context 'borderを補充' do
-      it '空の時は0を補充する' do
-        @panel.border = nil
+        }.should_not change @panel, :height\r
+      end\r
+    end\r
+    context 'borderを補充' do\r
+      it '空の時は0を補充する' do\r
+        @panel.border = nil\r
         @panel.supply_default @author\r
         @panel.supply_default @author\r
-        @panel.border.should eq 0
-      end
-      it '空でない時は変化しない' do
+        @panel.border.should eq 0\r
+      end\r
+      it '空でない時は変化しない' do\r
         @panel.border = 1\r
         @panel.border = 1\r
-        lambda {
+        lambda {\r
           @panel.supply_default @author\r
           @panel.supply_default @author\r
-        }.should_not change @panel, :border
-      end
-    end
-    context 'tを補充' do
-      it '空の時はコミック内のtの最大値+1を補充する' do
+        }.should_not change @panel, :border\r
+      end\r
+    end\r
+    context 'tを補充' do\r
+      it '空の時はコミック内のtの最大値+1を補充する' do\r
         pl = Factory :panel, :author_id => @author.id, :comic_id => @comic.id, :t => 0\r
         pl = Factory :panel, :author_id => @author.id, :comic_id => @comic.id, :t => 0\r
-        @panel.t = nil
+        @panel.t = nil\r
         @panel.supply_default @author\r
         @panel.supply_default @author\r
-        @panel.t.should eq 1
-      end
-      it '空でコミック初のコマなら0を補充する' do
-        @panel.t = nil
+        @panel.t.should eq 1\r
+      end\r
+      it '空でコミック初のコマなら0を補充する' do\r
+        @panel.t = nil\r
         @panel.supply_default @author\r
         @panel.supply_default @author\r
-        @panel.t.should eq 0
-      end
-      it '空の時でも更新ケースなら補充しない' do
+        @panel.t.should eq 0\r
+      end\r
+      it '空の時でも更新ケースなら補充しない' do\r
         pl = Factory :panel, :author_id => @author.id, :comic_id => @comic.id, :t => 1\r
         pl.t = nil\r
         pl = Factory :panel, :author_id => @author.id, :comic_id => @comic.id, :t => 1\r
         pl.t = nil\r
-        lambda {
+        lambda {\r
           pl.supply_default @author\r
           pl.supply_default @author\r
-        }.should_not change pl, :t
-      end
-      it '空でない時は変化しない' do
+        }.should_not change pl, :t\r
+      end\r
+      it '空でない時は変化しない' do\r
         @panel.t = 1\r
         @panel.t = 1\r
-        lambda {
+        lambda {\r
           @panel.supply_default @author\r
           @panel.supply_default @author\r
-        }.should_not change @panel, :t
-      end
-    end
-    context 'author_idを補充' do
-      it 'ログイン中の作家idを補充する' do
-        @panel.author_id = nil
+        }.should_not change @panel, :t\r
+      end\r
+    end\r
+    context 'author_idを補充' do\r
+      it 'ログイン中の作家idを補充する' do\r
+        @panel.author_id = nil\r
         @panel.supply_default @author\r
         @panel.supply_default @author\r
-        @panel.author_id.should eq @author.id
-      end
-    end
-    
-  end
+        @panel.author_id.should eq @author.id\r
+      end\r
+    end\r
+    \r
+  end\r
   \r
   \r
-  describe '作者判定に於いて' do
-    before do
-      @comic = Factory :comic, :author_id => @author.id
-    end
-    it '自作のコマならyes' do
-      panel = Factory :panel, :author_id => @author.id, :comic_id => @comic.id
-      panel.own?(@author).should == true
-    end
-    it '他人のコマならno' do
-      panel = Factory :panel, :author_id => @other_author.id, :comic_id => @comic.id
-      panel.own?(@author).should == false
-    end
-    it '作家が不明ならno' do
-      panel = Factory :panel, :author_id => @author.id, :comic_id => @comic.id
-      panel.own?(nil).should == false
-    end
-  end
-  describe '閲覧許可に於いて' do
-    before do
-      @comic = Factory :comic, :author_id => @author.id
-    end
-    it '自作の公開コミックのコマを見るときは許可する' do
-      Comic.any_instance.stub(:visible?).and_return(true)
-      panel = Factory :panel, :author_id => @author.id, :comic_id => @comic.id
-      panel.visible?(@author).should == true
-    end
-    it '自作のコマは非公開コミックでも許可する' do
-      Comic.any_instance.stub(:visible?).and_return(false)
-      panel = Factory :panel, :author_id => @author.id, :comic_id => @comic.id
-      panel.visible?(@author).should == true
-    end
-    it '他人のコマでも公開コミックなら許可する' do
-      Comic.any_instance.stub(:visible?).and_return(true)
-      panel = Factory :panel, :author_id => @other_author.id, :comic_id => @comic.id
-      panel.visible?(@author).should == true
-    end
-    it '他人のコマで非公開コミックなら許可しない' do
-      Comic.any_instance.stub(:visible?).and_return(false)
-      panel = Factory :panel, :author_id => @other_author.id, :comic_id => @comic.id
-      panel.visible?(@author).should == false
-    end
-  end
-  describe '単体取得に於いて' do
-    before do
-      @comic = Factory :comic, :author_id => @author.id
-      @panel = Factory :panel, :comic_id => @comic.id, :author_id => @author.id
-    end
-    it '指定のコマを返す' do
-      Comic.any_instance.stub(:visible?).and_return(true)
-      pl = Panel.show @panel.id, @author
-      pl.should eq @panel
-    end
-    context '他人の非公開コミックのコマを開こうとしたとき' do
-      it '403Forbidden例外を返す' do
-        Panel.any_instance.stub(:visible?).and_return(false)
-        lambda{
-          Panel.show @panel.id, @author
-        }.should raise_error(ActiveRecord::Forbidden)
-      end
-    end
-    context '存在しないコマを開こうとしたとき' do
-      it '404RecordNotFound例外を返す' do
-        lambda{
-          Panel.show 110, @author
-        }.should raise_error(ActiveRecord::RecordNotFound)
-      end
-    end
-  end
-  describe '関連テーブルプションに於いて' do
-    context 'オプションがないとき' do
-      it '4つの項目を含んでいる' do
-        r = Panel.show_include_opt
+  describe '作者判定に於いて' do\r
+    before do\r
+      @comic = Factory :comic, :author_id => @author.id\r
+    end\r
+    it '自作のコマならyes' do\r
+      panel = Factory :panel, :author_id => @author.id, :comic_id => @comic.id\r
+      panel.own?(@author).should == true\r
+    end\r
+    it '他人のコマならno' do\r
+      panel = Factory :panel, :author_id => @other_author.id, :comic_id => @comic.id\r
+      panel.own?(@author).should == false\r
+    end\r
+    it '作家が不明ならno' do\r
+      panel = Factory :panel, :author_id => @author.id, :comic_id => @comic.id\r
+      panel.own?(nil).should == false\r
+    end\r
+  end\r
+  describe '閲覧許可に於いて' do\r
+    before do\r
+      @comic = Factory :comic, :author_id => @author.id\r
+    end\r
+    it '自作の公開コミックのコマを見るときは許可する' do\r
+      Comic.any_instance.stub(:visible?).and_return(true)\r
+      panel = Factory :panel, :author_id => @author.id, :comic_id => @comic.id\r
+      panel.visible?(@author).should == true\r
+    end\r
+    it '自作のコマは非公開コミックでも許可する' do\r
+      Comic.any_instance.stub(:visible?).and_return(false)\r
+      panel = Factory :panel, :author_id => @author.id, :comic_id => @comic.id\r
+      panel.visible?(@author).should == true\r
+    end\r
+    it '他人のコマでも公開コミックなら許可する' do\r
+      Comic.any_instance.stub(:visible?).and_return(true)\r
+      panel = Factory :panel, :author_id => @other_author.id, :comic_id => @comic.id\r
+      panel.visible?(@author).should == true\r
+    end\r
+    it '他人のコマで非公開コミックなら許可しない' do\r
+      Comic.any_instance.stub(:visible?).and_return(false)\r
+      panel = Factory :panel, :author_id => @other_author.id, :comic_id => @comic.id\r
+      panel.visible?(@author).should == false\r
+    end\r
+  end\r
+  describe '単体取得に於いて' do\r
+    before do\r
+      @comic = Factory :comic, :author_id => @author.id\r
+      @panel = Factory :panel, :comic_id => @comic.id, :author_id => @author.id\r
+    end\r
+    it '指定のコマを返す' do\r
+      Comic.any_instance.stub(:visible?).and_return(true)\r
+      pl = Panel.show @panel.id, @author\r
+      pl.should eq @panel\r
+    end\r
+    context '他人の非公開コミックのコマを開こうとしたとき' do\r
+      it '403Forbidden例外を返す' do\r
+        Panel.any_instance.stub(:visible?).and_return(false)\r
+        lambda{\r
+          Panel.show @panel.id, @author\r
+        }.should raise_error(ActiveRecord::Forbidden)\r
+      end\r
+    end\r
+    context '存在しないコマを開こうとしたとき' do\r
+      it '404RecordNotFound例外を返す' do\r
+        lambda{\r
+          Panel.show 110, @author\r
+        }.should raise_error(ActiveRecord::RecordNotFound)\r
+      end\r
+    end\r
+  end\r
+  describe '関連テーブルプションに於いて' do\r
+    context 'オプションがないとき' do\r
+      it '4つの項目を含んでいる' do\r
+        r = Panel.show_include_opt\r
         r.should have(4).items\r
         r.should have(4).items\r
-      end
-      it 'コミックを含んでいる' do
-        r = Panel.show_include_opt
+      end\r
+      it 'コミックを含んでいる' do\r
+        r = Panel.show_include_opt\r
         r.has_key?(:comic).should be_true\r
         r.has_key?(:comic).should be_true\r
-      end
-      it 'コマ絵を含んでいる' do
-        r = Panel.show_include_opt
+      end\r
+      it 'コマ絵を含んでいる' do\r
+        r = Panel.show_include_opt\r
         r.has_key?(:panel_pictures).should be_true\r
         r.has_key?(:panel_pictures).should be_true\r
-      end
-        it 'コマ絵は素材を含んでいる' do
-          r = Panel.show_include_opt
+      end\r
+        it 'コマ絵は素材を含んでいる' do\r
+          r = Panel.show_include_opt\r
           r[:panel_pictures].has_key?(:resource_picture).should be_true\r
           r[:panel_pictures].has_key?(:resource_picture).should be_true\r
-        end
-          it '素材は絵師を含んでいる' do
-            r = Panel.show_include_opt
+        end\r
+          it '素材は絵師を含んでいる' do\r
+            r = Panel.show_include_opt\r
             r[:panel_pictures][:resource_picture].has_key?(:artist).should be_true\r
             r[:panel_pictures][:resource_picture].has_key?(:artist).should be_true\r
-          end
-          it '素材はライセンスを含んでいる' do
-            r = Panel.show_include_opt
+          end\r
+          it '素材はライセンスを含んでいる' do\r
+            r = Panel.show_include_opt\r
             r[:panel_pictures][:resource_picture].has_key?(:license).should be_true\r
             r[:panel_pictures][:resource_picture].has_key?(:license).should be_true\r
-          end
-      it 'フキダシを含んでいる' do
-        r = Panel.show_include_opt
+          end\r
+      it 'フキダシを含んでいる' do\r
+        r = Panel.show_include_opt\r
         r.has_key?(:speech_balloons).should be_true\r
         r.has_key?(:speech_balloons).should be_true\r
-      end
-        it 'フキダシはフキダシ枠を含んでいる' do
-          r = Panel.show_include_opt
+      end\r
+        it 'フキダシはフキダシ枠を含んでいる' do\r
+          r = Panel.show_include_opt\r
           r[:speech_balloons].has_key?(:balloons).should be_true\r
           r[:speech_balloons].has_key?(:balloons).should be_true\r
-        end
-        it 'フキダシはセリフを含んでいる' do
-          r = Panel.show_include_opt
+        end\r
+        it 'フキダシはセリフを含んでいる' do\r
+          r = Panel.show_include_opt\r
           r[:speech_balloons].has_key?(:speeches).should be_true\r
           r[:speech_balloons].has_key?(:speeches).should be_true\r
-        end
-      it '作家を含んでいる' do
-        r = Panel.show_include_opt
+        end\r
+      it '作家を含んでいる' do\r
+        r = Panel.show_include_opt\r
         r.has_key?(:author).should be_true\r
         r.has_key?(:author).should be_true\r
-      end
-    end
-    context 'オプションで原画を含ませたとき' do
-      it '5つの項目を含んでいる' do
-        r = Panel.show_include_opt(:include => {:test => {}})
+      end\r
+    end\r
+    context 'オプションで原画を含ませたとき' do\r
+      it '5つの項目を含んでいる' do\r
+        r = Panel.show_include_opt(:include => {:test => {}})\r
         r.should have(5).items\r
         r.should have(5).items\r
-      end
-      it 'testを含んでいる' do
-        r = Panel.show_include_opt(:include => {:test => {}})
+      end\r
+      it 'testを含んでいる' do\r
+        r = Panel.show_include_opt(:include => {:test => {}})\r
         r.has_key?(:test).should be_true\r
         r.has_key?(:test).should be_true\r
-      end
-    end
-  end
-  describe 'json単体出力オプションに於いて' do
-    it 'includeキーを含んでいる' do
-      r = Panel.show_json_include_opt
-      r.has_key?(:include).should be_true
-    end
-    it '4つの項目を含んでいる' do
-      r = Panel.show_json_include_opt[:include]
+      end\r
+    end\r
+  end\r
+  describe 'json単体出力オプションに於いて' do\r
+    it 'includeキーを含んでいる' do\r
+      r = Panel.show_json_include_opt\r
+      r.has_key?(:include).should be_true\r
+    end\r
+    it '4つの項目を含んでいる' do\r
+      r = Panel.show_json_include_opt[:include]\r
       r.should have(4).items\r
       r.should have(4).items\r
-    end
-    it 'コミックを含んでいる' do
-      r = Panel.show_json_include_opt[:include]
+    end\r
+    it 'コミックを含んでいる' do\r
+      r = Panel.show_json_include_opt[:include]\r
       r.has_key?(:comic).should be_true\r
       r.has_key?(:comic).should be_true\r
-    end
-    it 'コマ絵を含んでいる' do
-      r = Panel.show_json_include_opt[:include]
+    end\r
+    it 'コマ絵を含んでいる' do\r
+      r = Panel.show_json_include_opt[:include]\r
       r.has_key?(:panel_pictures).should be_true\r
       r.has_key?(:panel_pictures).should be_true\r
-    end
-      it 'コマ絵は素材を含んでいる' do
-        r = Panel.show_json_include_opt[:include]
+    end\r
+      it 'コマ絵は素材を含んでいる' do\r
+        r = Panel.show_json_include_opt[:include]\r
         r[:panel_pictures].has_key?(:resource_picture).should be_true\r
         r[:panel_pictures].has_key?(:resource_picture).should be_true\r
-      end
-        it '素材は絵師を含んでいる' do
-          r = Panel.show_json_include_opt[:include]
+      end\r
+        it '素材は絵師を含んでいる' do\r
+          r = Panel.show_json_include_opt[:include]\r
           r[:panel_pictures][:resource_picture].has_key?(:artist).should be_true\r
           r[:panel_pictures][:resource_picture].has_key?(:artist).should be_true\r
-        end
-        it '素材はライセンスを含んでいる' do
-          r = Panel.show_json_include_opt[:include]
+        end\r
+        it '素材はライセンスを含んでいる' do\r
+          r = Panel.show_json_include_opt[:include]\r
           r[:panel_pictures][:resource_picture].has_key?(:license).should be_true\r
           r[:panel_pictures][:resource_picture].has_key?(:license).should be_true\r
-        end
-    it 'フキダシを含んでいる' do
-      r = Panel.show_include_opt
+        end\r
+    it 'フキダシを含んでいる' do\r
+      r = Panel.show_include_opt\r
       r.has_key?(:speech_balloons).should be_true\r
       r.has_key?(:speech_balloons).should be_true\r
-    end
-      it 'フキダシはフキダシ枠を含んでいる' do
-        r = Panel.show_include_opt
+    end\r
+      it 'フキダシはフキダシ枠を含んでいる' do\r
+        r = Panel.show_include_opt\r
         r[:speech_balloons].has_key?(:balloons).should be_true\r
         r[:speech_balloons].has_key?(:balloons).should be_true\r
-      end
-      it 'フキダシはセリフを含んでいる' do
-        r = Panel.show_include_opt
+      end\r
+      it 'フキダシはセリフを含んでいる' do\r
+        r = Panel.show_include_opt\r
         r[:speech_balloons].has_key?(:speeches).should be_true\r
         r[:speech_balloons].has_key?(:speeches).should be_true\r
-      end
-    it '作家を含んでいる' do
-      r = Panel.show_json_include_opt[:include]
+      end\r
+    it '作家を含んでいる' do\r
+      r = Panel.show_json_include_opt[:include]\r
       r.has_key?(:author).should be_true\r
       r.has_key?(:author).should be_true\r
-    end
-  end
-  describe '一覧取得に於いて' do
-    before do
-      @comic = Factory :comic, :author_id => @author.id
-      @panel = Factory :panel, :comic_id => @comic.id, :author_id => @author.id
-    end
-    context 'page補正について' do
-      it '文字列から数値に変換される' do
-        Panel.page('8').should eq 8
-      end
-      it 'nilの場合は1になる' do
-        Panel.page().should eq 1
-      end
-      it '0以下の場合は1になる' do
-        Panel.page('0').should eq 1
-      end
-    end
-    context 'page_size補正について' do
-      it '文字列から数値に変換される' do
-        Panel.page_size('7').should eq 7
-      end
-      it 'nilの場合はPanel.default_page_sizeになる' do
-        Panel.page_size().should eq Panel.default_page_size
-      end
-      it '0以下の場合はPanel.default_page_sizeになる' do
-        Panel.page_size('0').should eq Panel.default_page_size
-      end
-      it 'Panel.max_page_sizeを超えた場合はPanel.max_page_sizeになる' do
-        Panel.page_size('1000').should eq Panel.max_page_size
-      end
-    end
-    it 'リストを返す' do
-      pl = Panel.list
-      pl.should eq [@panel]
-    end
-    it '時系列で並んでいる' do
-      npl = Factory :panel, :comic_id => @comic.id, :author_id => @author.id, :t => 1
-      pl = Panel.list
-      pl.should eq [npl, @panel]
-    end
-    context 'DBに5件あって1ページの件数を2件に変えたとして' do
-      before do
-        @npl2 = Factory :panel, :comic_id => @comic.id, :author_id => @author.id, :t => 1
-        @npl3 = Factory :panel, :comic_id => @comic.id, :author_id => @author.id, :t => 2
-        @npl4 = Factory :panel, :comic_id => @comic.id, :author_id => @author.id, :t => 3
-        @npl5 = Factory :panel, :comic_id => @comic.id, :author_id => @author.id, :t => 4
-        Panel.stub(:default_page_size).and_return(2)
-      end
-      it '通常は2件を返す' do
-        pl = Panel.list
-        pl.should have(2).items 
-      end
-      it 'page=1なら末尾2件を返す' do
-        #時系列で並んでいる
-        pl = Panel.list( {}, 1)
-        pl.should eq [@npl5, @npl4]
-      end
-      it 'page=2なら中間2件を返す' do
-        pl = Panel.list({}, 2)
-        pl.should eq [@npl3, @npl2]
-      end
-      it 'page=3なら先頭1件を返す' do
-        pl = Panel.list({}, 3)
-        pl.should eq [@panel]
-      end
-    end
-  end
-  describe 'list関連テーブルプションに於いて' do
-    it 'includeキーを含んでいる' do
-      r = Panel.list_opt
-      r.has_key?(:include).should be_true
-    end
-    it '4つの項目を含んでいる' do
-      r = Panel.list_opt[:include]
+    end\r
+  end\r
+  describe '一覧取得に於いて' do\r
+    before do\r
+      @comic = Factory :comic, :author_id => @author.id\r
+      @panel = Factory :panel, :comic_id => @comic.id, :author_id => @author.id\r
+    end\r
+    context 'page補正について' do\r
+      it '文字列から数値に変換される' do\r
+        Panel.page('8').should eq 8\r
+      end\r
+      it 'nilの場合は1になる' do\r
+        Panel.page().should eq 1\r
+      end\r
+      it '0以下の場合は1になる' do\r
+        Panel.page('0').should eq 1\r
+      end\r
+    end\r
+    context 'page_size補正について' do\r
+      it '文字列から数値に変換される' do\r
+        Panel.page_size('7').should eq 7\r
+      end\r
+      it 'nilの場合はPanel.default_page_sizeになる' do\r
+        Panel.page_size().should eq Panel.default_page_size\r
+      end\r
+      it '0以下の場合はPanel.default_page_sizeになる' do\r
+        Panel.page_size('0').should eq Panel.default_page_size\r
+      end\r
+      it 'Panel.max_page_sizeを超えた場合はPanel.max_page_sizeになる' do\r
+        Panel.page_size('1000').should eq Panel.max_page_size\r
+      end\r
+    end\r
+    it 'リストを返す' do\r
+      pl = Panel.list\r
+      pl.should eq [@panel]\r
+    end\r
+    it '時系列で並んでいる' do\r
+      npl = Factory :panel, :comic_id => @comic.id, :author_id => @author.id, :t => 1\r
+      pl = Panel.list\r
+      pl.should eq [npl, @panel]\r
+    end\r
+    context 'DBに5件あって1ページの件数を2件に変えたとして' do\r
+      before do\r
+        @npl2 = Factory :panel, :comic_id => @comic.id, :author_id => @author.id, :t => 1\r
+        @npl3 = Factory :panel, :comic_id => @comic.id, :author_id => @author.id, :t => 2\r
+        @npl4 = Factory :panel, :comic_id => @comic.id, :author_id => @author.id, :t => 3\r
+        @npl5 = Factory :panel, :comic_id => @comic.id, :author_id => @author.id, :t => 4\r
+        Panel.stub(:default_page_size).and_return(2)\r
+      end\r
+      it '通常は2件を返す' do\r
+        pl = Panel.list\r
+        pl.should have(2).items \r
+      end\r
+      it 'page=1なら末尾2件を返す' do\r
+        #時系列で並んでいる\r
+        pl = Panel.list( {}, 1)\r
+        pl.should eq [@npl5, @npl4]\r
+      end\r
+      it 'page=2なら中間2件を返す' do\r
+        pl = Panel.list({}, 2)\r
+        pl.should eq [@npl3, @npl2]\r
+      end\r
+      it 'page=3なら先頭1件を返す' do\r
+        pl = Panel.list({}, 3)\r
+        pl.should eq [@panel]\r
+      end\r
+    end\r
+  end\r
+  describe 'list関連テーブルプションに於いて' do\r
+    it 'includeキーを含んでいる' do\r
+      r = Panel.list_opt\r
+      r.has_key?(:include).should be_true\r
+    end\r
+    it '4つの項目を含んでいる' do\r
+      r = Panel.list_opt[:include]\r
       r.should have(4).items\r
       r.should have(4).items\r
-    end
-    it 'コミックを含んでいる' do
-      r = Panel.list_opt[:include]
+    end\r
+    it 'コミックを含んでいる' do\r
+      r = Panel.list_opt[:include]\r
       r.has_key?(:comic).should be_true\r
       r.has_key?(:comic).should be_true\r
-    end
-    it 'コマ絵を含んでいる' do
-      r = Panel.list_opt[:include]
+    end\r
+    it 'コマ絵を含んでいる' do\r
+      r = Panel.list_opt[:include]\r
       r.has_key?(:panel_pictures).should be_true\r
       r.has_key?(:panel_pictures).should be_true\r
-    end
-      it 'コマ絵は素材を含んでいる' do
-        r = Panel.list_opt[:include]
+    end\r
+      it 'コマ絵は素材を含んでいる' do\r
+        r = Panel.list_opt[:include]\r
         r[:panel_pictures].has_key?(:resource_picture).should be_true\r
         r[:panel_pictures].has_key?(:resource_picture).should be_true\r
-      end
-        it '素材は絵師を含んでいる' do
-          r = Panel.list_opt[:include]
+      end\r
+        it '素材は絵師を含んでいる' do\r
+          r = Panel.list_opt[:include]\r
           r[:panel_pictures][:resource_picture].has_key?(:artist).should be_true\r
           r[:panel_pictures][:resource_picture].has_key?(:artist).should be_true\r
-        end
-        it '素材はライセンスを含んでいる' do
-          r = Panel.list_opt[:include]
+        end\r
+        it '素材はライセンスを含んでいる' do\r
+          r = Panel.list_opt[:include]\r
           r[:panel_pictures][:resource_picture].has_key?(:license).should be_true\r
           r[:panel_pictures][:resource_picture].has_key?(:license).should be_true\r
-        end
-    it 'フキダシを含んでいる' do
-      r = Panel.show_include_opt
+        end\r
+    it 'フキダシを含んでいる' do\r
+      r = Panel.show_include_opt\r
       r.has_key?(:speech_balloons).should be_true\r
       r.has_key?(:speech_balloons).should be_true\r
-    end
-      it 'フキダシはフキダシ枠を含んでいる' do
-        r = Panel.show_include_opt
+    end\r
+      it 'フキダシはフキダシ枠を含んでいる' do\r
+        r = Panel.show_include_opt\r
         r[:speech_balloons].has_key?(:balloons).should be_true\r
         r[:speech_balloons].has_key?(:balloons).should be_true\r
-      end
-      it 'フキダシはセリフを含んでいる' do
-        r = Panel.show_include_opt
+      end\r
+      it 'フキダシはセリフを含んでいる' do\r
+        r = Panel.show_include_opt\r
         r[:speech_balloons].has_key?(:speeches).should be_true\r
         r[:speech_balloons].has_key?(:speeches).should be_true\r
-      end
-    it '作家を含んでいる' do
-      r = Panel.list_opt[:include]
+      end\r
+    it '作家を含んでいる' do\r
+      r = Panel.list_opt[:include]\r
       r.has_key?(:author).should be_true\r
       r.has_key?(:author).should be_true\r
-    end
-  end
-  describe 'json一覧出力オプションに於いて' do
-    it 'includeキーを含んでいる' do
-      r = Panel.list_json_opt
-      r.has_key?(:include).should be_true
-    end
-    it '4つの項目を含んでいる' do
-      r = Panel.list_json_opt[:include]
+    end\r
+  end\r
+  describe 'json一覧出力オプションに於いて' do\r
+    it 'includeキーを含んでいる' do\r
+      r = Panel.list_json_opt\r
+      r.has_key?(:include).should be_true\r
+    end\r
+    it '4つの項目を含んでいる' do\r
+      r = Panel.list_json_opt[:include]\r
       r.should have(4).items\r
       r.should have(4).items\r
-    end
-    it 'コミックを含んでいる' do
-      r = Panel.list_json_opt[:include]
+    end\r
+    it 'コミックを含んでいる' do\r
+      r = Panel.list_json_opt[:include]\r
       r.has_key?(:comic).should be_true\r
       r.has_key?(:comic).should be_true\r
-    end
-    it 'コマ絵を含んでいる' do
-      r = Panel.list_json_opt[:include]
+    end\r
+    it 'コマ絵を含んでいる' do\r
+      r = Panel.list_json_opt[:include]\r
       r.has_key?(:panel_pictures).should be_true\r
       r.has_key?(:panel_pictures).should be_true\r
-    end
-      it 'コマ絵は素材を含んでいる' do
-        r = Panel.list_json_opt[:include]
+    end\r
+      it 'コマ絵は素材を含んでいる' do\r
+        r = Panel.list_json_opt[:include]\r
         r[:panel_pictures].has_key?(:resource_picture).should be_true\r
         r[:panel_pictures].has_key?(:resource_picture).should be_true\r
-      end
-        it '素材は絵師を含んでいる' do
-          r = Panel.list_json_opt[:include]
+      end\r
+        it '素材は絵師を含んでいる' do\r
+          r = Panel.list_json_opt[:include]\r
           r[:panel_pictures][:resource_picture].has_key?(:artist).should be_true\r
           r[:panel_pictures][:resource_picture].has_key?(:artist).should be_true\r
-        end
-        it '素材はライセンスを含んでいる' do
-          r = Panel.list_json_opt[:include]
+        end\r
+        it '素材はライセンスを含んでいる' do\r
+          r = Panel.list_json_opt[:include]\r
           r[:panel_pictures][:resource_picture].has_key?(:license).should be_true\r
           r[:panel_pictures][:resource_picture].has_key?(:license).should be_true\r
-        end
-    it 'フキダシを含んでいる' do
-      r = Panel.show_include_opt
+        end\r
+    it 'フキダシを含んでいる' do\r
+      r = Panel.show_include_opt\r
       r.has_key?(:speech_balloons).should be_true\r
       r.has_key?(:speech_balloons).should be_true\r
-    end
-      it 'フキダシはフキダシ枠を含んでいる' do
-        r = Panel.show_include_opt
+    end\r
+      it 'フキダシはフキダシ枠を含んでいる' do\r
+        r = Panel.show_include_opt\r
         r[:speech_balloons].has_key?(:balloons).should be_true\r
         r[:speech_balloons].has_key?(:balloons).should be_true\r
-      end
-      it 'フキダシはセリフを含んでいる' do
-        r = Panel.show_include_opt
+      end\r
+      it 'フキダシはセリフを含んでいる' do\r
+        r = Panel.show_include_opt\r
         r[:speech_balloons].has_key?(:speeches).should be_true\r
         r[:speech_balloons].has_key?(:speeches).should be_true\r
-      end
-    it '作家を含んでいる' do
-      r = Panel.list_json_opt[:include]
+      end\r
+    it '作家を含んでいる' do\r
+      r = Panel.list_json_opt[:include]\r
       r.has_key?(:author).should be_true\r
       r.has_key?(:author).should be_true\r
-    end
+    end\r
+  end\r
+  \r
+  #異常データ検出\r
+    #コマはコミックに従属しなくなったのでtで入れ替えるチェックは要らなくなった\r
+    #コマ絵とフキダシの整合チェックをする\r
+  describe 'id収集に於いて' do\r
+    context 'つつがなく終わるとき' do\r
+      it '第一パラメータで指定された配列中から第二引数のidを収集している' do\r
+        a = [[{:panel_id => 1, :a => 'a'}, {:panel_id => 2, :a => 'a'}], \r
+          [{:panel_id => 3, :a => 'a'}, {:panel_id => 4, :a => 'a'}]]\r
+        r = Panel.collect_element_value a, :panel_id\r
+        r.should eq [1, 2, 3, 4]\r
+      end\r
+    end\r
+    context 'Nil除外指示があるとき' do\r
+      it '収集したpanel_idのうちnilは除外している' do\r
+        a = [[{:panel_id => 1, :a => 'a'}, {:panel_id => 2, :a => 'a'}, {:panel_id => nil, :a => 'a'}], \r
+          [{:panel_id => 3, :a => 'a'}, {:panel_id => nil, :a => 'a'}, {:panel_id => 4, :a => 'a'}]]\r
+        r = Panel.collect_element_value a, :panel_id, true\r
+        r.should eq [1, 2, 3, 4]\r
+      end\r
+    end\r
+  end\r
+  describe 'id一致チェックに於いて' do\r
+    #parent.idがNilのときはすべてNil。数値のときは全一致\r
+    context '親が既存(idが数値)のとき' do\r
+      it 'すべてid一致するときTrueを返す' do\r
+        r = Panel.validate_id [1, 1, 1, 1], 1\r
+        r.should be_true\r
+      end\r
+      it 'idが一致する中にNilが混じってもTrueを返す' do\r
+        r = Panel.validate_id [1, 1, 1, 1, nil], 1\r
+        r.should be_true\r
+      end\r
+      it 'すべて数値でも一致しないときFalseを返す' do\r
+        r = Panel.validate_id [1, 1, 1, 1, 2], 1\r
+        r.should be_false\r
+      end\r
+      it '数値とNilが混ざってもIDが一致しないときFalseを返す' do\r
+        r = Panel.validate_id [1, 1, nil, 2], 1\r
+        r.should be_false\r
+      end\r
+    end\r
+    context '親が新規(idがNil)のとき' do\r
+      it 'すべてNilはTrueを返す' do\r
+        r = Panel.validate_id [ nil,nil,nil,nil], nil\r
+        r.should be_true\r
+      end\r
+      it 'すべてnilでなければFalseを返す' do\r
+        r = Panel.validate_id [nil,nil,nil,nil, 2], nil\r
+        r.should be_false\r
+      end\r
+    end\r
+  end\r
+  describe 'idチェック単体に於いて' do\r
+    before do\r
+#      @pp = Factory :panel_picture, :panel_id => @panel.id, :t => 1\r
+    end\r
+    context 'つつがなく終わるとき' do\r
+      it 'idを収集依頼している' do\r
+        Panel.should_receive(:collect_element_value).with(any_args).exactly(1)\r
+        Panel.stub(:collect_element_value).with(any_args).and_return([])\r
+        Panel.stub(:validate_id).with(any_args).and_return(true)\r
+        r = Panel.validate_element_id [], :panel_id, nil\r
+      end\r
+      it '収集したidを一致チェック依頼している' do\r
+        Panel.should_receive(:validate_id).with(any_args).exactly(1)\r
+        Panel.stub(:collect_element_value).with(any_args).and_return([])\r
+        Panel.stub(:validate_id).with(any_args).and_return(true)\r
+        r = Panel.validate_element_id [], :panel_id, nil\r
+      end\r
+    end\r
+    #実データでチェック\r
+    #依頼チェックだけでは不安なので最低限のチェックを\r
+    context 'コマ新規のとき' do\r
+      it 'コマ絵で正常通過している' do\r
+        @panel = Factory.build :panel, :author_id => @author.id\r
+        @panel.panel_pictures.build(\r
+          Factory.attributes_for(:panel_picture, :panel_id => nil, :resource_picture_id => @rp.id, :t => nil)\r
+        )\r
+        r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
+        r.should be_true\r
+      end\r
+      it 'フキダシで正常通過している' do\r
+        @panel = Factory.build :panel, :author_id => @author.id\r
+        @panel.speech_balloons.build(\r
+          Factory.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
+        )\r
+        r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
+        r.should be_true\r
+      end\r
+    end\r
+    context 'コマ既存のとき' do\r
+      it 'コマ絵で正常通過している' do\r
+        @panel = Factory :panel, :author_id => @author.id\r
+        @panel.panel_pictures.build(\r
+          Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => nil)\r
+        )\r
+        r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
+        r.should be_true\r
+      end\r
+      it 'フキダシで正常通過している' do\r
+        @panel = Factory :panel, :author_id => @author.id\r
+        @panel.speech_balloons.build(\r
+          Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
+        )\r
+        r = Panel.validate_element_id [@panel.panel_pictures, @panel.speech_balloons], :panel_id, @panel.id\r
+        r.should be_true\r
+      end\r
+    end\r
+    context 'フキダシ新規のとき' do\r
+      it 'バルーンで正常通過している' do\r
+        @panel = Factory.build :panel, :author_id => @author.id\r
+        @panel.speech_balloons.build(\r
+          Factory.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
+        )\r
+        @panel.speech_balloons.first.balloons.build(\r
+          Factory.attributes_for(:balloon, :speech_balloon_id => nil)\r
+        )\r
+        r = Panel.validate_element_id [@panel.speech_balloons.first.speeches, @panel.speech_balloons.first.balloons], :speech_balloon_id, @panel.speech_balloons.first.id\r
+        r.should be_true\r
+      end\r
+      it 'セリフで正常通過している' do\r
+        @panel = Factory.build :panel, :author_id => @author.id\r
+        @panel.speech_balloons.build(\r
+          Factory.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
+        )\r
+        @panel.speech_balloons.first.speeches.build(\r
+          Factory.attributes_for(:speech, :speech_balloon_id => nil)\r
+        )\r
+        r = Panel.validate_element_id [@panel.speech_balloons.first.speeches, @panel.speech_balloons.first.balloons], :speech_balloon_id, @panel.speech_balloons.first.id\r
+        r.should be_true\r
+      end\r
+    end\r
+  end\r
+  describe 'idチェックリスト生成に於いて' do\r
+    before do\r
+      @panel = Factory.build :panel, :author_id => @author.id\r
+    end\r
+    context 'つつがなく終わるとき' do\r
+      it 'コマ部品とフキダシ部品のトータル2を返す' do\r
+        @panel.panel_pictures.build(\r
+          Factory.attributes_for(:panel_picture, :panel_id => nil, :resource_picture_id => @rp.id, :t => nil)\r
+        )\r
+        @panel.speech_balloons.build(\r
+          Factory.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id)\r
+        )\r
+        @panel.speech_balloons.first.balloons.build(\r
+          Factory.attributes_for(:balloon, :speech_balloon_id => nil)\r
+        )\r
+        @panel.speech_balloons.first.speeches.build(\r
+          Factory.attributes_for(:speech, :speech_balloon_id => nil)\r
+        )\r
+        r = @panel.validate_id_list\r
+        r.should have(2).items\r
+      end\r
+      it 'コマ部品とフキダシ部品[複数:2]のケースでトータル3を返す' do\r
+        @panel.panel_pictures.build(\r
+          Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => nil)\r
+        )\r
+        sb1 = @panel.speech_balloons.build(\r
+          Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
+        )\r
+        sb1.balloons.build(\r
+          Factory.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
+        )\r
+        sb1.speeches.build(\r
+          Factory.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
+        )\r
+        sb2 = @panel.speech_balloons.build(\r
+          Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
+        )\r
+        sb2.balloons.build(\r
+          Factory.attributes_for(:balloon, :speech_balloon_id => sb2.id)\r
+        )\r
+        sb2.speeches.build(\r
+          Factory.attributes_for(:speech, :speech_balloon_id => sb2.id)\r
+        )\r
+        r = @panel.validate_id_list\r
+        r.should have(3).items\r
+      end\r
+    end\r
+  end\r
+  describe 'idチェック複合に於いて' do\r
+    before do\r
+      @panel = Factory.build :panel, :author_id => @author.id\r
+    end\r
+    context 'つつがなく終わるとき' do\r
+      it 'コマ部品とフキダシ部品の二回チェック依頼している' do\r
+        Panel.should_receive(:validate_element_id).with(any_args).exactly(2)\r
+        Panel.stub(:validate_element_id).with(any_args).and_return(true)\r
+        @panel.panel_pictures.build(\r
+          Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => nil)\r
+        )\r
+        sb1 = @panel.speech_balloons.build(\r
+          Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id)\r
+        )\r
+        sb1.balloons.build(\r
+          Factory.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
+        )\r
+        sb1.speeches.build(\r
+          Factory.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
+        )\r
+        r = Panel.validate_elements_id(@panel.validate_id_list)\r
+      end\r
+    end\r
+  end\r
+  describe 'シリアライズチェックに於いて' do\r
+    context 'つつがなく終わるとき' do\r
+      it '0からシリアライズされているならTrueを返す' do\r
+        r = Panel.validate_t [0, 1, 2]\r
+        r.should be_true\r
+      end\r
+      it '見た目はシリアライズされてなくてもソート結果が無事ならtrueを返す' do\r
+        r = Panel.validate_t [0, 2, 1]\r
+        r.should be_true\r
+      end\r
+      it '見た目はシリアライズされてなくてもソート結果が無事ならtrueを返す' do\r
+        r = Panel.validate_t [ 2, 1, 4, 3, 0]\r
+        r.should be_true\r
+      end\r
+    end\r
+    context '異常なとき' do\r
+      it '0から始まらないならFalseを返す' do\r
+        r = Panel.validate_t [1, 2, 3]\r
+        r.should be_false\r
+      end\r
+      it '連続していないならFalseを返す' do\r
+        r = Panel.validate_t [0, 1, 2, 4]\r
+        r.should be_false\r
+      end\r
+      it '連続していないならFalseを返す' do\r
+        r = Panel.validate_t [0, 1, 2, 4, 5]\r
+        r.should be_false\r
+      end\r
+    end\r
+  end\r
+  describe 'tチェック単体に於いて' do\r
+    before do\r
+    end\r
+    context 'つつがなく終わるとき' do\r
+      it 'コマ絵とフキダシのtを収集依頼している' do\r
+        Panel.should_receive(:collect_element_value).with(any_args).exactly(1)\r
+        Panel.stub(:collect_element_value).with(any_args).and_return([])\r
+        Panel.stub(:validate_t).with(any_args).and_return(true)\r
+        r = Panel.validate_element_t [], :t\r
+      end\r
+      it '収集したtをシリアライズチェック依頼している' do\r
+        Panel.stub(:collect_element_value).with(any_args).and_return([])\r
+        Panel.should_receive(:validate_t).with(any_args).exactly(1)\r
+        Panel.stub(:validate_t).with(any_args).and_return(true)\r
+        r = Panel.validate_element_t [], :t\r
+      end\r
+    end\r
+    #実データでチェック\r
+    #依頼チェックだけでは不安なので最低限のチェックを\r
+    context '新規のとき' do\r
+      it 'コマ絵で正常通過している' do\r
+        @panel = Factory.build :panel, :author_id => @author.id\r
+        @panel.panel_pictures.build(\r
+          Factory.attributes_for(:panel_picture, :panel_id => nil, :resource_picture_id => @rp.id, :t => nil)\r
+        )\r
+        r = Panel.validate_element_t [@panel.panel_pictures, @panel.speech_balloons], :t\r
+        r.should be_true\r
+      end\r
+      it 'フキダシで正常通過している' do\r
+        @panel = Factory.build :panel, :author_id => @author.id\r
+        @panel.speech_balloons.build(\r
+          Factory.attributes_for(:speech_balloon, :panel_id => nil, :speech_balloon_template_id => @sbt.id, :t => nil)\r
+        )\r
+        r = Panel.validate_element_t [@panel.panel_pictures, @panel.speech_balloons], :t\r
+        r.should be_true\r
+      end\r
+    end\r
+    context '既存のとき' do\r
+      it 'コマ絵で正常通過している' do\r
+        @panel = Factory :panel, :author_id => @author.id\r
+        @panel.panel_pictures.build(\r
+          Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => 0)\r
+        )\r
+        r = Panel.validate_element_t [@panel.panel_pictures, @panel.speech_balloons], :t\r
+        r.should be_true\r
+      end\r
+      it 'フキダシで正常通過している' do\r
+        @panel = Factory :panel, :author_id => @author.id\r
+        @panel.speech_balloons.build(\r
+          Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
+        )\r
+        r = Panel.validate_element_t [@panel.panel_pictures, @panel.speech_balloons], :t\r
+        r.should be_true\r
+      end\r
+    end\r
+  end\r
+  describe '複合チェックに於いて' do\r
+    context 'つつがなく終わるとき' do\r
+      it 'している' do\r
+        @panel = Factory.build :panel, :author_id => @author.id\r
+        @panel.panel_pictures.build(\r
+          Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => 0)\r
+        )\r
+        @panel.panel_pictures.build(\r
+          Factory.attributes_for(:panel_picture, :panel_id => @panel.id, :resource_picture_id => @rp.id, :t => 1)\r
+        )\r
+        sb1 = @panel.speech_balloons.build(\r
+          Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 2)\r
+        )\r
+        sb1.balloons.build(\r
+          Factory.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
+        )\r
+        sb1.speeches.build(\r
+          Factory.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
+        )\r
+        sb2 = @panel.speech_balloons.build(\r
+          Factory.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 3)\r
+        )\r
+        sb2.balloons.build(\r
+          Factory.attributes_for(:balloon, :speech_balloon_id => sb2.id)\r
+        )\r
+        sb2.speeches.build(\r
+          Factory.attributes_for(:speech, :speech_balloon_id => sb2.id)\r
+        )\r
+        r = @panel.validate_child\r
+        r.should be_true\r
+      end\r
+    end\r
   end\r
   end\r
-  
-end
+end\r