treetop 1.1.2 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/Rakefile +6 -6
  2. data/doc/images/bottom_background.png +0 -0
  3. data/doc/images/middle_backgound.png +0 -0
  4. data/doc/images/middle_background.png +0 -0
  5. data/doc/images/top_background.png +0 -0
  6. data/doc/index.markdown +13 -8
  7. data/doc/screen.css +52 -0
  8. data/doc/site.html +34 -0
  9. data/doc/site.rb +41 -0
  10. data/examples/lambda_calculus/lambda_calculus.rb +2 -2
  11. data/lib/treetop/bootstrap_gen_1_metagrammar.rb +37 -0
  12. data/lib/treetop/compiler/metagrammar. +0 -0
  13. data/lib/treetop/compiler/metagrammar.rb +20 -9
  14. data/lib/treetop/compiler/metagrammar.treetop +1 -1
  15. data/lib/treetop/compiler/node_classes/declaration_sequence.rb +1 -7
  16. data/lib/treetop/compiler/node_classes/grammar.rb +2 -2
  17. data/lib/treetop/runtime/compiled_parser.rb +15 -2
  18. metadata +12 -74
  19. data/test/compilation_target/target.rb +0 -143
  20. data/test/compilation_target/target.treetop +0 -15
  21. data/test/compilation_target/target_test.rb +0 -56
  22. data/test/compiler/and_predicate_test.rb +0 -33
  23. data/test/compiler/anything_symbol_test.rb +0 -24
  24. data/test/compiler/character_class_test.rb +0 -45
  25. data/test/compiler/choice_test.rb +0 -74
  26. data/test/compiler/circular_compilation_test.rb +0 -20
  27. data/test/compiler/failure_propagation_functional_test.rb +0 -20
  28. data/test/compiler/grammar_compiler_test.rb +0 -58
  29. data/test/compiler/grammar_test.rb +0 -37
  30. data/test/compiler/nonterminal_symbol_test.rb +0 -38
  31. data/test/compiler/not_predicate_test.rb +0 -35
  32. data/test/compiler/one_or_more_test.rb +0 -30
  33. data/test/compiler/optional_test.rb +0 -32
  34. data/test/compiler/parenthesized_expression_test.rb +0 -17
  35. data/test/compiler/parsing_rule_test.rb +0 -30
  36. data/test/compiler/sequence_test.rb +0 -68
  37. data/test/compiler/terminal_symbol_test.rb +0 -35
  38. data/test/compiler/test_grammar.treetop +0 -7
  39. data/test/compiler/zero_or_more_test.rb +0 -51
  40. data/test/composition/a.treetop +0 -11
  41. data/test/composition/b.treetop +0 -11
  42. data/test/composition/c.treetop +0 -10
  43. data/test/composition/d.treetop +0 -10
  44. data/test/composition/grammar_composition_test.rb +0 -23
  45. data/test/parser/syntax_node_test.rb +0 -53
  46. data/test/parser/terminal_parse_failure_test.rb +0 -22
  47. data/test/ruby_extensions/string_test.rb +0 -33
  48. data/test/screw/Rakefile +0 -16
  49. data/test/screw/unit.rb +0 -37
  50. data/test/screw/unit/assertion_failed_error.rb +0 -14
  51. data/test/screw/unit/assertions.rb +0 -615
  52. data/test/screw/unit/auto_runner.rb +0 -227
  53. data/test/screw/unit/collector.rb +0 -45
  54. data/test/screw/unit/collector/dir.rb +0 -107
  55. data/test/screw/unit/collector/objectspace.rb +0 -28
  56. data/test/screw/unit/error.rb +0 -48
  57. data/test/screw/unit/failure.rb +0 -45
  58. data/test/screw/unit/sugar.rb +0 -25
  59. data/test/screw/unit/test_case.rb +0 -176
  60. data/test/screw/unit/test_result.rb +0 -73
  61. data/test/screw/unit/test_suite.rb +0 -70
  62. data/test/screw/unit/ui.rb +0 -4
  63. data/test/screw/unit/ui/console/test_runner.rb +0 -118
  64. data/test/screw/unit/ui/fox/test_runner.rb +0 -268
  65. data/test/screw/unit/ui/gtk/test_runner.rb +0 -416
  66. data/test/screw/unit/ui/gtk2/testrunner.rb +0 -465
  67. data/test/screw/unit/ui/test_runner_mediator.rb +0 -58
  68. data/test/screw/unit/ui/test_runner_utilities.rb +0 -46
  69. data/test/screw/unit/ui/tk/test_runner.rb +0 -260
  70. data/test/screw/unit/util.rb +0 -4
  71. data/test/screw/unit/util/backtrace_filter.rb +0 -40
  72. data/test/screw/unit/util/observable.rb +0 -82
  73. data/test/screw/unit/util/proc_wrapper.rb +0 -48
  74. data/test/test_helper.rb +0 -90
