treetop 0.1.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (153) hide show
  1. data/README +3 -0
  2. data/Rakefile +35 -0
  3. data/bin/tt +25 -0
  4. data/lib/treetop.rb +10 -6
  5. data/lib/treetop/compiler.rb +7 -0
  6. data/lib/treetop/compiler/grammar_compiler.rb +21 -0
  7. data/lib/treetop/compiler/lexical_address_space.rb +17 -0
  8. data/lib/treetop/compiler/load_grammar.rb +7 -0
  9. data/lib/treetop/compiler/metagrammar.rb +2441 -0
  10. data/lib/treetop/compiler/metagrammar.treetop +384 -0
  11. data/lib/treetop/compiler/node_classes.rb +18 -0
  12. data/lib/treetop/compiler/node_classes/anything_symbol.rb +10 -0
  13. data/lib/treetop/compiler/node_classes/atomic_expression.rb +9 -0
  14. data/lib/treetop/compiler/node_classes/character_class.rb +10 -0
  15. data/lib/treetop/compiler/node_classes/choice.rb +31 -0
  16. data/lib/treetop/compiler/node_classes/declaration_sequence.rb +24 -0
  17. data/lib/treetop/compiler/node_classes/grammar.rb +28 -0
  18. data/lib/treetop/compiler/node_classes/inline_module.rb +27 -0
  19. data/lib/treetop/compiler/node_classes/nonterminal.rb +11 -0
  20. data/lib/treetop/compiler/node_classes/optional.rb +19 -0
  21. data/lib/treetop/compiler/node_classes/parenthesized_expression.rb +9 -0
  22. data/lib/treetop/compiler/node_classes/parsing_expression.rb +132 -0
  23. data/lib/treetop/compiler/node_classes/parsing_rule.rb +55 -0
  24. data/lib/treetop/compiler/node_classes/predicate.rb +45 -0
  25. data/lib/treetop/compiler/node_classes/repetition.rb +56 -0
  26. data/lib/treetop/compiler/node_classes/sequence.rb +64 -0
  27. data/lib/treetop/compiler/node_classes/terminal.rb +10 -0
  28. data/lib/treetop/compiler/node_classes/treetop_file.rb +9 -0
  29. data/lib/treetop/compiler/ruby_builder.rb +109 -0
  30. data/lib/treetop/ruby_extensions.rb +2 -0
  31. data/lib/treetop/ruby_extensions/string.rb +19 -0
  32. data/lib/treetop/runtime.rb +9 -0
  33. data/lib/treetop/runtime/compiled_parser.rb +66 -0
  34. data/lib/treetop/runtime/node_cache.rb +27 -0
  35. data/lib/treetop/runtime/parse_cache.rb +19 -0
  36. data/lib/treetop/runtime/parse_failure.rb +32 -0
  37. data/lib/treetop/runtime/parse_result.rb +30 -0
  38. data/lib/treetop/runtime/syntax_node.rb +53 -0
  39. data/lib/treetop/runtime/terminal_parse_failure.rb +33 -0
  40. data/lib/treetop/runtime/terminal_syntax_node.rb +12 -0
  41. data/test/compilation_target/target.rb +143 -0
  42. data/test/compilation_target/target.treetop +15 -0
  43. data/test/compilation_target/target_test.rb +56 -0
  44. data/test/compiler/and_predicate_test.rb +33 -0
  45. data/test/compiler/anything_symbol_test.rb +24 -0
  46. data/test/compiler/character_class_test.rb +45 -0
  47. data/test/compiler/choice_test.rb +49 -0
  48. data/test/compiler/circular_compilation_test.rb +20 -0
  49. data/test/compiler/failure_propagation_functional_test.rb +20 -0
  50. data/test/compiler/grammar_compiler_test.rb +58 -0
  51. data/test/compiler/grammar_test.rb +33 -0
  52. data/test/compiler/nonterminal_symbol_test.rb +15 -0
  53. data/test/compiler/not_predicate_test.rb +35 -0
  54. data/test/compiler/one_or_more_test.rb +30 -0
  55. data/test/compiler/optional_test.rb +32 -0
  56. data/test/compiler/parsing_rule_test.rb +30 -0
  57. data/test/compiler/sequence_test.rb +68 -0
  58. data/test/compiler/terminal_symbol_test.rb +35 -0
  59. data/test/compiler/test_grammar.treetop +7 -0
  60. data/test/compiler/zero_or_more_test.rb +51 -0
  61. data/test/composition/a.treetop +11 -0
  62. data/test/composition/b.treetop +11 -0
  63. data/test/composition/c.treetop +10 -0
  64. data/test/composition/d.treetop +10 -0
  65. data/test/composition/grammar_composition_test.rb +23 -0
  66. data/test/parser/syntax_node_test.rb +53 -0
  67. data/test/parser/terminal_parse_failure_test.rb +22 -0
  68. data/test/ruby_extensions/string_test.rb +33 -0
  69. data/test/screw/Rakefile +16 -0
  70. data/test/screw/unit.rb +37 -0
  71. data/test/screw/unit/assertion_failed_error.rb +14 -0
  72. data/test/screw/unit/assertions.rb +615 -0
  73. data/test/screw/unit/auto_runner.rb +227 -0
  74. data/test/screw/unit/collector.rb +45 -0
  75. data/test/screw/unit/collector/dir.rb +107 -0
  76. data/test/screw/unit/collector/objectspace.rb +28 -0
  77. data/test/screw/unit/error.rb +48 -0
  78. data/test/screw/unit/failure.rb +45 -0
  79. data/test/screw/unit/sugar.rb +25 -0
  80. data/test/screw/unit/test_case.rb +176 -0
  81. data/test/screw/unit/test_result.rb +73 -0
  82. data/test/screw/unit/test_suite.rb +70 -0
  83. data/test/screw/unit/ui.rb +4 -0
  84. data/test/screw/unit/ui/console/test_runner.rb +118 -0
  85. data/test/screw/unit/ui/fox/test_runner.rb +268 -0
  86. data/test/screw/unit/ui/gtk/test_runner.rb +416 -0
  87. data/test/screw/unit/ui/gtk2/testrunner.rb +465 -0
  88. data/test/screw/unit/ui/test_runner_mediator.rb +58 -0
  89. data/test/screw/unit/ui/test_runner_utilities.rb +46 -0
  90. data/test/screw/unit/ui/tk/test_runner.rb +260 -0
  91. data/test/screw/unit/util.rb +4 -0
  92. data/test/screw/unit/util/backtrace_filter.rb +40 -0
  93. data/test/screw/unit/util/observable.rb +82 -0
  94. data/test/screw/unit/util/proc_wrapper.rb +48 -0
  95. data/test/test_helper.rb +89 -0
  96. metadata +127 -69
  97. data/lib/treetop/api.rb +0 -3
  98. data/lib/treetop/api/load_grammar.rb +0 -16
  99. data/lib/treetop/api/malformed_grammar_exception.rb +0 -9
  100. data/lib/treetop/grammar.rb +0 -7
  101. data/lib/treetop/grammar/grammar.rb +0 -48
  102. data/lib/treetop/grammar/grammar_builder.rb +0 -35
  103. data/lib/treetop/grammar/parsing_expression_builder.rb +0 -5
  104. data/lib/treetop/grammar/parsing_expression_builder_helper.rb +0 -121
  105. data/lib/treetop/grammar/parsing_expressions.rb +0 -18
  106. data/lib/treetop/grammar/parsing_expressions/and_predicate.rb +0 -17
  107. data/lib/treetop/grammar/parsing_expressions/anything_symbol.rb +0 -20
  108. data/lib/treetop/grammar/parsing_expressions/character_class.rb +0 -24
  109. data/lib/treetop/grammar/parsing_expressions/node_instantiating_parsing_expression.rb +0 -14
  110. data/lib/treetop/grammar/parsing_expressions/node_propagating_parsing_expression.rb +0 -4
  111. data/lib/treetop/grammar/parsing_expressions/nonterminal_symbol.rb +0 -42
  112. data/lib/treetop/grammar/parsing_expressions/not_predicate.rb +0 -18
  113. data/lib/treetop/grammar/parsing_expressions/one_or_more.rb +0 -12
  114. data/lib/treetop/grammar/parsing_expressions/optional.rb +0 -14
  115. data/lib/treetop/grammar/parsing_expressions/ordered_choice.rb +0 -27
  116. data/lib/treetop/grammar/parsing_expressions/parsing_expression.rb +0 -36
  117. data/lib/treetop/grammar/parsing_expressions/predicate.rb +0 -25
  118. data/lib/treetop/grammar/parsing_expressions/repeating_parsing_expression.rb +0 -29
  119. data/lib/treetop/grammar/parsing_expressions/sequence.rb +0 -41
  120. data/lib/treetop/grammar/parsing_expressions/terminal_parsing_expression.rb +0 -11
  121. data/lib/treetop/grammar/parsing_expressions/terminal_symbol.rb +0 -31
  122. data/lib/treetop/grammar/parsing_expressions/zero_or_more.rb +0 -11
  123. data/lib/treetop/grammar/parsing_rule.rb +0 -10
  124. data/lib/treetop/metagrammar.rb +0 -2
  125. data/lib/treetop/metagrammar/metagrammar.rb +0 -14
  126. data/lib/treetop/metagrammar/metagrammar.treetop +0 -320
  127. data/lib/treetop/parser.rb +0 -11
  128. data/lib/treetop/parser/node_cache.rb +0 -25
  129. data/lib/treetop/parser/parse_cache.rb +0 -17
  130. data/lib/treetop/parser/parse_failure.rb +0 -22
  131. data/lib/treetop/parser/parse_result.rb +0 -26
  132. data/lib/treetop/parser/parser.rb +0 -24
  133. data/lib/treetop/parser/sequence_syntax_node.rb +0 -14
  134. data/lib/treetop/parser/syntax_node.rb +0 -31
  135. data/lib/treetop/parser/terminal_parse_failure.rb +0 -18
  136. data/lib/treetop/parser/terminal_syntax_node.rb +0 -7
  137. data/lib/treetop/protometagrammar.rb +0 -16
  138. data/lib/treetop/protometagrammar/anything_symbol_expression_builder.rb +0 -13
  139. data/lib/treetop/protometagrammar/block_expression_builder.rb +0 -17
  140. data/lib/treetop/protometagrammar/character_class_expression_builder.rb +0 -25
  141. data/lib/treetop/protometagrammar/grammar_expression_builder.rb +0 -38
  142. data/lib/treetop/protometagrammar/nonterminal_symbol_expression_builder.rb +0 -45
  143. data/lib/treetop/protometagrammar/ordered_choice_expression_builder.rb +0 -21
  144. data/lib/treetop/protometagrammar/parsing_rule_expression_builder.rb +0 -23
  145. data/lib/treetop/protometagrammar/parsing_rule_sequence_expression_builder.rb +0 -14
  146. data/lib/treetop/protometagrammar/prefix_expression_builder.rb +0 -25
  147. data/lib/treetop/protometagrammar/primary_expression_builder.rb +0 -71
  148. data/lib/treetop/protometagrammar/protometagrammar.rb +0 -25
  149. data/lib/treetop/protometagrammar/sequence_expression_builder.rb +0 -37
  150. data/lib/treetop/protometagrammar/suffix_expression_builder.rb +0 -33
  151. data/lib/treetop/protometagrammar/terminal_symbol_expression_builder.rb +0 -52
  152. data/lib/treetop/protometagrammar/trailing_block_expression_builder.rb +0 -30
  153. data/lib/treetop/ruby_extension.rb +0 -11
