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/version.rb
CHANGED
data/lib/assert/view.rb
CHANGED
@@ -1,25 +1,112 @@
|
|
1
|
-
require 'assert/
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
1
|
+
require 'assert/config'
|
2
|
+
require 'assert/suite'
|
3
|
+
require 'assert/view_helpers'
|
4
|
+
|
5
|
+
module Assert
|
6
|
+
|
7
|
+
module View
|
8
|
+
|
9
|
+
# this method is used to bring in custom user-specific views
|
10
|
+
# require views by passing either a full path to the view ruby file
|
11
|
+
# or passing the name of a view installed in ~/.assert/views
|
12
|
+
|
13
|
+
def self.require_user_view(view_name)
|
14
|
+
views_file = File.expand_path(
|
15
|
+
File.join("#{ENV['HOME']}/.assert/views", view_name, 'lib', view_name)
|
16
|
+
)
|
17
|
+
|
18
|
+
if File.exists?(view_name) || File.exists?(view_name + '.rb')
|
19
|
+
require view_name
|
20
|
+
elsif File.exists?(views_file + '.rb')
|
21
|
+
require views_file
|
22
|
+
else
|
23
|
+
msg = "[WARN] Can't find or require #{view_name.inspect} view."
|
24
|
+
msg << " Did you install it in `~/.assert/views`?" if !view_name.match(/\A\//)
|
25
|
+
warn msg
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class Base
|
30
|
+
include Assert::ViewHelpers
|
31
|
+
|
32
|
+
# setup options and their default values
|
33
|
+
|
34
|
+
option 'styled', false
|
35
|
+
option 'pass_styles' # none
|
36
|
+
option 'fail_styles' # none
|
37
|
+
option 'error_styles' # none
|
38
|
+
option 'skip_styles' # none
|
39
|
+
option 'ignore_styles' # none
|
40
|
+
|
41
|
+
option 'pass_abbrev', '.'
|
42
|
+
option 'fail_abbrev', 'F'
|
43
|
+
option 'ignore_abbrev', 'I'
|
44
|
+
option 'skip_abbrev', 'S'
|
45
|
+
option 'error_abbrev', 'E'
|
46
|
+
|
47
|
+
attr_reader :config
|
48
|
+
|
49
|
+
def initialize(config, output_io)
|
50
|
+
@config , @output_io, = config, output_io
|
51
|
+
@output_io.sync = true if @output_io.respond_to?(:sync=)
|
52
|
+
end
|
53
|
+
|
54
|
+
def view
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
def is_tty?
|
59
|
+
!!@output_io.isatty
|
60
|
+
end
|
61
|
+
|
62
|
+
def ansi_styled_msg(msg, result_or_sym)
|
63
|
+
return msg if !self.is_tty? || !self.styled
|
64
|
+
code = Assert::ViewHelpers::Ansi.code_for(*self.send("#{result_or_sym.to_sym}_styles"))
|
65
|
+
return msg if code.empty?
|
66
|
+
code + msg + Assert::ViewHelpers::Ansi.code_for(:reset)
|
67
|
+
end
|
68
|
+
|
69
|
+
# Callbacks
|
70
|
+
|
71
|
+
# define callback handlers to output information. handlers are
|
72
|
+
# instance_eval'd in the scope of the view instance. any stdout is captured
|
73
|
+
# and sent to the io stream.
|
74
|
+
|
75
|
+
def fire(callback, *args)
|
76
|
+
self.send(callback, *args)
|
77
|
+
end
|
78
|
+
|
79
|
+
# available callbacks from the runner:
|
80
|
+
# * `before_load`: called at the beginning, before the suite is loaded
|
81
|
+
# * `after_load`: called after the suite is loaded, just before `on_start`
|
82
|
+
# functionally equivalent to `on_start`
|
83
|
+
# * `on_start`: called when a loaded test suite starts running
|
84
|
+
# * `before_test`: called before a test starts running
|
85
|
+
# the test is passed as an arg
|
86
|
+
# * `on_result`: called when a running tests generates a result
|
87
|
+
# the result is passed as an arg
|
88
|
+
# * `after_test`: called after a test finishes running
|
89
|
+
# the test is passed as an arg
|
90
|
+
# * `on_finish`: called when the test suite is finished running
|
91
|
+
# * `on_interrupt`: called when the test suite is interrupted while running
|
92
|
+
# the interrupt exception is passed as an arg
|
93
|
+
|
94
|
+
def before_load(test_files); end
|
95
|
+
def after_load; end
|
96
|
+
def on_start; end
|
97
|
+
def before_test(test); end
|
98
|
+
def on_result(result); end
|
99
|
+
def after_test(test); end
|
100
|
+
def on_finish; end
|
101
|
+
def on_interrupt(err); end
|
102
|
+
|
103
|
+
# IO capture
|
104
|
+
|
105
|
+
def puts(*args); @output_io.puts(*args); end
|
106
|
+
def print(*args); @output_io.print(*args); end
|
107
|
+
|
22
108
|
end
|
109
|
+
|
23
110
|
end
|
24
111
|
|
25
112
|
end
|
@@ -0,0 +1,238 @@
|
|
1
|
+
require 'assert/config_helpers'
|
2
|
+
|
3
|
+
module Assert
|
4
|
+
|
5
|
+
module ViewHelpers
|
6
|
+
|
7
|
+
def self.included(receiver)
|
8
|
+
receiver.class_eval do
|
9
|
+
include Assert::ConfigHelpers
|
10
|
+
extend ClassMethods
|
11
|
+
include InstanceMethods
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
|
17
|
+
def option(name, *default_vals)
|
18
|
+
default = default_vals.size > 1 ? default_vals : default_vals.first
|
19
|
+
define_method(name) do |*args|
|
20
|
+
if !(value = args.size > 1 ? args : args.first).nil?
|
21
|
+
instance_variable_set("@#{name}", value)
|
22
|
+
end
|
23
|
+
(val = instance_variable_get("@#{name}")).nil? ? default : val
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
module InstanceMethods
|
30
|
+
|
31
|
+
# get the formatted run time for an idividual test
|
32
|
+
def test_run_time(test, format = '%.6f')
|
33
|
+
format % test.run_time
|
34
|
+
end
|
35
|
+
|
36
|
+
# get the formatted result rate for an individual test
|
37
|
+
def test_result_rate(test, format = '%.6f')
|
38
|
+
format % test.result_rate
|
39
|
+
end
|
40
|
+
|
41
|
+
# get all the result details for a set of tests
|
42
|
+
def result_details_for(tests, result_order = :normal)
|
43
|
+
test_index = 0
|
44
|
+
tests.collect do |test|
|
45
|
+
test_index += 1
|
46
|
+
|
47
|
+
details = test.results.collect do |result|
|
48
|
+
ResultDetails.new(result, test, test_index)
|
49
|
+
end
|
50
|
+
details.reverse! if result_order == :reversed
|
51
|
+
details
|
52
|
+
end.compact.flatten
|
53
|
+
end
|
54
|
+
|
55
|
+
# get all the result details for a set of tests matching a file or context
|
56
|
+
def matched_result_details_for(match, tests, result_order = :normal)
|
57
|
+
context_match = match.kind_of?(Class) && match.ancestors.include?(Assert::Context)
|
58
|
+
file_match = match.kind_of?(String)
|
59
|
+
|
60
|
+
matching_tests = if context_match
|
61
|
+
tests.select {|test| test.context_info.klass == match}
|
62
|
+
elsif file_match
|
63
|
+
tests.select {|test| test.context_info.file == match}
|
64
|
+
else
|
65
|
+
tests
|
66
|
+
end
|
67
|
+
|
68
|
+
result_details_for(matching_tests, result_order)
|
69
|
+
end
|
70
|
+
|
71
|
+
# only show result details for failed or errored results
|
72
|
+
# show result details if a skip or passed result was issues w/ a message
|
73
|
+
def show_result_details?(result)
|
74
|
+
[:fail, :error].include?(result.to_sym) ||
|
75
|
+
!!([:skip, :ignore].include?(result.to_sym) && result.message)
|
76
|
+
end
|
77
|
+
|
78
|
+
# show any captured output
|
79
|
+
def captured_output(output)
|
80
|
+
"--- stdout ---\n"\
|
81
|
+
"#{output}"\
|
82
|
+
"--------------"
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_count_statement
|
86
|
+
"#{self.count(:tests)} test#{'s' if self.count(:tests) != 1}"
|
87
|
+
end
|
88
|
+
|
89
|
+
def result_count_statement
|
90
|
+
"#{self.count(:results)} result#{'s' if self.count(:results) != 1}"
|
91
|
+
end
|
92
|
+
|
93
|
+
# generate a comma-seperated sentence fragment given a list of items
|
94
|
+
def to_sentence(items)
|
95
|
+
if items.size <= 2
|
96
|
+
items.join(items.size == 2 ? ' and ' : '')
|
97
|
+
else
|
98
|
+
[items[0..-2].join(", "), items.last].join(", and ")
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# generate an appropriate result summary msg for all tests passing
|
103
|
+
def all_pass_result_summary_msg
|
104
|
+
if self.count(:results) < 1
|
105
|
+
"uhh..."
|
106
|
+
elsif self.count(:results) == 1
|
107
|
+
"pass"
|
108
|
+
else
|
109
|
+
"all pass"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# print a result summary message for a given result type
|
114
|
+
def result_summary_msg(result_type)
|
115
|
+
if result_type == :pass && self.all_pass?
|
116
|
+
self.all_pass_result_summary_msg
|
117
|
+
else
|
118
|
+
"#{self.count(result_type)} #{result_type.to_s}"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# generate a sentence fragment describing the breakdown of test results
|
123
|
+
# if a block is given, yield each msg in the breakdown for custom formatting
|
124
|
+
def results_summary_sentence
|
125
|
+
summaries = self.ocurring_result_types.map do |result_sym|
|
126
|
+
summary_msg = self.result_summary_msg(result_sym)
|
127
|
+
block_given? ? yield(summary_msg, result_sym) : summary_msg
|
128
|
+
end
|
129
|
+
self.to_sentence(summaries)
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
module Ansi
|
135
|
+
|
136
|
+
# Table of supported styles/codes (http://en.wikipedia.org/wiki/ANSI_escape_code)
|
137
|
+
|
138
|
+
CODES = {
|
139
|
+
:clear => 0,
|
140
|
+
:reset => 0,
|
141
|
+
:bright => 1,
|
142
|
+
:bold => 1,
|
143
|
+
:faint => 2,
|
144
|
+
:dark => 2,
|
145
|
+
:italic => 3,
|
146
|
+
:underline => 4,
|
147
|
+
:underscore => 4,
|
148
|
+
:blink => 5,
|
149
|
+
:slow_blink => 5,
|
150
|
+
:rapid => 6,
|
151
|
+
:rapid_blink => 6,
|
152
|
+
:invert => 7,
|
153
|
+
:inverse => 7,
|
154
|
+
:reverse => 7,
|
155
|
+
:negative => 7,
|
156
|
+
:swap => 7,
|
157
|
+
:conceal => 8,
|
158
|
+
:concealed => 8,
|
159
|
+
:hide => 9,
|
160
|
+
:strike => 9,
|
161
|
+
|
162
|
+
:default_font => 10,
|
163
|
+
:font_default => 10,
|
164
|
+
:font0 => 10,
|
165
|
+
:font1 => 11,
|
166
|
+
:font2 => 12,
|
167
|
+
:font3 => 13,
|
168
|
+
:font4 => 14,
|
169
|
+
:font5 => 15,
|
170
|
+
:font6 => 16,
|
171
|
+
:font7 => 17,
|
172
|
+
:font8 => 18,
|
173
|
+
:font9 => 19,
|
174
|
+
:fraktur => 20,
|
175
|
+
:bright_off => 21,
|
176
|
+
:bold_off => 21,
|
177
|
+
:double_underline => 21,
|
178
|
+
:clean => 22,
|
179
|
+
:italic_off => 23,
|
180
|
+
:fraktur_off => 23,
|
181
|
+
:underline_off => 24,
|
182
|
+
:blink_off => 25,
|
183
|
+
:inverse_off => 26,
|
184
|
+
:positive => 26,
|
185
|
+
:conceal_off => 27,
|
186
|
+
:show => 27,
|
187
|
+
:reveal => 27,
|
188
|
+
:crossed_off => 29,
|
189
|
+
:crossed_out_off => 29,
|
190
|
+
|
191
|
+
:black => 30,
|
192
|
+
:red => 31,
|
193
|
+
:green => 32,
|
194
|
+
:yellow => 33,
|
195
|
+
:blue => 34,
|
196
|
+
:magenta => 35,
|
197
|
+
:cyan => 36,
|
198
|
+
:white => 37,
|
199
|
+
|
200
|
+
:on_black => 40,
|
201
|
+
:on_red => 41,
|
202
|
+
:on_green => 42,
|
203
|
+
:on_yellow => 43,
|
204
|
+
:on_blue => 44,
|
205
|
+
:on_magenta => 45,
|
206
|
+
:on_cyan => 46,
|
207
|
+
:on_white => 47,
|
208
|
+
|
209
|
+
:frame => 51,
|
210
|
+
:encircle => 52,
|
211
|
+
:overline => 53,
|
212
|
+
:frame_off => 54,
|
213
|
+
:encircle_off => 54,
|
214
|
+
:overline_off => 55,
|
215
|
+
}
|
216
|
+
|
217
|
+
def self.code_for(*style_names)
|
218
|
+
style_names.map{ |n| "\e[#{CODES[n]}m" if CODES.key?(n) }.compact.join('')
|
219
|
+
end
|
220
|
+
|
221
|
+
end
|
222
|
+
|
223
|
+
class ResultDetails
|
224
|
+
|
225
|
+
attr_reader :result, :test_index, :test, :output
|
226
|
+
|
227
|
+
def initialize(result, test, test_index)
|
228
|
+
@result = result
|
229
|
+
@test = test
|
230
|
+
@test_index = test_index
|
231
|
+
@output = test.output
|
232
|
+
end
|
233
|
+
|
234
|
+
end
|
235
|
+
|
236
|
+
end
|
237
|
+
|
238
|
+
end
|
data/test/support/factory.rb
CHANGED
@@ -32,19 +32,36 @@ module Factory
|
|
32
32
|
# Generate a no-op test for use in testing.
|
33
33
|
|
34
34
|
def self.test(*args, &block)
|
35
|
-
|
36
|
-
args.last.kind_of?(::Hash) ? args.pop.dup : {},
|
35
|
+
config, context_info, name = [
|
37
36
|
args.last.kind_of?(Assert::Config) ? args.pop : self.modes_off_config,
|
38
37
|
args.last.kind_of?(Assert::Suite::ContextInfo) ? args.pop : self.context_info,
|
39
38
|
args.last.kind_of?(::String) ? args.pop : 'a test'
|
40
39
|
]
|
41
|
-
Assert::Test.
|
40
|
+
Assert::Test.for_block(name, context_info, config, &block)
|
42
41
|
end
|
43
42
|
|
44
|
-
# Generate
|
43
|
+
# Generate results for use in testing.
|
45
44
|
|
46
|
-
def self.
|
47
|
-
Assert::Result::
|
45
|
+
def self.pass_result(msg = nil)
|
46
|
+
Assert::Result::Pass.for_test(Factory.test(Factory.string), msg || Factory.string, [])
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.ignore_result(msg = nil)
|
50
|
+
Assert::Result::Ignore.for_test(Factory.test(Factory.string), msg || Factory.string, [])
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.fail_result(msg = nil)
|
54
|
+
Assert::Result::Fail.for_test(Factory.test(Factory.string), msg || Factory.string, [])
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.skip_result(exception = nil)
|
58
|
+
exception ||= Assert::Result::TestSkipped.new
|
59
|
+
Assert::Result::Skip.for_test(Factory.test(Factory.string), exception)
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.error_result(exception = nil)
|
63
|
+
exception ||= StandardError.new
|
64
|
+
Assert::Result::Error.for_test(Factory.test(Factory.string), exception)
|
48
65
|
end
|
49
66
|
|
50
67
|
def self.modes_off_config
|
@@ -0,0 +1,359 @@
|
|
1
|
+
require 'assert'
|
2
|
+
|
3
|
+
class Assert::Test
|
4
|
+
|
5
|
+
class SystemTests < Assert::Context
|
6
|
+
desc "Assert::Test"
|
7
|
+
subject{ @test }
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
class NoResultsTests < SystemTests
|
12
|
+
desc "when producing no results"
|
13
|
+
setup do
|
14
|
+
@test = Factory.test
|
15
|
+
@test.run
|
16
|
+
end
|
17
|
+
|
18
|
+
should "have 0 results" do
|
19
|
+
assert_equal 0, subject.result_count
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
class PassTests < SystemTests
|
25
|
+
desc "when passing a single assertion"
|
26
|
+
setup do
|
27
|
+
@test = Factory.test{ assert(1 == 1) }
|
28
|
+
@test.run
|
29
|
+
end
|
30
|
+
|
31
|
+
should "have 1 result" do
|
32
|
+
assert_equal 1, subject.result_count
|
33
|
+
end
|
34
|
+
|
35
|
+
should "have 1 pass result" do
|
36
|
+
assert_equal 1, subject.result_count(:pass)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
class FailTests < SystemTests
|
42
|
+
desc "when failing a single assertion"
|
43
|
+
setup do
|
44
|
+
@test = Factory.test{ assert(1 == 0) }
|
45
|
+
@test.run
|
46
|
+
end
|
47
|
+
|
48
|
+
should "have 1 result" do
|
49
|
+
assert_equal 1, subject.result_count
|
50
|
+
end
|
51
|
+
|
52
|
+
should "have 1 fail result" do
|
53
|
+
assert_equal 1, subject.result_count(:fail)
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
class SkipTests < SystemTests
|
59
|
+
desc "when skipping once"
|
60
|
+
setup do
|
61
|
+
@test = Factory.test{ skip }
|
62
|
+
@test.run
|
63
|
+
end
|
64
|
+
|
65
|
+
should "have 1 result" do
|
66
|
+
assert_equal 1, subject.result_count
|
67
|
+
end
|
68
|
+
|
69
|
+
should "have 1 skip result" do
|
70
|
+
assert_equal 1, subject.result_count(:skip)
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
class ErrorTests < SystemTests
|
76
|
+
desc "when erroring once"
|
77
|
+
setup do
|
78
|
+
@test = Factory.test{ raise("WHAT") }
|
79
|
+
@test.run
|
80
|
+
end
|
81
|
+
|
82
|
+
should "have 1 result" do
|
83
|
+
assert_equal 1, subject.result_count
|
84
|
+
end
|
85
|
+
|
86
|
+
should "have 1 error result" do
|
87
|
+
assert_equal 1, subject.result_count(:error)
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
class MixedTests < SystemTests
|
93
|
+
desc "when passing 1 assertion and failing 1 assertion"
|
94
|
+
setup do
|
95
|
+
@test = Factory.test do
|
96
|
+
assert(1 == 1)
|
97
|
+
assert(1 == 0)
|
98
|
+
end
|
99
|
+
@test.run
|
100
|
+
end
|
101
|
+
|
102
|
+
should "have 2 total results" do
|
103
|
+
assert_equal 2, subject.result_count
|
104
|
+
end
|
105
|
+
|
106
|
+
should "have 1 pass result" do
|
107
|
+
assert_equal 1, subject.result_count(:pass)
|
108
|
+
end
|
109
|
+
|
110
|
+
should "have 1 fail result" do
|
111
|
+
assert_equal 1, subject.result_count(:fail)
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
|
116
|
+
class MixedSkipTests < SystemTests
|
117
|
+
desc "when passing 1 assertion and failing 1 assertion with a skip call in between"
|
118
|
+
setup do
|
119
|
+
@test = Factory.test do
|
120
|
+
assert(1 == 1)
|
121
|
+
skip
|
122
|
+
assert(1 == 0)
|
123
|
+
end
|
124
|
+
@test.run
|
125
|
+
end
|
126
|
+
|
127
|
+
should "have 2 total results" do
|
128
|
+
assert_equal 2, subject.result_count
|
129
|
+
end
|
130
|
+
|
131
|
+
should "have a skip for its last result" do
|
132
|
+
assert_kind_of Assert::Result::Skip, subject.results.last
|
133
|
+
end
|
134
|
+
|
135
|
+
should "have 1 pass result" do
|
136
|
+
assert_equal 1, subject.result_count(:pass)
|
137
|
+
end
|
138
|
+
|
139
|
+
should "have 1 skip result" do
|
140
|
+
assert_equal 1, subject.result_count(:skip)
|
141
|
+
end
|
142
|
+
|
143
|
+
should "have 0 fail results" do
|
144
|
+
assert_equal 0, subject.result_count(:fail)
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
149
|
+
class MixedErrorTests < SystemTests
|
150
|
+
desc "when passing 1 assertion and failing 1 assertion with an exception raised in between"
|
151
|
+
setup do
|
152
|
+
@test = Factory.test do
|
153
|
+
assert(1 == 1)
|
154
|
+
raise Exception, "something errored"
|
155
|
+
assert(1 == 0)
|
156
|
+
end
|
157
|
+
@test.run
|
158
|
+
end
|
159
|
+
|
160
|
+
should "have 2 total results" do
|
161
|
+
assert_equal 2, subject.result_count
|
162
|
+
end
|
163
|
+
|
164
|
+
should "have an error for its last result" do
|
165
|
+
assert_kind_of Assert::Result::Error, subject.results.last
|
166
|
+
end
|
167
|
+
|
168
|
+
should "have 1 pass result" do
|
169
|
+
assert_equal 1, subject.result_count(:pass)
|
170
|
+
end
|
171
|
+
|
172
|
+
should "have 1 error result" do
|
173
|
+
assert_equal 1, subject.result_count(:error)
|
174
|
+
end
|
175
|
+
|
176
|
+
should "have 0 fail results" do
|
177
|
+
assert_equal 0, subject.result_count(:fail)
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
181
|
+
|
182
|
+
class MixedPassTests < SystemTests
|
183
|
+
desc "when passing 1 assertion and failing 1 assertion with a pass call in between"
|
184
|
+
setup do
|
185
|
+
@test = Factory.test do
|
186
|
+
assert(1 == 1)
|
187
|
+
pass
|
188
|
+
assert(1 == 0)
|
189
|
+
end
|
190
|
+
@test.run
|
191
|
+
end
|
192
|
+
|
193
|
+
should "have 3 total results" do
|
194
|
+
assert_equal 3, subject.result_count
|
195
|
+
end
|
196
|
+
|
197
|
+
should "have a fail for its last result" do
|
198
|
+
assert_kind_of Assert::Result::Fail, subject.results.last
|
199
|
+
end
|
200
|
+
|
201
|
+
should "have 2 pass results" do
|
202
|
+
assert_equal 2, subject.result_count(:pass)
|
203
|
+
end
|
204
|
+
|
205
|
+
should "have 1 fail result" do
|
206
|
+
assert_equal 1, subject.result_count(:fail)
|
207
|
+
end
|
208
|
+
|
209
|
+
end
|
210
|
+
|
211
|
+
class MixedFailTests < SystemTests
|
212
|
+
desc "when failing 1 assertion and passing 1 assertion with a fail call in between"
|
213
|
+
setup do
|
214
|
+
@test = Factory.test do
|
215
|
+
assert(1 == 0)
|
216
|
+
fail
|
217
|
+
assert(1 == 1)
|
218
|
+
end
|
219
|
+
@test.run
|
220
|
+
end
|
221
|
+
|
222
|
+
should "have 3 total results" do
|
223
|
+
assert_equal 3, subject.result_count
|
224
|
+
end
|
225
|
+
|
226
|
+
should "have a pass for its last result" do
|
227
|
+
assert_kind_of Assert::Result::Pass, subject.results.last
|
228
|
+
end
|
229
|
+
|
230
|
+
should "have 1 pass result" do
|
231
|
+
assert_equal 1, subject.result_count(:pass)
|
232
|
+
end
|
233
|
+
|
234
|
+
should "have 2 fail results" do
|
235
|
+
assert_equal 2, subject.result_count(:fail)
|
236
|
+
end
|
237
|
+
|
238
|
+
end
|
239
|
+
|
240
|
+
class MixedFlunkTests < SystemTests
|
241
|
+
desc "has failing 1 assertion and passing 1 assertion with a flunk call in between"
|
242
|
+
setup do
|
243
|
+
@test = Factory.test do
|
244
|
+
assert(1 == 0)
|
245
|
+
flunk
|
246
|
+
assert(1 == 1)
|
247
|
+
end
|
248
|
+
@test.run
|
249
|
+
end
|
250
|
+
|
251
|
+
should "have 3 total results" do
|
252
|
+
assert_equal 3, subject.result_count
|
253
|
+
end
|
254
|
+
|
255
|
+
should "have a pass for its last result" do
|
256
|
+
assert_kind_of Assert::Result::Pass, subject.results.last
|
257
|
+
end
|
258
|
+
|
259
|
+
should "have 1 pass results" do
|
260
|
+
assert_equal 1, subject.result_count(:pass)
|
261
|
+
end
|
262
|
+
|
263
|
+
should "have 2 fail results" do
|
264
|
+
assert_equal 2, subject.result_count(:fail)
|
265
|
+
end
|
266
|
+
|
267
|
+
end
|
268
|
+
|
269
|
+
class WithSetupsTests < SystemTests
|
270
|
+
desc "that has setup logic"
|
271
|
+
setup do
|
272
|
+
@context_class = Factory.context_class do
|
273
|
+
# assert style
|
274
|
+
setup{ pass 'assert style setup' }
|
275
|
+
# test/unit style
|
276
|
+
def setup; pass 'test/unit style setup'; end
|
277
|
+
end
|
278
|
+
@test = Factory.test("t", Factory.context_info(@context_class)){ pass 'TEST' }
|
279
|
+
@test.run
|
280
|
+
end
|
281
|
+
|
282
|
+
should "execute all setup logic when run" do
|
283
|
+
assert_equal 3, subject.result_count(:pass)
|
284
|
+
|
285
|
+
exp = ['assert style setup', 'test/unit style setup', 'TEST']
|
286
|
+
assert_equal exp, subject.results.map(&:message)
|
287
|
+
end
|
288
|
+
|
289
|
+
end
|
290
|
+
|
291
|
+
class WithTeardownsTests < SystemTests
|
292
|
+
desc "that has teardown logic"
|
293
|
+
setup do
|
294
|
+
@context_class = Factory.context_class do
|
295
|
+
# assert style
|
296
|
+
teardown{ pass 'assert style teardown' }
|
297
|
+
# test/unit style
|
298
|
+
def teardown; pass 'test/unit style teardown'; end
|
299
|
+
end
|
300
|
+
@test = Factory.test("t", Factory.context_info(@context_class)){ pass 'TEST' }
|
301
|
+
@test.run
|
302
|
+
end
|
303
|
+
|
304
|
+
should "execute all teardown logic when run" do
|
305
|
+
assert_equal 3, subject.result_count(:pass)
|
306
|
+
|
307
|
+
exp = ['TEST', 'assert style teardown', 'test/unit style teardown']
|
308
|
+
assert_equal exp, subject.results.map(&:message)
|
309
|
+
end
|
310
|
+
|
311
|
+
end
|
312
|
+
|
313
|
+
class WithAroundsTests < SystemTests
|
314
|
+
desc "that has around logic (in addition to setups/teardowns)"
|
315
|
+
setup do
|
316
|
+
@parent_context_class = Factory.modes_off_context_class do
|
317
|
+
around do |block|
|
318
|
+
pass "parent around start"
|
319
|
+
block.call
|
320
|
+
pass "parent around end"
|
321
|
+
end
|
322
|
+
setup{ pass "parent setup" }
|
323
|
+
teardown{ pass "parent teardown" }
|
324
|
+
end
|
325
|
+
@context_class = Factory.modes_off_context_class(@parent_context_class) do
|
326
|
+
setup{ pass "child setup1" }
|
327
|
+
around do |block|
|
328
|
+
pass "child around1 start"
|
329
|
+
block.call
|
330
|
+
pass "child around1 end"
|
331
|
+
end
|
332
|
+
teardown{ pass "child teardown1" }
|
333
|
+
setup{ pass "child setup2" }
|
334
|
+
around do |block|
|
335
|
+
pass "child around2 start"
|
336
|
+
block.call
|
337
|
+
pass "child around2 end"
|
338
|
+
end
|
339
|
+
teardown{ pass "child teardown2" }
|
340
|
+
end
|
341
|
+
@test = Factory.test("t", Factory.context_info(@context_class)){ pass "TEST" }
|
342
|
+
@test.run
|
343
|
+
end
|
344
|
+
|
345
|
+
should "run the arounds outside of the setups/teardowns/test" do
|
346
|
+
assert_equal 13, subject.result_count(:pass)
|
347
|
+
|
348
|
+
exp = [
|
349
|
+
'parent around start', 'child around1 start', 'child around2 start',
|
350
|
+
'parent setup', 'child setup1', 'child setup2', 'TEST',
|
351
|
+
'child teardown1', 'child teardown2', 'parent teardown',
|
352
|
+
'child around2 end', 'child around1 end', 'parent around end'
|
353
|
+
]
|
354
|
+
assert_equal exp, subject.results.map(&:message)
|
355
|
+
end
|
356
|
+
|
357
|
+
end
|
358
|
+
|
359
|
+
end
|