rack-ketai 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +1 -0
- data/MIT-LICENSE +21 -0
- data/README.rdoc +122 -0
- data/VERSION +1 -0
- data/lib/rack/ketai/carrier/abstract.rb +263 -0
- data/lib/rack/ketai/carrier/au.rb +153 -0
- data/lib/rack/ketai/carrier/cidrs/au.rb +32 -0
- data/lib/rack/ketai/carrier/cidrs/docomo.rb +14 -0
- data/lib/rack/ketai/carrier/cidrs/softbank.rb +10 -0
- data/lib/rack/ketai/carrier/docomo.rb +157 -0
- data/lib/rack/ketai/carrier/emoji/ausjisstrtoemojiid.rb +1391 -0
- data/lib/rack/ketai/carrier/emoji/docomosjisstrtoemojiid.rb +759 -0
- data/lib/rack/ketai/carrier/emoji/emojidata.rb +836 -0
- data/lib/rack/ketai/carrier/emoji/emojiidtotypecast.rb +432 -0
- data/lib/rack/ketai/carrier/emoji/softbankutf8strtoemojiid.rb +1119 -0
- data/lib/rack/ketai/carrier/emoji/softbankwebcodetoutf8str.rb +499 -0
- data/lib/rack/ketai/carrier/general.rb +75 -0
- data/lib/rack/ketai/carrier/iphone.rb +16 -0
- data/lib/rack/ketai/carrier/softbank.rb +144 -0
- data/lib/rack/ketai/carrier/specs/au.rb +1 -0
- data/lib/rack/ketai/carrier/specs/docomo.rb +1 -0
- data/lib/rack/ketai/carrier/specs/softbank.rb +1 -0
- data/lib/rack/ketai/carrier.rb +18 -0
- data/lib/rack/ketai/display.rb +16 -0
- data/lib/rack/ketai/middleware.rb +36 -0
- data/lib/rack/ketai.rb +12 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/unit/au_filter_spec.rb +96 -0
- data/spec/unit/au_spec.rb +240 -0
- data/spec/unit/carrier_spec.rb +30 -0
- data/spec/unit/display_spec.rb +25 -0
- data/spec/unit/docomo_filter_spec.rb +106 -0
- data/spec/unit/docomo_spec.rb +344 -0
- data/spec/unit/emoticon_filter_spec.rb +91 -0
- data/spec/unit/filter_spec.rb +38 -0
- data/spec/unit/iphone_spec.rb +16 -0
- data/spec/unit/middleware_spec.rb +38 -0
- data/spec/unit/softbank_filter_spec.rb +133 -0
- data/spec/unit/softbank_spec.rb +200 -0
- data/spec/unit/valid_addr_spec.rb +86 -0
- data/test/spec_runner.rb +29 -0
- data/tools/generate_emoji_dic.rb +434 -0
- data/tools/update_speclist.rb +87 -0
- metadata +138 -0
| @@ -0,0 +1,200 @@ | |
| 1 | 
            +
            # -*- coding: utf-8 -*-
         | 
| 2 | 
            +
            require 'rack/ketai/carrier/softbank'
         | 
| 3 | 
            +
            describe "Rack::Ketai::Carrier::Softbank" do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              before(:each) do
         | 
| 6 | 
            +
                
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
              # http://creation.mb.softbank.jp/web/web_ua_about.html
         | 
| 10 | 
            +
              # SoftBank 3G Series => 3GC型
         | 
| 11 | 
            +
              # C型 P型は省略(もうなくなるし)
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              describe "3GCケータイで" do
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                # http://ke-tai.org/blog/2008/09/08/phoneid/
         | 
| 16 | 
            +
                # http://creation.mb.softbank.jp/web/web_ua_about.html
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                describe "端末シリアル番号とX-JPHONE-UIDが送信されたとき" do
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  before(:each) do
         | 
