rr 1.0.4 → 1.0.5.rc1
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.
- checksums.yaml +15 -0
- data/CHANGES.md +376 -0
- data/Gemfile +7 -10
- data/README.md +822 -0
- data/Rakefile +24 -78
- data/VERSION +1 -0
- data/lib/rr.rb +3 -0
- data/lib/rr/adapters/minitest.rb +6 -0
- data/lib/rr/adapters/rr_methods.rb +6 -10
- data/lib/rr/adapters/rspec.rb +3 -0
- data/lib/rr/adapters/rspec2.rb +30 -0
- data/lib/rr/adapters/test_unit.rb +2 -0
- data/lib/rr/double.rb +3 -2
- data/lib/rr/double_definitions/child_double_definition_create.rb +3 -2
- data/lib/rr/double_definitions/double_definition.rb +15 -13
- data/lib/rr/double_definitions/double_definition_create.rb +9 -5
- data/lib/rr/double_definitions/double_injections/any_instance_of.rb +3 -2
- data/lib/rr/double_definitions/strategies/strategy.rb +5 -4
- data/lib/rr/double_definitions/strategies/strategy_methods.rb +6 -8
- data/lib/rr/double_definitions/strategies/verification/mock.rb +3 -3
- data/lib/rr/double_matches.rb +2 -1
- data/lib/rr/expectations/argument_equality_expectation.rb +2 -2
- data/lib/rr/expectations/times_called_expectation.rb +2 -2
- data/lib/rr/injections/double_injection.rb +12 -11
- data/lib/rr/injections/injection.rb +2 -2
- data/lib/rr/injections/method_missing_injection.rb +21 -7
- data/lib/rr/injections/singleton_method_added_injection.rb +3 -1
- data/lib/rr/method_dispatches/base_method_dispatch.rb +1 -1
- data/lib/rr/method_dispatches/method_dispatch.rb +2 -1
- data/lib/rr/method_dispatches/method_missing_dispatch.rb +2 -1
- data/lib/rr/proc_from_block.rb +8 -4
- data/lib/rr/space.rb +3 -2
- data/lib/rr/times_called_matchers/times_called_matcher.rb +2 -2
- data/lib/rr/version.rb +5 -0
- data/lib/rr/wildcard_matchers/boolean.rb +2 -2
- data/spec/runner.rb +41 -0
- metadata +45 -133
- data/.gitignore +0 -10
- data/.runrc +0 -3
- data/.rvmrc +0 -2
- data/CHANGES +0 -266
- data/Gemfile.lock +0 -31
- data/README.rdoc +0 -392
- data/benchmarks/rr_benchmark.rb +0 -32
- data/benchmarks/rspec_benchmark.rb +0 -14
- data/doc/0.6.0.release.markdown +0 -81
- data/doc/todo.txt +0 -0
- data/introducting_rr.txt +0 -206
- data/rr.gemspec +0 -37
- data/spec/api/any_instance_of/all_instances_of_spec.rb +0 -12
- data/spec/api/any_instance_of/any_instance_of_spec.rb +0 -47
- data/spec/api/any_instance_of/instance_of_spec.rb +0 -12
- data/spec/api/dont_allow/dont_allow_after_stub_spec.rb +0 -14
- data/spec/api/mock/mock_spec.rb +0 -193
- data/spec/api/proxy/proxy_spec.rb +0 -86
- data/spec/api/spy/spy_spec.rb +0 -49
- data/spec/api/strong/strong_spec.rb +0 -87
- data/spec/api/stub/stub_spec.rb +0 -152
- data/spec/core_spec_suite.rb +0 -19
- data/spec/environment_fixture_setup.rb +0 -8
- data/spec/minitest_spec_suite.rb +0 -21
- data/spec/proc_from_block_spec.rb +0 -14
- data/spec/rr/adapters/rr_methods_argument_matcher_spec.rb +0 -67
- data/spec/rr/adapters/rr_methods_creator_spec.rb +0 -137
- data/spec/rr/adapters/rr_methods_space_spec.rb +0 -98
- data/spec/rr/adapters/rr_methods_spec_helper.rb +0 -11
- data/spec/rr/adapters/rr_methods_times_matcher_spec.rb +0 -13
- data/spec/rr/double_definitions/child_double_definition_creator_spec.rb +0 -112
- data/spec/rr/double_definitions/double_definition_create_blank_slate_spec.rb +0 -91
- data/spec/rr/double_definitions/double_definition_create_spec.rb +0 -443
- data/spec/rr/double_injection/double_injection_spec.rb +0 -546
- data/spec/rr/double_injection/double_injection_verify_spec.rb +0 -29
- data/spec/rr/errors/rr_error_spec.rb +0 -67
- data/spec/rr/expectations/any_argument_expectation_spec.rb +0 -47
- data/spec/rr/expectations/anything_argument_equality_expectation_spec.rb +0 -14
- data/spec/rr/expectations/argument_equality_expectation_spec.rb +0 -135
- data/spec/rr/expectations/boolean_argument_equality_expectation_spec.rb +0 -34
- data/spec/rr/expectations/hash_including_argument_equality_expectation_spec.rb +0 -82
- data/spec/rr/expectations/hash_including_spec.rb +0 -17
- data/spec/rr/expectations/satisfy_argument_equality_expectation_spec.rb +0 -59
- data/spec/rr/expectations/satisfy_spec.rb +0 -14
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_any_times_spec.rb +0 -22
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_least_spec.rb +0 -37
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_most_spec.rb +0 -43
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_helper.rb +0 -15
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_integer_spec.rb +0 -58
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_proc_spec.rb +0 -35
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_range_spec.rb +0 -39
- data/spec/rr/minitest/minitest_integration_test.rb +0 -59
- data/spec/rr/minitest/test_helper.rb +0 -7
- data/spec/rr/rspec/invocation_matcher_spec.rb +0 -279
- data/spec/rr/rspec/rspec_adapter_spec.rb +0 -63
- data/spec/rr/rspec/rspec_backtrace_tweaking_spec.rb +0 -31
- data/spec/rr/rspec/rspec_backtrace_tweaking_spec_fixture.rb +0 -11
- data/spec/rr/rspec/rspec_usage_spec.rb +0 -86
- data/spec/rr/space/hash_with_object_id_key_spec.rb +0 -88
- data/spec/rr/space/space_spec.rb +0 -596
- data/spec/rr/test_unit/test_helper.rb +0 -7
- data/spec/rr/test_unit/test_unit_backtrace_test.rb +0 -36
- data/spec/rr/test_unit/test_unit_integration_test.rb +0 -59
- data/spec/rr/times_called_matchers/any_times_matcher_spec.rb +0 -47
- data/spec/rr/times_called_matchers/at_least_matcher_spec.rb +0 -55
- data/spec/rr/times_called_matchers/at_most_matcher_spec.rb +0 -70
- data/spec/rr/times_called_matchers/integer_matcher_spec.rb +0 -70
- data/spec/rr/times_called_matchers/proc_matcher_spec.rb +0 -55
- data/spec/rr/times_called_matchers/range_matcher_spec.rb +0 -76
- data/spec/rr/times_called_matchers/times_called_matcher_spec.rb +0 -118
- data/spec/rr/wildcard_matchers/anything_spec.rb +0 -24
- data/spec/rr/wildcard_matchers/boolean_spec.rb +0 -36
- data/spec/rr/wildcard_matchers/duck_type_spec.rb +0 -52
- data/spec/rr/wildcard_matchers/is_a_spec.rb +0 -32
- data/spec/rr/wildcard_matchers/numeric_spec.rb +0 -32
- data/spec/rr/wildcard_matchers/range_spec.rb +0 -35
- data/spec/rr/wildcard_matchers/regexp_spec.rb +0 -43
- data/spec/rr_spec.rb +0 -28
- data/spec/rspec_spec_suite.rb +0 -17
- data/spec/spec.opts +0 -10
- data/spec/spec_helper.rb +0 -41
- data/spec/spec_suite.rb +0 -54
- data/spec/spy_verification_spec.rb +0 -129
- data/spec/test_unit_spec_suite.rb +0 -21
@@ -6,9 +6,10 @@ module RR
|
|
6
6
|
include RR::Adapters::RRMethods
|
7
7
|
|
8
8
|
def call(subject_class, stubbed_methods=nil, &block)
|
9
|
-
|
9
|
+
strategy_lambda = lambda do |double_definition_create|
|
10
10
|
::RR::DoubleDefinitions::Strategies::DoubleInjection::AnyInstanceOf.new(double_definition_create)
|
11
|
-
end
|
11
|
+
end
|
12
|
+
::RR::DoubleDefinitions::DoubleDefinitionCreate.set_default_double_injection_strategy(strategy_lambda) do
|
12
13
|
if stubbed_methods
|
13
14
|
subject_class.class_eval do
|
14
15
|
stubbed_methods.each do |name, value|
|
@@ -3,21 +3,22 @@ module RR
|
|
3
3
|
module Strategies
|
4
4
|
class Strategy
|
5
5
|
attr_reader :double_definition_create, :definition, :method_name, :args, :handler
|
6
|
+
|
6
7
|
include Space::Reader
|
7
8
|
|
8
9
|
def initialize(double_definition_create)
|
9
10
|
@double_definition_create = double_definition_create
|
10
11
|
end
|
11
|
-
|
12
|
+
|
12
13
|
def call(definition, method_name, args, handler)
|
13
14
|
@definition, @method_name, @args, @handler = definition, method_name, args, handler
|
14
15
|
do_call
|
15
16
|
end
|
16
17
|
|
17
18
|
def verify_subject(subject)
|
18
|
-
end
|
19
|
+
end
|
19
20
|
|
20
|
-
|
21
|
+
protected
|
21
22
|
def do_call
|
22
23
|
raise NotImplementedError
|
23
24
|
end
|
@@ -40,4 +41,4 @@ module RR
|
|
40
41
|
end
|
41
42
|
end
|
42
43
|
end
|
43
|
-
end
|
44
|
+
end
|
@@ -4,10 +4,10 @@ module RR
|
|
4
4
|
module StrategyMethods
|
5
5
|
extend(Module.new do
|
6
6
|
def lately_bound_alias_method(target_method_name, source_method_name)
|
7
|
-
module_eval(
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
module_eval(<<-METHOD, __FILE__, __LINE__+1)
|
8
|
+
def #{target_method_name}(*args, &block)
|
9
|
+
#{source_method_name}(*args, &block)
|
10
|
+
end
|
11
11
|
METHOD
|
12
12
|
end
|
13
13
|
end)
|
@@ -39,14 +39,12 @@ module RR
|
|
39
39
|
def any_instance_of!(method_name=nil, &definition_eval_block)
|
40
40
|
any_instance_of(Object.new, method_name, &definition_eval_block)
|
41
41
|
end
|
42
|
-
lately_bound_alias_method :all_instances_of, :any_instance_of
|
43
|
-
lately_bound_alias_method :all_instances_of!, :any_instance_of!
|
44
42
|
|
45
43
|
def instance_of!(method_name=nil, &definition_eval_block)
|
46
44
|
instance_of(Object.new, method_name, &definition_eval_block)
|
47
45
|
end
|
48
|
-
lately_bound_alias_method :
|
49
|
-
lately_bound_alias_method :
|
46
|
+
lately_bound_alias_method :all_instances_of, :instance_of
|
47
|
+
lately_bound_alias_method :all_instances_of!, :instance_of!
|
50
48
|
end
|
51
49
|
end
|
52
50
|
end
|
@@ -14,7 +14,7 @@ module RR
|
|
14
14
|
#
|
15
15
|
# When passed the subject, a DoubleDefinitionCreateBlankSlate is returned. Passing
|
16
16
|
# a method with arguments to the proxy will set up expectations that
|
17
|
-
#
|
17
|
+
# a call to the subject's method with the arguments will happen,
|
18
18
|
# and return the prescribed value.
|
19
19
|
# mock(subject).method_name_1 {return_value_1}
|
20
20
|
# mock(subject).method_name_2(arg1, arg2) {return_value_2}
|
@@ -29,7 +29,7 @@ module RR
|
|
29
29
|
# mock(subject) do
|
30
30
|
# method_name_1 {return_value_1}
|
31
31
|
# method_name_2(arg_1, arg_2) {return_value_2}
|
32
|
-
# end
|
32
|
+
# end
|
33
33
|
class Mock < VerificationStrategy
|
34
34
|
protected
|
35
35
|
def do_call
|
@@ -39,4 +39,4 @@ module RR
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
42
|
-
end
|
42
|
+
end
|
data/lib/rr/double_matches.rb
CHANGED
@@ -5,6 +5,7 @@ module RR
|
|
5
5
|
:exact_non_terminal_doubles_to_attempt,
|
6
6
|
:wildcard_terminal_doubles_to_attempt,
|
7
7
|
:wildcard_non_terminal_doubles_to_attempt
|
8
|
+
|
8
9
|
def initialize(doubles) #:nodoc:
|
9
10
|
@doubles = doubles
|
10
11
|
@matching_doubles = []
|
@@ -39,4 +40,4 @@ module RR
|
|
39
40
|
self
|
40
41
|
end
|
41
42
|
end
|
42
|
-
end
|
43
|
+
end
|
@@ -32,10 +32,10 @@ module RR
|
|
32
32
|
expected_arguments == other.expected_arguments
|
33
33
|
end
|
34
34
|
|
35
|
-
|
35
|
+
protected
|
36
36
|
def equality_match(arg1, arg2)
|
37
37
|
arg1.respond_to?(:'__rr__original_==') ? arg1.__send__(:'__rr__original_==', arg2) : arg1 == arg2
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
41
|
-
end
|
41
|
+
end
|
@@ -86,6 +86,7 @@ module RR
|
|
86
86
|
end
|
87
87
|
end
|
88
88
|
end)
|
89
|
+
|
89
90
|
include ClassInstanceMethodDefined
|
90
91
|
|
91
92
|
attr_reader :subject_class, :method_name, :doubles
|
@@ -126,12 +127,12 @@ module RR
|
|
126
127
|
BoundObjects[id] = subject_class
|
127
128
|
|
128
129
|
subject_class.class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
129
|
-
|
130
|
-
|
131
|
-
|
130
|
+
def #{method_name}(*args, &block)
|
131
|
+
::RR::Injections::DoubleInjection::BoundObjects[#{id}].class_eval do
|
132
|
+
remove_method(:#{method_name})
|
133
|
+
end
|
134
|
+
method_missing(:#{method_name}, *args, &block)
|
132
135
|
end
|
133
|
-
method_missing(:#{method_name}, *args, &block)
|
134
|
-
end
|
135
136
|
RUBY
|
136
137
|
self
|
137
138
|
end
|
@@ -141,11 +142,11 @@ module RR
|
|
141
142
|
BoundObjects[id] = subject_class
|
142
143
|
|
143
144
|
subject_class.class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
145
|
+
def #{method_name}(*args, &block)
|
146
|
+
arguments = MethodArguments.new(args, block)
|
147
|
+
obj = ::RR::Injections::DoubleInjection::BoundObjects[#{id}]
|
148
|
+
RR::Injections::DoubleInjection.dispatch_method(self, obj, :#{method_name}, arguments.arguments, arguments.block)
|
149
|
+
end
|
149
150
|
RUBY
|
150
151
|
self
|
151
152
|
end
|
@@ -203,7 +204,7 @@ module RR
|
|
203
204
|
@dispatch_method_delegates_to_dispatch_original_method = nil
|
204
205
|
end
|
205
206
|
|
206
|
-
|
207
|
+
protected
|
207
208
|
def deferred_bind_method
|
208
209
|
unless subject_has_method_defined?(original_method_alias_name)
|
209
210
|
bind_method_with_alias
|
@@ -22,7 +22,7 @@ module RR
|
|
22
22
|
subject_class.instance_method(original_method_alias_name)
|
23
23
|
end
|
24
24
|
|
25
|
-
|
25
|
+
protected
|
26
26
|
def subject_respond_to_method?(subject, method_name)
|
27
27
|
subject_has_method_defined?(method_name) ||
|
28
28
|
class_instance_method_defined(subject_class, :respond_to?) &&
|
@@ -30,4 +30,4 @@ module RR
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
33
|
-
end
|
33
|
+
end
|
@@ -12,9 +12,13 @@ module RR
|
|
12
12
|
instances.include?(subject)
|
13
13
|
end
|
14
14
|
end)
|
15
|
+
|
16
|
+
BoundObjects = {}
|
17
|
+
|
15
18
|
include ClassInstanceMethodDefined
|
16
19
|
|
17
20
|
attr_reader :subject_class
|
21
|
+
|
18
22
|
def initialize(subject_class)
|
19
23
|
@subject_class = subject_class
|
20
24
|
@placeholder_method_defined = false
|
@@ -30,6 +34,18 @@ module RR
|
|
30
34
|
end
|
31
35
|
end
|
32
36
|
end
|
37
|
+
# Ruby 1.9 will raise a NoMethodError when #method_missing is defined
|
38
|
+
# on the subject, but #to_ary isn't. #method_missing will always be
|
39
|
+
# defined thanks to BasicObject, but #to_ary may not, so in this case
|
40
|
+
# we need to supply our own. Furthermore, Ruby has special logic to
|
41
|
+
# handle the return value of #to_ary; if it is nil, then it tells Ruby
|
42
|
+
# to ignore #to_ary altogether and use a default rule to arrayify the
|
43
|
+
# object in question.
|
44
|
+
unless class_instance_method_defined(subject_class, :to_ary)
|
45
|
+
subject_class.class_eval do
|
46
|
+
def to_ary; nil; end
|
47
|
+
end
|
48
|
+
end
|
33
49
|
subject_class.__send__(:alias_method, original_method_alias_name, :method_missing)
|
34
50
|
bind_method
|
35
51
|
end
|
@@ -50,18 +66,16 @@ module RR
|
|
50
66
|
end
|
51
67
|
end
|
52
68
|
|
53
|
-
|
54
|
-
BoundObjects = {}
|
55
|
-
|
69
|
+
protected
|
56
70
|
def bind_method
|
57
71
|
id = BoundObjects.size
|
58
72
|
BoundObjects[id] = subject_class
|
59
73
|
|
60
74
|
subject_class.class_eval((<<-METHOD), __FILE__, __LINE__ + 1)
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
75
|
+
def method_missing(method_name, *args, &block)
|
76
|
+
obj = ::RR::Injections::MethodMissingInjection::BoundObjects[#{id}]
|
77
|
+
MethodDispatches::MethodMissingDispatch.new(self, obj, method_name, args, block).call
|
78
|
+
end
|
65
79
|
METHOD
|
66
80
|
end
|
67
81
|
|
@@ -16,9 +16,11 @@ module RR
|
|
16
16
|
instances.include?(subject)
|
17
17
|
end
|
18
18
|
end)
|
19
|
+
|
19
20
|
include ClassInstanceMethodDefined
|
20
21
|
|
21
22
|
attr_reader :subject_class
|
23
|
+
|
22
24
|
def initialize(subject_class)
|
23
25
|
@subject_class = subject_class
|
24
26
|
@placeholder_method_defined = false
|
@@ -63,7 +65,7 @@ module RR
|
|
63
65
|
end
|
64
66
|
end
|
65
67
|
|
66
|
-
|
68
|
+
protected
|
67
69
|
def original_method_alias_name
|
68
70
|
"__rr__original_singleton_method_added"
|
69
71
|
end
|
@@ -2,6 +2,7 @@ module RR
|
|
2
2
|
module MethodDispatches
|
3
3
|
class MethodDispatch < BaseMethodDispatch
|
4
4
|
attr_reader :double_injection, :subject
|
5
|
+
|
5
6
|
def initialize(double_injection, subject, args, block)
|
6
7
|
@double_injection, @subject, @args, @block = double_injection, subject, args, block
|
7
8
|
@double = find_double_to_attempt
|
@@ -34,7 +35,7 @@ module RR
|
|
34
35
|
end
|
35
36
|
end
|
36
37
|
|
37
|
-
|
38
|
+
protected
|
38
39
|
def call_implementation
|
39
40
|
if implementation_is_original_method?
|
40
41
|
call_original_method
|
@@ -8,6 +8,7 @@ module RR
|
|
8
8
|
end)
|
9
9
|
|
10
10
|
attr_reader :subject, :subject_class, :method_name
|
11
|
+
|
11
12
|
def initialize(subject, subject_class, method_name, args, block)
|
12
13
|
@subject, @subject_class, @method_name, @args, @block = subject, subject_class, method_name, args, block
|
13
14
|
end
|
@@ -36,7 +37,7 @@ module RR
|
|
36
37
|
end
|
37
38
|
end
|
38
39
|
|
39
|
-
|
40
|
+
protected
|
40
41
|
def call_implementation
|
41
42
|
if implementation_is_original_method?
|
42
43
|
space.record_call(subject, method_name, args, block)
|
data/lib/rr/proc_from_block.rb
CHANGED
data/lib/rr/space.rb
CHANGED
@@ -13,7 +13,7 @@ module RR
|
|
13
13
|
end
|
14
14
|
attr_writer :instance
|
15
15
|
|
16
|
-
|
16
|
+
protected
|
17
17
|
def method_missing(method_name, *args, &block)
|
18
18
|
instance.__send__(method_name, *args, &block)
|
19
19
|
end
|
@@ -21,6 +21,7 @@ module RR
|
|
21
21
|
|
22
22
|
attr_reader :ordered_doubles, :recorded_calls
|
23
23
|
attr_accessor :trim_backtrace
|
24
|
+
|
24
25
|
def initialize
|
25
26
|
@ordered_doubles = []
|
26
27
|
@trim_backtrace = false
|
@@ -86,7 +87,7 @@ module RR
|
|
86
87
|
]
|
87
88
|
end
|
88
89
|
|
89
|
-
|
90
|
+
protected
|
90
91
|
# Removes the ordered Doubles from the list
|
91
92
|
def reset_ordered_doubles
|
92
93
|
@ordered_doubles.clear
|
data/lib/rr/version.rb
ADDED
data/spec/runner.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'session'
|
2
|
+
|
3
|
+
class SuitesRunner
|
4
|
+
TEST_SUITES = [
|
5
|
+
[:rspec, 'RSpec', 'RSpec'],
|
6
|
+
[:test_unit, 'TestUnit', 'Test::Unit'],
|
7
|
+
[:minitest, 'Minitest', 'MiniTest']
|
8
|
+
]
|
9
|
+
|
10
|
+
attr_reader :bash
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@bash = Session::Bash.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
TEST_SUITES.each_with_index do |(path, class_fragment, desc), i|
|
18
|
+
puts "----------------" unless i == 0
|
19
|
+
run_examples(path, class_fragment, desc)
|
20
|
+
puts
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def run_examples(path, class_fragment, desc)
|
25
|
+
path = File.expand_path("../suites/#{path}/runner.rb", __FILE__)
|
26
|
+
# From http://www.eglug.org/node/946
|
27
|
+
bash.execute "exec 3>&1", :out => STDOUT, :err => STDERR
|
28
|
+
# XXX: why are we checking for this warning here...
|
29
|
+
bash.execute "ruby -W #{path} 2>&1 >&3 3>&- | grep -v 'warning: useless use of' 3>&-; STATUS=${PIPESTATUS[0]}", :out => STDOUT, :err => STDERR
|
30
|
+
status = bash.execute("echo $STATUS")[0].to_s.strip.to_i
|
31
|
+
bash.execute "exec 3>&-", :out => STDOUT, :err => STDERR
|
32
|
+
unless status == 0
|
33
|
+
raise "#{desc} Suite Failed"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
if $0 == __FILE__
|
39
|
+
SuitesRunner.new.run
|
40
|
+
end
|
41
|
+
|