ruby_ex 0.1.1
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/AUTHORS +51 -0
- data/ChangeLog +1763 -0
- data/NEWS +3 -0
- data/README +1 -0
- data/Rakefile +8 -0
- data/SPEC.dyn.yml +10 -0
- data/SPEC.gem.yml +269 -0
- data/SPEC.yml +36 -0
- data/src/abstract.rb +253 -0
- data/src/abstract_node.rb +85 -0
- data/src/algorithms.rb +12 -0
- data/src/algorithms/simulated_annealing.rb +142 -0
- data/src/ask.rb +100 -0
- data/src/attributed_class.rb +303 -0
- data/src/cache.rb +350 -0
- data/src/checkout.rb +12 -0
- data/src/choose.rb +271 -0
- data/src/commands.rb +20 -0
- data/src/commands/command.rb +492 -0
- data/src/commands/datas.rb +16 -0
- data/src/commands/datas/composite.rb +31 -0
- data/src/commands/datas/data.rb +65 -0
- data/src/commands/datas/factory.rb +69 -0
- data/src/commands/datas/temp.rb +26 -0
- data/src/commands/factory.rb +67 -0
- data/src/commands/helpers.rb +81 -0
- data/src/commands/pipe.rb +66 -0
- data/src/commands/runners.rb +16 -0
- data/src/commands/runners/exec.rb +50 -0
- data/src/commands/runners/fork.rb +130 -0
- data/src/commands/runners/runner.rb +140 -0
- data/src/commands/runners/system.rb +57 -0
- data/src/commands/seq.rb +32 -0
- data/src/config_file.rb +95 -0
- data/src/const_regexp.rb +57 -0
- data/src/daemon.rb +135 -0
- data/src/diff.rb +665 -0
- data/src/dlogger.rb +62 -0
- data/src/drb/drb_observable.rb +95 -0
- data/src/drb/drb_observable_pool.rb +27 -0
- data/src/drb/drb_service.rb +44 -0
- data/src/drb/drb_undumped_attributes.rb +56 -0
- data/src/drb/drb_undumped_indexed_object.rb +55 -0
- data/src/drb/insecure_protected_methods.rb +101 -0
- data/src/drb_ex.rb +12 -0
- data/src/dumpable_proc.rb +57 -0
- data/src/filetype.rb +229 -0
- data/src/generate_id.rb +44 -0
- data/src/histogram.rb +222 -0
- data/src/hookable.rb +283 -0
- data/src/hooker.rb +54 -0
- data/src/indexed_node.rb +65 -0
- data/src/io_marshal.rb +99 -0
- data/src/ioo.rb +193 -0
- data/src/labeled_node.rb +62 -0
- data/src/logger_observer.rb +24 -0
- data/src/md5sum.rb +70 -0
- data/src/module/autoload_tree.rb +65 -0
- data/src/module/hierarchy.rb +334 -0
- data/src/module/instance_method_visibility.rb +71 -0
- data/src/node.rb +81 -0
- data/src/object_monitor.rb +143 -0
- data/src/object_monitor_activity.rb +34 -0
- data/src/observable.rb +138 -0
- data/src/observable_pool.rb +291 -0
- data/src/orderedhash.rb +252 -0
- data/src/pp_hierarchy.rb +30 -0
- data/src/random_generators.rb +29 -0
- data/src/random_generators/random_generator.rb +33 -0
- data/src/random_generators/ruby.rb +25 -0
- data/src/ruby_ex.rb +124 -0
- data/src/safe_eval.rb +346 -0
- data/src/sendmail.rb +214 -0
- data/src/service_manager.rb +122 -0
- data/src/shuffle.rb +30 -0
- data/src/spring.rb +134 -0
- data/src/spring_set.rb +134 -0
- data/src/symtbl.rb +108 -0
- data/src/synflow.rb +474 -0
- data/src/thread_mutex.rb +11 -0
- data/src/timeout_ex.rb +79 -0
- data/src/trace.rb +26 -0
- data/src/uri/druby.rb +78 -0
- data/src/uri/file.rb +63 -0
- data/src/uri/ftp_ex.rb +36 -0
- data/src/uri/http_ex.rb +41 -0
- data/src/uri/pgsql.rb +136 -0
- data/src/uri/ssh.rb +87 -0
- data/src/uri/svn.rb +113 -0
- data/src/uri_ex.rb +71 -0
- data/src/verbose_object.rb +70 -0
- data/src/yaml/basenode_ext.rb +63 -0
- data/src/yaml/chop_header.rb +24 -0
- data/src/yaml/transform.rb +450 -0
- data/src/yaml/yregexpath.rb +76 -0
- data/test/algorithms/simulated_annealing_test.rb +102 -0
- data/test/check-pkg-ruby_ex.yml +15 -0
- data/test/check-ruby_ex.yml +12 -0
- data/test/resources/autoload_tree/A.rb +11 -0
- data/test/resources/autoload_tree/B.rb +10 -0
- data/test/resources/autoload_tree/foo/C.rb +18 -0
- data/test/resources/foo.txt +6 -0
- data/test/sanity-suite.yml +12 -0
- data/test/sanity/multiple-requires.yml +20 -0
- data/test/sanity/single-requires.yml +24 -0
- data/test/test-unit-setup.rb +6 -0
- data/test/unit-suite.yml +14 -0
- metadata +269 -0
@@ -0,0 +1,291 @@
|
|
1
|
+
# Copyright: Copyright (c) 2004 Nicolas Despres. All rights reserved.
|
2
|
+
# Author: Nicolas Despres <polrop@lrde.epita.fr>.
|
3
|
+
# License: Gnu General Public License.
|
4
|
+
|
5
|
+
# $LastChangedBy: ertai $
|
6
|
+
# $Id: observable_pool.rb 266 2005-06-01 14:27:18Z ertai $
|
7
|
+
|
8
|
+
|
9
|
+
require 'ruby_ex'
|
10
|
+
require 'observable'
|
11
|
+
require 'thread'
|
12
|
+
|
13
|
+
|
14
|
+
module ObservablePool
|
15
|
+
|
16
|
+
class Observer
|
17
|
+
include Observable
|
18
|
+
|
19
|
+
attr_reader :observable
|
20
|
+
|
21
|
+
def initialize(observable, mutex)
|
22
|
+
@observable = observable
|
23
|
+
@observable.add_observer(self)
|
24
|
+
@mutex = mutex
|
25
|
+
end
|
26
|
+
|
27
|
+
def update(*args, &block)
|
28
|
+
@mutex.synchronize do
|
29
|
+
changed
|
30
|
+
notify_observers(@observable, *args, &block)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def method_missing(meth, *args, &block)
|
35
|
+
@observable.send(meth, *args, &block)
|
36
|
+
end
|
37
|
+
|
38
|
+
end # class Observer
|
39
|
+
|
40
|
+
def add_observable(observable)
|
41
|
+
unless observable.is_a?(Observable)
|
42
|
+
raise(ArgumentError, "observable object must be Observale")
|
43
|
+
end
|
44
|
+
@observable_peer_mutex = Mutex.new unless defined? @observable_peer_mutex
|
45
|
+
@observable_peers = {} unless defined? @observable_peers
|
46
|
+
sync_observer = Observer.new(observable, @observable_peer_mutex)
|
47
|
+
@observable_peers[observable] = sync_observer
|
48
|
+
@global_observer_peers = [] unless defined? @global_observer_peers
|
49
|
+
@global_observer_peers.each do |observer|
|
50
|
+
sync_observer.add_observer(observer)
|
51
|
+
end
|
52
|
+
sync_observer
|
53
|
+
end
|
54
|
+
|
55
|
+
def add_observables(*observables)
|
56
|
+
observables.each { |observable| add_observable(observable) }
|
57
|
+
end
|
58
|
+
|
59
|
+
def delete_observable(observable)
|
60
|
+
@observable_peers.delete(observable) if defined? @observable_peers
|
61
|
+
end
|
62
|
+
|
63
|
+
def delete_observables
|
64
|
+
@observable_peers.clear if defined? @observable_peers
|
65
|
+
end
|
66
|
+
|
67
|
+
def observable(observable)
|
68
|
+
@observable_peers[observable] if defined? @observable_peers
|
69
|
+
end
|
70
|
+
|
71
|
+
def observable?(observable)
|
72
|
+
@observable_peers.has_key?(observable) if defined? @observable_peers
|
73
|
+
end
|
74
|
+
|
75
|
+
def list_observables
|
76
|
+
if defined? @observable_peers
|
77
|
+
@observable_peers.keys
|
78
|
+
else
|
79
|
+
[]
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def list_observables_observed(observer)
|
84
|
+
observables = []
|
85
|
+
if defined? @observable_peers
|
86
|
+
@observable_peers.each do |observable, obsv|
|
87
|
+
if obsv.list_observers.include?(observer)
|
88
|
+
observables << observable
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
observables
|
93
|
+
end
|
94
|
+
|
95
|
+
def count_observables
|
96
|
+
if defined? @observable_peers
|
97
|
+
@observable_peers.size
|
98
|
+
else
|
99
|
+
0
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def each_observables(&block)
|
104
|
+
if defined? @observable_peers
|
105
|
+
@observable_peers.each do |observable, observer|
|
106
|
+
block[observable, observer]
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def list_all_observers
|
112
|
+
observers = []
|
113
|
+
if defined? @observable_peers
|
114
|
+
@observable_peers.each do |observable, observer|
|
115
|
+
observers += observer.list_observers
|
116
|
+
end
|
117
|
+
end
|
118
|
+
observers.uniq
|
119
|
+
end
|
120
|
+
|
121
|
+
def count_all_observers
|
122
|
+
list_observers.size
|
123
|
+
end
|
124
|
+
|
125
|
+
def add_global_observer(observer)
|
126
|
+
if defined? @observable_peers
|
127
|
+
@observable_peers.each do |observable, obsv|
|
128
|
+
obsv.add_observer(observer) unless observable.observer?(observer)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
@global_observer_peers = [] unless defined? @global_observer_peers
|
132
|
+
@global_observer_peers << observer
|
133
|
+
end
|
134
|
+
|
135
|
+
def add_global_observers(*observers)
|
136
|
+
observers.each { |observer| add_global_observer(observer) }
|
137
|
+
end
|
138
|
+
|
139
|
+
def delete_global_observer(observer)
|
140
|
+
if defined? @observable_peers
|
141
|
+
@observable_peers.each do |observable, obsv|
|
142
|
+
obsv.delete_observer(observer)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
@global_observer_peers.delete(observer) if defined? @global_observer_peers
|
146
|
+
end
|
147
|
+
|
148
|
+
def delete_global_observers
|
149
|
+
if defined? @global_observer_peers
|
150
|
+
@global_observer_peers.dup.each do |global_observer|
|
151
|
+
delete_global_observer(global_observer)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def list_global_observers
|
157
|
+
if defined? @global_observer_peers
|
158
|
+
@global_observer_peers.dup
|
159
|
+
else
|
160
|
+
[]
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def count_global_observers
|
165
|
+
if defined? @global_observer_peers
|
166
|
+
@globale.observer_peers.size
|
167
|
+
else
|
168
|
+
0
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def global_observer?(observer)
|
173
|
+
if defined? @global_observer_peers
|
174
|
+
@global_observer_peers.include?(observer)
|
175
|
+
else
|
176
|
+
false
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
end # class ObservablePool
|
181
|
+
|
182
|
+
|
183
|
+
test_section __FILE__ do
|
184
|
+
|
185
|
+
|
186
|
+
class ObservablePoolTest < Test::Unit::TestCase
|
187
|
+
|
188
|
+
class Notifier
|
189
|
+
include Observable
|
190
|
+
|
191
|
+
end
|
192
|
+
|
193
|
+
class NotifierPool
|
194
|
+
include ObservablePool
|
195
|
+
|
196
|
+
end
|
197
|
+
|
198
|
+
class Obsv
|
199
|
+
|
200
|
+
attr_reader :last_msg
|
201
|
+
|
202
|
+
def initialize
|
203
|
+
@last_msg = nil
|
204
|
+
end
|
205
|
+
|
206
|
+
def update(*args, &block)
|
207
|
+
@last_msg = args
|
208
|
+
end
|
209
|
+
|
210
|
+
end
|
211
|
+
|
212
|
+
def test_simple
|
213
|
+
n1 = Notifier.new
|
214
|
+
n2 = Notifier.new
|
215
|
+
o1 = Obsv.new
|
216
|
+
o2 = Obsv.new
|
217
|
+
o3 = Obsv.new
|
218
|
+
op = NotifierPool.new
|
219
|
+
assert_equal(0, op.count_observables)
|
220
|
+
assert_equal([], op.list_observables)
|
221
|
+
op.add_observables(n1)
|
222
|
+
op.add_observable(n2)
|
223
|
+
op.observable(n2).add_observers(o1, o3)
|
224
|
+
assert_equal(2, op.count_observables)
|
225
|
+
[ n1, n2 ].each { |x| assert(op.list_observables.include?(x)) }
|
226
|
+
assert_equal(1, n1.count_observers)
|
227
|
+
assert_equal([], n1.list_observers[0].list_observers)
|
228
|
+
assert_equal(1, n2.count_observers)
|
229
|
+
assert_equal(2, n2.list_observers[0].count_observers)
|
230
|
+
[o1, o3].each do |x|
|
231
|
+
assert(n2.list_observers[0].list_observers.include?(x),
|
232
|
+
"#{x} not observer")
|
233
|
+
end
|
234
|
+
op.observable(n1).add_observers(o2, o3)
|
235
|
+
assert_equal(2, op.observable(n1).count_observers)
|
236
|
+
[o1, o2, o3].each do |x|
|
237
|
+
assert(op.list_all_observers.include?(x), "#{x} not observer")
|
238
|
+
end
|
239
|
+
n2.changed
|
240
|
+
n2.notify_observers('msg2')
|
241
|
+
assert_equal([ n2, 'msg2'], o1.last_msg)
|
242
|
+
assert_nil(o2.last_msg)
|
243
|
+
assert_equal([ n2, 'msg2'], o3.last_msg)
|
244
|
+
n1.changed
|
245
|
+
n1.notify_observers('msg1')
|
246
|
+
assert_equal([n2, 'msg2'], o1.last_msg)
|
247
|
+
assert_equal([n1, 'msg1'], o2.last_msg)
|
248
|
+
assert_equal([n1, 'msg1'], o3.last_msg)
|
249
|
+
[n1, n2].each do |x|
|
250
|
+
assert(op.list_observables_observed(o3).include?(x), "#{x} not observer")
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
def test_global_observer
|
255
|
+
n1 = Notifier.new
|
256
|
+
n2 = Notifier.new
|
257
|
+
n3 = Notifier.new
|
258
|
+
o1 = Obsv.new
|
259
|
+
o2 = Obsv.new
|
260
|
+
o3 = Obsv.new
|
261
|
+
op = NotifierPool.new
|
262
|
+
assert_equal(0, op.count_global_observers)
|
263
|
+
assert_equal([], op.list_global_observers)
|
264
|
+
op.add_observables(n1)
|
265
|
+
op.add_observable(n2)
|
266
|
+
op.observable(n1).add_observers(o1)
|
267
|
+
op.observable(n2).add_observers(o2)
|
268
|
+
op.add_global_observers(o3)
|
269
|
+
[o1, o3].each do |x|
|
270
|
+
assert(n1.list_observers[0].list_observers.include?(x),
|
271
|
+
"#{x} not observer")
|
272
|
+
end
|
273
|
+
[o2, o3].each do |x|
|
274
|
+
assert(n2.list_observers[0].list_observers.include?(x),
|
275
|
+
"#{x} not observer")
|
276
|
+
end
|
277
|
+
assert_equal([o3], op.list_global_observers)
|
278
|
+
op.add_observable(n3)
|
279
|
+
assert([o3], n3.list_observers[0].list_observers)
|
280
|
+
op.delete_global_observers
|
281
|
+
assert_equal([], op.list_global_observers)
|
282
|
+
assert([], n3.list_observers[0].list_observers)
|
283
|
+
assert([o2], n2.list_observers[0].list_observers)
|
284
|
+
assert([o1], n1.list_observers[0].list_observers)
|
285
|
+
end
|
286
|
+
|
287
|
+
end # class ObservablePoolTest
|
288
|
+
|
289
|
+
|
290
|
+
end
|
291
|
+
|
data/src/orderedhash.rb
ADDED
@@ -0,0 +1,252 @@
|
|
1
|
+
# AUTHOR
|
2
|
+
# jan molic /mig/at/1984/dot/cz/
|
3
|
+
# updated by: Nicolas Pouillard <ertai@lrde.epita.fr>
|
4
|
+
#
|
5
|
+
# DESCRIPTION
|
6
|
+
# Override hash to make it creation order preserved.
|
7
|
+
# This will be obsolete - it is better to use special OrderedHash class
|
8
|
+
# than overriding.
|
9
|
+
# Public domain.
|
10
|
+
#
|
11
|
+
# THANKS
|
12
|
+
# Andrew Johnson for his suggestions and fixes of Hash[],
|
13
|
+
# merge, to_a, inspect and shift
|
14
|
+
#
|
15
|
+
# USAGE
|
16
|
+
# just require this file, examples are at the end
|
17
|
+
# you can try to run this file (ruby orderedhash.rb)
|
18
|
+
#
|
19
|
+
|
20
|
+
# $LastChangedBy: ertai $
|
21
|
+
# $Id: orderedhash.rb 266 2005-06-01 14:27:18Z ertai $
|
22
|
+
|
23
|
+
require 'ruby_ex'
|
24
|
+
|
25
|
+
module OrderedHash_ext
|
26
|
+
|
27
|
+
def store ( a, b )
|
28
|
+
@order.push a unless has_key? a
|
29
|
+
super a,b
|
30
|
+
end
|
31
|
+
|
32
|
+
def []= ( a, b )
|
33
|
+
@order.push a unless has_key? a
|
34
|
+
super a,b
|
35
|
+
end
|
36
|
+
|
37
|
+
def == ( hsh2 )
|
38
|
+
return false if !hsh2.respond_to? :order or @order != hsh2.order
|
39
|
+
super hsh2
|
40
|
+
end
|
41
|
+
|
42
|
+
def clear
|
43
|
+
@order = []
|
44
|
+
super
|
45
|
+
end
|
46
|
+
|
47
|
+
def delete ( key )
|
48
|
+
@order.delete key
|
49
|
+
super
|
50
|
+
end
|
51
|
+
|
52
|
+
def each_key
|
53
|
+
@order.each { |k| yield k }
|
54
|
+
self
|
55
|
+
end
|
56
|
+
|
57
|
+
def each_value
|
58
|
+
@order.each { |k| yield self[k] }
|
59
|
+
self
|
60
|
+
end
|
61
|
+
|
62
|
+
def each
|
63
|
+
@order.each { |k| yield(k, self[k]) }
|
64
|
+
self
|
65
|
+
end
|
66
|
+
|
67
|
+
alias :each_pair :each
|
68
|
+
|
69
|
+
def delete_if
|
70
|
+
@order.clone.each do |k|
|
71
|
+
delete k if yield(k, self[k])
|
72
|
+
end
|
73
|
+
self
|
74
|
+
end
|
75
|
+
|
76
|
+
def values
|
77
|
+
ary = []
|
78
|
+
@order.each { |k| ary << self[k] }
|
79
|
+
ary
|
80
|
+
end
|
81
|
+
|
82
|
+
def keys
|
83
|
+
@order
|
84
|
+
end
|
85
|
+
|
86
|
+
def invert
|
87
|
+
hsh2 = self.class.new
|
88
|
+
@order.each { |k| hsh2[self[k]] = k }
|
89
|
+
hsh2
|
90
|
+
end
|
91
|
+
|
92
|
+
def reject ( &block )
|
93
|
+
self.dup.delete_if(&block)
|
94
|
+
end
|
95
|
+
|
96
|
+
def reject! ( &block )
|
97
|
+
hsh2 = reject(&block)
|
98
|
+
self == hsh2 ? nil : hsh2
|
99
|
+
end
|
100
|
+
|
101
|
+
def replace ( hsh2 )
|
102
|
+
@order = hsh2.keys
|
103
|
+
super hsh2
|
104
|
+
end
|
105
|
+
|
106
|
+
def shift
|
107
|
+
key = @order.first
|
108
|
+
key ? [key,delete(key)] : super
|
109
|
+
end
|
110
|
+
|
111
|
+
def to_a
|
112
|
+
ary = []
|
113
|
+
each { |k,v| ary << [k,v] }
|
114
|
+
ary
|
115
|
+
end
|
116
|
+
|
117
|
+
def to_s
|
118
|
+
to_a.to_s
|
119
|
+
end
|
120
|
+
|
121
|
+
def update ( hsh2 )
|
122
|
+
hsh2.each { |k,v| self[k] = v }
|
123
|
+
self
|
124
|
+
end
|
125
|
+
|
126
|
+
def merge! ( hsh2 )
|
127
|
+
hsh2.each { |k,v| self[k] = v }
|
128
|
+
self
|
129
|
+
end
|
130
|
+
|
131
|
+
def merge ( hsh2 )
|
132
|
+
self.dup.update(hsh2)
|
133
|
+
end
|
134
|
+
|
135
|
+
def select
|
136
|
+
ary = []
|
137
|
+
each { |k,v| ary << [k,v] if yield k,v }
|
138
|
+
ary
|
139
|
+
end
|
140
|
+
|
141
|
+
def ordered?
|
142
|
+
!@order.nil?
|
143
|
+
end
|
144
|
+
|
145
|
+
end # module OrderedHash_ext
|
146
|
+
|
147
|
+
|
148
|
+
class OHash < Hash
|
149
|
+
|
150
|
+
attr_accessor :order
|
151
|
+
|
152
|
+
alias :unordered_keys :keys
|
153
|
+
|
154
|
+
include OrderedHash_ext
|
155
|
+
|
156
|
+
def initialize ( *a )
|
157
|
+
@order = unordered_keys
|
158
|
+
super
|
159
|
+
end
|
160
|
+
|
161
|
+
def self.[] ( *args )
|
162
|
+
hsh = OHash.new
|
163
|
+
if Hash === args[0]
|
164
|
+
hsh.replace args[0]
|
165
|
+
elsif (args.size % 2) != 0
|
166
|
+
raise ArgumentError, "odd number of elements for Hash"
|
167
|
+
else
|
168
|
+
hsh[args.shift] = args.shift while args.size > 0
|
169
|
+
end
|
170
|
+
hsh
|
171
|
+
end
|
172
|
+
|
173
|
+
end # class OHash
|
174
|
+
|
175
|
+
|
176
|
+
class Hash
|
177
|
+
|
178
|
+
def ordered?
|
179
|
+
false
|
180
|
+
end
|
181
|
+
|
182
|
+
end # class Hash
|
183
|
+
|
184
|
+
|
185
|
+
test_section __FILE__ do
|
186
|
+
class OrderedHashTest < Test::Unit::TestCase
|
187
|
+
|
188
|
+
def check_ordered ( h, ref )
|
189
|
+
h.store(4,3)
|
190
|
+
h.store(2,3)
|
191
|
+
assert_equal(h.to_a, ref)
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_ordered
|
195
|
+
check_ordered(OHash.new, [[4, 3], [2, 3]])
|
196
|
+
end
|
197
|
+
|
198
|
+
def test_unorderd
|
199
|
+
check_ordered(Hash.new, [[2, 3], [4, 3]])
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_simply
|
203
|
+
# You can do simply
|
204
|
+
hsh = OHash.new
|
205
|
+
hsh['z'] = 1
|
206
|
+
hsh['a'] = 2
|
207
|
+
hsh['c'] = 3
|
208
|
+
assert_equal(hsh.keys, ['z','a','c'])
|
209
|
+
end
|
210
|
+
|
211
|
+
def test_preserve
|
212
|
+
# or using OrderedHash[] method
|
213
|
+
hsh = OHash['z', 1, 'a', 2, 'c', 3]
|
214
|
+
hsh2 = OHash['a', 2, 'z', 1, 'c', 3]
|
215
|
+
assert_equal(hsh.keys, ['z','a','c'])
|
216
|
+
assert_not_equal(hsh, hsh2)
|
217
|
+
end
|
218
|
+
|
219
|
+
def test_dont_preserve
|
220
|
+
# but this don't preserve order
|
221
|
+
hsh = OHash['z'=>1, 'a'=>2, 'c'=>3]
|
222
|
+
hsh2 = OHash['a'=>2, 'z'=>1, 'c'=>3]
|
223
|
+
assert_equal(hsh, hsh2)
|
224
|
+
end
|
225
|
+
|
226
|
+
def test_unorderd_empty
|
227
|
+
check_ordered({}, [[2, 3], [4, 3]])
|
228
|
+
end
|
229
|
+
|
230
|
+
def test_little_ordered
|
231
|
+
a = (0..11).to_a
|
232
|
+
h = OHash[*a]
|
233
|
+
assert_equal(h.to_s, a.to_s)
|
234
|
+
end
|
235
|
+
|
236
|
+
def test_big_ordered
|
237
|
+
a = (0..501).to_a
|
238
|
+
h = OHash[*a]
|
239
|
+
assert_equal(h.to_s, a.to_s)
|
240
|
+
end
|
241
|
+
|
242
|
+
def test_eql
|
243
|
+
assert_nothing_raised { OHash.new == {} }
|
244
|
+
assert_not_equal OHash.new, {}
|
245
|
+
assert_equal OHash.new, OHash.new
|
246
|
+
assert_equal OHash[1,2,3,4], OHash[1,2,3,4]
|
247
|
+
assert_not_equal OHash[1,2,3,4], OHash[3,4,1,2]
|
248
|
+
end
|
249
|
+
|
250
|
+
end # OrderedHashTest
|
251
|
+
|
252
|
+
end
|