| 21 | 
            +
                    @env = Rack::MockRequest.env_for('http://hoge.com/dummy',
         | 
| 22 | 
            +
                                                     'HTTP_USER_AGENT' => 'SoftBank/1.0/824T/TJ001/SN000000000000000 Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1',
         | 
| 23 | 
            +
                                                     'HTTP_X_JPHONE_UID' => 'c10Sty5bmqjsZeb2')
         | 
| 24 | 
            +
                    @mobile = Rack::Ketai::Carrier::Softbank.new(@env)
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
                  
         | 
| 27 | 
            +
                  it "#subscriberid でx-jphone-uidを取得できること" do
         | 
| 28 | 
            +
                    @mobile.subscriberid.should == 'c10Sty5bmqjsZeb2'
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
                  
         | 
| 31 | 
            +
                  it "#deviceid で端末シリアル番号を取得できること" do
         | 
| 32 | 
            +
                    @mobile.deviceid.should == '000000000000000'
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  it "#ident でx-jphone-uidを取得できること" do
         | 
| 36 | 
            +
                    @mobile.ident.should == @mobile.subscriberid
         | 
| 37 | 
            +
                    @mobile.ident.should == 'c10Sty5bmqjsZeb2'
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                describe "端末シリアル番号の送出が禁止されているとき(最近のはデフォルトでこう)" do
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  before(:each) do
         | 
| 44 | 
            +
                    @env = Rack::MockRequest.env_for('http://hoge.com/dummy',
         | 
| 45 | 
            +
                                                     'HTTP_USER_AGENT' => 'SoftBank/1.0/824T/TJ001 Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1',
         | 
| 46 | 
            +
                                                     'HTTP_X_JPHONE_UID' => 'c10Sty5bmqjsZeb2')
         | 
| 47 | 
            +
                    @mobile = Rack::Ketai::Carrier::Softbank.new(@env)
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
                  
         | 
| 50 | 
            +
                  it "#subscriberid でx-jphone-uidを取得できること" do
         | 
| 51 | 
            +
                    @mobile.subscriberid.should == 'c10Sty5bmqjsZeb2'
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
                  
         | 
| 54 | 
            +
                  it "#deviceid が nil を返すこと" do
         | 
| 55 | 
            +
                    @mobile.deviceid.should be_nil
         | 
| 56 | 
            +
                  end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  it "#ident でx-jphone-uidを取得できること" do
         | 
| 59 | 
            +
                    @mobile.ident.should == @mobile.subscriberid
         | 
| 60 | 
            +
                    @mobile.ident.should == 'c10Sty5bmqjsZeb2'
         | 
| 61 | 
            +
                  end
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                describe "X-JPHONE-UIDの送出が禁止されているとき" do
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  before(:each) do
         | 
| 67 | 
            +
                    @env = Rack::MockRequest.env_for('http://hoge.com/dummy',
         | 
| 68 | 
            +
                                                     'HTTP_USER_AGENT' => 'SoftBank/1.0/824T/TJ001/SN000000000000000 Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1')
         | 
| 69 | 
            +
                    @mobile = Rack::Ketai::Carrier::Softbank.new(@env)
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
                  
         | 
| 72 | 
            +
                  it "#subscriberid が nil を返すこと" do
         | 
| 73 | 
            +
                    @mobile.subscriberid.should be_nil
         | 
| 74 | 
            +
                  end
         | 
| 75 | 
            +
                  
         | 
| 76 | 
            +
                  it "#deviceid で端末シリアル番号を取得できること" do
         | 
| 77 | 
            +
                    @mobile.deviceid.should == '000000000000000'
         | 
| 78 | 
            +
                  end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                  it "#ident で端末シリアル番号を取得できること" do
         | 
| 81 | 
            +
                    @mobile.ident.should == @mobile.deviceid
         | 
| 82 | 
            +
                    @mobile.ident.should == '000000000000000'
         | 
| 83 | 
            +
                  end
         | 
| 84 | 
            +
                end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                describe "端末シリアル番号もX-JPHONE-UIDも送出が禁止されているとき" do
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                  before(:each) do
         | 
