assert 2.14.0 → 2.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -3
- data/assert.gemspec +0 -2
- data/lib/assert/assert_runner.rb +1 -1
- data/lib/assert/assertions.rb +1 -1
- data/lib/assert/config.rb +6 -1
- data/lib/assert/config_helpers.rb +75 -0
- data/lib/assert/context.rb +20 -14
- data/lib/assert/context/test_dsl.rb +17 -13
- data/lib/assert/{view/default_view.rb → default_view.rb} +9 -17
- data/lib/assert/factory.rb +2 -7
- data/lib/assert/file_line.rb +7 -3
- data/lib/assert/macro.rb +1 -1
- data/lib/assert/macros/methods.rb +1 -1
- data/lib/assert/result.rb +84 -90
- data/lib/assert/runner.rb +8 -2
- data/lib/assert/suite.rb +15 -5
- data/lib/assert/test.rb +112 -75
- data/lib/assert/version.rb +1 -1
- data/lib/assert/view.rb +108 -21
- data/lib/assert/view_helpers.rb +238 -0
- data/test/support/factory.rb +23 -6
- data/test/system/test_tests.rb +359 -0
- data/test/unit/assertions_tests.rb +1 -1
- data/test/unit/config_helpers_tests.rb +95 -0
- data/test/unit/config_tests.rb +5 -1
- data/test/unit/context/test_dsl_tests.rb +25 -17
- data/test/unit/context_tests.rb +45 -10
- data/test/unit/factory_tests.rb +9 -11
- data/test/unit/file_line_tests.rb +22 -0
- data/test/unit/result_tests.rb +219 -160
- data/test/unit/runner_tests.rb +19 -5
- data/test/unit/suite_tests.rb +23 -4
- data/test/unit/test_tests.rb +167 -33
- data/test/unit/view_helpers_tests.rb +210 -0
- data/test/unit/view_tests.rb +66 -26
- metadata +12 -23
- data/lib/assert/view/base.rb +0 -91
- data/lib/assert/view/helpers/ansi_styles.rb +0 -25
- data/lib/assert/view/helpers/common.rb +0 -209
- data/test/system/running_tests.rb +0 -404
data/lib/assert/result.rb
CHANGED
@@ -9,84 +9,100 @@ module Assert::Result
|
|
9
9
|
class Skip < Base; end
|
10
10
|
|
11
11
|
def self.types
|
12
|
-
{
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
17
|
-
|
12
|
+
@types ||= Hash.new{ |h, k| Base }.tap do |hash|
|
13
|
+
hash[:pass] = Pass
|
14
|
+
hash[:fail] = Fail
|
15
|
+
hash[:ignore] = Ignore
|
16
|
+
hash[:skip] = Skip
|
17
|
+
hash[:error] = Error
|
18
|
+
end.freeze
|
18
19
|
end
|
19
20
|
|
20
|
-
|
21
|
+
def self.new(data = nil)
|
22
|
+
data ||= {}
|
23
|
+
self.types[data[:type]].new(data)
|
24
|
+
end
|
21
25
|
|
22
|
-
|
26
|
+
class Base
|
23
27
|
|
24
|
-
def
|
25
|
-
|
26
|
-
@backtrace = Backtrace.new(backtrace)
|
27
|
-
@message = message && !message.empty? ? message : nil
|
28
|
-
end
|
28
|
+
def self.type; :unknown; end
|
29
|
+
def self.name; ''; end
|
29
30
|
|
30
|
-
|
31
|
-
|
31
|
+
def self.for_test(test, message, bt)
|
32
|
+
self.new({
|
33
|
+
:test_name => test.name,
|
34
|
+
:message => message,
|
35
|
+
:backtrace => Backtrace.new(bt)
|
36
|
+
})
|
32
37
|
end
|
33
38
|
|
34
|
-
def
|
35
|
-
@
|
39
|
+
def initialize(build_data)
|
40
|
+
@build_data = build_data
|
36
41
|
end
|
37
42
|
|
38
|
-
def
|
43
|
+
def type; @type ||= (@build_data[:type] || self.class.type).to_sym; end
|
44
|
+
def name; @name ||= (@build_data[:name] || self.class.name.to_s); end
|
45
|
+
def test_name; @test_name ||= (@build_data[:test_name] || ''); end
|
46
|
+
def message; @message ||= (@build_data[:message] || ''); end
|
47
|
+
def backtrace; @backtrace ||= (@build_data[:backtrace] || Backtrace.new([])); end
|
48
|
+
def trace; @trace ||= (@build_data[:trace] || build_trace(self.backtrace)); end
|
39
49
|
|
40
|
-
|
41
|
-
|
42
|
-
self.message,
|
43
|
-
self.trace
|
44
|
-
].compact.join("\n")
|
50
|
+
Assert::Result.types.keys.each do |type|
|
51
|
+
define_method("#{type}?"){ self.type == type }
|
45
52
|
end
|
46
53
|
|
47
|
-
|
48
|
-
|
54
|
+
# we choose to implement this way instead of using an `attr_writer` to be
|
55
|
+
# consistant with how you override exception backtraces.
|
56
|
+
def set_backtrace(bt)
|
57
|
+
@backtrace = Backtrace.new(bt)
|
58
|
+
@trace = build_trace(@backtrace)
|
49
59
|
end
|
50
60
|
|
51
|
-
def
|
52
|
-
|
61
|
+
def data
|
62
|
+
{ :type => self.type,
|
63
|
+
:name => self.name,
|
64
|
+
:test_name => self.test_name,
|
65
|
+
:message => self.message,
|
66
|
+
:backtrace => self.backtrace,
|
67
|
+
:trace => self.trace,
|
68
|
+
}
|
53
69
|
end
|
54
70
|
|
55
|
-
|
56
|
-
|
57
|
-
def
|
58
|
-
|
71
|
+
def to_sym; self.type; end
|
72
|
+
|
73
|
+
def to_s
|
74
|
+
[ "#{self.name.upcase}: #{self.test_name}",
|
75
|
+
self.message,
|
76
|
+
self.trace
|
77
|
+
].reject(&:empty?).join("\n")
|
59
78
|
end
|
60
79
|
|
61
|
-
def ==(
|
62
|
-
self.
|
80
|
+
def ==(other_result)
|
81
|
+
self.type == other_result.type && self.message == other_result.message
|
63
82
|
end
|
64
83
|
|
65
84
|
def inspect
|
66
85
|
"#<#{self.class}:#{'0x0%x' % (object_id << 1)} @message=#{self.message.inspect}>"
|
67
86
|
end
|
68
87
|
|
88
|
+
private
|
89
|
+
|
90
|
+
# by default, a result's trace is the first line of its filtered backtrace
|
91
|
+
def build_trace(backtrace); backtrace.filtered.first.to_s; end
|
92
|
+
|
69
93
|
end
|
70
94
|
|
71
95
|
class Pass < Base
|
72
96
|
|
73
|
-
def pass
|
74
|
-
def
|
75
|
-
|
76
|
-
def name
|
77
|
-
"Pass"
|
78
|
-
end
|
97
|
+
def self.type; :pass; end
|
98
|
+
def self.name; 'Pass'; end
|
79
99
|
|
80
100
|
end
|
81
101
|
|
82
102
|
class Ignore < Base
|
83
103
|
|
84
|
-
def ignore
|
85
|
-
def
|
86
|
-
|
87
|
-
def name
|
88
|
-
"Ignore"
|
89
|
-
end
|
104
|
+
def self.type; :ignore; end
|
105
|
+
def self.name; 'Ignore'; end
|
90
106
|
|
91
107
|
end
|
92
108
|
|
@@ -95,24 +111,20 @@ module Assert::Result
|
|
95
111
|
|
96
112
|
class Fail < Base
|
97
113
|
|
114
|
+
def self.type; :fail; end
|
115
|
+
def self.name; 'Fail'; end
|
116
|
+
|
98
117
|
# fail results can be generated manually or by raising Assert::Result::TestFailure
|
99
|
-
def
|
118
|
+
def self.for_test(test, message_or_exception, bt = nil)
|
100
119
|
if message_or_exception.kind_of?(TestFailure)
|
101
|
-
super(test, message_or_exception.message, message_or_exception.backtrace
|
120
|
+
super(test, message_or_exception.message, message_or_exception.backtrace)
|
102
121
|
elsif message_or_exception.kind_of?(Exception)
|
103
122
|
raise ArgumentError, "generate fail results by raising Assert::Result::TestFailure"
|
104
123
|
else
|
105
|
-
super(test, message_or_exception,
|
124
|
+
super(test, message_or_exception, bt)
|
106
125
|
end
|
107
126
|
end
|
108
127
|
|
109
|
-
def fail?; true; end
|
110
|
-
def to_sym; :fail; end
|
111
|
-
|
112
|
-
def name
|
113
|
-
"Fail"
|
114
|
-
end
|
115
|
-
|
116
128
|
end
|
117
129
|
|
118
130
|
# raised by the 'skip' context helper to break test execution
|
@@ -120,71 +132,52 @@ module Assert::Result
|
|
120
132
|
|
121
133
|
class Skip < Base
|
122
134
|
|
135
|
+
def self.type; :skip; end
|
136
|
+
def self.name; 'Skip'; end
|
137
|
+
|
123
138
|
# skip results are generated by raising Assert::Result::TestSkipped
|
124
|
-
def
|
139
|
+
def self.for_test(test, exception)
|
125
140
|
if exception.kind_of?(TestSkipped)
|
126
|
-
super(test, exception.message, exception.backtrace
|
141
|
+
super(test, exception.message, exception.backtrace)
|
127
142
|
else
|
128
143
|
raise ArgumentError, "generate skip results by raising Assert::Result::TestSkipped"
|
129
144
|
end
|
130
145
|
end
|
131
146
|
|
132
|
-
def skip?; true; end
|
133
|
-
def to_sym; :skip; end
|
134
|
-
|
135
|
-
def name
|
136
|
-
"Skip"
|
137
|
-
end
|
138
|
-
|
139
147
|
end
|
140
148
|
|
141
149
|
class Error < Base
|
142
150
|
|
151
|
+
def self.type; :error; end
|
152
|
+
def self.name; 'Error'; end
|
153
|
+
|
143
154
|
# error results are generated by raising exceptions in tests
|
144
|
-
def
|
155
|
+
def self.for_test(test, exception)
|
145
156
|
if exception.kind_of?(Exception)
|
146
|
-
super(test, "#{exception.message} (#{exception.class.name})", exception.backtrace
|
157
|
+
super(test, "#{exception.message} (#{exception.class.name})", exception.backtrace)
|
147
158
|
else
|
148
159
|
raise ArgumentError, "generate error results by raising an exception"
|
149
160
|
end
|
150
161
|
end
|
151
162
|
|
152
|
-
|
153
|
-
def to_sym; :error; end
|
154
|
-
|
155
|
-
def name
|
156
|
-
"Error"
|
157
|
-
end
|
163
|
+
private
|
158
164
|
|
159
165
|
# override of the base, always show the full unfiltered backtrace for errors
|
160
|
-
def
|
161
|
-
self.backtrace.to_s
|
162
|
-
end
|
166
|
+
def build_trace(backtrace); backtrace.to_s; end
|
163
167
|
|
164
168
|
end
|
165
169
|
|
166
|
-
|
167
|
-
|
168
|
-
class Set < ::Array
|
169
|
-
attr_accessor :callback
|
170
|
+
class Backtrace < ::Array
|
170
171
|
|
171
|
-
|
172
|
-
@callback = callback
|
173
|
-
super()
|
174
|
-
end
|
172
|
+
DELIM = "\n".freeze
|
175
173
|
|
176
|
-
def
|
177
|
-
super
|
178
|
-
@callback.call(result) if @callback
|
179
|
-
end
|
180
|
-
end
|
174
|
+
def self.parse(bt); self.new(bt.to_s.split(DELIM)); end
|
181
175
|
|
182
|
-
class Backtrace < ::Array
|
183
176
|
def initialize(value = nil)
|
184
177
|
super([*(value || "No backtrace")])
|
185
178
|
end
|
186
179
|
|
187
|
-
def to_s; self.join(
|
180
|
+
def to_s; self.join(DELIM); end
|
188
181
|
|
189
182
|
def filtered
|
190
183
|
self.class.new(self.reject { |line| filter_out?(line) })
|
@@ -199,6 +192,7 @@ module Assert::Result
|
|
199
192
|
assert_bin_regex = /bin\/assert\:/
|
200
193
|
line.rindex(assert_lib_path, 0) || line =~ assert_bin_regex
|
201
194
|
end
|
195
|
+
|
202
196
|
end
|
203
197
|
|
204
198
|
end
|
data/lib/assert/runner.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
require 'assert/config_helpers'
|
1
2
|
require 'assert/suite'
|
2
3
|
|
3
4
|
module Assert
|
4
5
|
|
5
6
|
class Runner
|
7
|
+
include Assert::ConfigHelpers
|
6
8
|
|
7
9
|
attr_reader :config
|
8
10
|
|
@@ -10,8 +12,12 @@ module Assert
|
|
10
12
|
@config = config
|
11
13
|
end
|
12
14
|
|
13
|
-
def run
|
15
|
+
def run
|
16
|
+
suite, view = @config.suite, @config.view
|
14
17
|
raise ArgumentError if !suite.kind_of?(Suite)
|
18
|
+
if tests?
|
19
|
+
view.puts "Running tests in random order, seeded with \"#{runner_seed}\""
|
20
|
+
end
|
15
21
|
view.fire(:on_start)
|
16
22
|
|
17
23
|
begin
|
@@ -39,7 +45,7 @@ module Assert
|
|
39
45
|
|
40
46
|
def tests_to_run(suite)
|
41
47
|
srand self.config.runner_seed
|
42
|
-
suite.tests.sort.sort_by
|
48
|
+
suite.tests.sort.sort_by{ rand suite.tests.size }
|
43
49
|
end
|
44
50
|
|
45
51
|
end
|
data/lib/assert/suite.rb
CHANGED
@@ -14,8 +14,8 @@ module Assert
|
|
14
14
|
@config = config
|
15
15
|
@tests = []
|
16
16
|
@test_methods = []
|
17
|
-
@start_time =
|
18
|
-
@end_time =
|
17
|
+
@start_time = Time.now
|
18
|
+
@end_time = @start_time
|
19
19
|
end
|
20
20
|
|
21
21
|
def run_time
|
@@ -32,8 +32,12 @@ module Assert
|
|
32
32
|
|
33
33
|
alias_method :ordered_tests, :tests
|
34
34
|
|
35
|
+
def ordered_tests_by_run_time
|
36
|
+
self.ordered_tests.sort{ |a, b| a.run_time <=> b.run_time }
|
37
|
+
end
|
38
|
+
|
35
39
|
def results
|
36
|
-
tests.inject([])
|
40
|
+
tests.inject([]){ |results, test| results += test.results }
|
37
41
|
end
|
38
42
|
alias_method :ordered_results, :results
|
39
43
|
|
@@ -62,7 +66,7 @@ module Assert
|
|
62
66
|
self.tests.size
|
63
67
|
end
|
64
68
|
|
65
|
-
def result_count(type=nil)
|
69
|
+
def result_count(type = nil)
|
66
70
|
if type
|
67
71
|
self.tests.inject(0) do |count, test|
|
68
72
|
count += test.result_count(type)
|
@@ -130,13 +134,19 @@ module Assert
|
|
130
134
|
end
|
131
135
|
|
132
136
|
class ContextInfo
|
137
|
+
|
133
138
|
attr_reader :called_from, :klass, :file
|
134
139
|
|
135
|
-
def initialize(klass, called_from=nil, first_caller=nil)
|
140
|
+
def initialize(klass, called_from = nil, first_caller = nil)
|
136
141
|
@called_from = called_from || first_caller
|
137
142
|
@klass = klass
|
138
143
|
@file = @called_from.gsub(/\:[0-9]+.*$/, '') if @called_from
|
139
144
|
end
|
145
|
+
|
146
|
+
def test_name(name)
|
147
|
+
[klass.description.to_s, name.to_s].compact.reject(&:empty?).join(' ')
|
148
|
+
end
|
149
|
+
|
140
150
|
end
|
141
151
|
|
142
152
|
end
|
data/lib/assert/test.rb
CHANGED
@@ -6,62 +6,113 @@ module Assert
|
|
6
6
|
|
7
7
|
class Test
|
8
8
|
|
9
|
-
# a Test is some code/method to run in the scope of a Context
|
10
|
-
#
|
9
|
+
# a Test is some code/method to run in the scope of a Context that may
|
10
|
+
# produce results
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
def self.result_count_meth(type)
|
13
|
+
"#{type}_result_count".to_sym
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.name_file_line_context_data(ci, name)
|
17
|
+
{ :name => ci.test_name(name),
|
18
|
+
:file_line => ci.called_from
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.for_block(name, context_info, config, &block)
|
23
|
+
self.new(self.name_file_line_context_data(context_info, name).merge({
|
24
|
+
:context_info => context_info,
|
25
|
+
:config => config,
|
26
|
+
:code => block
|
27
|
+
}))
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.for_method(method_name, context_info, config)
|
31
|
+
self.new(self.name_file_line_context_data(context_info, method_name).merge({
|
32
|
+
:context_info => context_info,
|
33
|
+
:config => config,
|
34
|
+
:code => proc{ self.send(method_name) }
|
35
|
+
}))
|
36
|
+
end
|
37
|
+
|
38
|
+
attr_reader :results
|
39
|
+
attr_writer :total_result_count
|
40
|
+
|
41
|
+
def initialize(build_data = nil)
|
42
|
+
@build_data, @results = build_data || {}, []
|
43
|
+
end
|
44
|
+
|
45
|
+
def file_line; @file_line ||= FileLine.parse((@build_data[:file_line] || '').to_s); end
|
46
|
+
def name; @name ||= (@build_data[:name] || ''); end
|
47
|
+
def output; @output ||= (@build_data[:output] || ''); end
|
48
|
+
def run_time; @run_time ||= (@build_data[:run_time] || 0); end
|
49
|
+
|
50
|
+
def total_result_count
|
51
|
+
@total_result_count ||= (@build_data[:total_result_count] || 0)
|
52
|
+
end
|
15
53
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
54
|
+
Assert::Result.types.keys.each do |type|
|
55
|
+
n = result_count_meth(type)
|
56
|
+
define_method(n) do
|
57
|
+
instance_variable_get("@#{n}") || instance_variable_set("@#{n}", @build_data[n] || 0)
|
58
|
+
end
|
59
|
+
end
|
20
60
|
|
21
|
-
|
22
|
-
|
61
|
+
def context_info; @context_info ||= @build_data[:context_info]; end
|
62
|
+
def config; @config ||= @build_data[:config]; end
|
63
|
+
def code; @code ||= @build_data[:code]; end
|
23
64
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
65
|
+
def data
|
66
|
+
{ :file_line => self.file_line.to_s,
|
67
|
+
:name => self.name.to_s,
|
68
|
+
:output => self.output.to_s,
|
69
|
+
:run_time => self.run_time
|
70
|
+
}.merge(result_count_data(:total_result_count => self.total_result_count))
|
28
71
|
end
|
29
72
|
|
30
73
|
def context_class; self.context_info.klass; end
|
31
74
|
def file; self.file_line.file; end
|
32
75
|
def line_number; self.file_line.line; end
|
33
76
|
|
34
|
-
def
|
35
|
-
|
77
|
+
def result_rate
|
78
|
+
get_rate(self.result_count, self.run_time)
|
79
|
+
end
|
80
|
+
|
81
|
+
def result_count(type = nil)
|
82
|
+
if Assert::Result.types.keys.include?(type)
|
83
|
+
self.send(result_count_meth(type))
|
84
|
+
else
|
85
|
+
self.total_result_count
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def capture_result(result, callback)
|
90
|
+
self.results << result
|
91
|
+
self.total_result_count += 1
|
92
|
+
n = result_count_meth(result.to_sym)
|
93
|
+
instance_variable_set("@#{n}", (instance_variable_get("@#{n}") || 0) + 1)
|
94
|
+
callback.call(result)
|
95
|
+
end
|
36
96
|
|
37
|
-
|
97
|
+
def run(&result_callback)
|
98
|
+
result_callback ||= proc{ |result| } # do nothing by default
|
99
|
+
scope = self.context_class.new(self, self.config, result_callback)
|
38
100
|
start_time = Time.now
|
39
101
|
capture_output do
|
40
|
-
self.context_class.send('run_arounds', scope)
|
102
|
+
self.context_class.send('run_arounds', scope) do # TODO: why `send`?
|
103
|
+
run_test(scope, result_callback)
|
104
|
+
end
|
41
105
|
end
|
42
106
|
@run_time = Time.now - start_time
|
43
|
-
|
44
107
|
@results
|
45
108
|
end
|
46
109
|
|
47
110
|
Assert::Result.types.each do |name, klass|
|
48
111
|
define_method "#{name}_results" do
|
49
|
-
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def result_count(type=nil)
|
54
|
-
if Assert::Result.types.include?(type)
|
55
|
-
self.send("#{type}_results").size
|
56
|
-
else
|
57
|
-
@results.size
|
112
|
+
self.results.select{|r| r.kind_of?(klass) }
|
58
113
|
end
|
59
114
|
end
|
60
115
|
|
61
|
-
def result_rate
|
62
|
-
get_rate(self.result_count, self.run_time)
|
63
|
-
end
|
64
|
-
|
65
116
|
def <=>(other_test)
|
66
117
|
self.name <=> other_test.name
|
67
118
|
end
|
@@ -75,57 +126,40 @@ module Assert
|
|
75
126
|
|
76
127
|
private
|
77
128
|
|
78
|
-
def
|
129
|
+
def run_test(scope, result_callback)
|
79
130
|
begin
|
80
|
-
|
81
|
-
|
131
|
+
# run any assert style 'setup do' setups
|
132
|
+
self.context_class.send('run_setups', scope) # TODO: why `send`?
|
133
|
+
# run any test/unit style 'def setup' setups
|
134
|
+
scope.setup if scope.respond_to?(:setup)
|
135
|
+
# run the code block
|
136
|
+
scope.instance_eval(&(self.code || proc{}))
|
82
137
|
rescue Result::TestFailure => err
|
83
|
-
|
138
|
+
capture_result(Result::Fail.for_test(self, err), result_callback)
|
84
139
|
rescue Result::TestSkipped => err
|
85
|
-
|
140
|
+
capture_result(Result::Skip.for_test(self, err), result_callback)
|
86
141
|
rescue SignalException => err
|
87
142
|
raise(err)
|
88
143
|
rescue Exception => err
|
89
|
-
|
144
|
+
capture_result(Result::Error.for_test(self, err), result_callback)
|
90
145
|
ensure
|
91
146
|
begin
|
92
|
-
|
147
|
+
# run any assert style 'teardown do' teardowns
|
148
|
+
self.context_class.send('run_teardowns', scope) # TODO: why `send`?
|
149
|
+
# run any test/unit style 'def teardown' teardowns
|
150
|
+
scope.teardown if scope.respond_to?(:teardown)
|
93
151
|
rescue Result::TestFailure => err
|
94
|
-
|
152
|
+
capture_result(Result::Fail.for_test(self, err), result_callback)
|
95
153
|
rescue Result::TestSkipped => err
|
96
|
-
|
154
|
+
capture_result(Result::Skip.for_test(self, err), result_callback)
|
97
155
|
rescue SignalException => err
|
98
156
|
raise(err)
|
99
|
-
rescue Exception =>
|
100
|
-
|
157
|
+
rescue Exception => err
|
158
|
+
capture_result(Result::Error.for_test(self, err), result_callback)
|
101
159
|
end
|
102
160
|
end
|
103
161
|
end
|
104
162
|
|
105
|
-
def run_test_setup(scope)
|
106
|
-
# run any assert style 'setup do' setups
|
107
|
-
self.context_class.send('run_setups', scope)
|
108
|
-
|
109
|
-
# run any classic test/unit style 'def setup' setups
|
110
|
-
scope.setup if scope.respond_to?(:setup)
|
111
|
-
end
|
112
|
-
|
113
|
-
def run_test_code(scope)
|
114
|
-
if @code.kind_of?(::Proc)
|
115
|
-
scope.instance_eval(&@code)
|
116
|
-
elsif scope.respond_to?(@code.to_s)
|
117
|
-
scope.send(@code.to_s)
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
def run_test_teardown(scope)
|
122
|
-
# run any classic test/unit style 'def teardown' teardowns
|
123
|
-
scope.teardown if scope.respond_to?(:teardown)
|
124
|
-
|
125
|
-
# run any assert style 'teardown do' teardowns
|
126
|
-
self.context_class.send('run_teardowns', scope)
|
127
|
-
end
|
128
|
-
|
129
163
|
def capture_output(&block)
|
130
164
|
if self.config.capture_output == true
|
131
165
|
orig_stdout = $stdout.clone
|
@@ -138,15 +172,18 @@ module Assert
|
|
138
172
|
end
|
139
173
|
|
140
174
|
def capture_io
|
141
|
-
StringIO.new(
|
175
|
+
StringIO.new(self.output, "a+")
|
176
|
+
end
|
177
|
+
|
178
|
+
def result_count_data(seed)
|
179
|
+
Assert::Result.types.keys.inject(seed) do |d, t|
|
180
|
+
d[result_count_meth(t)] = self.send(result_count_meth(t))
|
181
|
+
d
|
182
|
+
end
|
142
183
|
end
|
143
184
|
|
144
|
-
def
|
145
|
-
|
146
|
-
name
|
147
|
-
].compact.reject(&:empty?).join(" "),
|
148
|
-
FileLine.parse(context_info.called_from)
|
149
|
-
]
|
185
|
+
def result_count_meth(type)
|
186
|
+
self.class.result_count_meth(type)
|
150
187
|
end
|
151
188
|
|
152
189
|
def get_rate(count, time)
|