utilrb 2.0.2.b2 → 2.1.0.rc1
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.
- checksums.yaml +4 -4
- data/.boring +40 -0
- data/.gitignore +13 -0
- data/.travis.yml +5 -0
- data/CMakeLists.txt +18 -0
- data/Gemfile +3 -0
- data/Makefile +8 -0
- data/Manifest.txt +0 -8
- data/{README.rd → README.md} +11 -7
- data/Rakefile +16 -63
- data/benchmarks/validate_options.rb +79 -0
- data/ext/utilrb/extconf.rb +1 -17
- data/ext/utilrb/utilrb.cc +0 -23
- data/lib/utilrb/column_formatter.rb +8 -5
- data/lib/utilrb/common.rb +1 -6
- data/lib/utilrb/enumerable/uniq.rb +2 -8
- data/lib/utilrb/event_loop.rb +5 -10
- data/lib/utilrb/kernel/load_dsl_file.rb +1 -2
- data/lib/utilrb/kernel/options.rb +25 -29
- data/lib/utilrb/logger/hierarchy.rb +0 -1
- data/lib/utilrb/logger/io.rb +3 -3
- data/lib/utilrb/logger/root.rb +12 -6
- data/lib/utilrb/module/ancestor_p.rb +0 -12
- data/lib/utilrb/module/is_singleton.rb +6 -0
- data/lib/utilrb/module/singleton_class_p.rb +14 -0
- data/lib/utilrb/object/attribute.rb +33 -65
- data/lib/utilrb/object/singleton_class.rb +1 -20
- data/lib/utilrb/pkgconfig.rb +21 -10
- data/lib/utilrb/socket/tcp_server.rb +2 -2
- data/lib/utilrb/spawn.rb +1 -1
- data/lib/utilrb/test.rb +65 -0
- data/lib/utilrb/thread_pool.rb +11 -13
- data/lib/utilrb/timepoints.rb +15 -0
- data/lib/utilrb/value_set.rb +10 -1
- data/lib/utilrb/version.rb +4 -0
- data/lib/utilrb/weakref.rb +11 -12
- data/lib/utilrb/yard.rb +0 -111
- data/lib/utilrb.rb +6 -1
- data/lib/yard-utilrb.rb +1 -0
- data/manifest.xml +19 -0
- data/package.xml +29 -0
- data/utilrb.gemspec +27 -0
- metadata +56 -107
- data/ext/utilrb/proc.c +0 -39
- data/ext/utilrb/readline.c +0 -52
- data/ext/utilrb/weakref.cc +0 -143
- data/lib/utilrb/models/inherited_enumerable.rb +0 -341
- data/lib/utilrb/models/registration.rb +0 -115
- data/lib/utilrb/module/inherited_enumerable.rb +0 -6
- data/lib/utilrb/objectstats.rb +0 -193
- data/lib/utilrb/ruby_object_graph.rb +0 -384
- data/test/data/test_pkgconfig.pc +0 -9
- data/test/data/test_pkgconfig_empty.pc +0 -10
- data/test/test_array.rb +0 -15
- data/test/test_config.rb +0 -4
- data/test/test_dir.rb +0 -22
- data/test/test_enumerable.rb +0 -119
- data/test/test_event_loop.rb +0 -407
- data/test/test_exception.rb +0 -38
- data/test/test_gc.rb +0 -34
- data/test/test_hash.rb +0 -102
- data/test/test_kernel.rb +0 -300
- data/test/test_logger.rb +0 -204
- data/test/test_misc.rb +0 -42
- data/test/test_models.rb +0 -212
- data/test/test_module.rb +0 -126
- data/test/test_object.rb +0 -77
- data/test/test_objectstats.rb +0 -26
- data/test/test_pkgconfig.rb +0 -84
- data/test/test_proc.rb +0 -31
- data/test/test_set.rb +0 -19
- data/test/test_thread_pool.rb +0 -409
- data/test/test_time.rb +0 -47
- data/test/test_unbound_method.rb +0 -23
- data/test/test_weakref.rb +0 -81
data/test/test_event_loop.rb
DELETED
@@ -1,407 +0,0 @@
|
|
1
|
-
require './test/test_config'
|
2
|
-
require 'utilrb/event_loop'
|
3
|
-
require 'minitest/spec'
|
4
|
-
|
5
|
-
MiniTest::Unit.autorun
|
6
|
-
|
7
|
-
describe Utilrb::EventLoop::Forwardable do
|
8
|
-
class Dummy
|
9
|
-
def test(wait)
|
10
|
-
sleep wait
|
11
|
-
Thread.current
|
12
|
-
end
|
13
|
-
|
14
|
-
def error
|
15
|
-
raise
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
class DummyAsync
|
20
|
-
extend Utilrb::EventLoop::Forwardable
|
21
|
-
def_event_loop_delegator :@obj,:@event_loop,:test,:alias => :atest
|
22
|
-
def_event_loop_delegators :@obj,:@event_loop,[:bla1,:bla2]
|
23
|
-
def_event_loop_delegator :@obj,:@event_loop,:error,:on_error => :on_error2,:known_errors => RuntimeError
|
24
|
-
|
25
|
-
forward_to :@obj, :@event_loop do
|
26
|
-
thread_safe do
|
27
|
-
def_delegators :bla3,:bla4
|
28
|
-
end
|
29
|
-
def_delegators :bla5
|
30
|
-
end
|
31
|
-
|
32
|
-
attr_accessor :last_error
|
33
|
-
|
34
|
-
def initialize(event_loop,obj = Dummy.new)
|
35
|
-
@event_loop = event_loop
|
36
|
-
@obj = obj
|
37
|
-
end
|
38
|
-
|
39
|
-
def on_error2(error)
|
40
|
-
@last_error = error
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
class DummyAsyncFilter
|
46
|
-
extend Utilrb::EventLoop::Forwardable
|
47
|
-
|
48
|
-
def do_not_overwrite
|
49
|
-
222
|
50
|
-
end
|
51
|
-
|
52
|
-
def_event_loop_delegator :@obj,:@event_loop,:test,:alias => :atest2
|
53
|
-
def_event_loop_delegator :@obj,:@event_loop,:test,:alias => :atest,:filter => :test_filter
|
54
|
-
def_event_loop_delegator :@obj,:@event_loop,:test,:alias => :do_not_overwrite
|
55
|
-
|
56
|
-
def initialize(event_loop,obj = Dummy.new)
|
57
|
-
@event_loop = event_loop
|
58
|
-
@obj = obj
|
59
|
-
end
|
60
|
-
|
61
|
-
# the result is always returned as array to check
|
62
|
-
# that the filer is working
|
63
|
-
def test_filter(result)
|
64
|
-
[result,result]
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
describe "when a class is extend but the designated object is nil" do
|
69
|
-
it "must raise if a method call is delegated." do
|
70
|
-
event_loop = Utilrb::EventLoop.new
|
71
|
-
obj = DummyAsync.new(event_loop,nil)
|
72
|
-
assert_raises Utilrb::EventLoop::Forwardable::DesignatedObjectNotFound do
|
73
|
-
obj.atest(0.1)
|
74
|
-
end
|
75
|
-
assert_raises Utilrb::EventLoop::Forwardable::DesignatedObjectNotFound do
|
76
|
-
obj.atest(0.1) do |_|
|
77
|
-
end
|
78
|
-
sleep 0.1
|
79
|
-
event_loop.step
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
it "must raise if a method call is delegated but the underlying object is nil." do
|
84
|
-
event_loop = Utilrb::EventLoop.new
|
85
|
-
obj = DummyAsyncFilter.new(event_loop,nil)
|
86
|
-
assert_raises Utilrb::EventLoop::Forwardable::DesignatedObjectNotFound do
|
87
|
-
obj.atest(0.1)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
describe "when a class is extend" do
|
93
|
-
it "must delegate the method call directly to the real object." do
|
94
|
-
event_loop = Utilrb::EventLoop.new
|
95
|
-
obj = DummyAsyncFilter.new(event_loop)
|
96
|
-
assert_equal Thread.current,obj.atest(0.1).first
|
97
|
-
end
|
98
|
-
|
99
|
-
it 'must call the error callback' do
|
100
|
-
event_loop = Utilrb::EventLoop.new
|
101
|
-
obj = DummyAsync.new(event_loop)
|
102
|
-
assert_raises RuntimeError do
|
103
|
-
obj.error
|
104
|
-
end
|
105
|
-
obj.last_error.must_be_instance_of RuntimeError
|
106
|
-
obj.last_error = nil
|
107
|
-
error = nil
|
108
|
-
obj.error do |_,e|
|
109
|
-
error = e
|
110
|
-
end
|
111
|
-
sleep 0.1
|
112
|
-
event_loop.step
|
113
|
-
error.must_be_instance_of RuntimeError
|
114
|
-
obj.last_error.must_be_instance_of RuntimeError
|
115
|
-
end
|
116
|
-
|
117
|
-
it 'must not overwrite instance methods' do
|
118
|
-
event_loop = Utilrb::EventLoop.new
|
119
|
-
obj = DummyAsyncFilter.new(event_loop)
|
120
|
-
assert_equal 222,obj.do_not_overwrite
|
121
|
-
end
|
122
|
-
|
123
|
-
it "must defer the method call to a thread pool if a block is given." do
|
124
|
-
event_loop = Utilrb::EventLoop.new
|
125
|
-
obj = DummyAsync.new(event_loop)
|
126
|
-
thread = nil
|
127
|
-
task = obj.atest(0.05) do |result|
|
128
|
-
thread = result
|
129
|
-
end
|
130
|
-
assert_equal Utilrb::ThreadPool::Task,task.class
|
131
|
-
sleep 0.1
|
132
|
-
event_loop.step
|
133
|
-
assert task.successfull?
|
134
|
-
assert thread != Thread.current
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
describe Utilrb::EventLoop do
|
140
|
-
describe "when executed" do
|
141
|
-
it "must call the timers at the right point in time." do
|
142
|
-
event_loop = Utilrb::EventLoop.new
|
143
|
-
val1 = nil
|
144
|
-
val2 = nil
|
145
|
-
val3 = nil
|
146
|
-
timer1 = event_loop.every 0.1 do
|
147
|
-
val1 = 123
|
148
|
-
end
|
149
|
-
timer2 = event_loop.every 0.2 do
|
150
|
-
val2 = 345
|
151
|
-
end
|
152
|
-
event_loop.once 0.3 do
|
153
|
-
val3 = 444
|
154
|
-
end
|
155
|
-
|
156
|
-
time = Time.now
|
157
|
-
while Time.now - time < 0.101
|
158
|
-
event_loop.step
|
159
|
-
end
|
160
|
-
event_loop.steps
|
161
|
-
assert_equal 123,val1
|
162
|
-
assert_equal nil,val2
|
163
|
-
assert_equal nil,val3
|
164
|
-
val1 = nil
|
165
|
-
|
166
|
-
time = Time.now
|
167
|
-
while Time.now - time < 0.101
|
168
|
-
event_loop.step
|
169
|
-
end
|
170
|
-
assert_equal 123,val1
|
171
|
-
assert_equal 345,val2
|
172
|
-
assert_equal nil,val3
|
173
|
-
|
174
|
-
time = Time.now
|
175
|
-
while Time.now - time < 0.101
|
176
|
-
event_loop.step
|
177
|
-
end
|
178
|
-
assert_equal 444,val3
|
179
|
-
event_loop.clear
|
180
|
-
end
|
181
|
-
|
182
|
-
it 'must call a given block for every step' do
|
183
|
-
event_loop = Utilrb::EventLoop.new
|
184
|
-
val = nil
|
185
|
-
event_loop.every_step do
|
186
|
-
val = 123
|
187
|
-
end
|
188
|
-
event_loop.step
|
189
|
-
assert_equal 123,val
|
190
|
-
val = nil
|
191
|
-
event_loop.step
|
192
|
-
assert_equal 123,val
|
193
|
-
val = nil
|
194
|
-
event_loop.step
|
195
|
-
assert_equal 123,val
|
196
|
-
end
|
197
|
-
|
198
|
-
it "must be able to start and stop timers." do
|
199
|
-
event_loop = Utilrb::EventLoop.new
|
200
|
-
val1 = nil
|
201
|
-
val2 = nil
|
202
|
-
timer1 = event_loop.every 0.1 do
|
203
|
-
val1 = 123
|
204
|
-
end
|
205
|
-
assert timer1.running?
|
206
|
-
timer2 = event_loop.every 0.2 do
|
207
|
-
val2 = 345
|
208
|
-
end
|
209
|
-
assert timer2.running?
|
210
|
-
|
211
|
-
timer1.cancel
|
212
|
-
assert !timer1.running?
|
213
|
-
time = Time.now
|
214
|
-
event_loop.wait_for do
|
215
|
-
Time.now - time >= 0.22
|
216
|
-
end
|
217
|
-
assert_equal nil,val1
|
218
|
-
assert_equal 345,val2
|
219
|
-
val2 = nil
|
220
|
-
timer1.start
|
221
|
-
timer2.cancel
|
222
|
-
|
223
|
-
time = Time.now
|
224
|
-
while Time.now - time < 0.201
|
225
|
-
event_loop.step
|
226
|
-
end
|
227
|
-
assert_equal 123,val1
|
228
|
-
assert_equal nil,val2
|
229
|
-
end
|
230
|
-
|
231
|
-
it "must defer blocking calls to a thread pool" do
|
232
|
-
event_loop = Utilrb::EventLoop.new
|
233
|
-
main_thread = Thread.current
|
234
|
-
val = nil
|
235
|
-
val2 = nil
|
236
|
-
callback = Proc.new do |result|
|
237
|
-
assert_equal main_thread,Thread.current
|
238
|
-
assert main_thread != result
|
239
|
-
val = result
|
240
|
-
end
|
241
|
-
event_loop.defer({:callback => callback},123,333) do |a,b|
|
242
|
-
assert_equal 123,a
|
243
|
-
assert_equal 333,b
|
244
|
-
sleep 0.2
|
245
|
-
assert main_thread != Thread.current
|
246
|
-
val2 = Thread.current
|
247
|
-
end
|
248
|
-
sleep 0.1
|
249
|
-
event_loop.step
|
250
|
-
assert !val
|
251
|
-
|
252
|
-
sleep 0.11
|
253
|
-
event_loop.step
|
254
|
-
assert val
|
255
|
-
assert_equal val,val2
|
256
|
-
end
|
257
|
-
it "must peridically defer blocking calls to a thread pool" do
|
258
|
-
event_loop = Utilrb::EventLoop.new
|
259
|
-
main_thread = Thread.current
|
260
|
-
work = Proc.new do
|
261
|
-
Thread.current
|
262
|
-
end
|
263
|
-
val = nil
|
264
|
-
event_loop.async_every work,:period => 0.1 do |result,e|
|
265
|
-
val = result
|
266
|
-
end
|
267
|
-
sleep 0.11
|
268
|
-
event_loop.step
|
269
|
-
assert !val
|
270
|
-
sleep 0.01
|
271
|
-
event_loop.step
|
272
|
-
assert val
|
273
|
-
assert val != main_thread
|
274
|
-
val = nil
|
275
|
-
|
276
|
-
sleep 0.11
|
277
|
-
event_loop.step
|
278
|
-
sleep 0.01
|
279
|
-
event_loop.step
|
280
|
-
assert val
|
281
|
-
assert val != main_thread
|
282
|
-
end
|
283
|
-
|
284
|
-
it 'must be able to overwrite an error' do
|
285
|
-
event_loop = Utilrb::EventLoop.new
|
286
|
-
work = Proc.new do
|
287
|
-
raise ArgumentError
|
288
|
-
end
|
289
|
-
event_loop.async work do |r,e|
|
290
|
-
if e
|
291
|
-
RuntimeError.new
|
292
|
-
end
|
293
|
-
end
|
294
|
-
sleep 0.1
|
295
|
-
assert_raises RuntimeError do
|
296
|
-
event_loop.step
|
297
|
-
end
|
298
|
-
end
|
299
|
-
|
300
|
-
it 'must be able to ignore an error' do
|
301
|
-
event_loop = Utilrb::EventLoop.new
|
302
|
-
work = Proc.new do
|
303
|
-
raise ArgumentError
|
304
|
-
end
|
305
|
-
event_loop.async work do |r,e|
|
306
|
-
if e
|
307
|
-
:ignore_error
|
308
|
-
end
|
309
|
-
end
|
310
|
-
sleep 0.1
|
311
|
-
event_loop.step
|
312
|
-
end
|
313
|
-
|
314
|
-
it 'must inform on_error block in an event of an error' do
|
315
|
-
event_loop = Utilrb::EventLoop.new
|
316
|
-
error = nil
|
317
|
-
event_loop.on_error ArgumentError do |e|
|
318
|
-
error = e
|
319
|
-
end
|
320
|
-
|
321
|
-
#check super class
|
322
|
-
error2 = nil
|
323
|
-
event_loop.on_error Exception do |e|
|
324
|
-
error2 = e
|
325
|
-
end
|
326
|
-
work = Proc.new do
|
327
|
-
raise ArgumentError
|
328
|
-
end
|
329
|
-
event_loop.async_with_options work, :default => :default_value,:known_errors => ArgumentError do |r,e|
|
330
|
-
end
|
331
|
-
sleep 0.1
|
332
|
-
event_loop.step
|
333
|
-
assert error
|
334
|
-
assert error2
|
335
|
-
end
|
336
|
-
|
337
|
-
it 'must re-raise an error' do
|
338
|
-
event_loop = Utilrb::EventLoop.new
|
339
|
-
event_loop.once do
|
340
|
-
raise ArgumentError
|
341
|
-
end
|
342
|
-
event_loop.once do
|
343
|
-
raise ArgumentError
|
344
|
-
end
|
345
|
-
event_loop.once do
|
346
|
-
raise ArgumentError
|
347
|
-
end
|
348
|
-
assert_raises ArgumentError do
|
349
|
-
event_loop.step
|
350
|
-
end
|
351
|
-
assert_raises ArgumentError do
|
352
|
-
event_loop.step
|
353
|
-
end
|
354
|
-
event_loop.clear_errors
|
355
|
-
event_loop.step
|
356
|
-
|
357
|
-
event_loop.defer Hash.new, 123,22,333 do |a,b,c|
|
358
|
-
assert_equal 123,a
|
359
|
-
assert_equal 22,b
|
360
|
-
assert_equal 333,c
|
361
|
-
raise ArgumentError
|
362
|
-
end
|
363
|
-
sleep 0.1
|
364
|
-
assert_raises ArgumentError do
|
365
|
-
event_loop.step
|
366
|
-
end
|
367
|
-
end
|
368
|
-
|
369
|
-
it 'must automatically step' do
|
370
|
-
event_loop = Utilrb::EventLoop.new
|
371
|
-
event_loop.once 0.2 do
|
372
|
-
event_loop.stop
|
373
|
-
end
|
374
|
-
event_loop.exec
|
375
|
-
end
|
376
|
-
|
377
|
-
it 'must raise if step is called from a wrong thread' do
|
378
|
-
event_loop = Utilrb::EventLoop.new
|
379
|
-
event_loop.defer do
|
380
|
-
event_loop.step
|
381
|
-
end
|
382
|
-
sleep 0.1
|
383
|
-
assert_raises RuntimeError do
|
384
|
-
event_loop.step
|
385
|
-
end
|
386
|
-
end
|
387
|
-
|
388
|
-
it 'must call a given block from the event loop thread' do
|
389
|
-
event_loop = Utilrb::EventLoop.new
|
390
|
-
event_loop.thread = Thread.current
|
391
|
-
result1,result2 = [nil,nil]
|
392
|
-
event_loop.defer do
|
393
|
-
result1 = Thread.current
|
394
|
-
event_loop.call do
|
395
|
-
result2 = Thread.current
|
396
|
-
assert event_loop.thread?
|
397
|
-
end
|
398
|
-
end
|
399
|
-
sleep 0.1
|
400
|
-
event_loop.step
|
401
|
-
assert result1
|
402
|
-
assert result1 != result2
|
403
|
-
assert_equal Thread.current,result2
|
404
|
-
end
|
405
|
-
end
|
406
|
-
end
|
407
|
-
|
data/test/test_exception.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
require './test/test_config'
|
2
|
-
require 'utilrb/exception'
|
3
|
-
require 'flexmock'
|
4
|
-
|
5
|
-
class TC_Exception < Test::Unit::TestCase
|
6
|
-
def test_full_message
|
7
|
-
FlexMock.use do |mock|
|
8
|
-
error = Exception.new
|
9
|
-
def error.message; "this is an error" end
|
10
|
-
def error.backtrace
|
11
|
-
(0..10).map { |i| i.to_s }
|
12
|
-
end
|
13
|
-
|
14
|
-
full = error.full_message.split("\n")
|
15
|
-
assert_equal(11, full.size)
|
16
|
-
|
17
|
-
filtered = error.full_message { |line| Integer(line) % 2 == 0 }.split("\n")
|
18
|
-
assert_equal(6, filtered.size)
|
19
|
-
assert_equal(full.values_at(0, 2, 4, 6, 8, 10), filtered)
|
20
|
-
|
21
|
-
since_matches = error.full_message(:since => /4/).split("\n")
|
22
|
-
assert_equal(7, since_matches.size)
|
23
|
-
assert_equal(full.values_at(*(5..10)), since_matches[1..-1])
|
24
|
-
|
25
|
-
until_matches = error.full_message(:until => /3/).split("\n")
|
26
|
-
assert_equal(3, until_matches.size)
|
27
|
-
assert_equal(full.values_at(1, 2), until_matches[1..-1])
|
28
|
-
|
29
|
-
since_and_until = error.full_message(:since => /3/, :until => /6/).split("\n")
|
30
|
-
assert_equal(3, since_and_until.size)
|
31
|
-
assert_equal(full.values_at(4, 5), since_and_until[1..-1])
|
32
|
-
|
33
|
-
all = error.full_message(:since => /3/, :until => /6/) { |line| Integer(line) % 2 == 0 }.split("\n")
|
34
|
-
assert_equal(1, all.size)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
data/test/test_gc.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
require './test/test_config'
|
2
|
-
|
3
|
-
require 'utilrb/gc'
|
4
|
-
require 'enumerator'
|
5
|
-
|
6
|
-
class TC_GC < Test::Unit::TestCase
|
7
|
-
def allocate(&block)
|
8
|
-
# Allocate twice since it seems the last object stays on stack
|
9
|
-
# (and is not GC'ed)
|
10
|
-
2.times { ObjectSpace.define_finalizer(Object.new, &block) }
|
11
|
-
nil
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_force
|
15
|
-
finalized = false
|
16
|
-
allocate { finalized = true }
|
17
|
-
GC.start
|
18
|
-
assert( finalized )
|
19
|
-
|
20
|
-
GC.disable
|
21
|
-
finalized = false
|
22
|
-
allocate { finalized = true }
|
23
|
-
GC.start
|
24
|
-
assert( !finalized )
|
25
|
-
GC.force
|
26
|
-
assert( finalized )
|
27
|
-
assert( GC.disable )
|
28
|
-
|
29
|
-
GC.enable
|
30
|
-
GC.force
|
31
|
-
assert( !GC.enable )
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
data/test/test_hash.rb
DELETED
@@ -1,102 +0,0 @@
|
|
1
|
-
require './test/test_config'
|
2
|
-
require 'enumerator'
|
3
|
-
require 'set'
|
4
|
-
|
5
|
-
require 'utilrb/hash'
|
6
|
-
|
7
|
-
class TC_Hash < Test::Unit::TestCase
|
8
|
-
def test_slice
|
9
|
-
test = { :a => 1, :b => 2, :c => 3 }
|
10
|
-
assert_equal({:a => 1, :c => 3}, test.slice(:a, :c))
|
11
|
-
assert_equal({:a => 1, :c => 3}, test.slice(:a, :c, :d))
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_to_sym_keys
|
15
|
-
assert_equal({ :a => 10, :b => 20, :c => 30 }, { 'a' => 10, 'b' => 20, :c => 30 }.to_sym_keys)
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_to_s
|
19
|
-
obj = { 1 => 2, 2 => 3 }
|
20
|
-
assert(obj.to_s =~ /^\{(.*)\}$/)
|
21
|
-
values = $1.split(", ")
|
22
|
-
assert_equal(["1 => 2", "2 => 3"].to_set, values.to_set)
|
23
|
-
|
24
|
-
obj[3] = obj
|
25
|
-
assert(obj.to_s =~ /^\{(.*)\}$/)
|
26
|
-
values = $1.split(", ")
|
27
|
-
assert_equal(["1 => 2", "2 => 3", "3 => ..."].to_set, values.to_set)
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_map_key
|
31
|
-
base = { 1 => 'a', 2 => 'b' }
|
32
|
-
result = base.map_key { |k, v| k += 1 }
|
33
|
-
|
34
|
-
assert_equal({ 1 => 'a', 2 => 'b' }, base)
|
35
|
-
assert_equal({ 2 => 'a', 3 => 'b' }, result)
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_map_value
|
39
|
-
base = { 'a' => 1, 'b' => 2 }
|
40
|
-
result = base.map_value { |k, v| v += 1 }
|
41
|
-
|
42
|
-
assert_equal({ 'a' => 1, 'b' => 2 }, base)
|
43
|
-
assert_equal({ 'a' => 2, 'b' => 3 }, result)
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_recursive_merge
|
47
|
-
base = { 'a' => 1, 'b' => { 'c' => 10, 'd' => 20 }, 'c' => 2 }
|
48
|
-
base_orig = base.dup
|
49
|
-
to_merge = { 'a' => 10, 'b' => { 'c' => 100 }, 'd' => 3 }
|
50
|
-
to_merge_orig = to_merge.dup
|
51
|
-
result = base.recursive_merge(to_merge)
|
52
|
-
|
53
|
-
assert_equal(base, base_orig)
|
54
|
-
assert_equal(to_merge, to_merge_orig)
|
55
|
-
assert_equal({'a' => 10, 'b' => { 'c' => 100, 'd' => 20 }, 'c' => 2, 'd' => 3}, result)
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_recursive_merge_with_block
|
59
|
-
base = { 'a' => 1, 'b' => { 'c' => 10, 'd' => 20 }, 'c' => 2 }
|
60
|
-
base_orig = base.dup
|
61
|
-
to_merge = { 'a' => 10, 'b' => { 'c' => 100 }, 'd' => 3 }
|
62
|
-
to_merge_orig = to_merge.dup
|
63
|
-
args = []
|
64
|
-
result = base.recursive_merge(to_merge) do |v, k1, k2|
|
65
|
-
args << [v, k1, k2]
|
66
|
-
k1
|
67
|
-
end
|
68
|
-
|
69
|
-
assert_equal(base, base_orig)
|
70
|
-
assert_equal(to_merge, to_merge_orig)
|
71
|
-
assert_equal([['a', 1, 10], ['c', 10, 100]].to_set, args.to_set)
|
72
|
-
assert_equal({'a' => 1, 'b' => { 'c' => 10, 'd' => 20 }, 'c' => 2, 'd' => 3}, result)
|
73
|
-
end
|
74
|
-
|
75
|
-
def test_recursive_merge_bang
|
76
|
-
base = { 'a' => 1, 'b' => { 'c' => 10, 'd' => 20 }, 'c' => 2 }
|
77
|
-
to_merge = { 'a' => 10, 'b' => { 'c' => 100 }, 'd' => 3 }
|
78
|
-
to_merge_orig = to_merge.dup
|
79
|
-
result = base.recursive_merge!(to_merge)
|
80
|
-
|
81
|
-
assert_equal(result, base)
|
82
|
-
assert_equal(to_merge, to_merge_orig)
|
83
|
-
assert_equal({'a' => 10, 'b' => { 'c' => 100, 'd' => 20 }, 'c' => 2, 'd' => 3}, result)
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_recursive_merge_bang_with_block
|
87
|
-
base = { 'a' => 1, 'b' => { 'c' => 10, 'd' => 20 }, 'c' => 2 }
|
88
|
-
to_merge = { 'a' => 10, 'b' => { 'c' => 100 }, 'd' => 3 }
|
89
|
-
to_merge_orig = to_merge.dup
|
90
|
-
args = []
|
91
|
-
result = base.recursive_merge!(to_merge) do |v, k1, k2|
|
92
|
-
args << [v, k1, k2]
|
93
|
-
k1
|
94
|
-
end
|
95
|
-
|
96
|
-
assert_equal(result, base)
|
97
|
-
assert_equal(to_merge, to_merge_orig)
|
98
|
-
assert_equal([['a', 1, 10], ['c', 10, 100]].to_set, args.to_set)
|
99
|
-
assert_equal({'a' => 1, 'b' => { 'c' => 10, 'd' => 20 }, 'c' => 2, 'd' => 3}, result)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|