| 89 | 
            +
                    @env = Rack::MockRequest.env_for('http://hoge.com/dummy',
         | 
| 90 | 
            +
                                                     'HTTP_USER_AGENT' => 'SoftBank/1.0/824T/TJ001 Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1')
         | 
| 91 | 
            +
                    @mobile = Rack::Ketai::Carrier::Softbank.new(@env)
         | 
| 92 | 
            +
                  end
         | 
| 93 | 
            +
                  
         | 
| 94 | 
            +
                  it "#subscriberid が nil を返すこと" do
         | 
| 95 | 
            +
                    @mobile.subscriberid.should be_nil
         | 
| 96 | 
            +
                  end
         | 
| 97 | 
            +
                  
         | 
| 98 | 
            +
                  it "#deviceid が nil を返すこと" do
         | 
| 99 | 
            +
                    @mobile.deviceid.should be_nil
         | 
| 100 | 
            +
                  end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                  it "#ident が nil を返すこと" do
         | 
| 103 | 
            +
                    @mobile.ident.should be_nil
         | 
| 104 | 
            +
                  end
         | 
| 105 | 
            +
                end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                describe "ディスプレイ情報を取得できること" do
         | 
| 108 | 
            +
                  
         | 
| 109 | 
            +
                  describe "既知の端末のとき" do 
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                    it "環境変数を優先すること" do
         | 
| 112 | 
            +
                      @env = Rack::MockRequest.env_for('http://hoge.com/dummy',
         | 
| 113 | 
            +
                                                       'HTTP_USER_AGENT' => 'SoftBank/1.0/933SH/SHJ002[/Serial] Browser/NetFront/3.5 Profile/MIDP-2.0 Configuration/CLDC-1.1',
         | 
| 114 | 
            +
                                                       'HTTP_X_JPHONE_DISPLAY' => '1024*768',
         | 
| 115 | 
            +
                                                       'HTTP_X_JPHONE_COLOR' => 'C256')
         | 
| 116 | 
            +
                      @mobile = Rack::Ketai::Carrier::Softbank.new(@env)
         | 
| 117 | 
            +
                      display = @mobile.display
         | 
| 118 | 
            +
                      display.should_not be_nil
         | 
| 119 | 
            +
                      display.colors.should == 256
         | 
| 120 | 
            +
                      display.width.should == 1024
         | 
| 121 | 
            +
                      display.height.should == 768
         | 
| 122 | 
            +
                      
         | 
| 123 | 
            +
                      @env = Rack::MockRequest.env_for('http://hoge.com/dummy',
         | 
| 124 | 
            +
                                                       'HTTP_USER_AGENT' => 'SoftBank/1.0/933SH/SHJ002[/Serial] Browser/NetFront/3.5 Profile/MIDP-2.0 Configuration/CLDC-1.1')
         | 
| 125 | 
            +
                      @mobile = Rack::Ketai::Carrier::Softbank.new(@env)
         | 
| 126 | 
            +
                      display = @mobile.display
         | 
| 127 | 
            +
                      display.should_not be_nil
         | 
| 128 | 
            +
                      display.colors.should == 16777216
         | 
| 129 | 
            +
                      display.width.should == 480
         | 
| 130 | 
            +
                      display.height.should == 738
         | 
| 131 | 
            +
                    end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                  end
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                  describe "未知の端末のとき" do 
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                    it "環境変数から設定すること" do
         | 
| 138 | 
            +
                      @env = Rack::MockRequest.env_for('http://hoge.com/dummy',
         | 
| 139 | 
            +
                                                       'HTTP_USER_AGENT' => 'SoftBank/1.0/100XX/SHJ002[/Serial] Browser/NetFront/3.5 Profile/MIDP-2.0 Configuration/CLDC-1.1',
         | 
| 140 | 
            +
                                                       'HTTP_X_JPHONE_DISPLAY' => '1024*768',
         | 
| 141 | 
            +
                                                       'HTTP_X_JPHONE_COLOR' => 'C256')
         | 
