assert 2.14.0 → 2.15.0
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 +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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 977f66c154b34e18051876043c6ef149048f3c24
|
4
|
+
data.tar.gz: 4ad230cae2d6fbe5895456d04f421843bbdb43e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ea117fae5c227ae573763287d76156b11b923afa80b50c63223deb6f001605eac1eb55302f08f85ecc134eedf49efb90973cec640b6e1a11c75509100a8ccad
|
7
|
+
data.tar.gz: cf13653df60d7b5c295d2a43523923423998ae9c7b40f60bc95d95044af0577a96107d5d04a553d9de8c799bde111599d6656e2d678adcdee0ecb33750aa61e9
|
data/README.md
CHANGED
@@ -428,7 +428,7 @@ Use this if you prefer a 3rd-party tool (like awesome_print or something) over t
|
|
428
428
|
|
429
429
|
## Viewing Test Results
|
430
430
|
|
431
|
-
`Assert::
|
431
|
+
`Assert::DefaultView` is the default view for test results. Its output goes something like this:
|
432
432
|
|
433
433
|
* before the run starts, output some info about the test suite that is about to run
|
434
434
|
* print out result abbreviations as the test results are generated
|
@@ -438,7 +438,7 @@ Use this if you prefer a 3rd-party tool (like awesome_print or something) over t
|
|
438
438
|
|
439
439
|
You can run a test suite and get a feel for what this default outputs. The view has a few options you can tweak:
|
440
440
|
|
441
|
-
* `styled`: whether to apply
|
441
|
+
* `styled`: whether to apply ansi styles to the output, default `true`
|
442
442
|
* `pass_styles`: how to style pass result output, default `:green`
|
443
443
|
* `fail_styles`: default `:red, :bold`
|
444
444
|
* `error_styles`: default `:yellow, :bold`
|
@@ -534,7 +534,7 @@ Tests produce results as they are executed. Every `assert` statement produces a
|
|
534
534
|
|
535
535
|
### View
|
536
536
|
|
537
|
-
A `View` object is responsible for rendering test result output. Assert provides a `Assert::View::Base` object to provide common helpers and default runner callback handlers for building views. Assert also provides
|
537
|
+
A `View` object is responsible for rendering test result output. Assert provides a `Assert::View::Base` object to provide common helpers and default runner callback handlers for building views. Assert also provides an `Assert::DefaultView` that it renders its output with. See the "Viewing Test Results" section below for more details.
|
538
538
|
|
539
539
|
### Macro
|
540
540
|
|
data/assert.gemspec
CHANGED
data/lib/assert/assert_runner.rb
CHANGED
data/lib/assert/assertions.rb
CHANGED
@@ -294,7 +294,7 @@ module Assert
|
|
294
294
|
end
|
295
295
|
end
|
296
296
|
|
297
|
-
def exception_details(raised_msg=nil, no_raised_msg=nil)
|
297
|
+
def exception_details(raised_msg = nil, no_raised_msg = nil)
|
298
298
|
if @exception
|
299
299
|
backtrace = Assert::Result::Backtrace.new(@exception.backtrace)
|
300
300
|
[ raised_msg,
|
data/lib/assert/config.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
require 'assert/default_view'
|
2
|
+
require 'assert/runner'
|
3
|
+
require 'assert/suite'
|
4
|
+
require 'assert/utils'
|
5
|
+
|
1
6
|
module Assert
|
2
7
|
|
3
8
|
class Config
|
@@ -21,7 +26,7 @@ module Assert
|
|
21
26
|
|
22
27
|
def initialize(settings = nil)
|
23
28
|
@suite = Assert::Suite.new(self)
|
24
|
-
@view = Assert::
|
29
|
+
@view = Assert::DefaultView.new(self, $stdout)
|
25
30
|
@runner = Assert::Runner.new(self)
|
26
31
|
|
27
32
|
@test_dir = "test"
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Assert
|
2
|
+
|
3
|
+
module ConfigHelpers
|
4
|
+
|
5
|
+
def runner_seed
|
6
|
+
self.config.runner_seed
|
7
|
+
end
|
8
|
+
|
9
|
+
def count(type)
|
10
|
+
self.config.suite.count(type)
|
11
|
+
end
|
12
|
+
|
13
|
+
def tests?
|
14
|
+
self.count(:tests) > 0
|
15
|
+
end
|
16
|
+
|
17
|
+
def all_pass?
|
18
|
+
self.count(:pass) == self.count(:results)
|
19
|
+
end
|
20
|
+
|
21
|
+
# get the formatted suite run time
|
22
|
+
def run_time(format = '%.6f')
|
23
|
+
format % self.config.suite.run_time
|
24
|
+
end
|
25
|
+
|
26
|
+
# get the formatted suite test rate
|
27
|
+
def test_rate(format = '%.6f')
|
28
|
+
format % self.config.suite.test_rate
|
29
|
+
end
|
30
|
+
|
31
|
+
# get the formatted suite result rate
|
32
|
+
def result_rate(format = '%.6f')
|
33
|
+
format % self.config.suite.result_rate
|
34
|
+
end
|
35
|
+
|
36
|
+
# get a uniq list of contexts for the test suite
|
37
|
+
def suite_contexts
|
38
|
+
@suite_contexts ||= self.config.suite.tests.inject([]) do |contexts, test|
|
39
|
+
contexts << test.context_info.klass
|
40
|
+
end.uniq
|
41
|
+
end
|
42
|
+
|
43
|
+
def ordered_suite_contexts
|
44
|
+
self.suite_contexts.sort{ |a,b| a.to_s <=> b.to_s }
|
45
|
+
end
|
46
|
+
|
47
|
+
# get a uniq list of files containing contexts for the test suite
|
48
|
+
def suite_files
|
49
|
+
@suite_files ||= self.config.suite.tests.inject([]) do |files, test|
|
50
|
+
files << test.context_info.file
|
51
|
+
end.uniq
|
52
|
+
end
|
53
|
+
|
54
|
+
def ordered_suite_files
|
55
|
+
self.suite_files.sort{ |a,b| a.to_s <=> b.to_s }
|
56
|
+
end
|
57
|
+
|
58
|
+
def show_test_profile_info?
|
59
|
+
!!self.config.profile
|
60
|
+
end
|
61
|
+
|
62
|
+
def show_test_verbose_info?
|
63
|
+
!!self.config.verbose
|
64
|
+
end
|
65
|
+
|
66
|
+
# return a list of result symbols that have actually occurred
|
67
|
+
def ocurring_result_types
|
68
|
+
@result_types ||= [:pass, :fail, :ignore, :skip, :error].select do |sym|
|
69
|
+
self.count(sym) > 0
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
data/lib/assert/context.rb
CHANGED
@@ -33,19 +33,23 @@ module Assert
|
|
33
33
|
|
34
34
|
if self.suite.test_methods.include?(klass_method_name)
|
35
35
|
puts "WARNING: redefining '#{klass_method_name}'"
|
36
|
-
puts " from: #{
|
36
|
+
puts " from: #{caller.first}"
|
37
37
|
else
|
38
38
|
self.suite.test_methods << klass_method_name
|
39
39
|
end
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
self.suite.tests << Test.for_method(
|
42
|
+
method_name.to_s,
|
43
|
+
Suite::ContextInfo.new(self, nil, caller.first),
|
44
|
+
self.suite.config
|
45
|
+
)
|
44
46
|
end
|
45
47
|
end
|
46
48
|
|
47
|
-
def initialize(running_test, config)
|
48
|
-
@__running_test__
|
49
|
+
def initialize(running_test, config, result_callback)
|
50
|
+
@__running_test__ = running_test
|
51
|
+
@__assert_config__ = config
|
52
|
+
@__result_callback__ = result_callback
|
49
53
|
end
|
50
54
|
|
51
55
|
# check if the assertion is a truthy value, if so create a new pass result, otherwise
|
@@ -75,17 +79,17 @@ module Assert
|
|
75
79
|
|
76
80
|
# adds a Pass result to the end of the test's results
|
77
81
|
# does not break test execution
|
78
|
-
def pass(pass_msg=nil)
|
82
|
+
def pass(pass_msg = nil)
|
79
83
|
capture_result do |test, backtrace|
|
80
|
-
Assert::Result::Pass.
|
84
|
+
Assert::Result::Pass.for_test(test, pass_msg, backtrace)
|
81
85
|
end
|
82
86
|
end
|
83
87
|
|
84
88
|
# adds an Ignore result to the end of the test's results
|
85
89
|
# does not break test execution
|
86
|
-
def ignore(ignore_msg=nil)
|
90
|
+
def ignore(ignore_msg = nil)
|
87
91
|
capture_result do |test, backtrace|
|
88
|
-
Assert::Result::Ignore.
|
92
|
+
Assert::Result::Ignore.for_test(test, ignore_msg, backtrace)
|
89
93
|
end
|
90
94
|
end
|
91
95
|
|
@@ -96,15 +100,17 @@ module Assert
|
|
96
100
|
raise Result::TestFailure, message || ''
|
97
101
|
else
|
98
102
|
capture_result do |test, backtrace|
|
99
|
-
Assert::Result::Fail.
|
103
|
+
Assert::Result::Fail.for_test(test, message || '', backtrace)
|
100
104
|
end
|
101
105
|
end
|
102
106
|
end
|
103
107
|
alias_method :flunk, :fail
|
104
108
|
|
105
109
|
# adds a Skip result to the end of the test's results and breaks test execution
|
106
|
-
def skip(skip_msg=nil)
|
107
|
-
|
110
|
+
def skip(skip_msg = nil, called_from = nil)
|
111
|
+
err = Result::TestSkipped.new(skip_msg || '')
|
112
|
+
err.set_backtrace([called_from]) if called_from
|
113
|
+
raise(err)
|
108
114
|
end
|
109
115
|
|
110
116
|
# alter the backtraces of fail results generated in the given block
|
@@ -147,7 +153,7 @@ module Assert
|
|
147
153
|
def capture_result
|
148
154
|
if block_given?
|
149
155
|
result = yield __running_test__, caller
|
150
|
-
__running_test__.
|
156
|
+
__running_test__.capture_result(result, @__result_callback__)
|
151
157
|
result
|
152
158
|
end
|
153
159
|
end
|
@@ -7,38 +7,42 @@ class Assert::Context
|
|
7
7
|
|
8
8
|
module TestDSL
|
9
9
|
|
10
|
-
def test(desc_or_macro, called_from=nil, first_caller=nil, &block)
|
10
|
+
def test(desc_or_macro, called_from = nil, first_caller = nil, &block)
|
11
11
|
if desc_or_macro.kind_of?(Assert::Macro)
|
12
12
|
instance_eval(&desc_or_macro)
|
13
13
|
elsif block_given?
|
14
|
-
ci = Assert::Suite::ContextInfo.new(self, called_from, first_caller || caller.first)
|
15
|
-
test_name = desc_or_macro
|
16
|
-
|
17
14
|
# create a test from the given code block
|
18
|
-
self.suite.tests << Assert::Test.
|
15
|
+
self.suite.tests << Assert::Test.for_block(
|
16
|
+
desc_or_macro.kind_of?(Assert::Macro) ? desc_or_macro.name : desc_or_macro,
|
17
|
+
Assert::Suite::ContextInfo.new(self, called_from, first_caller || caller.first),
|
18
|
+
self.suite.config,
|
19
|
+
&block
|
20
|
+
)
|
19
21
|
else
|
20
22
|
test_eventually(desc_or_macro, called_from, first_caller || caller.first, &block)
|
21
23
|
end
|
22
24
|
end
|
23
25
|
|
24
|
-
def test_eventually(desc_or_macro, called_from=nil, first_caller=nil, &block)
|
25
|
-
ci = Assert::Suite::ContextInfo.new(self, called_from, first_caller || caller.first)
|
26
|
-
test_name = desc_or_macro.kind_of?(Assert::Macro) ? desc_or_macro.name : desc_or_macro
|
27
|
-
skip_block = block.nil? ? Proc.new { skip 'TODO' } : Proc.new { skip }
|
28
|
-
|
26
|
+
def test_eventually(desc_or_macro, called_from = nil, first_caller = nil, &block)
|
29
27
|
# create a test from a proc that just skips
|
30
|
-
|
28
|
+
ci = Assert::Suite::ContextInfo.new(self, called_from, first_caller || caller.first)
|
29
|
+
self.suite.tests << Assert::Test.for_block(
|
30
|
+
desc_or_macro.kind_of?(Assert::Macro) ? desc_or_macro.name : desc_or_macro,
|
31
|
+
ci,
|
32
|
+
self.suite.config,
|
33
|
+
&proc { skip('TODO', ci.called_from) }
|
34
|
+
)
|
31
35
|
end
|
32
36
|
alias_method :test_skip, :test_eventually
|
33
37
|
|
34
|
-
def should(desc_or_macro, called_from=nil, first_caller=nil, &block)
|
38
|
+
def should(desc_or_macro, called_from = nil, first_caller = nil, &block)
|
35
39
|
if !desc_or_macro.kind_of?(Assert::Macro)
|
36
40
|
desc_or_macro = "should #{desc_or_macro}"
|
37
41
|
end
|
38
42
|
test(desc_or_macro, called_from, first_caller || caller.first, &block)
|
39
43
|
end
|
40
44
|
|
41
|
-
def should_eventually(desc_or_macro, called_from=nil, first_caller=nil, &block)
|
45
|
+
def should_eventually(desc_or_macro, called_from = nil, first_caller = nil, &block)
|
42
46
|
if !desc_or_macro.kind_of?(Assert::Macro)
|
43
47
|
desc_or_macro = "should #{desc_or_macro}"
|
44
48
|
end
|
@@ -1,13 +1,11 @@
|
|
1
|
-
require 'assert/view
|
1
|
+
require 'assert/view'
|
2
2
|
|
3
|
-
module Assert
|
3
|
+
module Assert
|
4
4
|
|
5
5
|
# This is the default view used by assert. It renders ansi test output
|
6
6
|
# designed for terminal viewing.
|
7
7
|
|
8
|
-
class DefaultView < Base
|
9
|
-
require 'assert/view/helpers/ansi_styles'
|
10
|
-
include Helpers::AnsiStyles
|
8
|
+
class DefaultView < Assert::View::Base
|
11
9
|
|
12
10
|
# setup options and their default values
|
13
11
|
|
@@ -26,9 +24,6 @@ module Assert::View
|
|
26
24
|
end
|
27
25
|
|
28
26
|
def on_start
|
29
|
-
if tests?
|
30
|
-
puts "Running tests in random order, seeded with \"#{runner_seed}\""
|
31
|
-
end
|
32
27
|
end
|
33
28
|
|
34
29
|
def before_test(test)
|
@@ -40,10 +35,7 @@ module Assert::View
|
|
40
35
|
end
|
41
36
|
|
42
37
|
def on_result(result)
|
43
|
-
|
44
|
-
styled_abbrev = ansi_styled_msg(result_abbrev, result_ansi_styles(result))
|
45
|
-
|
46
|
-
print styled_abbrev
|
38
|
+
print ansi_styled_msg(self.send("#{result.to_sym}_abbrev"), result)
|
47
39
|
end
|
48
40
|
|
49
41
|
def after_test(test)
|
@@ -61,7 +53,7 @@ module Assert::View
|
|
61
53
|
|
62
54
|
# show profile output
|
63
55
|
if show_test_profile_info?
|
64
|
-
|
56
|
+
config.suite.ordered_tests_by_run_time.each do |test|
|
65
57
|
puts "#{test_run_time(test)} seconds,"\
|
66
58
|
" #{test.result_count} results,"\
|
67
59
|
" #{test_result_rate(test)} results/s --"\
|
@@ -71,8 +63,8 @@ module Assert::View
|
|
71
63
|
end
|
72
64
|
|
73
65
|
# style the summaries of each result set
|
74
|
-
styled_results_sentence = results_summary_sentence do |summary,
|
75
|
-
ansi_styled_msg(summary,
|
66
|
+
styled_results_sentence = results_summary_sentence do |summary, result_sym|
|
67
|
+
ansi_styled_msg(summary, result_sym)
|
76
68
|
end
|
77
69
|
|
78
70
|
puts "#{result_count_statement}: #{styled_results_sentence}"
|
@@ -91,12 +83,12 @@ module Assert::View
|
|
91
83
|
puts
|
92
84
|
|
93
85
|
# output detailed results for the tests in reverse test/result order
|
94
|
-
tests = suite.ordered_tests.reverse
|
86
|
+
tests = config.suite.ordered_tests.reverse
|
95
87
|
result_details_for(tests, :reversed).each do |details|
|
96
88
|
if show_result_details?(details.result)
|
97
89
|
# output the styled result details
|
98
90
|
result = details.result
|
99
|
-
puts ansi_styled_msg(result.to_s,
|
91
|
+
puts ansi_styled_msg(result.to_s, result)
|
100
92
|
|
101
93
|
# output any captured stdout
|
102
94
|
output = details.output
|
data/lib/assert/factory.rb
CHANGED
@@ -33,7 +33,7 @@ module Assert
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def string(length = nil)
|
36
|
-
self.type_cast(Random.string(length), :string)
|
36
|
+
self.type_cast(Random.string(length || 10), :string)
|
37
37
|
end
|
38
38
|
|
39
39
|
def text(length = nil)
|
@@ -41,7 +41,7 @@ module Assert
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def slug(length = nil)
|
44
|
-
self.type_cast(Random.
|
44
|
+
self.type_cast(Random.string(length || 5), :string)
|
45
45
|
end
|
46
46
|
|
47
47
|
def hex(length = nil)
|
@@ -122,11 +122,6 @@ module Assert
|
|
122
122
|
[*0..((length || 10) - 1)].map{ |n| DICTIONARY[rand(DICTIONARY.size)] }.join
|
123
123
|
end
|
124
124
|
|
125
|
-
def self.slug_string(length = nil)
|
126
|
-
length ||= 8
|
127
|
-
self.string(length).scan(/.{1,4}/).join('-')
|
128
|
-
end
|
129
|
-
|
130
125
|
def self.hex_string(length = nil)
|
131
126
|
length ||= 10
|
132
127
|
self.integer(("f" * length).hex - 1).to_s(16).rjust(length, '0')
|
data/lib/assert/file_line.rb
CHANGED
@@ -3,12 +3,12 @@ module Assert
|
|
3
3
|
class FileLine
|
4
4
|
|
5
5
|
def self.parse(file_line_path)
|
6
|
-
self.new(*file_line_path.match(/(.+)\:(.+)/)[1..2])
|
6
|
+
self.new(*(file_line_path.to_s.match(/(.+)\:(.+)/) || [])[1..2])
|
7
7
|
end
|
8
8
|
|
9
9
|
attr_reader :file, :line
|
10
10
|
|
11
|
-
def initialize(file, line)
|
11
|
+
def initialize(file = nil, line = nil)
|
12
12
|
@file, @line = file.to_s, line.to_s
|
13
13
|
end
|
14
14
|
|
@@ -17,7 +17,11 @@ module Assert
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def ==(other_file_line)
|
20
|
-
|
20
|
+
if other_file_line.kind_of?(FileLine)
|
21
|
+
self.file == other_file_line.file && self.line == other_file_line.line
|
22
|
+
else
|
23
|
+
super
|
24
|
+
end
|
21
25
|
end
|
22
26
|
|
23
27
|
end
|
data/lib/assert/macro.rb
CHANGED
@@ -100,7 +100,7 @@ module Assert::Macros
|
|
100
100
|
# private
|
101
101
|
|
102
102
|
def _methods_macro_test(called_from)
|
103
|
-
@_methods_macro_test ||= should
|
103
|
+
@_methods_macro_test ||= test "should respond to methods", called_from do
|
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}"
|