assert 2.16.3 → 2.16.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +1 -0
- data/lib/assert.rb +9 -0
- data/lib/assert/context.rb +42 -15
- data/lib/assert/context/test_dsl.rb +6 -6
- data/lib/assert/context_info.rb +1 -1
- data/lib/assert/default_view.rb +9 -0
- data/lib/assert/macros/methods.rb +14 -14
- data/lib/assert/result.rb +83 -38
- data/lib/assert/runner.rb +11 -0
- data/lib/assert/stub.rb +12 -16
- data/lib/assert/suite.rb +1 -0
- data/lib/assert/version.rb +1 -1
- data/lib/assert/view.rb +3 -1
- data/test/unit/assert_tests.rb +3 -1
- data/test/unit/context_tests.rb +117 -19
- data/test/unit/result_tests.rb +112 -37
- data/test/unit/runner_tests.rb +1 -1
- data/test/unit/stub_tests.rb +14 -4
- data/test/unit/suite_tests.rb +1 -1
- data/test/unit/view_tests.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
SHA512:
|
3
|
-
metadata.gz: 2f4a1019a10e96ae935cb6aa9fc17f93e5965659f3e401d367f5a81fe260960b28f1741218eaf2b9f9ca7993ba0fc6cbce5b447c78f9289812014daeb8c74108
|
4
|
-
data.tar.gz: d6a0657a4041933cadd0e238571cabd9092bbe4e4e7db2470deb75c80689c3ccf6df4601136ae8a4e910eaa815bb5066c7a5df875750aea5bd1300cdf1e5ff34
|
5
2
|
SHA1:
|
6
|
-
|
7
|
-
|
3
|
+
data.tar.gz: 1140a1218d3b3df2195ab376b494b275155951e2
|
4
|
+
metadata.gz: e696cad6f5a6a309c43c72c059f7072ad7b5fa28
|
5
|
+
SHA512:
|
6
|
+
data.tar.gz: d819e6364e40bd86571d63e87b93ca4277f441914d25b862543504a58eef9ab6cc8c29a95e7db502288e526b8de62abc52c355c3f21bf372ab57d2f1a87cc00d
|
7
|
+
metadata.gz: 6bd08bca020ce2e980da50aec61e574270c2e77e1441d3fc84c50d91b60651713c367b00c8aa78478abdb5bb2b0a379eb120ec73cd14c27d94a049f07bb0ac25
|
data/README.md
CHANGED
@@ -557,6 +557,7 @@ Available callbacks from the runner, and when they are called:
|
|
557
557
|
* `on_result`: when a running tests generates a result, the result is passed as an arg
|
558
558
|
* `after_test`: after a test finishes running, the test is passed as an arg
|
559
559
|
* `on_finish`: when the test suite is finished running
|
560
|
+
* `on_info`: called when the INFO signal is triggered while running the test suite (Ctrl-T on Macs)
|
560
561
|
* `on_interrupt`: called when the test suite is interrupted while running
|
561
562
|
|
562
563
|
Beyond that, each view can do as it sees fit. Initialize how you wish, take whatever settings you'd like, and output results as you see fit, given the available callbacks.
|
data/lib/assert.rb
CHANGED
@@ -23,3 +23,12 @@ module Assert
|
|
23
23
|
end
|
24
24
|
|
25
25
|
end
|
26
|
+
|
27
|
+
# Kernel#caller_locations polyfill for pre ruby 2.0.0
|
28
|
+
if RUBY_VERSION =~ /\A1\..+/ && !Kernel.respond_to?(:caller_locations)
|
29
|
+
module Kernel
|
30
|
+
def caller_locations(start = 1, length = nil)
|
31
|
+
length ? caller[start, length] : caller[start..-1]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/assert/context.rb
CHANGED
@@ -34,14 +34,14 @@ module Assert
|
|
34
34
|
|
35
35
|
if self.suite.test_methods.include?(klass_method_name)
|
36
36
|
puts "WARNING: redefining '#{klass_method_name}'"
|
37
|
-
puts " from: #{
|
37
|
+
puts " from: #{caller_locations(1,1)}"
|
38
38
|
else
|
39
39
|
self.suite.test_methods << klass_method_name
|
40
40
|
end
|
41
41
|
|
42
42
|
self.suite.on_test(Test.for_method(
|
43
43
|
method_name.to_s,
|
44
|
-
ContextInfo.new(self, nil,
|
44
|
+
ContextInfo.new(self, nil, caller_locations(1,1)),
|
45
45
|
self.suite.config
|
46
46
|
))
|
47
47
|
end
|
@@ -50,10 +50,13 @@ module Assert
|
|
50
50
|
def initialize(running_test, config, result_callback)
|
51
51
|
@__assert_running_test__ = running_test
|
52
52
|
@__assert_config__ = config
|
53
|
-
@__assert_with_bt__ =
|
53
|
+
@__assert_with_bt__ = []
|
54
|
+
@__assert_pending__ = 0
|
54
55
|
|
55
56
|
@__assert_result_callback__ = proc do |result|
|
56
|
-
|
57
|
+
if !@__assert_with_bt__.empty?
|
58
|
+
result.set_with_bt(@__assert_with_bt__.dup)
|
59
|
+
end
|
57
60
|
result_callback.call(result)
|
58
61
|
result
|
59
62
|
end
|
@@ -89,7 +92,12 @@ module Assert
|
|
89
92
|
# adds a Pass result to the end of the test's results
|
90
93
|
# does not break test execution
|
91
94
|
def pass(pass_msg = nil)
|
92
|
-
|
95
|
+
if @__assert_pending__ == 0
|
96
|
+
capture_result(Assert::Result::Pass, pass_msg)
|
97
|
+
else
|
98
|
+
capture_result(Assert::Result::Fail, "Pending pass (make it "\
|
99
|
+
"not pending)")
|
100
|
+
end
|
93
101
|
end
|
94
102
|
|
95
103
|
# adds an Ignore result to the end of the test's results
|
@@ -101,10 +109,18 @@ module Assert
|
|
101
109
|
# adds a Fail result to the end of the test's results
|
102
110
|
# break test execution if assert is configured to halt on failures
|
103
111
|
def fail(message = nil)
|
104
|
-
if
|
105
|
-
|
112
|
+
if @__assert_pending__ == 0
|
113
|
+
if halt_on_fail?
|
114
|
+
raise Result::TestFailure, message || ''
|
115
|
+
else
|
116
|
+
capture_result(Assert::Result::Fail, message || '')
|
117
|
+
end
|
106
118
|
else
|
107
|
-
|
119
|
+
if halt_on_fail?
|
120
|
+
raise Result::TestSkipped, "Pending fail: #{message || ''}"
|
121
|
+
else
|
122
|
+
capture_result(Assert::Result::Skip, "Pending fail: #{message || ''}")
|
123
|
+
end
|
108
124
|
end
|
109
125
|
end
|
110
126
|
alias_method :flunk, :fail
|
@@ -112,21 +128,32 @@ module Assert
|
|
112
128
|
# adds a Skip result to the end of the test's results
|
113
129
|
# breaks test execution
|
114
130
|
def skip(skip_msg = nil, called_from = nil)
|
115
|
-
|
116
|
-
|
117
|
-
|
131
|
+
raise Result::TestSkipped, (skip_msg || ''), called_from
|
132
|
+
end
|
133
|
+
|
134
|
+
# runs block and any fails are skips and any passes are fails
|
135
|
+
def pending(&block)
|
136
|
+
begin
|
137
|
+
@__assert_pending__ += 1
|
138
|
+
instance_eval(&block)
|
139
|
+
ensure
|
140
|
+
@__assert_pending__ -= 1
|
141
|
+
end
|
118
142
|
end
|
119
143
|
|
120
144
|
# alter the backtraces of fail/skip results generated in the given block
|
121
145
|
def with_backtrace(bt, &block)
|
122
146
|
bt ||= []
|
123
147
|
begin
|
124
|
-
@__assert_with_bt__
|
148
|
+
@__assert_with_bt__.push(bt.first)
|
125
149
|
instance_eval(&block)
|
126
150
|
rescue Result::TestSkipped, Result::TestFailure => e
|
127
|
-
e.
|
151
|
+
if e.assert_with_bt.nil? && !@__assert_with_bt__.empty?
|
152
|
+
e.assert_with_bt = @__assert_with_bt__.dup
|
153
|
+
end
|
154
|
+
raise(e)
|
128
155
|
ensure
|
129
|
-
@__assert_with_bt__
|
156
|
+
@__assert_with_bt__.pop
|
130
157
|
end
|
131
158
|
end
|
132
159
|
|
@@ -156,7 +183,7 @@ module Assert
|
|
156
183
|
|
157
184
|
def capture_result(result_klass, msg)
|
158
185
|
@__assert_result_callback__.call(
|
159
|
-
result_klass.for_test(@__assert_running_test__, msg,
|
186
|
+
result_klass.for_test(@__assert_running_test__, msg, caller_locations)
|
160
187
|
)
|
161
188
|
end
|
162
189
|
|
@@ -15,23 +15,23 @@ class Assert::Context
|
|
15
15
|
# create a test from the given code block
|
16
16
|
self.suite.on_test(Assert::Test.for_block(
|
17
17
|
desc_or_macro.kind_of?(Assert::Macro) ? desc_or_macro.name : desc_or_macro,
|
18
|
-
Assert::ContextInfo.new(self, called_from, first_caller ||
|
18
|
+
Assert::ContextInfo.new(self, called_from, first_caller || caller_locations.first),
|
19
19
|
self.suite.config,
|
20
20
|
&block
|
21
21
|
))
|
22
22
|
else
|
23
|
-
test_eventually(desc_or_macro, called_from, first_caller ||
|
23
|
+
test_eventually(desc_or_macro, called_from, first_caller || caller_locations.first, &block)
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
27
|
def test_eventually(desc_or_macro, called_from = nil, first_caller = nil, &block)
|
28
28
|
# create a test from a proc that just skips
|
29
|
-
ci = Assert::ContextInfo.new(self, called_from, first_caller ||
|
29
|
+
ci = Assert::ContextInfo.new(self, called_from, first_caller || caller_locations.first)
|
30
30
|
self.suite.on_test(Assert::Test.for_block(
|
31
31
|
desc_or_macro.kind_of?(Assert::Macro) ? desc_or_macro.name : desc_or_macro,
|
32
32
|
ci,
|
33
33
|
self.suite.config,
|
34
|
-
&proc { skip('TODO', ci.called_from) }
|
34
|
+
&proc { skip('TODO', [ci.called_from.to_s]) }
|
35
35
|
))
|
36
36
|
end
|
37
37
|
alias_method :test_skip, :test_eventually
|
@@ -40,14 +40,14 @@ class Assert::Context
|
|
40
40
|
if !desc_or_macro.kind_of?(Assert::Macro)
|
41
41
|
desc_or_macro = "should #{desc_or_macro}"
|
42
42
|
end
|
43
|
-
test(desc_or_macro, called_from, first_caller ||
|
43
|
+
test(desc_or_macro, called_from, first_caller || caller_locations.first, &block)
|
44
44
|
end
|
45
45
|
|
46
46
|
def should_eventually(desc_or_macro, called_from = nil, first_caller = nil, &block)
|
47
47
|
if !desc_or_macro.kind_of?(Assert::Macro)
|
48
48
|
desc_or_macro = "should #{desc_or_macro}"
|
49
49
|
end
|
50
|
-
test_eventually(desc_or_macro, called_from, first_caller ||
|
50
|
+
test_eventually(desc_or_macro, called_from, first_caller || caller_locations.first, &block)
|
51
51
|
end
|
52
52
|
alias_method :should_skip, :should_eventually
|
53
53
|
|
data/lib/assert/context_info.rb
CHANGED
@@ -7,7 +7,7 @@ module Assert
|
|
7
7
|
def initialize(klass, called_from = nil, first_caller = nil)
|
8
8
|
@called_from = called_from || first_caller
|
9
9
|
@klass = klass
|
10
|
-
@file = @called_from.gsub(/\:[0-9]+.*$/, '') if @called_from
|
10
|
+
@file = @called_from.to_s.gsub(/\:[0-9]+.*$/, '') if @called_from
|
11
11
|
end
|
12
12
|
|
13
13
|
def test_name(name)
|
data/lib/assert/default_view.rb
CHANGED
@@ -59,6 +59,15 @@ module Assert
|
|
59
59
|
"#{formatted_suite_result_rate} results/s)"
|
60
60
|
end
|
61
61
|
|
62
|
+
def on_info(test)
|
63
|
+
dump_test_results
|
64
|
+
|
65
|
+
puts "Current test:"
|
66
|
+
puts test.name
|
67
|
+
puts test.file_line.to_s
|
68
|
+
puts
|
69
|
+
end
|
70
|
+
|
62
71
|
def on_interrupt(err)
|
63
72
|
dump_test_results
|
64
73
|
end
|
@@ -10,7 +10,7 @@ module Assert::Macros
|
|
10
10
|
module ClassMethods
|
11
11
|
|
12
12
|
def have_instance_method(*methods)
|
13
|
-
called_from = (methods.last.kind_of?(Array) ? methods.pop :
|
13
|
+
called_from = (methods.last.kind_of?(Array) ? methods.pop : caller_locations).first
|
14
14
|
Assert::Macro.new do
|
15
15
|
methods.each{ |m| _methods_macro_instance_methods << [m, called_from] }
|
16
16
|
_methods_macro_test called_from
|
@@ -21,7 +21,7 @@ module Assert::Macros
|
|
21
21
|
alias_method :have_imeths, :have_instance_method
|
22
22
|
|
23
23
|
def not_have_instance_method(*methods)
|
24
|
-
called_from = (methods.last.kind_of?(Array) ? methods.pop :
|
24
|
+
called_from = (methods.last.kind_of?(Array) ? methods.pop : caller_locations).first
|
25
25
|
Assert::Macro.new do
|
26
26
|
methods.each{ |m| _methods_macro_not_instance_methods << [m, called_from] }
|
27
27
|
_methods_macro_test called_from
|
@@ -32,7 +32,7 @@ module Assert::Macros
|
|
32
32
|
alias_method :not_have_imeths, :not_have_instance_method
|
33
33
|
|
34
34
|
def have_class_method(*methods)
|
35
|
-
called_from = (methods.last.kind_of?(Array) ? methods.pop :
|
35
|
+
called_from = (methods.last.kind_of?(Array) ? methods.pop : caller_locations).first
|
36
36
|
Assert::Macro.new do
|
37
37
|
methods.each{ |m| _methods_macro_class_methods << [m, called_from] }
|
38
38
|
_methods_macro_test called_from
|
@@ -43,7 +43,7 @@ module Assert::Macros
|
|
43
43
|
alias_method :have_cmeths, :have_class_method
|
44
44
|
|
45
45
|
def not_have_class_method(*methods)
|
46
|
-
called_from = (methods.last.kind_of?(Array) ? methods.pop :
|
46
|
+
called_from = (methods.last.kind_of?(Array) ? methods.pop : caller_locations).first
|
47
47
|
Assert::Macro.new do
|
48
48
|
methods.each{ |m| _methods_macro_not_class_methods << [m, called_from] }
|
49
49
|
_methods_macro_test called_from
|
@@ -54,19 +54,19 @@ module Assert::Macros
|
|
54
54
|
alias_method :not_have_cmeths, :not_have_class_method
|
55
55
|
|
56
56
|
def have_reader(*methods)
|
57
|
-
methods <<
|
57
|
+
methods << caller_locations if !methods.last.kind_of?(Array)
|
58
58
|
have_instance_methods(*methods)
|
59
59
|
end
|
60
60
|
alias_method :have_readers, :have_reader
|
61
61
|
|
62
62
|
def not_have_reader(*methods)
|
63
|
-
methods <<
|
63
|
+
methods << caller_locations if !methods.last.kind_of?(Array)
|
64
64
|
not_have_instance_methods(*methods)
|
65
65
|
end
|
66
66
|
alias_method :not_have_readers, :not_have_reader
|
67
67
|
|
68
68
|
def have_writer(*methods)
|
69
|
-
called = methods.last.kind_of?(Array) ? methods.pop :
|
69
|
+
called = methods.last.kind_of?(Array) ? methods.pop : caller_locations
|
70
70
|
writer_meths = methods.collect{|m| "#{m}="}
|
71
71
|
writer_meths << called
|
72
72
|
have_instance_methods(*writer_meths)
|
@@ -74,7 +74,7 @@ module Assert::Macros
|
|
74
74
|
alias_method :have_writers, :have_writer
|
75
75
|
|
76
76
|
def not_have_writer(*methods)
|
77
|
-
called = methods.last.kind_of?(Array) ? methods.pop :
|
77
|
+
called = methods.last.kind_of?(Array) ? methods.pop : caller_locations
|
78
78
|
writer_meths = methods.collect{|m| "#{m}="}
|
79
79
|
writer_meths << called
|
80
80
|
not_have_instance_methods(*writer_meths)
|
@@ -82,7 +82,7 @@ module Assert::Macros
|
|
82
82
|
alias_method :not_have_writers, :not_have_writer
|
83
83
|
|
84
84
|
def have_accessor(*methods)
|
85
|
-
called = methods.last.kind_of?(Array) ? methods.pop :
|
85
|
+
called = methods.last.kind_of?(Array) ? methods.pop : caller_locations
|
86
86
|
accessor_meths = methods.collect{|m| [m, "#{m}="]}.flatten
|
87
87
|
accessor_meths << called
|
88
88
|
have_instance_methods(*accessor_meths)
|
@@ -90,7 +90,7 @@ module Assert::Macros
|
|
90
90
|
alias_method :have_accessors, :have_accessor
|
91
91
|
|
92
92
|
def not_have_accessor(*methods)
|
93
|
-
called = methods.last.kind_of?(Array) ? methods.pop :
|
93
|
+
called = methods.last.kind_of?(Array) ? methods.pop : caller_locations
|
94
94
|
accessor_meths = methods.collect{|m| [m, "#{m}="]}.flatten
|
95
95
|
accessor_meths << called
|
96
96
|
not_have_instance_methods(*accessor_meths)
|
@@ -104,28 +104,28 @@ module Assert::Macros
|
|
104
104
|
|
105
105
|
self.class._methods_macro_instance_methods.each do |(method, called_from)|
|
106
106
|
msg = "#{subject.class.name} does not have instance method ##{method}"
|
107
|
-
with_backtrace(called_from) do
|
107
|
+
with_backtrace([called_from]) do
|
108
108
|
assert_respond_to method, subject, msg
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
112
112
|
self.class._methods_macro_class_methods.each do |(method, called_from)|
|
113
113
|
msg = "#{subject.class.name} does not have class method ##{method}"
|
114
|
-
with_backtrace(called_from) do
|
114
|
+
with_backtrace([called_from]) do
|
115
115
|
assert_respond_to method, subject.class, msg
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
119
|
self.class._methods_macro_not_instance_methods.each do |(method, called_from)|
|
120
120
|
msg = "#{subject.class.name} has instance method ##{method}"
|
121
|
-
with_backtrace(called_from) do
|
121
|
+
with_backtrace([called_from]) do
|
122
122
|
assert_not_respond_to method, subject, msg
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
126
126
|
self.class._methods_macro_not_class_methods.each do |(method, called_from)|
|
127
127
|
msg = "#{subject.class.name} has class method ##{method}"
|
128
|
-
with_backtrace(called_from) do
|
128
|
+
with_backtrace([called_from]) do
|
129
129
|
assert_not_respond_to method, subject.class, msg
|
130
130
|
end
|
131
131
|
end
|
data/lib/assert/result.rb
CHANGED
@@ -3,12 +3,12 @@ require 'assert/file_line'
|
|
3
3
|
module Assert; end
|
4
4
|
module Assert::Result
|
5
5
|
|
6
|
-
class Base; end
|
7
|
-
class Pass
|
8
|
-
class Ignore < Base; end
|
9
|
-
class Fail
|
10
|
-
class Error
|
11
|
-
class Skip
|
6
|
+
class Base ; end
|
7
|
+
class Pass < Base ; end
|
8
|
+
class Ignore < Base ; end
|
9
|
+
class Fail < Base ; end
|
10
|
+
class Error < Base ; end
|
11
|
+
class Skip < Base ; end
|
12
12
|
|
13
13
|
def self.types
|
14
14
|
@types ||= Hash.new{ |h, k| Base }.tap do |hash|
|
@@ -42,6 +42,7 @@ module Assert::Result
|
|
42
42
|
|
43
43
|
def initialize(build_data)
|
44
44
|
@build_data = build_data
|
45
|
+
@with_bt = nil
|
45
46
|
end
|
46
47
|
|
47
48
|
def type
|
@@ -80,19 +81,37 @@ module Assert::Result
|
|
80
81
|
end
|
81
82
|
|
82
83
|
def trace
|
83
|
-
@trace ||=
|
84
|
+
@trace ||= build_trace
|
84
85
|
end
|
85
86
|
|
86
87
|
# we choose to implement this way instead of using an `attr_writer` to be
|
87
88
|
# consistant with how you override exception backtraces.
|
88
89
|
def set_backtrace(bt)
|
89
90
|
@backtrace = Backtrace.new(bt)
|
90
|
-
@
|
91
|
-
@file_line =
|
91
|
+
@src_line = nil
|
92
|
+
@file_line = nil
|
93
|
+
@trace = nil
|
94
|
+
end
|
95
|
+
|
96
|
+
# set the given with bt and the src line for with bt
|
97
|
+
def set_with_bt(with_bt)
|
98
|
+
return if with_bt.nil?
|
99
|
+
@with_bt = with_bt
|
100
|
+
@src_line = with_bt.first
|
101
|
+
@file_line = nil
|
102
|
+
@trace = nil
|
103
|
+
end
|
104
|
+
|
105
|
+
def with_bt_set?
|
106
|
+
!@with_bt.nil?
|
107
|
+
end
|
108
|
+
|
109
|
+
def src_line
|
110
|
+
@src_line ||= first_filtered_bt_line(self.backtrace)
|
92
111
|
end
|
93
112
|
|
94
113
|
def file_line
|
95
|
-
@file_line ||= Assert::FileLine.parse(
|
114
|
+
@file_line ||= Assert::FileLine.parse(self.src_line)
|
96
115
|
end
|
97
116
|
|
98
117
|
def file_name; self.file_line.file; end
|
@@ -124,15 +143,21 @@ module Assert::Result
|
|
124
143
|
|
125
144
|
private
|
126
145
|
|
127
|
-
#
|
128
|
-
#
|
129
|
-
#
|
130
|
-
#
|
131
|
-
|
132
|
-
|
133
|
-
|
146
|
+
# By default, a result's trace is its `src_line`. If a with bt has been
|
147
|
+
# set, display it in full along with the "original src line" (the first
|
148
|
+
# filtered line of the backtrace). This is overridden for error results
|
149
|
+
# as they always show their full backtrace.
|
150
|
+
def build_trace
|
151
|
+
if self.with_bt_set?
|
152
|
+
Backtrace.to_s(@with_bt+[first_filtered_bt_line(self.backtrace)])
|
153
|
+
else
|
154
|
+
self.src_line
|
155
|
+
end
|
134
156
|
end
|
135
157
|
|
158
|
+
# if the filtered backtrace is empty, just use the backtrace itself (this
|
159
|
+
# should only occur if the result is an error from a line in assert's
|
160
|
+
# non-test code).
|
136
161
|
def first_filtered_bt_line(backtrace)
|
137
162
|
((fbt = backtrace.filtered).empty? ? backtrace : fbt).first.to_s
|
138
163
|
end
|
@@ -152,8 +177,12 @@ module Assert::Result
|
|
152
177
|
|
153
178
|
end
|
154
179
|
|
180
|
+
class HaltingTestResultError < RuntimeError
|
181
|
+
attr_accessor :assert_with_bt
|
182
|
+
end
|
183
|
+
|
155
184
|
# raised by the 'fail' context helper to break test execution
|
156
|
-
TestFailure = Class.new(
|
185
|
+
TestFailure = Class.new(HaltingTestResultError)
|
157
186
|
|
158
187
|
class Fail < Base
|
159
188
|
|
@@ -161,20 +190,22 @@ module Assert::Result
|
|
161
190
|
def self.name; 'Fail'; end
|
162
191
|
|
163
192
|
# fail results can be generated manually or by raising Assert::Result::TestFailure
|
164
|
-
def self.for_test(test,
|
165
|
-
if
|
166
|
-
super(test,
|
167
|
-
|
193
|
+
def self.for_test(test, msg_or_err, bt = nil)
|
194
|
+
if msg_or_err.kind_of?(TestFailure)
|
195
|
+
super(test, msg_or_err.message, msg_or_err.backtrace).tap do |result|
|
196
|
+
result.set_with_bt(msg_or_err.assert_with_bt)
|
197
|
+
end
|
198
|
+
elsif msg_or_err.kind_of?(Exception)
|
168
199
|
raise ArgumentError, "generate fail results by raising Assert::Result::TestFailure"
|
169
200
|
else
|
170
|
-
super(test,
|
201
|
+
super(test, msg_or_err, bt)
|
171
202
|
end
|
172
203
|
end
|
173
204
|
|
174
205
|
end
|
175
206
|
|
176
207
|
# raised by the 'skip' context helper to break test execution
|
177
|
-
TestSkipped = Class.new(
|
208
|
+
TestSkipped = Class.new(HaltingTestResultError)
|
178
209
|
|
179
210
|
class Skip < Base
|
180
211
|
|
@@ -182,11 +213,15 @@ module Assert::Result
|
|
182
213
|
def self.name; 'Skip'; end
|
183
214
|
|
184
215
|
# skip results are generated by raising Assert::Result::TestSkipped
|
185
|
-
def self.for_test(test,
|
186
|
-
if
|
187
|
-
super(test,
|
188
|
-
|
216
|
+
def self.for_test(test, msg_or_err, bt = nil)
|
217
|
+
if msg_or_err.kind_of?(TestSkipped)
|
218
|
+
super(test, msg_or_err.message, msg_or_err.backtrace).tap do |result|
|
219
|
+
result.set_with_bt(msg_or_err.assert_with_bt)
|
220
|
+
end
|
221
|
+
elsif msg_or_err.kind_of?(Exception)
|
189
222
|
raise ArgumentError, "generate skip results by raising Assert::Result::TestSkipped"
|
223
|
+
else
|
224
|
+
super(test, msg_or_err, bt)
|
190
225
|
end
|
191
226
|
end
|
192
227
|
|
@@ -198,9 +233,9 @@ module Assert::Result
|
|
198
233
|
def self.name; 'Error'; end
|
199
234
|
|
200
235
|
# error results are generated by raising exceptions in tests
|
201
|
-
def self.for_test(test,
|
202
|
-
if
|
203
|
-
super(test, "#{
|
236
|
+
def self.for_test(test, err)
|
237
|
+
if err.kind_of?(Exception)
|
238
|
+
super(test, "#{err.message} (#{err.class.name})", err.backtrace)
|
204
239
|
else
|
205
240
|
raise ArgumentError, "generate error results by raising an exception"
|
206
241
|
end
|
@@ -209,7 +244,9 @@ module Assert::Result
|
|
209
244
|
private
|
210
245
|
|
211
246
|
# override of the base, always show the full unfiltered backtrace for errors
|
212
|
-
def build_trace
|
247
|
+
def build_trace
|
248
|
+
Backtrace.to_s(backtrace)
|
249
|
+
end
|
213
250
|
|
214
251
|
end
|
215
252
|
|
@@ -217,16 +254,20 @@ module Assert::Result
|
|
217
254
|
|
218
255
|
DELIM = "\n".freeze
|
219
256
|
|
220
|
-
def self.parse(bt)
|
257
|
+
def self.parse(bt)
|
258
|
+
self.new(bt.to_s.split(DELIM))
|
259
|
+
end
|
260
|
+
|
261
|
+
def self.to_s(bt_array)
|
262
|
+
bt_array.join(DELIM)
|
263
|
+
end
|
221
264
|
|
222
265
|
def initialize(value = nil)
|
223
266
|
super([*(value || "No backtrace")])
|
224
267
|
end
|
225
268
|
|
226
|
-
def to_s; self.join(DELIM); end
|
227
|
-
|
228
269
|
def filtered
|
229
|
-
self.class.new(self.reject { |line| filter_out?(line) })
|
270
|
+
self.class.new(self.reject { |line| filter_out?(line.to_s) })
|
230
271
|
end
|
231
272
|
|
232
273
|
protected
|
@@ -234,9 +275,13 @@ module Assert::Result
|
|
234
275
|
# filter a line out if it's an assert lib/bin line
|
235
276
|
def filter_out?(line)
|
236
277
|
# './lib' in project dir, or '/usr/local/blahblah' if installed
|
237
|
-
assert_lib_path
|
278
|
+
assert_lib_path = File.expand_path('../..', __FILE__)
|
279
|
+
assert_macros_path = File.join(assert_lib_path, 'assert/macros')
|
238
280
|
assert_bin_regex = /bin\/assert\:/
|
239
|
-
line.rindex(assert_lib_path, 0)
|
281
|
+
( line.rindex(assert_lib_path, 0) &&
|
282
|
+
!line.rindex(assert_macros_path, 0)
|
283
|
+
) ||
|
284
|
+
line =~ assert_bin_regex
|
240
285
|
end
|
241
286
|
|
242
287
|
end
|