| 142 | 
            +
                      @mobile = Rack::Ketai::Carrier::Softbank.new(@env)
         | 
| 143 | 
            +
                      display = @mobile.display
         | 
| 144 | 
            +
                      display.should_not be_nil
         | 
| 145 | 
            +
                      display.colors.should == 256
         | 
| 146 | 
            +
                      display.width.should == 1024
         | 
| 147 | 
            +
                      display.height.should == 768
         | 
| 148 | 
            +
                    end
         | 
| 149 | 
            +
             | 
| 150 | 
            +
                    it "環境変数が無かったら慌てず騒がず nil を返す" do
         | 
| 151 | 
            +
                      @env = Rack::MockRequest.env_for('http://hoge.com/dummy',
         | 
| 152 | 
            +
                                                       'HTTP_USER_AGENT' => 'SoftBank/1.0/100XX/SHJ002[/Serial] Browser/NetFront/3.5 Profile/MIDP-2.0 Configuration/CLDC-1.1')
         | 
| 153 | 
            +
                      @mobile = Rack::Ketai::Carrier::Softbank.new(@env)
         | 
| 154 | 
            +
                      display = @mobile.display
         | 
| 155 | 
            +
                      display.should_not be_nil
         | 
| 156 | 
            +
                      display.colors.should be_nil
         | 
| 157 | 
            +
                      display.width.should be_nil
         | 
| 158 | 
            +
                      display.height.should be_nil
         | 
| 159 | 
            +
                    end
         | 
| 160 | 
            +
             | 
| 161 | 
            +
                  end
         | 
| 162 | 
            +
             | 
| 163 | 
            +
                end
         | 
| 164 | 
            +
             | 
| 165 | 
            +
              end
         | 
| 166 | 
            +
             | 
| 167 | 
            +
              describe "#cache_size でキャッシュ容量を取得するとき" do
         | 
| 168 | 
            +
                
         | 
| 169 | 
            +
                it "データにないときは300KBに設定でOK" do
         | 
| 170 | 
            +
                  env = Rack::MockRequest.env_for('http://hoge.com/dummy',
         | 
| 171 | 
            +
                                                  'HTTP_USER_AGENT' => 'SoftBank/1.0/923SH/SHJ001/SN*************** Browser/NetFront/3.4 Profile/MIDP-2.0 Configuration/CLDC-1.1')
         | 
| 172 | 
            +
                  mobile = Rack::Ketai::Carrier::Softbank.new(env)
         | 
| 173 | 
            +
                  mobile.name.should == '923SH'
         | 
| 174 | 
            +
                  mobile.cache_size.should == 300000
         | 
| 175 | 
            +
                end
         | 
| 176 | 
            +
             | 
| 177 | 
            +
                it "仕方ないので、データにあればそれを信用" do
         | 
| 178 | 
            +
                  env = Rack::MockRequest.env_for('http://hoge.com/dummy',
         | 
| 179 | 
            +
                                                  'HTTP_USER_AGENT' => 'SoftBank/2.0/944SH/SHJ001/SN*************** Browser/NetFront/3.5 Profile/MIDP-2.0 Configuration/CLDC-1.1')
         | 
| 180 | 
            +
                  mobile = Rack::Ketai::Carrier::Softbank.new(env)
         | 
| 181 | 
            +
                  mobile.name.should == '944SH'
         | 
| 182 | 
            +
                  mobile.cache_size.should == 500000
         | 
| 183 | 
            +
                end
         | 
| 184 | 
            +
                
         | 
| 185 | 
            +
              end
         | 
| 186 | 
            +
              
         | 
| 187 | 
            +
              describe "#supports_cookie? を使うとき" do
         | 
| 188 | 
            +
                # Softbank のCookie対応状況
         | 
| 189 | 
            +
                # W型、3GC型機種のみ対応…C型、P型もサービス終了につき、
         | 
| 190 | 
            +
                # 現状はすべて対応のはず
         | 