@@ -0,0 +1,227 @@
1
+ dir =
2
+ require 'optparse'
3
+
4
+ module Screw
5
+ module Unit
6
+ class AutoRunner
7
+ def self.run(force_standalone=false, default_dir=nil, argv=ARGV, &block)
8
+ r = new(force_standalone || standalone?, &block)
9
+ r.base = default_dir
10
+ r.process_args(argv)
11
+ r.run
12
+ end
13
+
14
+ def self.standalone?
15
+ return false unless("-e" == $0)
16
+ ObjectSpace.each_object(Class) do |klass|
17
+ return false if(klass < TestCase)
18
+ end
19
+ true
20
+ end
21
+
22
+ def self.require_runner(name)
23
+ require File.join(File.dirname(__FILE__), 'ui', name, 'test_runner')
24
+ end
25
+
26
+ def self.require_collector(name)
27
+ require File.join(File.dirname(__FILE__), 'collector', name)
28
+ end
29
+
30
+ RUNNERS = {
31
+ :console => proc do |r|
32
+ require_runner 'console'
33
+ Screw::Unit::UI::Console::TestRunner
34
+ end,
35
+ :gtk => proc do |r|
36
+ require_runner 'gtk'
37
+ Screw::Unit::UI::GTK::TestRunner
38
+ end,
39
+ :gtk2 => proc do |r|
40
+ require_runner 'gtk2'
41
+ Screw::Unit::UI::GTK2::TestRunner
42
+ end,
43
+ :fox => proc do |r|
44
+ require_runner 'fox'
45
+ Screw::Unit::UI::Fox::TestRunner
46
+ end,
47
+ :tk => proc do |r|
48
+ require_runner 'tk'
49
+ Screw::Unit::UI::Tk::TestRunner
50
+ end,
51
+ }
52
+
53
+ OUTPUT_LEVELS = [
54
+ [:silent, UI::SILENT],
55
+ [:progress, UI::PROGRESS_ONLY],
56
+ [:normal, UI::NORMAL],
57
+ [:verbose, UI::VERBOSE],
58
+ ]
59
+
60
+ COLLECTORS = {
61
+ :objectspace => proc do |r|
62
+ require_collector 'objectspace'
63
+ c = Collector::ObjectSpace.new
64
+ c.filter = r.filters
65
+ c.collect($0.sub(/\.rb\Z/, ''))
66
+ end,
67
+ :dir => proc do |r|
68
+ require_collector 'dir'
69
+ c = Collector::Dir.new
70
+ c.filter = r.filters
71
+ c.pattern.concat(r.pattern) if(r.pattern)
72
+ c.exclude.concat(r.exclude) if(r.exclude)
73
+ c.base = r.base
74
+ $:.push(r.base) if r.base
75
+ c.collect(*(r.to_run.empty? ? ['.'] : r.to_run))
76
+ end,
77
+ }
78
+
79
+ attr_reader :suite
80
+ attr_accessor :output_level, :filters, :to_run, :pattern, :exclude, :base, :workdir
81
+ attr_writer :runner, :collector
82
+
83
+ def initialize(standalone)
84
+ Unit.run = true
85
+ @standalone = standalone
86
+ @runner = RUNNERS[:console]
87
+ @collector = COLLECTORS[(standalone ? :dir : :objectspace)]
88
+ @filters = []
89
+ @to_run = []
90
+ @output_level = UI::NORMAL
91
+ @workdir = nil
92
+ yield(self) if(block_given?)
93
+ end
94
+
95
+ def process_args(args = ARGV)
96
+ begin
97
+ options.order!(args) {|arg| @to_run << arg}
98
+ rescue OptionRuntime::ParseError => e
99
+ puts e
100
+ puts options
101
+ $! = nil
102
+ abort
103
+ else
104
+ @filters << proc{false} unless(@filters.empty?)
105
+ end
106
+ not @to_run.empty?
107
+ end
108
+
109
+ def options
110
+ @options ||= OptionParser.new do |o|
111
+ o.banner = "Screw::Unit automatic runner."
112
+ o.banner << "\nUsage: #{$0} [options] [-- untouched arguments]"
113
+
114
+ o.on
115
+ o.on('-r', '--runner=RUNNER', RUNNERS,
116
+ "Use the given RUNNER.",
117
+ "(" + keyword_display(RUNNERS) + ")") do |r|
118
+ @runner = r
119
+ end
120
+
121
+ if(@standalone)
122
+ o.on('-b', '--basedir=DIR', "Base directory of test suites.") do |b|
123
+ @base = b
124
+ end
125
+
126
+ o.on('-w', '--workdir=DIR', "Working directory to run tests.") do |w|
127
+ @workdir = w
128
+ end
129
+
130
+ o.on('-a', '--add=TORUN', Array,
131
+ "Add TORUN to the list of things to run;",
132
+ "can be a file or a directory.") do |a|
133
+ @to_run.concat(a)
134
+ end
135
+
136
+ @pattern = []
137
+ o.on('-p', '--pattern=PATTERN', Regexp,
138
+ "Match files to collect against PATTERN.") do |e|
139
+ @pattern << e
140
+ end
141
+
142
+ @exclude = []
143
+ o.on('-x', '--exclude=PATTERN', Regexp,
144
+ "Ignore files to collect against PATTERN.") do |e|
145
+ @exclude << e
146
+ end
147
+ end
148
+
149
+ o.on('-n', '--name=NAME', String,
150
+ "Runs tests matching NAME.",
151
+ "(patterns may be used).") do |n|
152
+ n = (%r{\A/(.*)/\Z} =~ n ? Regexp.new($1) : n)
153
+ case n
154
+ when Regexp
155
+ @filters << proc{|t| n =~ t.method_name ? true : nil}
156
+ else
157
+ @filters << proc{|t| n == t.method_name ? true : nil}
158
+ end
159
+ end
160
+
161
+ o.on('-t', '--testcase=TESTCASE', String,
162
+ "Runs tests in TestCases matching TESTCASE.",
163
+ "(patterns may be used).") do |n|
164
+ n = (%r{\A/(.*)/\Z} =~ n ? Regexp.new($1) : n)
165
+ case n
166
+ when Regexp
167
+ @filters << proc{|t| n =~ t.class.name ? true : nil}
168
+ else
169
+ @filters << proc{|t| n == t.class.name ? true : nil}
170
+ end
171
+ end
172
+
173
+ o.on('-I', "--load-path=DIR[#{File::PATH_SEPARATOR}DIR...]",
174
+ "Appends directory list to $LOAD_PATH.") do |dirs|
175
+ $LOAD_PATH.concat(dirs.split(File::PATH_SEPARATOR))
176
+ end
177
+
178
+ o.on('-v', '--verbose=[LEVEL]', OUTPUT_LEVELS,
179
+ "Set the output level (default is verbose).",
180
+ "(" + keyword_display(OUTPUT_LEVELS) + ")") do |l|
181
+ @output_level = l || UI::VERBOSE
182
+ end
183
+
184
+ o.on('--',
185
+ "Stop processing options so that the",
186
+ "remaining options will be passed to the",
187
+ "test."){o.terminate}
188
+
189
+ o.on('-h', '--help', 'Display this help.'){puts o; exit}
190
+
191
+ o.on_tail
192
+ o.on_tail('Deprecated options:')
193
+
194
+ o.on_tail('--console', 'Console runner (use --runner).') do
195
+ warn("Deprecated option (--console).")
196
+ @runner = RUNNERS[:console]
197
+ end
198
+
199
+ o.on_tail('--gtk', 'GTK runner (use --runner).') do
200
+ warn("Deprecated option (--gtk).")
201
+ @runner = RUNNERS[:gtk]
202
+ end
203
+
204
+ o.on_tail('--fox', 'Fox runner (use --runner).') do
205
+ warn("Deprecated option (--fox).")
206
+ @runner = RUNNERS[:fox]
207
+ end
208
+
209
+ o.on_tail
210
+ end
211
+ end
212
+
213
+ def keyword_display(array)
214
+ list = array.collect {|e, *| e.to_s}
215
+ Array === array or list.sort!
216
+ list.collect {|e| e.sub(/^(.)([A-Za-z]+)(?=\w*$)/, '\\1[\\2]')}.join(", ")
217
+ end
218
+
219
+ def run
220
+ @suite = @collector[self]
221
+ result = @runner[self] or return false
222
+ Dir.chdir(@workdir) if @workdir
223
+ result.run(@suite, @output_level).passed?
224
+ end
225
+ end
226
+ end
227
+ end
@@ -0,0 +1,45 @@
1
+ dir = File.dirname(__FILE__)
2
+
3
+ module Screw
4
+ module Unit
5
+ module Collector
6
+ def initialize
7
+ @filters = []
8
+ end
9
+
10
+ def filter=(filters)
11
+ @filters = case(filters)
12
+ when Proc
13
+ [filters]
14
+ when Array
15
+ filters
16
+ end
17
+ end
18
+
19
+ def add_suite(destination, suite)
20
+ to_delete = suite.tests.find_all{|t| !include?(t)}
21
+ to_delete.each{|t| suite.delete(t)}
22
+ destination << suite unless(suite.size == 0)
23
+ end
24
+
25
+ def include?(test)
26
+ return true if(@filters.empty?)
27
+ @filters.each do |filter|
28
+ result = filter[test]
29
+ if(result.nil?)
30
+ next
31
+ elsif(!result)
32
+ return false
33
+ else
34
+ return true
35
+ end
36
+ end
37
+ true
38
+ end
39
+
40
+ def sort(suites)
41
+ suites.sort_by{|s| s.name}
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,107 @@
1
+ require 'fancy/unit/testsuite'
2
+ require 'fancy/unit/collector'
3
+
4
+ module Screw
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
+ end
22
+
23
+ def collect(*from)
24
+ basedir = @base
25
+ $:.push(basedir) if basedir
26
+ if(from.empty?)
27
+ recursive_collect('.', find_test_cases)
28
+ elsif(from.size == 1)
29
+ recursive_collect(from.first, find_test_cases)
30
+ else
31
+ suites = []
32
+ from.each do |f|
33
+ suite = recursive_collect(f, find_test_cases)
34
+ suites << suite unless(suite.tests.empty?)
35
+ end
36
+ suite = TestSuite.new("[#{from.join(', ')}]")
37
+ sort(suites).each{|s| suite << s}
38
+ suite
39
+ end
40
+ ensure
41
+ $:.delete_at($:.rindex(basedir)) if basedir
42
+ end
43
+
44
+ def find_test_cases(ignore=[])
45
+ cases = []
46
+ @object_space.each_object(Class) do |c|
47
+ cases << c if(c < TestCase && !ignore.include?(c))
48
+ end
49
+ ignore.concat(cases)
50
+ cases
51
+ end
52
+
53
+ def recursive_collect(name, already_gathered)
54
+ sub_suites = []
55
+ path = realdir(name)
56
+ if @file.directory?(path)
57
+ dir_name = name unless name == '.'
58
+ @dir.entries(path).each do |e|
59
+ next if(e == '.' || e == '..')
60
+ e_name = dir_name ? @file.join(dir_name, e) : e
61
+ if @file.directory?(realdir(e_name))
62
+ next if /\ACVS\z/ =~ e
63
+ sub_suite = recursive_collect(e_name, already_gathered)
64
+ sub_suites << sub_suite unless(sub_suite.empty?)
65
+ else
66
+ next if /~\z/ =~ e_name or /\A\.\#/ =~ e
67
+ if @pattern and !@pattern.empty?
68
+ next unless @pattern.any? {|pat| pat =~ e_name}
69
+ end
70
+ if @exclude and !@exclude.empty?
71
+ next if @exclude.any? {|pat| pat =~ e_name}
72
+ end
73
+ collect_file(e_name, sub_suites, already_gathered)
74
+ end
75
+ end
76
+ else
77
+ collect_file(name, sub_suites, already_gathered)
78
+ end
79
+ suite = TestSuite.new(@file.basename(name))
80
+ sort(sub_suites).each{|s| suite << s}
81
+ suite
82
+ end
83
+
84
+ def collect_file(name, suites, already_gathered)
85
+ dir = @file.dirname(@file.expand_path(name, @base))
86
+ $:.unshift(dir)
87
+ if(@req)
88
+ @req.require(name)
89
+ else
90
+ require(name)
91
+ end
92
+ find_test_cases(already_gathered).each{|t| add_suite(suites, t.suite)}
93
+ ensure
94
+ $:.delete_at($:.rindex(dir)) if(dir)
95
+ end
96
+
97
+ def realdir(path)
98
+ if @base
99
+ @file.join(@base, path)
100
+ else
101
+ path
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,28 @@
1
+ module Screw
2
+ module Unit
3
+ module Collector
4
+ class ObjectSpace
5
+ include Collector
6
+
7
+ NAME = 'collected from the ObjectSpace'
8
+
9
+ def initialize(source=::ObjectSpace)
10
+ super()
11
+ @source = source
12
+ end
13
+
14
+ def collect(name=NAME)
15
+ suite = TestSuite.new(name)
16
+ sub_suites = []
17
+ @source.each_object(Class) do |klass|
18
+ if(Screw::Unit::TestCase > klass)
19
+ add_suite(sub_suites, klass.suite)
20
+ end
21
+ end
22
+ sort(sub_suites).each{|s| suite << s}
23
+ suite
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,48 @@
1
+ module Screw
2
+ module Unit
3
+
4
+ # Encapsulates an error in a test. Created by
5
+ # Screw::Unit::TestCase when it rescues an exception thrown
6
+ # during the processing of a test.
7
+ class Error
8
+ include Util::BacktraceFilter
9
+
10
+ attr_reader(:test_name, :exception)
11
+
12
+ SINGLE_CHARACTER = 'E'
13
+
14
+ # Creates a new Error with the given test_name and
15
+ # exception.
16
+ def initialize(test_name, exception)
17
+ @test_name = test_name
18
+ @exception = exception
19
+ end
20
+
21
+ # Returns a single character representation of an error.
22
+ def single_character_display
23
+ SINGLE_CHARACTER
24
+ end
25
+
26
+ # Returns the message associated with the error.
27
+ def message
28
+ "#{@exception.class.name}: #{@exception.message}"
29
+ end
30
+
31
+ # Returns a brief version of the error description.
32
+ def short_display
33
+ "#@test_name: #{message.split("\n")[0]}"
34
+ end
35
+
36
+ # Returns a verbose version of the error description.
37
+ def long_display
38
+ backtrace = filter_backtrace(@exception.backtrace).join("\n ")
39
+ "Error:\n#@test_name:\n#{message}\n #{backtrace}"
40
+ end
41
+
42
+ # Overridden to return long_display.
43
+ def to_s
44
+ long_display
45
+ end
46
+ end
47
+ end
48
+ end