-
-
Notifications
You must be signed in to change notification settings - Fork 400
/
Copy pathoptions_spec.rb
171 lines (150 loc) · 4.59 KB
/
options_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# frozen_string_literal: true
RSpec.describe YARD::Options do
class FooOptions < YARD::Options
attr_accessor :foo
def initialize; self.foo = "abc" end
end
describe ".default_attr" do
it "allows default attributes to be defined with symbols" do
class DefaultOptions1 < YARD::Options
default_attr :foo, 'HELLO'
end
o = DefaultOptions1.new
o.reset_defaults
expect(o.foo).to eq 'HELLO'
end
it "calls lambda if value is a Proc" do
class DefaultOptions2 < YARD::Options
default_attr :foo, lambda { 100 }
end
o = DefaultOptions2.new
o.reset_defaults
expect(o.foo).to eq 100
end
end
describe "#reset_defaults" do
it "does not define defaults until reset is called" do
class ResetDefaultOptions1 < YARD::Options
default_attr :foo, 'FOO'
end
expect(ResetDefaultOptions1.new.foo).to be nil
o = ResetDefaultOptions1.new
o.reset_defaults
expect(o.foo).to eq 'FOO'
end
it "uses defaults from superclass as well" do
class ResetDefaultOptions2 < YARD::Options
default_attr :foo, 'FOO'
end
class ResetDefaultOptions3 < ResetDefaultOptions2
end
o = ResetDefaultOptions3.new
o.reset_defaults
expect(o.foo).to eq 'FOO'
end
end
describe "#delete" do
it "deletes an option" do
o = FooOptions.new
o.delete(:foo)
expect(o.to_hash).to eq({})
end
it "does not error if an option is deleted that does not exist" do
o = FooOptions.new
o.delete(:foo)
o.delete(:foo)
expect(o.to_hash).to eq({})
end
end
describe "#[]" do
it "handles getting option values using hash syntax" do
expect(FooOptions.new[:foo]).to eq "abc"
end
end
describe "#[]=" do
it "handles setting options using hash syntax" do
o = FooOptions.new
o[:foo] = "xyz"
expect(o[:foo]).to eq "xyz"
end
it "allows setting of unregistered keys" do
o = FooOptions.new
o[:bar] = "foo"
expect(o[:bar]).to eq "foo"
end
end
describe "#method_missing" do
it "allows setting of unregistered keys" do
o = FooOptions.new
o.bar = 'foo'
expect(o.bar).to eq 'foo'
end
it "allows getting values of unregistered keys (return nil)" do
expect(FooOptions.new.bar).to be nil
end
it "prints debugging messages about unregistered keys" do
expect(log).to receive(:debug).with("Attempting to access unregistered key bar on FooOptions")
FooOptions.new.bar
expect(log).to receive(:debug).with("Attempting to set unregistered key bar on FooOptions")
FooOptions.new.bar = 1
end
end
describe "#update" do
it "allows updating of options" do
expect(FooOptions.new.update(:foo => "xyz").foo).to eq "xyz"
end
it "does not ignore keys with no setter (OpenStruct behaviour)" do
o = FooOptions.new
o.update(:bar => "xyz")
expect(o.to_hash).to eq(:foo => "abc", :bar => "xyz")
end
end
describe "#merge" do
it "updates a new object" do
o = FooOptions.new
expect(o.merge(:foo => "xyz").object_id).not_to eq o.object_id
expect(o.merge(:foo => "xyz").to_hash).to eq(:foo => "xyz")
end
it "adds in values from original object" do
o = FooOptions.new
o.update(:bar => "foo")
expect(o.merge(:baz => 1).to_hash).to eq(:foo => "abc", :bar => "foo", :baz => 1)
end
end
describe "#to_hash" do
it "converts all instance variables and symbolized keys" do
class ToHashOptions1 < YARD::Options
attr_accessor :foo, :bar, :baz
def initialize; @foo = 1; @bar = 2; @baz = "hello" end
end
o = ToHashOptions1.new
hash = o.to_hash
expect(hash.keys).to include(:foo, :bar, :baz)
expect(hash[:foo]).to eq 1
expect(hash[:bar]).to eq 2
expect(hash[:baz]).to eq "hello"
end
it "uses accessor when converting values to hash" do
class ToHashOptions2 < YARD::Options
def initialize; @foo = 1 end
def foo; "HELLO#{@foo}" end
end
o = ToHashOptions2.new
expect(o.to_hash).to eq(:foo => "HELLO1")
end
it "ignores ivars with no accessor" do
class ToHashOptions3 < YARD::Options
attr_accessor :foo
def initialize; @foo = 1; @bar = "NOIGNORE" end
end
o = ToHashOptions3.new
expect(o.to_hash).to eq(:foo => 1, :bar => "NOIGNORE")
end
end
describe "#tap" do
it "supports #tap(&block) (even in 1.8.6)" do
o = FooOptions.new.tap {|obj| obj.foo = :BAR }
expect(o.to_hash).to eq(:foo => :BAR)
end
end
end