| 191 | 
            +
                it "#supports_cookie? は true を返す" do
         | 
| 192 | 
            +
                  env = Rack::MockRequest.env_for('http://hoge.com/dummy',
         | 
| 193 | 
            +
                                                  'HTTP_USER_AGENT' => 'SoftBank/1.0/930SH/SHJ001[/Serial] Browser/NetFront/3.4 Profile/MIDP-2.0 Configuration/CLDC-1.1')
         | 
| 194 | 
            +
                  mobile = Rack::Ketai::Carrier::Softbank.new(env)
         | 
| 195 | 
            +
                  mobile.should be_respond_to(:supports_cookie?)
         | 
| 196 | 
            +
                  mobile.should be_supports_cookie
         | 
| 197 | 
            +
                end
         | 
| 198 | 
            +
              end
         | 
| 199 | 
            +
             | 
| 200 | 
            +
            end
         | 
| @@ -0,0 +1,86 @@ | |
| 1 | 
            +
            # -*- coding: utf-8 -*-
         | 
| 2 | 
            +
            require 'rack/ketai/carrier/docomo'
         | 
| 3 | 
            +
            describe "Rack::Ketai::Carrier::*.valid_addr? を使うとき" do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              def from(carrier, addr)
         | 
| 6 | 
            +
                env = Rack::MockRequest.env_for('http://hoge.com/dummy',
         | 
| 7 | 
            +
                                                'HTTP_USER_AGENT' => 'DoCoMo/1.0/N505i/c20/TB/W24H12',
         | 
| 8 | 
            +
                                                'HTTP_X_DCMGUID' => '0123abC',
         | 
| 9 | 
            +
                                                'REMOTE_ADDR' => addr)
         | 
| 10 | 
            +
                carrier.new(env)
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              CIDRS = {
         | 
| 14 | 
            +
                  :Docomo => %w(
         | 
| 15 | 
            +
            210.153.84.0/24
         | 
| 16 | 
            +
            210.136.161.0/24
         | 
| 17 | 
            +
            210.153.86.0/24
         | 
| 18 | 
            +
            124.146.174.0/24
         | 
| 19 | 
            +
            124.146.175.0/24
         | 
| 20 | 
            +
            202.229.176.0/24
         | 
| 21 | 
            +
            202.229.177.0/24
         | 
| 22 | 
            +
            202.229.178.0/24
         | 
| 23 | 
            +
            ),
         | 
| 24 | 
            +
                  :Au => %w(
         | 
| 25 | 
            +
            210.230.128.224/28
         | 
| 26 | 
            +
            121.111.227.160/27
         | 
| 27 | 
            +
            61.117.1.0/28
         | 
| 28 | 
            +
            219.108.158.0/27
         | 
| 29 | 
            +
            219.125.146.0/28
         | 
| 30 | 
            +
            61.117.2.32/29
         | 
| 31 | 
            +
            61.117.2.40/29
         | 
| 32 | 
            +
            219.108.158.40/29
         | 
| 33 | 
            +
            219.125.148.0/25
         | 
| 34 | 
            +
            222.5.63.0/25
         | 
| 35 | 
            +
            222.5.63.128/25
         | 
| 36 | 
            +
            222.5.62.128/25
         | 
| 37 | 
            +
            59.135.38.128/25
         | 
| 38 | 
            +
            219.108.157.0/25
         | 
| 39 | 
            +
            219.125.145.0/25
         | 
| 40 | 
            +
            121.111.231.0/25
         | 
| 41 | 
            +
            121.111.227.0/25
         | 
| 42 | 
            +
            118.152.214.192/26
         | 
| 43 | 
            +
            118.159.131.0/25
         | 
| 44 | 
            +
            118.159.133.0/25
         | 
| 45 | 
            +
            118.159.132.160/27
         | 
| 46 | 
            +
            111.86.142.0/26
         | 
| 47 | 
            +
            111.86.141.64/26
         | 
| 48 | 
            +
            111.86.141.128/26
         | 
| 49 | 
            +
            111.86.141.192/26
         | 
| 50 | 
            +
            ),
         | 
| 51 | 
            +
                  :Softbank => %w(
         | 
| 52 | 
            +
            123.108.237.0/27
         | 
| 53 | 
            +
            202.253.96.224/27
         | 
| 54 | 
            +
            210.146.7.192/26
         | 
| 55 | 
            +
            210.175.1.128/25
         | 
| 56 | 
            +
            )
         | 
| 57 | 
            +
              }.freeze
         | 
