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
data/src/drb_ex.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
|
2
|
+
# Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
|
3
|
+
# License:: Gnu General Public License.
|
4
|
+
# Revision:: $Id: drb_ex.rb 258 2005-06-01 00:22:51Z ertai $
|
5
|
+
|
6
|
+
require 'module/autoload_tree'
|
7
|
+
|
8
|
+
module DRb
|
9
|
+
|
10
|
+
autoloaded_module(__FILE__.sub(/drb_ex\.rb/, 'drb.rb'))
|
11
|
+
|
12
|
+
end # module Drb
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# Copyright: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
|
2
|
+
# Author: Nicolas Pouillard <ertai@lrde.epita.fr>.
|
3
|
+
# License: Gnu General Public License.
|
4
|
+
|
5
|
+
# $LastChangedBy: ertai $
|
6
|
+
# $Id: dumpable_proc.rb 266 2005-06-01 14:27:18Z ertai $
|
7
|
+
|
8
|
+
require 'ruby_ex'
|
9
|
+
require 'delegate'
|
10
|
+
|
11
|
+
class DumpableProc < DelegateClass(Proc)
|
12
|
+
|
13
|
+
def initialize ( str )
|
14
|
+
@str = str.freeze
|
15
|
+
super(eval("proc { #@str }"))
|
16
|
+
end
|
17
|
+
|
18
|
+
def _dump ( depth )
|
19
|
+
Marshal.dump([self.class, @str])
|
20
|
+
end
|
21
|
+
|
22
|
+
def self._load ( data )
|
23
|
+
klass, str = Marshal.load(data)
|
24
|
+
klass.new(str)
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_yaml ( opts={} )
|
28
|
+
"#{to_yaml_type} #@str"
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_s
|
32
|
+
@str
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_yaml_type
|
36
|
+
'!proc'
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
test_section __FILE__ do
|
42
|
+
|
43
|
+
class DumpableProcTest < Test::Unit::TestCase
|
44
|
+
|
45
|
+
def test_simple
|
46
|
+
p = DumpableProc.new('|x| 3 + x')
|
47
|
+
assert_equal(7, p[4])
|
48
|
+
str = nil
|
49
|
+
assert_nothing_raised { str = Marshal.dump(p) }
|
50
|
+
p2 = nil
|
51
|
+
assert_nothing_raised { p2 = Marshal.load(str) }
|
52
|
+
assert_equal(9, p2[6])
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
data/src/filetype.rb
ADDED
@@ -0,0 +1,229 @@
|
|
1
|
+
require 'ruby_ex'
|
2
|
+
require 'abstract'
|
3
|
+
|
4
|
+
module FileType
|
5
|
+
|
6
|
+
@@subclasses = []
|
7
|
+
|
8
|
+
def self.register ( klass )
|
9
|
+
@@subclasses << klass
|
10
|
+
end
|
11
|
+
|
12
|
+
class Generic
|
13
|
+
include Abstract
|
14
|
+
|
15
|
+
attr_reader :path, :base, :ext
|
16
|
+
|
17
|
+
def initialize ( path )
|
18
|
+
@path = Pathname.new(path)
|
19
|
+
re = self.class.extension
|
20
|
+
raise ArgumentError, "bad class #{self.class}" if re.nil?
|
21
|
+
unless @path.to_s =~ re
|
22
|
+
raise ArgumentError, "#{@path} do not match /#{re.source}/"
|
23
|
+
end
|
24
|
+
@base, @ext = $`, $&
|
25
|
+
if @ext.empty?
|
26
|
+
@base = self
|
27
|
+
else
|
28
|
+
@base = FileType.guess(@base)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def extsplit
|
33
|
+
[@base, @ext]
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.inherited ( klass )
|
37
|
+
FileType.register(klass)
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_s
|
41
|
+
@path.to_s
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.extension
|
45
|
+
const_get(:EXTENSION)
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.match_type ( path, max, best )
|
49
|
+
ext_re = self.extension
|
50
|
+
if path.to_s =~ ext_re and $&.size > max
|
51
|
+
return [$&.size, self]
|
52
|
+
end
|
53
|
+
return [max, best]
|
54
|
+
end
|
55
|
+
|
56
|
+
def + ( arg )
|
57
|
+
@path + arg.to_s
|
58
|
+
end
|
59
|
+
|
60
|
+
end # class Generic
|
61
|
+
|
62
|
+
class Unknown < Generic
|
63
|
+
include Concrete
|
64
|
+
EXTENSION = /(\.[^.\/]+)?$/
|
65
|
+
end # class Unknown
|
66
|
+
|
67
|
+
class ExtractError < Exception
|
68
|
+
end
|
69
|
+
|
70
|
+
module Extractable
|
71
|
+
|
72
|
+
def self.included ( aClass )
|
73
|
+
|
74
|
+
aClass.module_eval do
|
75
|
+
|
76
|
+
def mk_cmd
|
77
|
+
base, ext = @base.extsplit
|
78
|
+
@tmp = TempPath.new(base.path.basename, ext)
|
79
|
+
cmd = self.class.const_get(:EXTRACT_COMMAND).gsub(/%I/, @path.to_s)
|
80
|
+
cmd.gsub!(/%O/, @tmp.to_s)
|
81
|
+
cmd
|
82
|
+
end
|
83
|
+
|
84
|
+
def extract
|
85
|
+
cmd = mk_cmd
|
86
|
+
unless system(cmd)
|
87
|
+
@tmp.rmtree if @tmp.exist?
|
88
|
+
err = "
|
89
|
+
|Cannot extract a file:
|
90
|
+
| path: #{to_s}
|
91
|
+
| type: #{self.class}
|
92
|
+
| command: #{cmd}
|
93
|
+
| exit status: #{$? >> 8}
|
94
|
+
"
|
95
|
+
raise ExtractError, err.gsub(/^\s*|/, '')
|
96
|
+
end
|
97
|
+
FileType.guess(@tmp)
|
98
|
+
end
|
99
|
+
|
100
|
+
alias :default :extract
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
end # module Extractable
|
107
|
+
|
108
|
+
# FIXME Use the zlib if gzip not available.
|
109
|
+
class Gz < Generic
|
110
|
+
include Extractable
|
111
|
+
include Concrete
|
112
|
+
EXTENSION = /(\.(gz|z|Z)|-gz|-z|_z)$/
|
113
|
+
EXTRACT_COMMAND = 'gzip -d -c "%I" > "%O"'
|
114
|
+
end # class Gz
|
115
|
+
|
116
|
+
class Bz2 < Generic
|
117
|
+
include Extractable
|
118
|
+
include Concrete
|
119
|
+
EXTENSION = /\.(bz2|bz)$/
|
120
|
+
EXTRACT_COMMAND = 'bzip2 -d -c "%I" > "%O"'
|
121
|
+
end # class Bz2
|
122
|
+
|
123
|
+
class Zip < Generic
|
124
|
+
include Extractable
|
125
|
+
include Concrete
|
126
|
+
EXTENSION = /\.zip$/
|
127
|
+
EXTRACT_COMMAND = 'unzip -p "%I" > "%O"'
|
128
|
+
end # class Zip
|
129
|
+
|
130
|
+
module ExtractableDir
|
131
|
+
|
132
|
+
def self.included ( aClass )
|
133
|
+
|
134
|
+
aClass.module_eval do
|
135
|
+
|
136
|
+
include Extractable
|
137
|
+
|
138
|
+
alias :mk_cmd_extractable :mk_cmd
|
139
|
+
|
140
|
+
def mk_cmd
|
141
|
+
cmd = mk_cmd_extractable
|
142
|
+
@tmp.mkpath
|
143
|
+
@log = TempPath.new
|
144
|
+
cmd.gsub!(/%L/, @log.to_s)
|
145
|
+
end
|
146
|
+
|
147
|
+
alias :extract_extractable :extract
|
148
|
+
|
149
|
+
def extract
|
150
|
+
dir = extract_extractable
|
151
|
+
# We want the longest common path
|
152
|
+
longest = nil
|
153
|
+
@log.each_line do |line|
|
154
|
+
path = line.split(/\//)
|
155
|
+
longest = path if longest.nil?
|
156
|
+
longest &= path
|
157
|
+
raise CorruptedTarball, self if longest.empty?
|
158
|
+
end
|
159
|
+
dir.path + longest.join('/')
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
end # module ExtractableDir
|
167
|
+
|
168
|
+
class Tar < Generic
|
169
|
+
include ExtractableDir
|
170
|
+
include Concrete
|
171
|
+
EXTENSION = /\.tar$/
|
172
|
+
EXTRACT_COMMAND = 'tar xvf "%I" -C "%O" > "%L"'
|
173
|
+
end # class Tar
|
174
|
+
|
175
|
+
class TarGz < Generic
|
176
|
+
include ExtractableDir
|
177
|
+
include Concrete
|
178
|
+
EXTENSION = /\.(tar\.gz|tgz)$/
|
179
|
+
EXTRACT_COMMAND = 'tar xvzf "%I" -C "%O" > %L'
|
180
|
+
end # class TarGz
|
181
|
+
|
182
|
+
class TarBz2 < Generic
|
183
|
+
include ExtractableDir
|
184
|
+
include Concrete
|
185
|
+
EXTENSION = /\.(tar\.bz2|tbz2|tbz)$/
|
186
|
+
EXTRACT_COMMAND = 'bzip2 -c -d %I | tar xvf - -C "%O" > "%L"'
|
187
|
+
end # class TarBz2
|
188
|
+
|
189
|
+
class Directory < Generic
|
190
|
+
include Concrete
|
191
|
+
|
192
|
+
EXTENSION = /()$/
|
193
|
+
|
194
|
+
def self.match_type ( path, max, best )
|
195
|
+
if File.directory? path
|
196
|
+
return [path.to_s.size, self]
|
197
|
+
end
|
198
|
+
return [max, best]
|
199
|
+
end
|
200
|
+
|
201
|
+
end # class Directory
|
202
|
+
|
203
|
+
def self.guess_class ( path )
|
204
|
+
lazy_init
|
205
|
+
max = -1
|
206
|
+
best = Unknown
|
207
|
+
@@subclasses.each do |klass|
|
208
|
+
max, best = klass.match_type(path, max, best)
|
209
|
+
end
|
210
|
+
return best
|
211
|
+
end
|
212
|
+
|
213
|
+
def self.guess ( path )
|
214
|
+
guess_class(path).new(path)
|
215
|
+
end
|
216
|
+
|
217
|
+
def self.lazy_init
|
218
|
+
return if defined? @@init
|
219
|
+
@@init = true
|
220
|
+
@@subclasses.delete_if do |klass|
|
221
|
+
klass.abstract? or not (klass.is_a? Class) # and constants.include? klass)
|
222
|
+
end
|
223
|
+
@@subclasses.each do |klass|
|
224
|
+
ext = klass.extension
|
225
|
+
raise ArgumentError, "Bad extension #{ext}" unless ext.is_a? Regexp
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
end # module FileType
|
data/src/generate_id.rb
ADDED
@@ -0,0 +1,44 @@
|
|
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
|
+
# Revision:: $Id: generate_id.rb 266 2005-06-01 14:27:18Z ertai $
|
5
|
+
|
6
|
+
|
7
|
+
require 'ruby_ex'
|
8
|
+
require 'md5'
|
9
|
+
|
10
|
+
module Kernel
|
11
|
+
|
12
|
+
def generate_id(&already_exist)
|
13
|
+
md5 = Digest::MD5::new
|
14
|
+
id = ''
|
15
|
+
begin
|
16
|
+
md5.update(id)
|
17
|
+
md5.update(Time.now.to_s)
|
18
|
+
md5.update(rand.to_s)
|
19
|
+
md5.update($$.to_s)
|
20
|
+
md5.update($0)
|
21
|
+
id = md5.hexdigest[0,16]
|
22
|
+
end while block_given? and already_exist[id]
|
23
|
+
id
|
24
|
+
end
|
25
|
+
|
26
|
+
end # module Kernel
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
test_section __FILE__ do
|
31
|
+
class GenerateIdTest < Test::Unit::TestCase
|
32
|
+
def test_simple
|
33
|
+
tab = []
|
34
|
+
100.times { tab << generate_id }
|
35
|
+
assert_equal(tab.size, tab.uniq.size)
|
36
|
+
end
|
37
|
+
def test_simple
|
38
|
+
tab = []
|
39
|
+
bool = true
|
40
|
+
100.times { tab << generate_id { bool = !bool ; bool } }
|
41
|
+
assert_equal(tab.size, tab.uniq.size)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/src/histogram.rb
ADDED
@@ -0,0 +1,222 @@
|
|
1
|
+
# Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
|
2
|
+
# Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
|
3
|
+
# License:: Gnu General Public License.
|
4
|
+
# Revision:: $Id: histogram.rb 266 2005-06-01 14:27:18Z ertai $
|
5
|
+
|
6
|
+
require 'ruby_ex'
|
7
|
+
|
8
|
+
class Histogram
|
9
|
+
|
10
|
+
class EquivalenceClass
|
11
|
+
|
12
|
+
attr_reader :values, :id
|
13
|
+
|
14
|
+
def initialize ( id, *values )
|
15
|
+
@id = id
|
16
|
+
@values = values.flatten
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def include? ( anObject )
|
21
|
+
if @values.empty?
|
22
|
+
raise "You cannot call #{self.class}#include? with an empty class"
|
23
|
+
end
|
24
|
+
anObject == @values.first
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def each ( &block )
|
29
|
+
@values.each(&block)
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def << ( anObject )
|
34
|
+
@values << anObject
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
def size
|
39
|
+
@values.size
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
alias :count :size
|
44
|
+
|
45
|
+
end # class EquivalenceClass
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
# Here the enumearation is something which respond to each.
|
50
|
+
def initialize ( enum=nil )
|
51
|
+
@hist = []
|
52
|
+
enum.each { |x| self << x } unless enum.nil?
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
# Returns an array with size of each equivalence class.
|
57
|
+
def support
|
58
|
+
@hist.map { |equivalence_class| equivalence_class.size }
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
# Returns apparation frequences as an array which is the @support@
|
63
|
+
# divided by the amount of samples.
|
64
|
+
def frequences
|
65
|
+
sup = support
|
66
|
+
total = sup.sum
|
67
|
+
sup.map { |x| x.to_f / total }
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
def total
|
72
|
+
support.sum
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
def equivalence_class_of ( anObject )
|
77
|
+
@hist.each do |anEquivalenceClass|
|
78
|
+
return anEquivalenceClass if anEquivalenceClass.include? anObject
|
79
|
+
end
|
80
|
+
return nil
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
def equivalence_class_by_index ( anInteger )
|
85
|
+
@hist[anInteger]
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
def << ( anObject )
|
90
|
+
anEquivalenceClass = equivalence_class_of anObject
|
91
|
+
if anEquivalenceClass.nil?
|
92
|
+
@hist << EquivalenceClass.new(@hist.size, anObject)
|
93
|
+
else
|
94
|
+
anEquivalenceClass << anObject
|
95
|
+
end
|
96
|
+
self
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
def [] ( anObject )
|
101
|
+
anEquivalenceClass = equivalence_class_of(anObject)
|
102
|
+
(anEquivalenceClass)? anEquivalenceClass.size : 0
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
def each ( &block )
|
107
|
+
@hist.each(&block)
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
def size
|
112
|
+
@hist.size
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
def to_a
|
117
|
+
@hist.dup
|
118
|
+
end
|
119
|
+
|
120
|
+
end # class Histogram
|
121
|
+
|
122
|
+
|
123
|
+
|
124
|
+
test_section __FILE__ do
|
125
|
+
require 'delegate'
|
126
|
+
require 'generator'
|
127
|
+
|
128
|
+
class HistogramTest < Test::Unit::TestCase
|
129
|
+
|
130
|
+
class Z_10Z_Integer < DelegateClass(Integer)
|
131
|
+
def == ( rhs )
|
132
|
+
to_i % 10 == rhs % 10
|
133
|
+
end
|
134
|
+
def succ
|
135
|
+
self.class.new(super)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def setup
|
140
|
+
@_1, @_42 = Z_10Z_Integer.new(1), Z_10Z_Integer.new(42)
|
141
|
+
@r = @_1 .. @_42
|
142
|
+
mk_hist(@r)
|
143
|
+
@support = [5, 5, 4, 4, 4, 4, 4, 4, 4, 4]
|
144
|
+
end
|
145
|
+
|
146
|
+
def mk_hist ( enum=nil, &block )
|
147
|
+
assert_nothing_raised { @h = Histogram.new(enum, &block) }
|
148
|
+
@h
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_init_via_enum
|
152
|
+
assert_equal(1, mk_hist([0] * 10).size)
|
153
|
+
assert_equal(10, @h[0])
|
154
|
+
assert_equal(0, @h[1])
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_uniform_range
|
158
|
+
assert_equal(11, mk_hist(0 .. 10).size)
|
159
|
+
(0 .. 10).each { |i| assert_equal(1, @h[i]) }
|
160
|
+
assert_equal(0, @h[11])
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_a_large_uniform_range
|
164
|
+
enum = (0 .. 10).to_a * 10
|
165
|
+
mk_hist(enum)
|
166
|
+
assert_equal(0, @h[11])
|
167
|
+
enum.each { |i| assert_equal(10, @h[i]) }
|
168
|
+
assert_equal(0, @h[11])
|
169
|
+
end
|
170
|
+
|
171
|
+
def test_push # <<
|
172
|
+
assert_nothing_raised { @h << 12 }
|
173
|
+
assert_equal(5, @h[11])
|
174
|
+
assert_equal(6, @h[12])
|
175
|
+
@h << 11 << 12 << 22
|
176
|
+
assert_equal(4, @h[10])
|
177
|
+
assert_equal(6, @h[11])
|
178
|
+
assert_equal(8, @h[12])
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_hooks # []
|
182
|
+
@h << 42
|
183
|
+
assert_kind_of(Integer, @h[42])
|
184
|
+
assert_equal(6, @h[42])
|
185
|
+
end
|
186
|
+
|
187
|
+
def test_each
|
188
|
+
g1 = Generator.new([5, 5, 4, 4, 4, 4, 4, 4, 4, 4])
|
189
|
+
g2 = Generator.new(@r)
|
190
|
+
@h.each do |equivalence_class|
|
191
|
+
assert_equal(x = g1.next, equivalence_class.size)
|
192
|
+
assert_equal(x, equivalence_class.values.size)
|
193
|
+
assert_equal(g2.next, equivalence_class.values.first)
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_equivalence_class_of
|
198
|
+
assert_kind_of(Histogram::EquivalenceClass, @h.equivalence_class_of(42))
|
199
|
+
assert_equal([10, 20, 30, 40], @h.equivalence_class_of(0).values)
|
200
|
+
assert_equal([2, 12, 22, 32, 42], @h.equivalence_class_of(12).values)
|
201
|
+
assert_equal(5, @h[42])
|
202
|
+
end
|
203
|
+
|
204
|
+
def test_size
|
205
|
+
assert_equal(10, @h.size)
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_support
|
209
|
+
assert_equal(@support, @h.support)
|
210
|
+
end
|
211
|
+
|
212
|
+
def test_total
|
213
|
+
assert_equal(42, @h.total)
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_frequences
|
217
|
+
assert_equal(@support, @h.frequences.map { |x| x * 42 })
|
218
|
+
end
|
219
|
+
|
220
|
+
end # class HistogramTest
|
221
|
+
|
222
|
+
end
|