@@ -1,23 +0,0 @@
1
- dir = File.dirname(__FILE__)
2
- require File.join(dir, '..', 'test_helper')
3
-
4
- class GrammarCompositionTest < Screw::Unit::TestCase
5
- def setup
6
- dir = File.dirname(__FILE__)
7
- load_grammar File.join(dir, 'a')
8
- load_grammar File.join(dir, 'b')
9
- load_grammar File.join(dir, 'c')
10
- load_grammar File.join(dir, 'd')
11
-
12
- @c = ::Test::CParser.new
13
- @d = ::Test::DParser.new
14
- end
15
-
16
- test "rules in C have access to rules defined in A and B" do
17
- @c.parse('abc').should be_success
18
- end
19
-
20
- test "rules in C can override rules in A and B with super semantics" do
21
- @d.parse('superkeywordworks').should be_success
22
- end
23
- end
@@ -1,53 +0,0 @@
1
- dir = File.dirname(__FILE__)
2
- require "#{dir}/../test_helper"
3
-
4
- describe "A new terminal syntax node" do
5
-
6
- def setup
7
- @node = Runtime::SyntaxNode.new("input", 0...3)
8
- end
9
-
10
- it "reports itself as terminal" do
11
- @node.should be_terminal
12
- @node.should_not be_nonterminal
13
- end
14
-
15
- it "has a text value based on the input and the interval" do
16
- @node.text_value.should == "inp"
17
- end
18
-
19
- it "has no nested failures" do
20
- @node.nested_failures.should be_empty
21
- end
22
-
23
- it "has itself as its only element" do
24
- @node.elements.should == [@node]
25
- end
26
- end
27
-
28
- describe "A new nonterminal syntax node" do
29
- def setup
30
- @input = 'test input'
31
- @nested_results = [Runtime::TerminalParseFailure.new(@input, 1, 'foo')]
32
- @elements = Runtime::SyntaxNode.new('input', 0...3)
33
- @node = Runtime::SyntaxNode.new('input', 0...3, @elements, @nested_results)
34
- end
35
-
36
- it "reports itself as nonterminal" do
37
- @node.should be_nonterminal
38
- @node.should_not be_terminal
39
- end
40
-
41
- it "has a text value based on the input and the interval" do
42
- @node.text_value.should == "inp"
43
- end
44
-
45
- it "has the elements with which it was instantiated" do
46
- @node.elements.should == @elements
47
- end
48
-
49
- it "has nested failures frow within the nested results with which it was instantiated" do
50
- @node.nested_failures.should == @nested_results
51
- end
52
-
53
- end
@@ -1,22 +0,0 @@
1
- dir = File.dirname(__FILE__)
2
- require "#{dir}/../test_helper"
3
-
4
- describe "A terminal parse failure" do
5
- def setup
6
- @input = "test input"
7
- @failure = Runtime::TerminalParseFailure.new(@input, 1, "foo")
8
- end
9
-
10
- it "is == to a parse failure at the same index expecting the same string" do
11
- @failure.should == Runtime::TerminalParseFailure.new(@input, 1, "foo")
12
- end
13
-
14
- it "is eql to a parse failure at the same index expecting the same string" do
15
- @failure.should eql(Runtime::TerminalParseFailure.new(@input, 1, "foo"))
16
- @failure.hash.should == Runtime::TerminalParseFailure.new(@input, 1, "foo").hash
17
- end
18
-
19
- it "is considered identical to another failure with the same index and expected string in an array" do
20
- [Runtime::TerminalParseFailure.new(@input, 1, "foo"), Runtime::TerminalParseFailure.new(@input, 1, "foo")].uniq.size.should == 1
21
- end
22
- end
@@ -1,33 +0,0 @@
1
- require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
-
3
- class StringTest < Screw::Unit::TestCase
4
-
5
- def setup
6
- @string = %{
7
- 0123456789
8
- 012345
9
- 01234567
10
- 0123
11
- }.tabto(0).strip
12
- end
13
-
14
- test "column numbers" do
15
- @string.column_of(0).should == 1
16
- @string.column_of(5).should == 6
17
- @string.column_of(10).should == 11
18
- @string.column_of(11).should == 1
19
- @string.column_of(17).should == 7
20
- @string.column_of(18).should == 1
21
- @string.column_of(24).should == 7
22
- end
23
-
24
- test "line numbers" do
25
- @string.line_of(0).should == 1
26
- @string.line_of(5).should == 1
27
- @string.line_of(10).should == 1
28
- @string.line_of(11).should == 2
29
- @string.line_of(17).should == 2
30
- @string.line_of(18).should == 3
31
- @string.line_of(24).should == 3
32
- end
33
- end
data/test/screw/Rakefile DELETED
@@ -1,16 +0,0 @@
1
- spec = Gem::Specification.new do |s|
2
- s.name = "Screw::Unit"
3
- s.version = "0.0.1"
4
- s.author = "Nathan Sobo"
5
- s.email = "nathansobo@gmail.com"
6
- s.homepage = "http://screwunit.rubyforge.org"
7
- s.platform = Gem::Platform::RUBY
8
- s.summary = "RSpec-style syntactic sugar that is backward compatible with Test::Unit"
9
- s.files = FileList["{unit}/**/*"].to_a
10
- s.require_path = "lib"
11
- s.autorequire = "name"
12
- s.test_files = FileList["{test}/**/*test.rb"].to_a
13
- s.has_rdoc = true
14
- s.extra_rdoc_files = ["README"]
15
- s.add_dependency("dependency", ">= 0.x.x")
16
- end
data/test/screw/unit.rb DELETED
@@ -1,37 +0,0 @@
1
- dir = File.dirname(__FILE__)
2
- require 'rubygems'
3
- require 'spec/expectations'
4
- require 'spec/matchers'
5
-
6
- require File.join(dir, 'unit', 'util')
7
- require File.join(dir, 'unit', 'assertion_failed_error')
8
- require File.join(dir, 'unit', 'assertions')
9
- require File.join(dir, 'unit', 'collector')
10
- require File.join(dir, 'unit', 'error')
11
- require File.join(dir, 'unit', 'failure')
12
- require File.join(dir, 'unit', 'test_case')
13
- require File.join(dir, 'unit', 'test_result')
14
- require File.join(dir, 'unit', 'test_suite')
15
- require File.join(dir, 'unit', 'ui')
16
- require File.join(dir, 'unit', 'auto_runner')
17
- require File.join(dir, 'unit', 'sugar')
18
-
19
- module Screw
20
- module Unit
21
- # If set to false Screw::Unit will not automatically run at exit.
22
- def self.run=(flag)
23
- @run = flag
24
- end
25
-
26
- # Automatically run tests at exit?
27
- def self.run?
28
- @run ||= false
29
- end
30
- end
31
- end
32
-
33
- at_exit do
34
- unless $! || Screw::Unit.run?
35
- exit Screw::Unit::AutoRunner.run
36
- end
37
- end
@@ -1,14 +0,0 @@
1
- #--
2
- #
3
- # Author:: Nathaniel Talbott.
4
- # Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
5
- # License:: Ruby license.
6
-
7
- module Screw
8
- module Unit
9
-
10
- # Thrown by Screw::Unit::Assertions when an assertion fails.
11
- class AssertionFailedError < StandardError
12
- end
13
- end
14
- end
@@ -1,615 +0,0 @@
1
- module Screw
2
- module Unit
3
-
4
- ##
5
- # Screw::Unit::Assertions contains the standard Screw::Unit assertions.
6
- # Assertions is included in Screw::Unit::TestCase.
7
- #
8
- # To include it in your own code and use its functionality, you simply
9
- # need to rescue Screw::Unit::AssertionFailedError. Additionally you may
10
- # override add_assertion to get notified whenever an assertion is made.
11
- #
12
- # Notes:
13
- # * The message to each assertion, if given, will be propagated with the
14
- # failure.
15
- # * It is easy to add your own assertions based on assert_block().
16
- #
17
- # = Example Custom Assertion
18
- #
19
- # def deny(boolean, message = nil)
20
- # message = build_message message, '<?> is not false or nil.', boolean
21
- # assert_block message do
22
- # not boolean
23
- # end
24
- # end
25
-
26
- module Assertions
27
-
28
- ##
29
- # The assertion upon which all other assertions are based. Passes if the
30
- # block yields true.
31
- #
32
- # Example:
33
- # assert_block "Couldn't do the thing" do
34
- # do_the_thing
35
- # end
36
-
37
- public
38
- def assert_block(message="assert_block failed.") # :yields:
39
- _wrap_assertion do
40
- if (! yield)
41
- raise AssertionFailedError.new(message.to_s)
42
- end
43
- end
44
- end
45
-
46
- ##
47
- # Asserts that +boolean+ is not false or nil.
48
- #
49
- # Example:
50
- # assert [1, 2].include?(5)
51
-
52
- public
53
- def assert(boolean, message=nil)
54
- _wrap_assertion do
55
- assert_block("assert should not be called with a block.") { !block_given? }
56
- assert_block(build_message(message, "<?> is not true.", boolean)) { boolean }
57
- end
58
- end
59
-
60
- ##
61
- # Passes if +expected+ == +actual.
62
- #
63
- # Note that the ordering of arguments is important, since a helpful
64
- # error message is generated when this one fails that tells you the
65
- # values of expected and actual.
66
- #
67
- # Example:
68
- # assert_equal 'MY STRING', 'my string'.upcase
69
-
70
- public
71
- def assert_equal(expected, actual, message=nil)
72
- full_message = build_message(message, <<EOT, expected, actual)
73
- <?> expected but was
74
- <?>.
75
- EOT
76
- assert_block(full_message) { expected == actual }
77
- end
78
-
79
- private
80
- def _check_exception_class(args) # :nodoc:
81
- args.partition do |klass|
82
- next if klass.instance_of?(Module)
83
- assert(Exception >= klass, "Should expect a class of exception, #{klass}")
84
- true
85
- end
86
- end
87
-
88
- private
89
- def _expected_exception?(actual_exception, exceptions, modules) # :nodoc:
90
- exceptions.include?(actual_exception.class) or
91
- modules.any? {|mod| actual_exception.is_a?(mod)}
92
- end
93
-
94
- ##
95
- # Passes if the block raises one of the given exceptions.
96
- #
97
- # Example:
98
- # assert_raise RuntimeError, LoadError do
99
- # raise 'Boom!!!'
100
- # end
101
-
102
- public
103
- def assert_raise(*args)
104
- _wrap_assertion do
105
- if Module === args.last
106
- message = ""
107
- else
108
- message = args.pop
109
- end
110
- exceptions, modules = _check_exception_class(args)
111
- expected = args.size == 1 ? args.first : args
112
- actual_exception = nil
113
- full_message = build_message(message, "<?> exception expected but none was thrown.", expected)
114
- assert_block(full_message) do
115
- begin
116
- yield
117
- rescue Exception => actual_exception
118
- break
119
- end
120
- false
121
- end
122
- full_message = build_message(message, "<?> exception expected but was\n?", expected, actual_exception)
123
- assert_block(full_message) {_expected_exception?(actual_exception, exceptions, modules)}
124
- actual_exception
125
- end
126
- end
127
-
128
- ##
129
- # Alias of assert_raise.
130
- #
131
- # Will be deprecated in 1.9, and removed in 2.0.
132
-
133
- public
134
- def assert_raises(*args, &block)
135
- assert_raise(*args, &block)
136
- end
137
-
138
- ##
139
- # Passes if +object+ .instance_of? +klass+
140
- #
141
- # Example:
142
- # assert_instance_of String, 'foo'
143
-
144
- public
145
- def assert_instance_of(klass, object, message="")
146
- _wrap_assertion do
147
- assert_equal(Class, klass.class, "assert_instance_of takes a Class as its first argument")
148
- full_message = build_message(message, <<EOT, object, klass, object.class)
149
- <?> expected to be an instance of
150
- <?> but was
151
- <?>.
152
- EOT
153
- assert_block(full_message){object.instance_of?(klass)}
154
- end
155
- end
156
-
157
- ##
158
- # Passes if +object+ is nil.
159
- #
160
- # Example:
161
- # assert_nil [1, 2].uniq!
162
-
163
- public
164
- def assert_nil(object, message="")
165
- assert_equal(nil, object, message)
166
- end
167
-
168
- ##
169
- # Passes if +object+ .kind_of? +klass+
170
- #
171
- # Example:
172
- # assert_kind_of Object, 'foo'
173
-
174
- public
175
- def assert_kind_of(klass, object, message="")
176
- _wrap_assertion do
177
- assert(klass.kind_of?(Module), "The first parameter to assert_kind_of should be a kind_of Module.")
178
- full_message = build_message(message, "<?>\nexpected to be kind_of\\?\n<?> but was\n<?>.", object, klass, object.class)
179
- assert_block(full_message){object.kind_of?(klass)}
180
- end
181
- end
182
-
183
- ##
184
- # Passes if +object+ .respond_to? +method+
185
- #
186
- # Example:
187
- # assert_respond_to 'bugbear', :slice
188
-
189
- public
190
- def assert_respond_to(object, method, message="")
191
- _wrap_assertion do
192
- full_message = build_message(nil, "<?>\ngiven as the method name argument to #assert_respond_to must be a Symbol or #respond_to\\?(:to_str).", method)
193
-
194
- assert_block(full_message) do
195
- method.kind_of?(Symbol) || method.respond_to?(:to_str)
196
- end
197
- full_message = build_message(message, <<EOT, object, object.class, method)
198
- <?>
199
- of type <?>
200
- expected to respond_to\\?<?>.
201
- EOT
202
- assert_block(full_message) { object.respond_to?(method) }
203
- end
204
- end
205
-
206
- ##
207
- # Passes if +string+ =~ +pattern+.
208
- #
209
- # Example:
210
- # assert_match(/\d+/, 'five, 6, seven')
211
-
212
- public
213
- def assert_match(pattern, string, message="")
214
- _wrap_assertion do
215
- pattern = case(pattern)
216
- when String
217
- Regexp.new(Regexp.escape(pattern))
218
- else
219
- pattern
220
- end
221
- full_message = build_message(message, "<?> expected to be =~\n<?>.", string, pattern)
222
- assert_block(full_message) { string =~ pattern }
223
- end
224
- end
225
-
226
- ##
227
- # Passes if +actual+ .equal? +expected+ (i.e. they are the same
228
- # instance).
229
- #
230
- # Example:
231
- # o = Object.new
232
- # assert_same o, o
233
-
234
- public
235
- def assert_same(expected, actual, message="")
236
- full_message = build_message(message, <<EOT, expected, expected.__id__, actual, actual.__id__)
237
- <?>
238
- with id <?> expected to be equal\\? to
239
- <?>
240
- with id <?>.
241
- EOT
242
- assert_block(full_message) { actual.equal?(expected) }
243
- end
244
-
245
- ##
246
- # Compares the +object1+ with +object2+ using +operator+.
247
- #
248
- # Passes if object1.__send__(operator, object2) is true.
249
- #
250
- # Example:
251
- # assert_operator 5, :>=, 4
252
-
253
- public
254
- def assert_operator(object1, operator, object2, message="")
255
- _wrap_assertion do
256
- full_message = build_message(nil, "<?>\ngiven as the operator for #assert_operator must be a Symbol or #respond_to\\?(:to_str).", operator)
257
- assert_block(full_message){operator.kind_of?(Symbol) || operator.respond_to?(:to_str)}
258
- full_message = build_message(message, <<EOT, object1, AssertionMessage.literal(operator), object2)
259
- <?> expected to be
260
- ?
261
- <?>.
262
- EOT
263
- assert_block(full_message) { object1.__send__(operator, object2) }
264
- end
265
- end
266
-
267
- ##
268
- # Passes if block does not raise an exception.
269
- #
270
- # Example:
271
- # assert_nothing_raised do
272
- # [1, 2].uniq
273
- # end
274
-
275
- public
276
- def assert_nothing_raised(*args)
277
- _wrap_assertion do
278
- if Module === args.last
279
- message = ""
280
- else
281
- message = args.pop
282
- end
283
- exceptions, modules = _check_exception_class(args)
284
- begin
285
- yield
286
- rescue Exception => e
287
- if ((args.empty? && !e.instance_of?(AssertionFailedError)) ||
288
- _expected_exception?(e, exceptions, modules))
289
- assert_block(build_message(message, "Exception raised:\n?", e)){false}
290
- else
291
- raise
292
- end
293
- end
294
- nil
295
- end
296
- end
297
-
298
- ##
299
- # Flunk always fails.
300
- #
301
- # Example:
302
- # flunk 'Not done testing yet.'
303
-
304
- public
305
- def flunk(message="Flunked")
306
- assert_block(build_message(message)){false}
307
- end
308
-
309
- ##
310
- # Passes if ! +actual+ .equal? +expected+
311
- #
312
- # Example:
313
- # assert_not_same Object.new, Object.new
314
-
315
- public
316
- def assert_not_same(expected, actual, message="")
317
- full_message = build_message(message, <<EOT, expected, expected.__id__, actual, actual.__id__)
318
- <?>
319
- with id <?> expected to not be equal\\? to
320
- <?>
321
- with id <?>.
322
- EOT
323
- assert_block(full_message) { !actual.equal?(expected) }
324
- end
325
-
326
- ##
327
- # Passes if +expected+ != +actual+
328
- #
329
- # Example:
330
- # assert_not_equal 'some string', 5
331
-
332
- public
333
- def assert_not_equal(expected, actual, message="")
334
- full_message = build_message(message, "<?> expected to be != to\n<?>.", expected, actual)
335
- assert_block(full_message) { expected != actual }
336
- end
337
-
338
- ##
339
- # Passes if ! +object+ .nil?
340
- #
341
- # Example:
342
- # assert_not_nil '1 two 3'.sub!(/two/, '2')
343
-
344
- public
345
- def assert_not_nil(object, message="")
346
- full_message = build_message(message, "<?> expected to not be nil.", object)
347
- assert_block(full_message){!object.nil?}
348
- end
349
-
350
- ##
351
- # Passes if +regexp+ !~ +string+
352
- #
353
- # Example:
354
- # assert_no_match(/two/, 'one 2 three')
355
-
356
- public
357
- def assert_no_match(regexp, string, message="")
358
- _wrap_assertion do
359
- assert_instance_of(Regexp, regexp, "The first argument to assert_no_match should be a Regexp.")
360
- full_message = build_message(message, "<?> expected to not match\n<?>.", regexp, string)
361
- assert_block(full_message) { regexp !~ string }
362
- end
363
- end
364
-
365
- UncaughtThrow = {NameError => /^uncaught throw \`(.+)\'$/,
366
- ThreadError => /^uncaught throw \`(.+)\' in thread /} #`
367
-
368
- ##
369
- # Passes if the block throws +expected_symbol+
370
- #
371
- # Example:
372
- # assert_throws :done do
373
- # throw :done
374
- # end
375
-
376
- public
377
- def assert_throws(expected_symbol, message="", &proc)
378
- _wrap_assertion do
379
- assert_instance_of(Symbol, expected_symbol, "assert_throws expects the symbol that should be thrown for its first argument")
380
- assert_block("Should have passed a block to assert_throws."){block_given?}
381
- caught = true
382
- begin
383
- catch(expected_symbol) do
384
- proc.call
385
- caught = false
386
- end
387
- full_message = build_message(message, "<?> should have been thrown.", expected_symbol)
388
- assert_block(full_message){caught}
389
- rescue NameError, ThreadError => error
390
- if UncaughtThrow[error.class] !~ error.message
391
- raise error
392
- end
393
- full_message = build_message(message, "<?> expected to be thrown but\n<?> was thrown.", expected_symbol, $1.intern)
394
- flunk(full_message)
395
- end
396
- end
397
- end
398
-
399
- ##
400
- # Passes if block does not throw anything.
401
- #
402
- # Example:
403
- # assert_nothing_thrown do
404
- # [1, 2].uniq
405
- # end
406
-
407
- public
408
- def assert_nothing_thrown(message="", &proc)
409
- _wrap_assertion do
410
- assert(block_given?, "Should have passed a block to assert_nothing_thrown")
411
- begin
412
- proc.call
413
- rescue NameError, ThreadError => error
414
- if UncaughtThrow[error.class] !~ error.message
415
- raise error
416
- end
417
- full_message = build_message(message, "<?> was thrown when nothing was expected", $1.intern)
418
- flunk(full_message)
419
- end
420
- assert(true, "Expected nothing to be thrown")
421
- end
422
- end
423
-
424
- ##
425
- # Passes if +expected_float+ and +actual_float+ are equal
426
- # within +delta+ tolerance.
427
- #
428
- # Example:
429
- # assert_in_delta 0.05, (50000.0 / 10**6), 0.00001
430
-
431
- public
432
- def assert_in_delta(expected_float, actual_float, delta, message="")
433
- _wrap_assertion do
434
- {expected_float => "first float", actual_float => "second float", delta => "delta"}.each do |float, name|
435
- assert_respond_to(float, :to_f, "The arguments must respond to to_f; the #{name} did not")
436
- end
437
- assert_operator(delta, :>=, 0.0, "The delta should not be negative")
438
- full_message = build_message(message, <<EOT, expected_float, actual_float, delta)
439
- <?> and
440
- <?> expected to be within
441
- <?> of each other.
442
- EOT
443
- assert_block(full_message) { (expected_float.to_f - actual_float.to_f).abs <= delta.to_f }
444
- end
445
- end
446
-
447
- ##
448
- # Passes if the method send returns a true value.
449
- #
450
- # +send_array+ is composed of:
451
- # * A receiver
452
- # * A method
453
- # * Arguments to the method
454
- #
455
- # Example:
456
- # assert_send [[1, 2], :include?, 4]
457
-
458
- public
459
- def assert_send(send_array, message="")
460
- _wrap_assertion do
461
- assert_instance_of(Array, send_array, "assert_send requires an array of send information")
462
- assert(send_array.size >= 2, "assert_send requires at least a receiver and a message name")
463
- full_message = build_message(message, <<EOT, send_array[0], AssertionMessage.literal(send_array[1].to_s), send_array[2..-1])
464
- <?> expected to respond to
465
- <?(?)> with a true value.
466
- EOT
467
- assert_block(full_message) { send_array[0].__send__(send_array[1], *send_array[2..-1]) }
468
- end
469
- end
470
-
471
- ##
472
- # Builds a failure message. +head+ is added before the +template+ and
473
- # +arguments+ replaces the '?'s positionally in the template.
474
-
475
- public
476
- def build_message(head, template=nil, *arguments)
477
- template &&= template.chomp
478
- return AssertionMessage.new(head, template, arguments)
479
- end
480
-
481
- private
482
- def _wrap_assertion
483
- @_assertion_wrapped ||= false
484
- unless (@_assertion_wrapped)
485
- @_assertion_wrapped = true
486
- begin
487
- add_assertion
488
- return yield
489
- ensure
490
- @_assertion_wrapped = false
491
- end
492
- else
493
- return yield
494
- end
495
- end
496
-
497
- ##
498
- # Called whenever an assertion is made. Define this in classes that
499
- # include Screw::Unit::Assertions to record assertion counts.
500
-
501
- private
502
- def add_assertion
503
- end
504
-
505
- ##
506
- # Select whether or not to use the pretty-printer. If this option is set
507
- # to false before any assertions are made, pp.rb will not be required.
508
-
509
- public
510
- def self.use_pp=(value)
511
- AssertionMessage.use_pp = value
512
- end
513
-
514
- # :stopdoc:
515
-
516
- class AssertionMessage
517
- @use_pp = true
518
- class << self
519
- attr_accessor :use_pp
520
- end
521
-
522
- class Literal
523
- def initialize(value)
524
- @value = value
525
- end
526
-
527
- def inspect
528
- @value.to_s
529
- end
530
- end
531
-
532
- class Template
533
- def self.create(string)
534
- parts = (string ? string.scan(/(?=[^\\])\?|(?:\\\?|[^\?])+/m) : [])
535
- self.new(parts)
536
- end
537
-
538
- attr_reader :count
539
-
540
- def initialize(parts)
541
- @parts = parts
542
- @count = parts.find_all{|e| e == '?'}.size
543
- end
544
-
545
- def result(parameters)
546
- raise "The number of parameters does not match the number of substitutions." if(parameters.size != count)
547
- params = parameters.dup
548
- @parts.collect{|e| e == '?' ? params.shift : e.gsub(/\\\?/m, '?')}.join('')
549
- end
550
- end
551
-
552
- def self.literal(value)
553
- Literal.new(value)
554
- end
555
-
556
- include Util::BacktraceFilter
557
-
558
- def initialize(head, template_string, parameters)
559
- @head = head
560
- @template_string = template_string
561
- @parameters = parameters
562
- end
563
-
564
- def convert(object)
565
- case object
566
- when Exception
567
- <<EOM.chop
568
- Class: <#{convert(object.class)}>
569
- Message: <#{convert(object.message)}>
570
- ---Backtrace---
571
- #{filter_backtrace(object.backtrace).join("\n")}
572
- ---------------
573
- EOM
574
- else
575
- if(self.class.use_pp)
576
- begin
577
- require 'pp'
578
- rescue LoadError
579
- self.class.use_pp = false
580
- return object.inspect
581
- end unless(defined?(PP))
582
- PP.pp(object, '').chomp
583
- else
584
- object.inspect
585
- end
586
- end
587
- end
588
-
589
- def template
590
- @template ||= Template.create(@template_string)
591
- end
592
-
593
- def add_period(string)
594
- (string =~ /\.\Z/ ? string : string + '.')
595
- end
596
-
597
- def to_s
598
- message_parts = []
599
- if (@head)
600
- head = @head.to_s
601
- unless(head.empty?)
602
- message_parts << add_period(head)
603
- end
604
- end
605
- tail = template.result(@parameters.collect{|e| convert(e)})
606
- message_parts << tail unless(tail.empty?)
607
- message_parts.join("\n")
608
- end
609
- end
610
-
611
- # :startdoc:
612
-
613
- end
614
- end
615
- end