cairo 1.8.5 → 1.10.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of cairo might be problematic. Click here for more details.
- data/NEWS +2 -2
- data/Rakefile +44 -7
- data/ext/cairo/cairo.def +28 -1
- data/ext/cairo/extconf.rb +14 -16
- data/ext/cairo/rb_cairo.c +4 -1
- data/ext/cairo/rb_cairo.h +65 -1
- data/ext/cairo/rb_cairo_constants.c +150 -3
- data/ext/cairo/rb_cairo_context.c +17 -0
- data/ext/cairo/rb_cairo_device.c +406 -0
- data/ext/cairo/rb_cairo_exception.c +83 -32
- data/ext/cairo/rb_cairo_io.c +166 -0
- data/ext/cairo/rb_cairo_io.h +44 -0
- data/ext/cairo/rb_cairo_matrix.c +1 -1
- data/ext/cairo/rb_cairo_private.h +3 -0
- data/ext/cairo/rb_cairo_region.c +385 -0
- data/ext/cairo/rb_cairo_surface.c +674 -199
- data/samples/blur.rb +2 -3
- data/samples/{pac2.rb → pac-nomralize.rb} +5 -6
- data/samples/pac-tee.rb +170 -0
- data/samples/pac.rb +2 -3
- data/samples/png.rb +2 -3
- data/samples/scalable.rb +2 -3
- data/samples/text-on-path.rb +2 -3
- data/samples/text2.rb +2 -3
- data/test/cairo-test-utils.rb +15 -0
- data/test/run-test.rb +5 -4
- data/test/test_context.rb +4 -4
- data/test/test_font_face.rb +34 -21
- data/test/test_recording_surface.rb +18 -0
- data/test/test_region.rb +102 -0
- data/test/test_script_device.rb +46 -0
- data/test/test_script_surface.rb +13 -0
- data/test/test_surface.rb +14 -4
- data/test/test_tee_surface.rb +32 -0
- data/test/test_xml_device.rb +22 -0
- data/test/test_xml_surface.rb +32 -0
- metadata +49 -77
- data/pkg-config.rb +0 -313
- data/test-unit/Rakefile +0 -30
- data/test-unit/bin/testrb +0 -5
- data/test-unit/lib/test/unit.rb +0 -280
- data/test-unit/lib/test/unit/assertionfailederror.rb +0 -14
- data/test-unit/lib/test/unit/assertions.rb +0 -722
- data/test-unit/lib/test/unit/attribute.rb +0 -125
- data/test-unit/lib/test/unit/autorunner.rb +0 -254
- data/test-unit/lib/test/unit/collector.rb +0 -43
- data/test-unit/lib/test/unit/collector/descendant.rb +0 -23
- data/test-unit/lib/test/unit/collector/dir.rb +0 -108
- data/test-unit/lib/test/unit/collector/load.rb +0 -135
- data/test-unit/lib/test/unit/collector/objectspace.rb +0 -34
- data/test-unit/lib/test/unit/color.rb +0 -61
- data/test-unit/lib/test/unit/diff.rb +0 -524
- data/test-unit/lib/test/unit/error.rb +0 -124
- data/test-unit/lib/test/unit/exceptionhandler.rb +0 -39
- data/test-unit/lib/test/unit/failure.rb +0 -110
- data/test-unit/lib/test/unit/fixture.rb +0 -185
- data/test-unit/lib/test/unit/notification.rb +0 -125
- data/test-unit/lib/test/unit/omission.rb +0 -143
- data/test-unit/lib/test/unit/pending.rb +0 -146
- data/test-unit/lib/test/unit/priority.rb +0 -146
- data/test-unit/lib/test/unit/runner/console.rb +0 -46
- data/test-unit/lib/test/unit/runner/emacs.rb +0 -8
- data/test-unit/lib/test/unit/testcase.rb +0 -281
- data/test-unit/lib/test/unit/testresult.rb +0 -89
- data/test-unit/lib/test/unit/testsuite.rb +0 -110
- data/test-unit/lib/test/unit/ui/console/outputlevel.rb +0 -14
- data/test-unit/lib/test/unit/ui/console/testrunner.rb +0 -195
- data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +0 -49
- data/test-unit/lib/test/unit/ui/testrunner.rb +0 -20
- data/test-unit/lib/test/unit/ui/testrunnermediator.rb +0 -77
- data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +0 -41
- data/test-unit/lib/test/unit/util/backtracefilter.rb +0 -41
- data/test-unit/lib/test/unit/util/observable.rb +0 -90
- data/test-unit/lib/test/unit/util/procwrapper.rb +0 -48
- data/test-unit/lib/test/unit/version.rb +0 -7
- data/test-unit/sample/adder.rb +0 -13
- data/test-unit/sample/subtracter.rb +0 -12
- data/test-unit/sample/tc_adder.rb +0 -18
- data/test-unit/sample/tc_subtracter.rb +0 -18
- data/test-unit/sample/ts_examples.rb +0 -7
- data/test-unit/test/collector/test_descendant.rb +0 -135
- data/test-unit/test/collector/test_dir.rb +0 -406
- data/test-unit/test/collector/test_load.rb +0 -333
- data/test-unit/test/collector/test_objectspace.rb +0 -98
- data/test-unit/test/run-test.rb +0 -13
- data/test-unit/test/test_assertions.rb +0 -693
- data/test-unit/test/test_attribute.rb +0 -86
- data/test-unit/test/test_color.rb +0 -37
- data/test-unit/test/test_diff.rb +0 -477
- data/test-unit/test/test_emacs_runner.rb +0 -60
- data/test-unit/test/test_error.rb +0 -26
- data/test-unit/test/test_failure.rb +0 -33
- data/test-unit/test/test_fixture.rb +0 -252
- data/test-unit/test/test_notification.rb +0 -33
- data/test-unit/test/test_omission.rb +0 -81
- data/test-unit/test/test_pending.rb +0 -70
- data/test-unit/test/test_priority.rb +0 -89
- data/test-unit/test/test_testcase.rb +0 -430
- data/test-unit/test/test_testresult.rb +0 -113
- data/test-unit/test/test_testsuite.rb +0 -129
- data/test-unit/test/testunit_test_util.rb +0 -14
- data/test-unit/test/ui/test_testrunmediator.rb +0 -20
- data/test-unit/test/util/test_backtracefilter.rb +0 -41
- data/test-unit/test/util/test_observable.rb +0 -102
- data/test-unit/test/util/test_procwrapper.rb +0 -36
- data/test/test_pkg_config.rb +0 -123
@@ -1,125 +0,0 @@
|
|
1
|
-
module Test
|
2
|
-
module Unit
|
3
|
-
module Attribute
|
4
|
-
class << self
|
5
|
-
def included(base)
|
6
|
-
base.extend(BaseClassMethods)
|
7
|
-
base.extend(ClassMethods)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
module BaseClassMethods
|
12
|
-
def attributes_table
|
13
|
-
{}
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
module ClassMethods
|
18
|
-
def method_added(name)
|
19
|
-
super
|
20
|
-
return unless defined?(@current_attributes)
|
21
|
-
|
22
|
-
attributes = {}
|
23
|
-
kept_attributes = {}
|
24
|
-
@current_attributes.each do |attribute_name, attribute|
|
25
|
-
attributes[attribute_name] = attribute[:value]
|
26
|
-
kept_attributes[attribute_name] = attribute if attribute[:keep]
|
27
|
-
end
|
28
|
-
set_attributes(name, attributes)
|
29
|
-
@current_attributes = kept_attributes
|
30
|
-
end
|
31
|
-
|
32
|
-
def attribute(name, value, options={}, *method_names)
|
33
|
-
unless options.is_a?(Hash)
|
34
|
-
method_names << options
|
35
|
-
options = {}
|
36
|
-
end
|
37
|
-
@current_attributes ||= {}
|
38
|
-
if method_names.empty?
|
39
|
-
@current_attributes[name] = options.merge(:value => value)
|
40
|
-
else
|
41
|
-
method_names.each do |method_name|
|
42
|
-
set_attributes(method_name, {name => value})
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def attributes_table
|
48
|
-
@attributes_table ||= {}
|
49
|
-
super.merge(@attributes_table)
|
50
|
-
end
|
51
|
-
|
52
|
-
def set_attributes(method_name, new_attributes)
|
53
|
-
return if new_attributes.empty?
|
54
|
-
method_name = normalize_method_name(method_name)
|
55
|
-
@attributes_table ||= {}
|
56
|
-
@attributes_table[method_name] ||= {}
|
57
|
-
current_attributes = @attributes_table[method_name]
|
58
|
-
new_attributes.each do |key, value|
|
59
|
-
key = normalize_attribute_name(key)
|
60
|
-
observers = attribute_observers(key) || []
|
61
|
-
observers.each do |observer|
|
62
|
-
observer.call(self,
|
63
|
-
key,
|
64
|
-
(attributes(method_name) || {})[key],
|
65
|
-
value,
|
66
|
-
method_name)
|
67
|
-
end
|
68
|
-
current_attributes[key] = value
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def attributes(method_name)
|
73
|
-
method_name = normalize_method_name(method_name)
|
74
|
-
attributes = attributes_table[method_name]
|
75
|
-
ancestors[1..-1].each do |ancestor|
|
76
|
-
if ancestor.is_a?(Class) and ancestor < Test::Unit::Attribute
|
77
|
-
parent_attributes = ancestor.attributes(method_name)
|
78
|
-
if attributes
|
79
|
-
attributes = (parent_attributes || {}).merge(attributes)
|
80
|
-
else
|
81
|
-
attributes = parent_attributes
|
82
|
-
end
|
83
|
-
break
|
84
|
-
end
|
85
|
-
end
|
86
|
-
attributes
|
87
|
-
end
|
88
|
-
|
89
|
-
def get_attribute(method_name, attribute_name)
|
90
|
-
attribute_name = normalize_attribute_name(attribute_name)
|
91
|
-
(attributes(method_name) || {})[attribute_name]
|
92
|
-
end
|
93
|
-
|
94
|
-
@@attribute_observers = {}
|
95
|
-
def register_attribute_observer(attribute_name, observer=Proc.new)
|
96
|
-
attribute_name = normalize_attribute_name(attribute_name)
|
97
|
-
@@attribute_observers[attribute_name] ||= []
|
98
|
-
@@attribute_observers[attribute_name] << observer
|
99
|
-
end
|
100
|
-
|
101
|
-
def attribute_observers(attribute_name)
|
102
|
-
attribute_name = normalize_attribute_name(attribute_name)
|
103
|
-
@@attribute_observers[attribute_name]
|
104
|
-
end
|
105
|
-
|
106
|
-
private
|
107
|
-
def normalize_attribute_name(name)
|
108
|
-
name.to_s
|
109
|
-
end
|
110
|
-
|
111
|
-
def normalize_method_name(name)
|
112
|
-
name.to_s
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
def attributes
|
117
|
-
self.class.attributes(@method_name) || {}
|
118
|
-
end
|
119
|
-
|
120
|
-
def [](name)
|
121
|
-
self.class.get_attribute(@method_name, name)
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
@@ -1,254 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'optparse'
|
3
|
-
|
4
|
-
module Test
|
5
|
-
module Unit
|
6
|
-
class AutoRunner
|
7
|
-
RUNNERS = {}
|
8
|
-
COLLECTORS = {}
|
9
|
-
ADDITIONAL_OPTIONS = []
|
10
|
-
|
11
|
-
class << self
|
12
|
-
def register_runner(id, runner_builder=Proc.new)
|
13
|
-
RUNNERS[id] = runner_builder
|
14
|
-
end
|
15
|
-
|
16
|
-
def register_collector(id, collector_builder=Proc.new)
|
17
|
-
COLLECTORS[id] = collector_builder
|
18
|
-
end
|
19
|
-
|
20
|
-
def setup_option(option_builder=Proc.new)
|
21
|
-
ADDITIONAL_OPTIONS << option_builder
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.run(force_standalone=false, default_dir=nil, argv=ARGV, &block)
|
26
|
-
r = new(force_standalone || standalone?, &block)
|
27
|
-
r.base = default_dir
|
28
|
-
r.process_args(argv)
|
29
|
-
r.run
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.standalone?
|
33
|
-
return false unless("-e" == $0)
|
34
|
-
ObjectSpace.each_object(Class) do |klass|
|
35
|
-
return false if(klass < TestCase)
|
36
|
-
end
|
37
|
-
true
|
38
|
-
end
|
39
|
-
|
40
|
-
register_collector(:descendant) do |auto_runner|
|
41
|
-
require 'test/unit/collector/descendant'
|
42
|
-
collector = Collector::Descendant.new
|
43
|
-
collector.filter = auto_runner.filters
|
44
|
-
collector.collect($0.sub(/\.rb\Z/, ''))
|
45
|
-
end
|
46
|
-
|
47
|
-
register_collector(:load) do |auto_runner|
|
48
|
-
require 'test/unit/collector/load'
|
49
|
-
collector = Collector::Load.new
|
50
|
-
collector.patterns.concat(auto_runner.pattern) if auto_runner.pattern
|
51
|
-
collector.excludes.concat(auto_runner.exclude) if auto_runner.exclude
|
52
|
-
collector.base = auto_runner.base
|
53
|
-
collector.filter = auto_runner.filters
|
54
|
-
collector.collect(*auto_runner.to_run)
|
55
|
-
end
|
56
|
-
|
57
|
-
# deprecated
|
58
|
-
register_collector(:object_space) do |auto_runner|
|
59
|
-
require 'test/unit/collector/objectspace'
|
60
|
-
c = Collector::ObjectSpace.new
|
61
|
-
c.filter = auto_runner.filters
|
62
|
-
c.collect($0.sub(/\.rb\Z/, ''))
|
63
|
-
end
|
64
|
-
|
65
|
-
# deprecated
|
66
|
-
register_collector(:dir) do |auto_runner|
|
67
|
-
require 'test/unit/collector/dir'
|
68
|
-
c = Collector::Dir.new
|
69
|
-
c.filter = auto_runner.filters
|
70
|
-
c.pattern.concat(auto_runner.pattern) if auto_runner.pattern
|
71
|
-
c.exclude.concat(auto_runner.exclude) if auto_runner.exclude
|
72
|
-
c.base = auto_runner.base
|
73
|
-
$:.push(auto_runner.base) if auto_runner.base
|
74
|
-
c.collect(*(auto_runner.to_run.empty? ? ['.'] : auto_runner.to_run))
|
75
|
-
end
|
76
|
-
|
77
|
-
attr_reader :suite, :runner_options
|
78
|
-
attr_accessor :filters, :to_run, :pattern, :exclude, :base, :workdir
|
79
|
-
attr_writer :runner, :collector
|
80
|
-
|
81
|
-
def initialize(standalone)
|
82
|
-
Unit.run = true
|
83
|
-
@standalone = standalone
|
84
|
-
@runner = default_runner
|
85
|
-
@collector = default_collector
|
86
|
-
@filters = []
|
87
|
-
@to_run = []
|
88
|
-
@runner_options = {}
|
89
|
-
@workdir = nil
|
90
|
-
yield(self) if block_given?
|
91
|
-
end
|
92
|
-
|
93
|
-
def process_args(args = ARGV)
|
94
|
-
begin
|
95
|
-
options.order!(args) {|arg| @to_run << arg}
|
96
|
-
rescue OptionParser::ParseError => e
|
97
|
-
puts e
|
98
|
-
puts options
|
99
|
-
$! = nil
|
100
|
-
abort
|
101
|
-
else
|
102
|
-
@filters << proc{false} unless(@filters.empty?)
|
103
|
-
end
|
104
|
-
not @to_run.empty?
|
105
|
-
end
|
106
|
-
|
107
|
-
def options
|
108
|
-
@options ||= OptionParser.new do |o|
|
109
|
-
o.banner = "Test::Unit automatic runner."
|
110
|
-
o.banner << "\nUsage: #{$0} [options] [-- untouched arguments]"
|
111
|
-
|
112
|
-
o.on
|
113
|
-
o.on('-r', '--runner=RUNNER', RUNNERS,
|
114
|
-
"Use the given RUNNER.",
|
115
|
-
"(" + keyword_display(RUNNERS) + ")") do |r|
|
116
|
-
@runner = r
|
117
|
-
end
|
118
|
-
|
119
|
-
if(@standalone)
|
120
|
-
o.on('-b', '--basedir=DIR', "Base directory of test suites.") do |b|
|
121
|
-
@base = b
|
122
|
-
end
|
123
|
-
|
124
|
-
o.on('-w', '--workdir=DIR', "Working directory to run tests.") do |w|
|
125
|
-
@workdir = w
|
126
|
-
end
|
127
|
-
|
128
|
-
o.on('-a', '--add=TORUN', Array,
|
129
|
-
"Add TORUN to the list of things to run;",
|
130
|
-
"can be a file or a directory.") do |a|
|
131
|
-
@to_run.concat(a)
|
132
|
-
end
|
133
|
-
|
134
|
-
@pattern = []
|
135
|
-
o.on('-p', '--pattern=PATTERN', Regexp,
|
136
|
-
"Match files to collect against PATTERN.") do |e|
|
137
|
-
@pattern << e
|
138
|
-
end
|
139
|
-
|
140
|
-
@exclude = []
|
141
|
-
o.on('-x', '--exclude=PATTERN', Regexp,
|
142
|
-
"Ignore files to collect against PATTERN.") do |e|
|
143
|
-
@exclude << e
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
o.on('-n', '--name=NAME', String,
|
148
|
-
"Runs tests matching NAME.",
|
149
|
-
"(patterns may be used).") do |n|
|
150
|
-
n = (%r{\A/(.*)/\Z} =~ n ? Regexp.new($1) : n)
|
151
|
-
case n
|
152
|
-
when Regexp
|
153
|
-
@filters << proc{|t| n =~ t.method_name ? true : nil}
|
154
|
-
else
|
155
|
-
@filters << proc{|t| n == t.method_name ? true : nil}
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
o.on('-t', '--testcase=TESTCASE', String,
|
160
|
-
"Runs tests in TestCases matching TESTCASE.",
|
161
|
-
"(patterns may be used).") do |n|
|
162
|
-
n = (%r{\A/(.*)/\Z} =~ n ? Regexp.new($1) : n)
|
163
|
-
case n
|
164
|
-
when Regexp
|
165
|
-
@filters << proc{|t| n =~ t.class.name ? true : nil}
|
166
|
-
else
|
167
|
-
@filters << proc{|t| n == t.class.name ? true : nil}
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
priority_filter = Proc.new do |test|
|
172
|
-
if @filters.size > 2
|
173
|
-
nil
|
174
|
-
else
|
175
|
-
Priority::Checker.new(test).need_to_run? or nil
|
176
|
-
end
|
177
|
-
end
|
178
|
-
o.on("--[no-]priority-mode",
|
179
|
-
"Runs some tests based on their priority.") do |priority_mode|
|
180
|
-
if priority_mode
|
181
|
-
@filters |= [priority_filter]
|
182
|
-
else
|
183
|
-
@filters -= [priority_filter]
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
o.on('-I', "--load-path=DIR[#{File::PATH_SEPARATOR}DIR...]",
|
188
|
-
"Appends directory list to $LOAD_PATH.") do |dirs|
|
189
|
-
$LOAD_PATH.concat(dirs.split(File::PATH_SEPARATOR))
|
190
|
-
end
|
191
|
-
|
192
|
-
ADDITIONAL_OPTIONS.each do |option_builder|
|
193
|
-
option_builder.call(self, o)
|
194
|
-
end
|
195
|
-
|
196
|
-
o.on('--',
|
197
|
-
"Stop processing options so that the",
|
198
|
-
"remaining options will be passed to the",
|
199
|
-
"test."){o.terminate}
|
200
|
-
|
201
|
-
o.on('-h', '--help', 'Display this help.'){puts o; exit}
|
202
|
-
|
203
|
-
o.on_tail
|
204
|
-
o.on_tail('Deprecated options:')
|
205
|
-
|
206
|
-
o.on_tail('--console', 'Console runner (use --runner).') do
|
207
|
-
warn("Deprecated option (--console).")
|
208
|
-
@runner = RUNNERS[:console]
|
209
|
-
end
|
210
|
-
|
211
|
-
if RUNNERS[:fox]
|
212
|
-
o.on_tail('--fox', 'Fox runner (use --runner).') do
|
213
|
-
warn("Deprecated option (--fox).")
|
214
|
-
@runner = RUNNERS[:fox]
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
|
-
o.on_tail
|
219
|
-
end
|
220
|
-
end
|
221
|
-
|
222
|
-
def keyword_display(array)
|
223
|
-
list = array.collect {|e, *| e.to_s}
|
224
|
-
Array === array or list.sort!
|
225
|
-
list.collect {|e| e.sub(/^(.)([A-Za-z]+)(?=\w*$)/, '\\1[\\2]')}.join(", ")
|
226
|
-
end
|
227
|
-
|
228
|
-
def run
|
229
|
-
suite = @collector[self]
|
230
|
-
return false if suite.nil?
|
231
|
-
runner = @runner[self]
|
232
|
-
return false if runner.nil?
|
233
|
-
Dir.chdir(@workdir) if @workdir
|
234
|
-
runner.run(suite, @runner_options).passed?
|
235
|
-
end
|
236
|
-
|
237
|
-
private
|
238
|
-
def default_runner
|
239
|
-
if ENV["EMACS"] == "t"
|
240
|
-
RUNNERS[:emacs]
|
241
|
-
else
|
242
|
-
RUNNERS[:console]
|
243
|
-
end
|
244
|
-
end
|
245
|
-
|
246
|
-
def default_collector
|
247
|
-
COLLECTORS[@standalone ? :load : :descendant]
|
248
|
-
end
|
249
|
-
end
|
250
|
-
end
|
251
|
-
end
|
252
|
-
|
253
|
-
require 'test/unit/runner/console'
|
254
|
-
require 'test/unit/runner/emacs'
|
@@ -1,43 +0,0 @@
|
|
1
|
-
module Test
|
2
|
-
module Unit
|
3
|
-
module Collector
|
4
|
-
def initialize
|
5
|
-
@filters = []
|
6
|
-
end
|
7
|
-
|
8
|
-
def filter=(filters)
|
9
|
-
@filters = case(filters)
|
10
|
-
when Proc
|
11
|
-
[filters]
|
12
|
-
when Array
|
13
|
-
filters
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def add_suite(destination, suite)
|
18
|
-
to_delete = suite.tests.find_all{|t| !include?(t)}
|
19
|
-
to_delete.each{|t| suite.delete(t)}
|
20
|
-
destination << suite unless(suite.size == 0)
|
21
|
-
end
|
22
|
-
|
23
|
-
def include?(test)
|
24
|
-
return true if(@filters.empty?)
|
25
|
-
@filters.each do |filter|
|
26
|
-
result = filter[test]
|
27
|
-
if(result.nil?)
|
28
|
-
next
|
29
|
-
elsif(!result)
|
30
|
-
return false
|
31
|
-
else
|
32
|
-
return true
|
33
|
-
end
|
34
|
-
end
|
35
|
-
true
|
36
|
-
end
|
37
|
-
|
38
|
-
def sort(suites)
|
39
|
-
suites.sort_by{|s| s.name}
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'test/unit/collector'
|
2
|
-
|
3
|
-
module Test
|
4
|
-
module Unit
|
5
|
-
module Collector
|
6
|
-
class Descendant
|
7
|
-
include Collector
|
8
|
-
|
9
|
-
NAME = 'collected from the subclasses of TestCase'
|
10
|
-
|
11
|
-
def collect(name=NAME)
|
12
|
-
suite = TestSuite.new(name)
|
13
|
-
sub_suites = []
|
14
|
-
TestCase::DESCENDANTS.each do |descendant_test_case|
|
15
|
-
add_suite(sub_suites, descendant_test_case.suite)
|
16
|
-
end
|
17
|
-
sort(sub_suites).each {|s| suite << s}
|
18
|
-
suite
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,108 +0,0 @@
|
|
1
|
-
require 'test/unit/testsuite'
|
2
|
-
require 'test/unit/collector'
|
3
|
-
|
4
|
-
module Test
|
5
|
-
module Unit
|
6
|
-
module Collector
|
7
|
-
class Dir
|
8
|
-
include Collector
|
9
|
-
|
10
|
-
attr_reader :pattern, :exclude
|
11
|
-
attr_accessor :base
|
12
|
-
|
13
|
-
def initialize(dir=::Dir, file=::File, object_space=::ObjectSpace, req=nil)
|
14
|
-
super()
|
15
|
-
@dir = dir
|
16
|
-
@file = file
|
17
|
-
@object_space = object_space
|
18
|
-
@req = req
|
19
|
-
@pattern = [/\btest_.*\.rb\Z/m]
|
20
|
-
@exclude = []
|
21
|
-
@base = nil
|
22
|
-
end
|
23
|
-
|
24
|
-
def collect(*from)
|
25
|
-
basedir = @base
|
26
|
-
$:.push(basedir) if basedir
|
27
|
-
if(from.empty?)
|
28
|
-
recursive_collect('.', find_test_cases)
|
29
|
-
elsif(from.size == 1)
|
30
|
-
recursive_collect(from.first, find_test_cases)
|
31
|
-
else
|
32
|
-
suites = []
|
33
|
-
from.each do |f|
|
34
|
-
suite = recursive_collect(f, find_test_cases)
|
35
|
-
suites << suite unless(suite.tests.empty?)
|
36
|
-
end
|
37
|
-
suite = TestSuite.new("[#{from.join(', ')}]")
|
38
|
-
sort(suites).each{|s| suite << s}
|
39
|
-
suite
|
40
|
-
end
|
41
|
-
ensure
|
42
|
-
$:.delete_at($:.rindex(basedir)) if basedir
|
43
|
-
end
|
44
|
-
|
45
|
-
def find_test_cases(ignore=[])
|
46
|
-
cases = []
|
47
|
-
@object_space.each_object(Class) do |c|
|
48
|
-
cases << c if(c < TestCase && !ignore.include?(c))
|
49
|
-
end
|
50
|
-
ignore.concat(cases)
|
51
|
-
cases
|
52
|
-
end
|
53
|
-
|
54
|
-
def recursive_collect(name, already_gathered)
|
55
|
-
sub_suites = []
|
56
|
-
path = realdir(name)
|
57
|
-
if @file.directory?(path)
|
58
|
-
dir_name = name unless name == '.'
|
59
|
-
@dir.entries(path).each do |e|
|
60
|
-
next if(e == '.' || e == '..')
|
61
|
-
e_name = dir_name ? @file.join(dir_name, e) : e
|
62
|
-
if @file.directory?(realdir(e_name))
|
63
|
-
next if /\A(?:CVS|\.svn)\z/ =~ e
|
64
|
-
sub_suite = recursive_collect(e_name, already_gathered)
|
65
|
-
sub_suites << sub_suite unless(sub_suite.empty?)
|
66
|
-
else
|
67
|
-
next if /~\z/ =~ e_name or /\A\.\#/ =~ e
|
68
|
-
if @pattern and !@pattern.empty?
|
69
|
-
next unless @pattern.any? {|pat| pat =~ e_name}
|
70
|
-
end
|
71
|
-
if @exclude and !@exclude.empty?
|
72
|
-
next if @exclude.any? {|pat| pat =~ e_name}
|
73
|
-
end
|
74
|
-
collect_file(e_name, sub_suites, already_gathered)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
else
|
78
|
-
collect_file(name, sub_suites, already_gathered)
|
79
|
-
end
|
80
|
-
suite = TestSuite.new(@file.basename(name))
|
81
|
-
sort(sub_suites).each{|s| suite << s}
|
82
|
-
suite
|
83
|
-
end
|
84
|
-
|
85
|
-
def collect_file(name, suites, already_gathered)
|
86
|
-
dir = @file.dirname(@file.expand_path(name, @base))
|
87
|
-
$:.unshift(dir)
|
88
|
-
if(@req)
|
89
|
-
@req.require(name)
|
90
|
-
else
|
91
|
-
require(name)
|
92
|
-
end
|
93
|
-
find_test_cases(already_gathered).each{|t| add_suite(suites, t.suite)}
|
94
|
-
ensure
|
95
|
-
$:.delete_at($:.rindex(dir)) if(dir)
|
96
|
-
end
|
97
|
-
|
98
|
-
def realdir(path)
|
99
|
-
if @base
|
100
|
-
@file.join(@base, path)
|
101
|
-
else
|
102
|
-
path
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|