assert 2.19.0 → 2.19.5
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/Gemfile +4 -2
- data/assert.gemspec +11 -6
- data/bin/assert +1 -0
- data/lib/assert.rb +20 -6
- data/lib/assert/actual_value.rb +11 -6
- data/lib/assert/assert_runner.rb +38 -17
- data/lib/assert/assertions.rb +85 -50
- data/lib/assert/cli.rb +32 -70
- data/lib/assert/clirb.rb +55 -0
- data/lib/assert/config.rb +22 -8
- data/lib/assert/config_helpers.rb +57 -22
- data/lib/assert/context.rb +16 -18
- data/lib/assert/context/let_dsl.rb +8 -2
- data/lib/assert/context/method_missing.rb +3 -0
- data/lib/assert/context/setup_dsl.rb +24 -16
- data/lib/assert/context/subject_dsl.rb +9 -7
- data/lib/assert/context/suite_dsl.rb +5 -1
- data/lib/assert/context/test_dsl.rb +58 -19
- data/lib/assert/context_info.rb +2 -0
- data/lib/assert/default_runner.rb +2 -0
- data/lib/assert/default_suite.rb +27 -15
- data/lib/assert/default_view.rb +49 -30
- data/lib/assert/factory.rb +2 -0
- data/lib/assert/file_line.rb +8 -6
- data/lib/assert/macro.rb +3 -1
- data/lib/assert/macros/methods.rb +73 -45
- data/lib/assert/result.rb +114 -62
- data/lib/assert/runner.rb +70 -51
- data/lib/assert/stub.rb +44 -3
- data/lib/assert/suite.rb +69 -28
- data/lib/assert/test.rb +43 -36
- data/lib/assert/utils.rb +22 -11
- data/lib/assert/version.rb +3 -1
- data/lib/assert/view.rb +46 -18
- data/lib/assert/view_helpers.rb +102 -92
- data/test/helper.rb +8 -4
- data/test/support/factory.rb +40 -21
- data/test/support/inherited_stuff.rb +2 -0
- data/test/system/stub_tests.rb +182 -144
- data/test/system/test_tests.rb +88 -60
- data/test/unit/actual_value_tests.rb +71 -50
- data/test/unit/assert_tests.rb +42 -23
- data/test/unit/assertions/assert_block_tests.rb +12 -10
- data/test/unit/assertions/assert_changes_tests.rb +27 -21
- data/test/unit/assertions/assert_empty_tests.rb +16 -12
- data/test/unit/assertions/assert_equal_tests.rb +28 -26
- data/test/unit/assertions/assert_file_exists_tests.rb +17 -13
- data/test/unit/assertions/assert_includes_tests.rb +12 -10
- data/test/unit/assertions/assert_instance_of_tests.rb +16 -14
- data/test/unit/assertions/assert_is_a_tests.rb +128 -0
- data/test/unit/assertions/assert_match_tests.rb +12 -10
- data/test/unit/assertions/assert_nil_tests.rb +18 -12
- data/test/unit/assertions/assert_raises_tests.rb +29 -20
- data/test/unit/assertions/assert_respond_to_tests.rb +12 -10
- data/test/unit/assertions/assert_same_tests.rb +26 -24
- data/test/unit/assertions/assert_true_false_tests.rb +34 -24
- data/test/unit/assertions_tests.rb +16 -9
- data/test/unit/config_helpers_tests.rb +17 -10
- data/test/unit/config_tests.rb +36 -9
- data/test/unit/context/let_dsl_tests.rb +2 -0
- data/test/unit/context/setup_dsl_tests.rb +26 -14
- data/test/unit/context/subject_dsl_tests.rb +5 -3
- data/test/unit/context/suite_dsl_tests.rb +6 -4
- data/test/unit/context/test_dsl_tests.rb +39 -17
- data/test/unit/context_info_tests.rb +6 -4
- data/test/unit/context_tests.rb +112 -54
- data/test/unit/default_runner_tests.rb +2 -0
- data/test/unit/default_suite_tests.rb +12 -6
- data/test/unit/factory_tests.rb +4 -2
- data/test/unit/file_line_tests.rb +9 -7
- data/test/unit/macro_tests.rb +13 -11
- data/test/unit/result_tests.rb +49 -41
- data/test/unit/runner_tests.rb +33 -18
- data/test/unit/suite_tests.rb +39 -15
- data/test/unit/test_tests.rb +65 -50
- data/test/unit/utils_tests.rb +52 -37
- data/test/unit/view_helpers_tests.rb +23 -14
- data/test/unit/view_tests.rb +7 -5
- metadata +26 -11
- data/test/unit/assertions/assert_kind_of_tests.rb +0 -66
data/lib/assert/runner.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "assert/config_helpers"
|
2
4
|
require "assert/suite"
|
3
5
|
require "assert/view"
|
@@ -12,21 +14,21 @@ module Assert
|
|
12
14
|
@config = config
|
13
15
|
end
|
14
16
|
|
15
|
-
def runner
|
17
|
+
def runner
|
18
|
+
self
|
19
|
+
end
|
16
20
|
|
17
21
|
def run
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
if
|
23
|
-
|
24
|
-
elsif
|
25
|
-
|
26
|
-
end
|
27
|
-
if self.tests_to_run?
|
28
|
-
self.view.puts ", seeded with \"#{self.runner_seed}\""
|
22
|
+
on_start
|
23
|
+
suite.on_start
|
24
|
+
view.on_start
|
25
|
+
|
26
|
+
if single_test?
|
27
|
+
view.print "Running test: #{single_test_file_line}"
|
28
|
+
elsif tests_to_run?
|
29
|
+
view.print "Running tests in random order"
|
29
30
|
end
|
31
|
+
view.puts ", seeded with \"#{runner_seed}\"" if tests_to_run?
|
30
32
|
|
31
33
|
@current_running_test = nil
|
32
34
|
|
@@ -34,46 +36,46 @@ module Assert
|
|
34
36
|
# (Ctrl+T on Macs), process it
|
35
37
|
if Signal.list.keys.include?("INFO")
|
36
38
|
Signal.trap("INFO") do
|
37
|
-
|
38
|
-
|
39
|
-
|
39
|
+
on_info(@current_running_test)
|
40
|
+
suite.on_info(@current_running_test)
|
41
|
+
view.on_info(@current_running_test)
|
40
42
|
end
|
41
43
|
end
|
42
44
|
|
43
45
|
begin
|
44
|
-
|
45
|
-
|
46
|
-
tests_to_run.tap{
|
46
|
+
suite.start_time = Time.now
|
47
|
+
suite.setups.each(&:call)
|
48
|
+
tests_to_run.tap{ suite.clear_tests_to_run }.delete_if do |test|
|
47
49
|
@current_running_test = test
|
48
50
|
|
49
|
-
|
50
|
-
|
51
|
-
|
51
|
+
before_test(test)
|
52
|
+
suite.before_test(test)
|
53
|
+
view.before_test(test)
|
52
54
|
test.run do |result|
|
53
|
-
|
54
|
-
|
55
|
-
|
55
|
+
on_result(result)
|
56
|
+
suite.on_result(result)
|
57
|
+
view.on_result(result)
|
56
58
|
end
|
57
|
-
|
58
|
-
|
59
|
-
|
59
|
+
after_test(test)
|
60
|
+
suite.after_test(test)
|
61
|
+
view.after_test(test)
|
60
62
|
|
61
63
|
# always delete `test` from `tests_to_run` since it has been run
|
62
64
|
true
|
63
65
|
end
|
64
|
-
|
65
|
-
|
66
|
-
rescue Interrupt =>
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
raise(
|
66
|
+
suite.teardowns.each(&:call)
|
67
|
+
suite.end_time = Time.now
|
68
|
+
rescue Interrupt => ex
|
69
|
+
on_interrupt(ex)
|
70
|
+
suite.on_interrupt(ex)
|
71
|
+
view.on_interrupt(ex)
|
72
|
+
raise(ex)
|
71
73
|
end
|
72
74
|
|
73
|
-
(
|
74
|
-
|
75
|
-
|
76
|
-
|
75
|
+
(fail_result_count + error_result_count).tap do
|
76
|
+
view.on_finish
|
77
|
+
suite.on_finish
|
78
|
+
on_finish
|
77
79
|
end
|
78
80
|
end
|
79
81
|
|
@@ -82,24 +84,41 @@ module Assert
|
|
82
84
|
# define callback handlers to do special behavior during the test run. These
|
83
85
|
# will be called by the test runner
|
84
86
|
|
85
|
-
def before_load(test_files)
|
86
|
-
|
87
|
-
|
88
|
-
def
|
89
|
-
|
90
|
-
|
91
|
-
def
|
92
|
-
|
93
|
-
|
87
|
+
def before_load(test_files)
|
88
|
+
end
|
89
|
+
|
90
|
+
def after_load
|
91
|
+
end
|
92
|
+
|
93
|
+
def on_start
|
94
|
+
end
|
95
|
+
|
96
|
+
def before_test(test)
|
97
|
+
end
|
98
|
+
|
99
|
+
def on_result(result)
|
100
|
+
end
|
101
|
+
|
102
|
+
def after_test(test)
|
103
|
+
end
|
104
|
+
|
105
|
+
def on_finish
|
106
|
+
end
|
107
|
+
|
108
|
+
def on_info(test)
|
109
|
+
end
|
110
|
+
|
111
|
+
def on_interrupt(err)
|
112
|
+
end
|
94
113
|
|
95
114
|
private
|
96
115
|
|
97
116
|
def tests_to_run
|
98
|
-
srand
|
99
|
-
if
|
100
|
-
[
|
117
|
+
srand runner_seed
|
118
|
+
if single_test?
|
119
|
+
[suite.find_test_to_run(single_test_file_line)].compact
|
101
120
|
else
|
102
|
-
|
121
|
+
suite.sorted_tests_to_run{ rand tests_to_run_count }
|
103
122
|
end
|
104
123
|
end
|
105
124
|
end
|
data/lib/assert/stub.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "much-stub"
|
2
4
|
|
3
5
|
module Assert
|
@@ -25,9 +27,9 @@ module Assert
|
|
25
27
|
orig_caller = caller_locations
|
26
28
|
begin
|
27
29
|
MuchStub.stub_send(*args, &block)
|
28
|
-
rescue MuchStub::NotStubbedError =>
|
29
|
-
|
30
|
-
raise
|
30
|
+
rescue MuchStub::NotStubbedError => ex
|
31
|
+
ex.set_backtrace(orig_caller.map(&:to_s))
|
32
|
+
raise ex
|
31
33
|
end
|
32
34
|
end
|
33
35
|
|
@@ -42,4 +44,43 @@ module Assert
|
|
42
44
|
def self.stub_spy(*args, &block)
|
43
45
|
MuchStub.spy(*args, &block)
|
44
46
|
end
|
47
|
+
|
48
|
+
StubCall = MuchStub::Call
|
49
|
+
class StubCall
|
50
|
+
def self.name
|
51
|
+
super.gsub("MuchStub::Call", "Assert::StubCall")
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.to_s
|
55
|
+
super.gsub("MuchStub::Call", "Assert::StubCall")
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.inspect
|
59
|
+
super.gsub("MuchStub::Call", "Assert::StubCall")
|
60
|
+
end
|
61
|
+
|
62
|
+
def inspect
|
63
|
+
super.gsub("MuchStub::Call", "Assert::StubCall")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
StubCallSpy = MuchStub::CallSpy
|
68
|
+
class StubCallSpy
|
69
|
+
def self.name
|
70
|
+
super.gsub("MuchStub::CallSpy", "Assert::StubCallSpy")
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.to_s
|
74
|
+
super.gsub("MuchStub::CallSpy", "Assert::StubCallSpy")
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.inspect
|
78
|
+
super.gsub("MuchStub::CallSpy", "Assert::StubCallSpy")
|
79
|
+
end
|
80
|
+
|
81
|
+
# See MuchStub::CallSpy#inspect.
|
82
|
+
def inspect
|
83
|
+
"#<Assert::StubCallSpy:#{"0x0%x" % (__id__ << 1)}>"
|
84
|
+
end
|
85
|
+
end
|
45
86
|
end
|
data/lib/assert/suite.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "assert/config_helpers"
|
2
4
|
require "assert/test"
|
3
5
|
|
@@ -25,21 +27,31 @@ module Assert
|
|
25
27
|
@end_time = @start_time
|
26
28
|
end
|
27
29
|
|
28
|
-
def suite
|
30
|
+
def suite
|
31
|
+
self
|
32
|
+
end
|
29
33
|
|
30
34
|
def setup(&block)
|
31
|
-
|
35
|
+
setups << (block || proc{})
|
32
36
|
end
|
33
37
|
alias_method :startup, :setup
|
34
38
|
|
35
39
|
def teardown(&block)
|
36
|
-
|
40
|
+
teardowns << (block || proc{})
|
37
41
|
end
|
38
42
|
alias_method :shutdown, :teardown
|
39
43
|
|
40
|
-
def tests_to_run
|
41
|
-
|
42
|
-
|
44
|
+
def tests_to_run?
|
45
|
+
@tests.any?
|
46
|
+
end
|
47
|
+
|
48
|
+
def tests_to_run_count
|
49
|
+
@tests.size
|
50
|
+
end
|
51
|
+
|
52
|
+
def clear_tests_to_run
|
53
|
+
@tests.clear
|
54
|
+
end
|
43
55
|
|
44
56
|
def find_test_to_run(file_line)
|
45
57
|
@tests.find{ |t| t.file_line == file_line }
|
@@ -49,32 +61,46 @@ module Assert
|
|
49
61
|
@tests.sort.sort_by(&sort_by_proc)
|
50
62
|
end
|
51
63
|
|
52
|
-
def test_count
|
53
|
-
|
54
|
-
|
55
|
-
def
|
56
|
-
|
57
|
-
|
58
|
-
def
|
64
|
+
def test_count
|
65
|
+
end
|
66
|
+
|
67
|
+
def result_count
|
68
|
+
end
|
69
|
+
|
70
|
+
def pass_result_count
|
71
|
+
end
|
72
|
+
|
73
|
+
def fail_result_count
|
74
|
+
end
|
75
|
+
|
76
|
+
def error_result_count
|
77
|
+
end
|
78
|
+
|
79
|
+
def skip_result_count
|
80
|
+
end
|
81
|
+
|
82
|
+
def ignore_result_count
|
83
|
+
end
|
59
84
|
|
60
85
|
def run_time
|
61
86
|
@end_time - @start_time
|
62
87
|
end
|
63
88
|
|
64
89
|
def test_rate
|
65
|
-
get_rate(
|
90
|
+
get_rate(test_count, run_time)
|
66
91
|
end
|
67
92
|
|
68
93
|
def result_rate
|
69
|
-
get_rate(
|
94
|
+
get_rate(result_count, run_time)
|
70
95
|
end
|
71
96
|
|
72
97
|
# Callbacks
|
73
98
|
|
74
|
-
# define callback handlers to do special behavior during the test run.
|
75
|
-
# will be called by the test runner
|
99
|
+
# define callback handlers to do special behavior during the test run.
|
100
|
+
# These will be called by the test runner.
|
76
101
|
|
77
|
-
def before_load(test_files)
|
102
|
+
def before_load(test_files)
|
103
|
+
end
|
78
104
|
|
79
105
|
# this is required to load tests into the suite, be sure to `super` if you
|
80
106
|
# override this method
|
@@ -82,19 +108,34 @@ module Assert
|
|
82
108
|
@tests << test
|
83
109
|
end
|
84
110
|
|
85
|
-
def after_load
|
86
|
-
|
87
|
-
|
88
|
-
def
|
89
|
-
|
90
|
-
|
91
|
-
def
|
92
|
-
|
111
|
+
def after_load
|
112
|
+
end
|
113
|
+
|
114
|
+
def on_start
|
115
|
+
end
|
116
|
+
|
117
|
+
def before_test(test)
|
118
|
+
end
|
119
|
+
|
120
|
+
def on_result(result)
|
121
|
+
end
|
122
|
+
|
123
|
+
def after_test(test)
|
124
|
+
end
|
125
|
+
|
126
|
+
def on_finish
|
127
|
+
end
|
128
|
+
|
129
|
+
def on_info(test)
|
130
|
+
end
|
131
|
+
|
132
|
+
def on_interrupt(err)
|
133
|
+
end
|
93
134
|
|
94
135
|
def inspect
|
95
136
|
"#<#{self.class}:#{"0x0%x" % (object_id << 1)}"\
|
96
|
-
" test_count=#{
|
97
|
-
" result_count=#{
|
137
|
+
" test_count=#{test_count.inspect}"\
|
138
|
+
" result_count=#{result_count.inspect}>"
|
98
139
|
end
|
99
140
|
end
|
100
141
|
end
|
data/lib/assert/test.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "stringio"
|
2
4
|
require "assert/file_line"
|
3
5
|
require "assert/result"
|
@@ -7,16 +9,16 @@ module Assert
|
|
7
9
|
# Test is some code/method to run in the scope of a Context that may
|
8
10
|
# produce results.
|
9
11
|
def self.name_file_line_context_data(ci, name)
|
10
|
-
{ :
|
11
|
-
:
|
12
|
+
{ name: ci.test_name(name),
|
13
|
+
file_line: ci.called_from,
|
12
14
|
}
|
13
15
|
end
|
14
16
|
|
15
17
|
def self.for_block(name, context_info, config, &block)
|
16
|
-
|
17
|
-
:
|
18
|
-
:
|
19
|
-
:
|
18
|
+
new(name_file_line_context_data(context_info, name).merge({
|
19
|
+
context_info: context_info,
|
20
|
+
config: config,
|
21
|
+
code: block,
|
20
22
|
}))
|
21
23
|
end
|
22
24
|
|
@@ -29,15 +31,20 @@ module Assert
|
|
29
31
|
@file_line ||= FileLine.parse((@build_data[:file_line] || "").to_s)
|
30
32
|
end
|
31
33
|
|
32
|
-
def file_name
|
33
|
-
|
34
|
+
def file_name
|
35
|
+
file_line.file
|
36
|
+
end
|
37
|
+
|
38
|
+
def line_num
|
39
|
+
file_line.line.to_i
|
40
|
+
end
|
34
41
|
|
35
42
|
def name
|
36
43
|
@name ||= (@build_data[:name] || "")
|
37
44
|
end
|
38
45
|
|
39
46
|
def output
|
40
|
-
@output ||= (@build_data[:output] || "")
|
47
|
+
@output ||= (@build_data[:output] || +"")
|
41
48
|
end
|
42
49
|
|
43
50
|
def run_time
|
@@ -49,7 +56,7 @@ module Assert
|
|
49
56
|
end
|
50
57
|
|
51
58
|
def context_class
|
52
|
-
|
59
|
+
context_info.klass
|
53
60
|
end
|
54
61
|
|
55
62
|
def config
|
@@ -62,22 +69,22 @@ module Assert
|
|
62
69
|
|
63
70
|
def run(&result_callback)
|
64
71
|
@result_callback = result_callback || proc{ |result| } # noop by default
|
65
|
-
scope =
|
72
|
+
scope = context_class.new(self, config, @result_callback)
|
66
73
|
start_time = Time.now
|
67
74
|
capture_output do
|
68
|
-
|
75
|
+
context_class.run_arounds(scope){ run_test(scope) }
|
69
76
|
end
|
70
77
|
@result_callback = nil
|
71
78
|
@run_time = Time.now - start_time
|
72
79
|
end
|
73
80
|
|
74
|
-
def <=>(
|
75
|
-
|
81
|
+
def <=>(other)
|
82
|
+
name <=> other.name
|
76
83
|
end
|
77
84
|
|
78
85
|
def inspect
|
79
86
|
attributes_string = ([:name, :context_info].collect do |attr|
|
80
|
-
"@#{attr}=#{
|
87
|
+
"@#{attr}=#{send(attr).inspect}"
|
81
88
|
end).join(" ")
|
82
89
|
"#<#{self.class}:#{"0x0%x" % (object_id << 1)} #{attributes_string}>"
|
83
90
|
end
|
@@ -87,33 +94,33 @@ module Assert
|
|
87
94
|
def run_test(scope)
|
88
95
|
begin
|
89
96
|
# run any assert style "setup do" setups
|
90
|
-
|
97
|
+
context_class.run_setups(scope)
|
91
98
|
# run any test/unit style "def setup" setups
|
92
99
|
scope.setup if scope.respond_to?(:setup)
|
93
100
|
# run the code block
|
94
|
-
scope.instance_eval(&(
|
95
|
-
rescue Result::TestFailure =>
|
96
|
-
capture_result(Result::Fail,
|
97
|
-
rescue Result::TestSkipped =>
|
98
|
-
capture_result(Result::Skip,
|
99
|
-
rescue SignalException =>
|
100
|
-
raise(
|
101
|
-
rescue
|
102
|
-
capture_result(Result::Error,
|
101
|
+
scope.instance_eval(&(code || proc{}))
|
102
|
+
rescue Result::TestFailure => ex
|
103
|
+
capture_result(Result::Fail, ex)
|
104
|
+
rescue Result::TestSkipped => ex
|
105
|
+
capture_result(Result::Skip, ex)
|
106
|
+
rescue SignalException => ex
|
107
|
+
raise(ex)
|
108
|
+
rescue => ex
|
109
|
+
capture_result(Result::Error, ex)
|
103
110
|
ensure
|
104
111
|
begin
|
105
112
|
# run any assert style "teardown do" teardowns
|
106
|
-
|
113
|
+
context_class.run_teardowns(scope)
|
107
114
|
# run any test/unit style "def teardown" teardowns
|
108
115
|
scope.teardown if scope.respond_to?(:teardown)
|
109
|
-
rescue Result::TestFailure =>
|
110
|
-
capture_result(Result::Fail,
|
111
|
-
rescue Result::TestSkipped =>
|
112
|
-
capture_result(Result::Skip,
|
113
|
-
rescue SignalException =>
|
114
|
-
raise(
|
115
|
-
rescue
|
116
|
-
capture_result(Result::Error,
|
116
|
+
rescue Result::TestFailure => ex
|
117
|
+
capture_result(Result::Fail, ex)
|
118
|
+
rescue Result::TestSkipped => ex
|
119
|
+
capture_result(Result::Skip, ex)
|
120
|
+
rescue SignalException => ex
|
121
|
+
raise(ex)
|
122
|
+
rescue => ex
|
123
|
+
capture_result(Result::Error, ex)
|
117
124
|
end
|
118
125
|
end
|
119
126
|
end
|
@@ -123,7 +130,7 @@ module Assert
|
|
123
130
|
end
|
124
131
|
|
125
132
|
def capture_output(&block)
|
126
|
-
if
|
133
|
+
if config.capture_output == true
|
127
134
|
orig_stdout = $stdout.clone
|
128
135
|
$stdout = capture_io
|
129
136
|
block.call
|
@@ -134,7 +141,7 @@ module Assert
|
|
134
141
|
end
|
135
142
|
|
136
143
|
def capture_io
|
137
|
-
StringIO.new(
|
144
|
+
StringIO.new(output, "a+")
|
138
145
|
end
|
139
146
|
end
|
140
147
|
end
|