| 58 | 
            +
             | 
| 59 | 
            +
              it "キャリア指定のアドレス帯域からのアクセスであれば真を返すこと" do
         | 
| 60 | 
            +
                CIDRS.each do |carrier_name, cidrs|
         | 
| 61 | 
            +
                  klass = Rack::Ketai::Carrier.const_get(carrier_name)
         | 
| 62 | 
            +
                  cidrs.each do |cidr|
         | 
| 63 | 
            +
                    addrs = IPAddr.new(cidr).to_range.to_a
         | 
| 64 | 
            +
                    from(klass, addrs.first.to_s).should be_valid_addr
         | 
| 65 | 
            +
                    from(klass, addrs[(addrs.size - 1)/2].to_s).should be_valid_addr
         | 
| 66 | 
            +
                    from(klass, addrs.last.to_s).should be_valid_addr
         | 
| 67 | 
            +
                  end
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
              end
         | 
| 70 | 
            +
              
         | 
| 71 | 
            +
              it "キャリア指定のアドレス帯域からのアクセスでなければ偽を返すこと" do
         | 
| 72 | 
            +
                CIDRS.each do |carrier_name, cidrs|
         | 
| 73 | 
            +
                  ([Rack::Ketai::Carrier::Docomo,
         | 
| 74 | 
            +
                    Rack::Ketai::Carrier::Au,
         | 
| 75 | 
            +
                    Rack::Ketai::Carrier::Softbank] - [Rack::Ketai::Carrier.const_get(carrier_name)]).each do |klass|
         | 
| 76 | 
            +
                    cidrs.each do |cidr|
         | 
| 77 | 
            +
                      addrs = IPAddr.new(cidr).to_range.to_a
         | 
| 78 | 
            +
                      from(klass, addrs.first.to_s).should_not be_valid_addr
         | 
| 79 | 
            +
                      from(klass, addrs[(addrs.size - 1)/2].to_s).should_not be_valid_addr
         | 
| 80 | 
            +
                      from(klass, addrs.last.to_s).should_not be_valid_addr
         | 
| 81 | 
            +
                    end
         | 
| 82 | 
            +
                  end
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
              end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
            end
         | 
    
        data/test/spec_runner.rb
    ADDED
    
    | @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            require 'test/unit'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class SpecRunner < Test::Unit::TestCase
         | 
| 4 | 
            +
              
         | 
| 5 | 
            +
              def load_spec
         | 
| 6 | 
            +
                begin
         | 
| 7 | 
            +
                  require 'spec'
         | 
| 8 | 
            +
                rescue LoadError
         | 
| 9 | 
            +
                  retry if require "rubygems"
         | 
| 10 | 
            +
                  puts "All tests are skipped."
         | 
| 11 | 
            +
                  return
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              def test_spec
         | 
| 16 | 
            +
                 return unless load_spec
         | 
| 17 | 
            +
                require File.join(File.dirname(__FILE__),
         | 
| 18 | 
            +
                                  '../spec/spec_helper.rb')
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                argv = Dir.glob(File.join(File.dirname(__FILE__),
         | 
| 21 | 
            +
                                          '../spec/**/*_spec.rb'))
         | 
| 22 | 
            +
                argv.unshift '-fs'
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                unless Spec::Runner::CommandLine.run(Spec::Runner::OptionParser.parse(argv, STDOUT, STDERR))
         | 
| 25 | 
            +
                  fail "failure(s)."
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            end
         |