e4u 0.0.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/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +88 -0
- data/VERSION +1 -0
- data/data/docomo/carrier_data.xml +285 -0
- data/data/emoji4unicode.xml +2172 -0
- data/data/kddi/carrier_data.xml +650 -0
- data/data/softbank/carrier_data.xml +488 -0
- data/lib/e4u.rb +30 -0
- data/lib/e4u/base.rb +77 -0
- data/lib/e4u/docomo.rb +37 -0
- data/lib/e4u/google.rb +60 -0
- data/lib/e4u/kddi.rb +69 -0
- data/lib/e4u/softbank.rb +35 -0
- data/lib/e4u/util.rb +25 -0
- data/spec/docomo_spec.rb +54 -0
- data/spec/e4u_spec.rb +14 -0
- data/spec/google_spec.rb +116 -0
- data/spec/kddi_spec.rb +80 -0
- data/spec/softbank_spec.rb +53 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +9 -0
- metadata +93 -0
data/lib/e4u.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
$LOAD_PATH.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'e4u/base'
|
4
|
+
require 'e4u/docomo'
|
5
|
+
require 'e4u/kddi'
|
6
|
+
require 'e4u/softbank'
|
7
|
+
require 'e4u/google'
|
8
|
+
require 'e4u/util'
|
9
|
+
|
10
|
+
module E4U
|
11
|
+
def self.docomo
|
12
|
+
@docomo ||= DoCoMo.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.kddi
|
16
|
+
@kddi ||= KDDI.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.kddiweb
|
20
|
+
self.kddi
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.softbank
|
24
|
+
@softbank ||= Softbank.new
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.google
|
28
|
+
@google ||= Google.new
|
29
|
+
end
|
30
|
+
end
|
data/lib/e4u/base.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'rexml/document'
|
2
|
+
|
3
|
+
module E4U
|
4
|
+
class Base
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
def each
|
8
|
+
data.each do |element|
|
9
|
+
yield element
|
10
|
+
end
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def data
|
17
|
+
return @data if @data
|
18
|
+
@data = []
|
19
|
+
xml.root.each_element('//e') do |element|
|
20
|
+
hash = {}
|
21
|
+
element.attributes.each{ |k,v| hash[k.to_sym] = v.to_s }
|
22
|
+
if element.has_elements?
|
23
|
+
hash[:desc] = element.get_text('desc').to_s if element.get_text('desc')
|
24
|
+
hash[:ann] = element.get_text('ann').to_s if element.get_text('ann')
|
25
|
+
end
|
26
|
+
@data << emojinize(hash)
|
27
|
+
end
|
28
|
+
@data.recursive_freeze
|
29
|
+
end
|
30
|
+
|
31
|
+
def xml
|
32
|
+
opt = 'rb'
|
33
|
+
opt+= ':utf-8' unless RUBY_VERSION < '1.9'
|
34
|
+
@xml ||= REXML::Document.new(File.open(path, opt){ |f| f.read })
|
35
|
+
end
|
36
|
+
|
37
|
+
def emojinize object
|
38
|
+
object.extend Base::Emojinize
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
module Base::Emojinize
|
43
|
+
def emojiize
|
44
|
+
Base::Emoji.new self
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class Base::Emoji
|
49
|
+
def initialize attributes
|
50
|
+
@attributes = attributes
|
51
|
+
@attributes.each do |key, value|
|
52
|
+
next if key =~ /\A(id|object_id|__(id|send)__)\z/
|
53
|
+
self.class.class_eval("def #{key}; @attributes[:#{key}]; end", __FILE__, __LINE__)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def alternate?
|
58
|
+
!!(unicode =~ /\A>/)
|
59
|
+
end
|
60
|
+
|
61
|
+
def utf8
|
62
|
+
hex = unicode.sub(/\A[\>\*\+]/, '')
|
63
|
+
raise if hex.size == 0
|
64
|
+
hex.split(/\+/, -1).map{ |ch| ch.hex }.pack('U')
|
65
|
+
end
|
66
|
+
|
67
|
+
def cp932
|
68
|
+
hex = unicode.sub(/\A[\>\*\+]/, '')
|
69
|
+
raise if hex.size == 0
|
70
|
+
chr = hex.split(/\+/, -1).map{ |ch| unicode_to_cp932(ch.hex) }.pack('n')
|
71
|
+
chr.force_encoding('CP932') if chr.respond_to? :force_encoding
|
72
|
+
chr
|
73
|
+
end
|
74
|
+
alias :sjis :cp932
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
data/lib/e4u/docomo.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'e4u/base'
|
2
|
+
|
3
|
+
module E4U
|
4
|
+
class DoCoMo < Base
|
5
|
+
private
|
6
|
+
|
7
|
+
def path
|
8
|
+
File.expand_path(File.join('..', '..', 'data', 'docomo', 'carrier_data.xml'), File.dirname(__FILE__))
|
9
|
+
end
|
10
|
+
|
11
|
+
def emojinize object
|
12
|
+
object.extend DoCoMo::Emojinize
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module DoCoMo::Emojinize
|
17
|
+
def docomo_emoji
|
18
|
+
DoCoMo::Emoji.new self
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class DoCoMo::Emoji < Base::Emoji
|
23
|
+
private
|
24
|
+
|
25
|
+
def unicode_to_cp932 octet
|
26
|
+
return if octet < 0xE63E or octet > 0xE757
|
27
|
+
|
28
|
+
if octet <= 0xE69B
|
29
|
+
octet + 4705
|
30
|
+
elsif octet <= 0xE6DA
|
31
|
+
octet + 4772
|
32
|
+
else
|
33
|
+
octet + 4773
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/e4u/google.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'e4u/base'
|
2
|
+
|
3
|
+
module E4U
|
4
|
+
class Google < Base
|
5
|
+
private
|
6
|
+
|
7
|
+
def path
|
8
|
+
File.expand_path(File.join('..', '..', 'data', 'emoji4unicode.xml'), File.dirname(__FILE__))
|
9
|
+
end
|
10
|
+
|
11
|
+
def emojinize object
|
12
|
+
object.extend Google::Emojinize
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module Google::Emojinize
|
17
|
+
def docomo_emoji
|
18
|
+
DoCoMo::Emoji.new :unicode => self[:docomo]
|
19
|
+
end
|
20
|
+
|
21
|
+
def kddi_emoji
|
22
|
+
KDDI::Emoji.new :unicode => self[:kddi]
|
23
|
+
end
|
24
|
+
|
25
|
+
def kddiweb_emoji
|
26
|
+
KDDIWeb::Emoji.new :unicode => self[:kddi]
|
27
|
+
end
|
28
|
+
|
29
|
+
def softbank_emoji
|
30
|
+
Softbank::Emoji.new :unicode => self[:softbank]
|
31
|
+
end
|
32
|
+
|
33
|
+
def unicode_emoji
|
34
|
+
Google::Emoji.new :unicode => self[:unicode]
|
35
|
+
end
|
36
|
+
|
37
|
+
def google_emoji
|
38
|
+
Google::Emoji.new self
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class Google::Emoji < Base::Emoji
|
43
|
+
def proposal?
|
44
|
+
@attributes[:in_proposal] == 'yes'
|
45
|
+
end
|
46
|
+
|
47
|
+
def translate carrier
|
48
|
+
case carrier.to_s.downcase
|
49
|
+
when 'docomo'
|
50
|
+
E4U.docomo.find{ |e| e[:unicode] == docomo }.docomo_emoji
|
51
|
+
when 'kddi'
|
52
|
+
E4U.kddi.find{ |e| e[:unicode] == kddi }.kddi_emoji
|
53
|
+
when 'softbank'
|
54
|
+
E4U.softbank.find{ |e| e[:unicode] == softbank }.softbank_emoji
|
55
|
+
else
|
56
|
+
raise ArgumentError
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/e4u/kddi.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'e4u/base'
|
2
|
+
|
3
|
+
module E4U
|
4
|
+
class KDDI < Base
|
5
|
+
private
|
6
|
+
|
7
|
+
def path
|
8
|
+
File.expand_path(File.join('..', '..', 'data', 'kddi', 'carrier_data.xml'), File.dirname(__FILE__))
|
9
|
+
end
|
10
|
+
|
11
|
+
def emojinize object
|
12
|
+
object.extend KDDI::Emojinize
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module KDDI::Emojinize
|
17
|
+
def kddi_emoji
|
18
|
+
KDDI::Emoji.new self
|
19
|
+
end
|
20
|
+
def kddiweb_emoji
|
21
|
+
KDDIWeb::Emoji.new self
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class KDDI::Emoji < Base::Emoji
|
26
|
+
private
|
27
|
+
|
28
|
+
def unicode_to_cp932 octet
|
29
|
+
if octet >= 0xE468 and octet <= 0xE5DF
|
30
|
+
sjis = if octet <= 0xE4A6
|
31
|
+
octet + 4568
|
32
|
+
elsif octet <= 0xE523
|
33
|
+
octet + 4569
|
34
|
+
elsif octet <= 0xE562
|
35
|
+
octet + 4636
|
36
|
+
elsif octet <= 0xE5B4
|
37
|
+
octet + 4637
|
38
|
+
elsif octet <= 0xE5CC
|
39
|
+
octet + 4656
|
40
|
+
else
|
41
|
+
octet + 3443
|
42
|
+
end
|
43
|
+
elsif octet >= 0xEA80 and octet <= 0xEB8E
|
44
|
+
sjis = if octet <= 0xEAAB
|
45
|
+
octet + 2259
|
46
|
+
elsif octet <= 0xEAFA
|
47
|
+
octet + 2260
|
48
|
+
elsif octet <= 0xEB0D
|
49
|
+
octet + 3287
|
50
|
+
elsif octet <= 0xEB3B
|
51
|
+
octet + 2241
|
52
|
+
elsif octet <= 0xEB7A
|
53
|
+
octet + 2308
|
54
|
+
else
|
55
|
+
octet + 2309
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class KDDIWeb < KDDI
|
62
|
+
end
|
63
|
+
|
64
|
+
class KDDIWeb::Emoji < KDDI::Emoji
|
65
|
+
def utf8
|
66
|
+
sjis.unpack('n*').map{ |char| char - 1792 }.pack('U')
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/lib/e4u/softbank.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'e4u/base'
|
2
|
+
|
3
|
+
module E4U
|
4
|
+
class Softbank < Base
|
5
|
+
private
|
6
|
+
|
7
|
+
def path
|
8
|
+
File.expand_path(File.join('..', '..', 'data', 'softbank', 'carrier_data.xml'), File.dirname(__FILE__))
|
9
|
+
end
|
10
|
+
|
11
|
+
def emojinize object
|
12
|
+
object.extend Softbank::Emojinize
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module Softbank::Emojinize
|
17
|
+
def softbank_emoji
|
18
|
+
Softbank::Emoji.new self
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class Softbank::Emoji < Base::Emoji
|
23
|
+
private
|
24
|
+
|
25
|
+
def unicode_to_cp932 octet
|
26
|
+
return if octet < 0xE001 or octet > 0xE55A
|
27
|
+
|
28
|
+
page = (octet >> 8) & 7
|
29
|
+
sjisHi = [0xF9, 0xF7, 0xF7, 0xF9, 0xFB, 0xFB][page]
|
30
|
+
sjisLo = [0x40, 0x40, 0xA0, 0xA0, 0x40, 0xA0][page] + (octet & 0x7F)
|
31
|
+
sjisLo += 1 if sjisLo > 0x7E and sjisLo < 0xA1
|
32
|
+
sjisHi << 8 | sjisLo
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/e4u/util.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
class Object
|
3
|
+
def recursive_freeze
|
4
|
+
case self
|
5
|
+
when Hash
|
6
|
+
self.each_value{ |e| e.recursive_freeze }
|
7
|
+
when Array
|
8
|
+
self.each{ |e| e.recursive_freeze }
|
9
|
+
end
|
10
|
+
self.freeze
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
if __FILE__ == $PROGRAM_NAME
|
15
|
+
a = Array.new(10){|i| {:c => "#{i}"} }
|
16
|
+
|
17
|
+
# 本当は Object.freeze! のがよかったなぁ
|
18
|
+
a.recursive_freeze
|
19
|
+
|
20
|
+
puts a.frozen?
|
21
|
+
a.each do |b|
|
22
|
+
puts b.frozen?
|
23
|
+
puts b[:c].frozen?
|
24
|
+
end
|
25
|
+
end
|
data/spec/docomo_spec.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
3
|
+
|
4
|
+
describe E4U::DoCoMo do
|
5
|
+
before :all do
|
6
|
+
@docomo = E4U.docomo
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should include Enumerable" do
|
10
|
+
@docomo.should be_kind_of Enumerable
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should include E4U::DoCoMo::Emojinize" do
|
14
|
+
@docomo.first.should be_kind_of E4U::DoCoMo::Emojinize
|
15
|
+
end
|
16
|
+
|
17
|
+
it "すべての要素に:unicodeをキーとしたデータはあること" do
|
18
|
+
@docomo.each do |emj|
|
19
|
+
emj.should have_key(:unicode)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "正しくデータを取得できること" do
|
24
|
+
# <e jis="7541" name_en="Fine" name_ja="晴れ" unicode="E63E"/>
|
25
|
+
emj = @docomo.find{ |e| e[:name_en] == 'Fine' }
|
26
|
+
emj[:unicode].should == 'E63E'
|
27
|
+
emj[:name_en].should == 'Fine'
|
28
|
+
emj[:name_ja].should == '晴れ'
|
29
|
+
emj[:jis].should == '7541'
|
30
|
+
end
|
31
|
+
|
32
|
+
it "docomo_emojiでE4U::DoCoMo::Emojiが返ってくること" do
|
33
|
+
emj = @docomo.find{ |e| e[:name_en] == 'Fine' }
|
34
|
+
emj.docomo_emoji.should be_instance_of E4U::DoCoMo::Emoji
|
35
|
+
end
|
36
|
+
|
37
|
+
describe E4U::DoCoMo::Emoji do
|
38
|
+
before :all do
|
39
|
+
@emj = @docomo.find{ |e| e[:unicode] == 'E63E' }.docomo_emoji
|
40
|
+
end
|
41
|
+
|
42
|
+
it "utf8が返ってくること" do
|
43
|
+
@emj.utf8.should == [0xE63E].pack('U')
|
44
|
+
end
|
45
|
+
|
46
|
+
it "sjisが返ってくること" do
|
47
|
+
@emj.sjis.dump.should == "\xF8\x9F".dump
|
48
|
+
end
|
49
|
+
|
50
|
+
it "alternate?が返ってくること" do
|
51
|
+
@emj.alternate?.should be_false
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/spec/e4u_spec.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
3
|
+
|
4
|
+
describe "E4U" do
|
5
|
+
it "インスタンスが返ってくること" do
|
6
|
+
{ :google => E4U::Google,
|
7
|
+
:docomo => E4U::DoCoMo,
|
8
|
+
:kddi => E4U::KDDI,
|
9
|
+
:kddiweb => E4U::KDDI,
|
10
|
+
:softbank => E4U::Softbank }.each{ |method, klass|
|
11
|
+
E4U.method(method).call.should be_an_instance_of klass
|
12
|
+
}
|
13
|
+
end
|
14
|
+
end
|
data/spec/google_spec.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
3
|
+
|
4
|
+
describe E4U::Google do
|
5
|
+
before :all do
|
6
|
+
@google = E4U.google
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should include Enumerable" do
|
10
|
+
@google.should be_kind_of Enumerable
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should E4U::Google::Emojinize" do
|
14
|
+
@google.first.should be_kind_of E4U::Google::Emojinize
|
15
|
+
end
|
16
|
+
|
17
|
+
it "すべての要素に:idをキーとしたデータはあること" do
|
18
|
+
@google.each do |emj|
|
19
|
+
emj.should have_key(:id)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "正しくデータを取得できること" do
|
24
|
+
# つーかハッシュだし
|
25
|
+
# <e docomo="E63E" google="FE000" id="000" kddi="E488" name="BLACK SUN WITH RAYS" softbank="E04A" unicode="2600">
|
26
|
+
emj = @google.find{ |e| e[:id] == '000' }
|
27
|
+
emj[:docomo].should == 'E63E'
|
28
|
+
emj[:google].should == 'FE000'
|
29
|
+
emj[:kddi].should == 'E488'
|
30
|
+
emj[:name].should == 'BLACK SUN WITH RAYS'
|
31
|
+
emj[:softbank].should == 'E04A'
|
32
|
+
emj[:unicode].should == '2600'
|
33
|
+
end
|
34
|
+
|
35
|
+
it "docomo_emojiでE4U::DoCoMo::Emojiが返ってくること" do
|
36
|
+
de = @google.find{ |e| e[:id] == '000' }.docomo_emoji
|
37
|
+
de.should be_instance_of E4U::DoCoMo::Emoji
|
38
|
+
de.utf8.should == [0xE63E].pack('U')
|
39
|
+
de.sjis.dump.should == "\xF8\x9F".dump
|
40
|
+
end
|
41
|
+
|
42
|
+
it "kddi_emojiでE4U::KDDI::Emojiが返ってくること" do
|
43
|
+
ke = @google.find{ |e| e[:id] == '000' }.kddi_emoji
|
44
|
+
ke.should be_instance_of E4U::KDDI::Emoji
|
45
|
+
ke.utf8.should == [0xE488].pack('U')
|
46
|
+
ke.sjis.dump.should == "\xF6\x60".dump
|
47
|
+
end
|
48
|
+
|
49
|
+
it "softbank_emojiでE4U::Softbank::Emojiが返ってくること" do
|
50
|
+
se = @google.find{ |e| e[:id] == '000' }.softbank_emoji
|
51
|
+
se.should be_instance_of E4U::Softbank::Emoji
|
52
|
+
se.utf8.should == [0xE04A].pack('U')
|
53
|
+
se.sjis.dump.should == "\xF9\x8B".dump
|
54
|
+
end
|
55
|
+
|
56
|
+
describe E4U::Google::Emoji do
|
57
|
+
before :all do
|
58
|
+
@emj = @google.find{ |e| e[:id] == '000' }.google_emoji
|
59
|
+
end
|
60
|
+
|
61
|
+
it "docomoが返ってくること" do
|
62
|
+
@emj.docomo.should == 'E63E'
|
63
|
+
@emj.docomo.hex.should == 0xE63E
|
64
|
+
end
|
65
|
+
|
66
|
+
it "kddiが返ってくること" do
|
67
|
+
@emj.kddi.should == 'E488'
|
68
|
+
@emj.kddi.hex.should == 0xE488
|
69
|
+
end
|
70
|
+
|
71
|
+
it "softbankが返ってくること" do
|
72
|
+
@emj.softbank.should == 'E04A'
|
73
|
+
@emj.softbank.hex.should == 0xE04A
|
74
|
+
end
|
75
|
+
|
76
|
+
it "descが返ってくること" do
|
77
|
+
@emj.desc.should be_an_instance_of String
|
78
|
+
@emj.desc.should match(/clear weather/i)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "translate(:docomo)でDoCoMo絵文字に変換できること" do
|
82
|
+
de = @emj.translate :docomo
|
83
|
+
de.utf8.should == [0xE63E].pack('U')
|
84
|
+
end
|
85
|
+
|
86
|
+
it "translate(:kddi)でKDDI絵文字に変換できること" do
|
87
|
+
de = @emj.translate :kddi
|
88
|
+
de.utf8.should == [0xE488].pack('U')
|
89
|
+
end
|
90
|
+
|
91
|
+
it "translate(:softbank)でSoftbank絵文字に変換できること" do
|
92
|
+
de = @emj.translate :softbank
|
93
|
+
de.utf8.should == [0xE04A].pack('U')
|
94
|
+
end
|
95
|
+
|
96
|
+
it "translateでArgumentErrorが起こること" do
|
97
|
+
lambda{ @emj.translate :emobile }.should raise_error ArgumentError
|
98
|
+
end
|
99
|
+
|
100
|
+
it "proposal?が返ってくること" do
|
101
|
+
@emj.proposal?.should be_false
|
102
|
+
end
|
103
|
+
|
104
|
+
it "text_fallbackが返ってくること" do
|
105
|
+
@google.find{ |e| e[:google] == 'FE006' }.google_emoji.text_fallback.should == '[霧]'
|
106
|
+
end
|
107
|
+
|
108
|
+
it "utf8が返ってくること" do
|
109
|
+
@emj.utf8.should == [0x2600].pack('U')
|
110
|
+
end
|
111
|
+
|
112
|
+
it "alternate?が返ってくること" do
|
113
|
+
@emj.alternate?.should be_false
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|