dohtest 0.1.54 → 0.1.56
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/bin/dohtest_repeat +1 -0
- data/lib/dohtest/assertions.rb +13 -3
- data/lib/dohtest/capture_output.rb +11 -3
- data/lib/dohtest/group_runner.rb +4 -0
- data/lib/dohtest/master_runner.rb +11 -0
- data/lib/dohtest/stream_output.rb +13 -5
- data/test/support/group_runner_helper.rb +25 -0
- data/test/test_assertions.rb +239 -0
- data/test/test_backtrace_parser.rb +1 -1
- data/test/test_exit_codes.rb +106 -0
- data/test/test_group_runner.rb +40 -22
- data/test/test_master_runner.rb +20 -0
- metadata +11 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: feef508b9e97ca382ecec3b01e7cb0c3ff609ab1e0e010e1d7676b94220f4840
|
|
4
|
+
data.tar.gz: 4fadcdffa88dc7d3d958c1f7b73a38a8897c3cfc9427ac32bc12031f2cc00fa1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fe2f5fece8efb09b7fd77bbcf4169b992b22b73f66e876fba4763a23353763c1c291d08c9988e5852cd12710d48fe079e13f24f86e9a2995cac3941da0515d82
|
|
7
|
+
data.tar.gz: a36eaf21dbf9bc595fbf1a3eee95a77066d00dadc76bf5ecec20bb00ba8b81f8b809eb0a031e1f9df0d69044a90d59fd59ca0effe37edccbf43afb0ed16d5361
|
data/bin/dohtest_repeat
CHANGED
data/lib/dohtest/assertions.rb
CHANGED
|
@@ -19,20 +19,30 @@ class TestGroup
|
|
|
19
19
|
end
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
+
# expected arguments:
|
|
23
|
+
# one or more exception classes (or modules); a class matches only exactly, not a subclass
|
|
24
|
+
# then optionally a regex the exception's message must match
|
|
25
|
+
# then optionally a failure message to display if the assertion fails
|
|
22
26
|
def assert_raises(*expected)
|
|
23
27
|
msg = expected.pop if expected.last.is_a?(String)
|
|
28
|
+
message_regex = expected.pop if expected.last.is_a?(Regexp)
|
|
29
|
+
if expected.empty? || !expected.all? { |elem| elem.is_a?(Module) }
|
|
30
|
+
raise ArgumentError, "assert_raises takes exception classes, then an optional regex, then an optional failure message; got: #{expected.inspect}"
|
|
31
|
+
end
|
|
32
|
+
failure_expected = {:classes => expected, :message_regex => message_regex}
|
|
24
33
|
begin
|
|
25
34
|
yield
|
|
26
35
|
no_exception = true
|
|
27
36
|
rescue Exception => actual_excpt
|
|
28
37
|
actual_class = actual_excpt.class
|
|
29
|
-
|
|
38
|
+
class_matched = expected.any? { |elem| elem.instance_of?(Module) ? actual_excpt.kind_of?(elem) : elem == actual_class }
|
|
39
|
+
if class_matched && (message_regex.nil? || actual_excpt.message.match?(message_regex))
|
|
30
40
|
@runner.assertion_passed
|
|
31
41
|
else
|
|
32
|
-
raise DohTest::Failure.new(msg, :raises,
|
|
42
|
+
raise DohTest::Failure.new(msg, :raises, failure_expected, actual_excpt)
|
|
33
43
|
end
|
|
34
44
|
end
|
|
35
|
-
raise DohTest::Failure.new(msg, :raises,
|
|
45
|
+
raise DohTest::Failure.new(msg, :raises, failure_expected, nil) if no_exception
|
|
36
46
|
end
|
|
37
47
|
|
|
38
48
|
def assert_instance_of(expected_class, actual_object, msg = nil)
|
|
@@ -35,17 +35,25 @@ class CaptureOutput
|
|
|
35
35
|
add(:group_name => group_name, :test_name => test_name, :error => error, :seed => seed)
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
-
def assertion_failed(group_name, test_name, failure)
|
|
39
|
-
add(:group_name => group_name, :test_name => test_name, :failure => failure)
|
|
38
|
+
def assertion_failed(group_name, test_name, failure, seed)
|
|
39
|
+
add(:group_name => group_name, :test_name => test_name, :failure => failure, :seed => seed)
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
def assertion_passed(group_name, test_name)
|
|
43
43
|
add(:group_name => group_name, :test_name => test_name)
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
+
def callback_failed(proc_name)
|
|
47
|
+
add(:proc_name => proc_name)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def no_tests_found
|
|
51
|
+
add({})
|
|
52
|
+
end
|
|
53
|
+
|
|
46
54
|
private
|
|
47
55
|
def add(args)
|
|
48
|
-
args[:name] =
|
|
56
|
+
args[:name] = caller_locations(1, 1).first.base_label
|
|
49
57
|
@events.push(args)
|
|
50
58
|
end
|
|
51
59
|
end
|
data/lib/dohtest/group_runner.rb
CHANGED
|
@@ -26,19 +26,30 @@ class MasterRunner
|
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
total_problems = 0
|
|
29
|
+
total_assertions = 0
|
|
30
|
+
callbacks_succeeded = true
|
|
29
31
|
# sort them to be the same order no matter what (different machines were returning different results)
|
|
30
32
|
TestGroup.descendants.sort{|a,b|a.to_s<=>b.to_s}.shuffle.each do |group_class|
|
|
31
33
|
runner = GroupRunner.new(group_class, @output, @config)
|
|
32
34
|
brink_hit = runner.run
|
|
33
35
|
total_problems += runner.total_problems
|
|
36
|
+
total_assertions += runner.total_assertions
|
|
34
37
|
break if brink_hit
|
|
35
38
|
end
|
|
36
39
|
@config[:post_all_callback].each do |proc|
|
|
37
40
|
if !proc.call(total_problems)
|
|
41
|
+
callbacks_succeeded = false
|
|
38
42
|
@output.callback_failed(proc.inspect)
|
|
39
43
|
end
|
|
40
44
|
end
|
|
41
45
|
@output.run_end(Time.now - start_time)
|
|
46
|
+
|
|
47
|
+
success = (total_assertions > 0) && (total_problems == 0) && callbacks_succeeded
|
|
48
|
+
if success
|
|
49
|
+
return 0
|
|
50
|
+
else
|
|
51
|
+
return 1
|
|
52
|
+
end
|
|
42
53
|
end
|
|
43
54
|
end
|
|
44
55
|
|
|
@@ -72,9 +72,6 @@ class StreamOutput
|
|
|
72
72
|
msg = "#{error_str}; #{group_str}; #{test_str}; #{assertion_str}"
|
|
73
73
|
msg = colorize(:success, msg) if success
|
|
74
74
|
@std_ios.puts msg
|
|
75
|
-
|
|
76
|
-
# this is to generate an exit code; true translates to 0, false to 1
|
|
77
|
-
success
|
|
78
75
|
end
|
|
79
76
|
|
|
80
77
|
def group_begin(group_name)
|
|
@@ -171,14 +168,25 @@ private
|
|
|
171
168
|
end
|
|
172
169
|
|
|
173
170
|
def display_raises_failure(failure)
|
|
171
|
+
classes = failure.expected.fetch(:classes)
|
|
172
|
+
message_regex = failure.expected.fetch(:message_regex)
|
|
173
|
+
|
|
174
|
+
if classes.size == 1
|
|
175
|
+
expected_str = classes.first.to_s
|
|
176
|
+
else
|
|
177
|
+
expected_str = "one of #{classes.join(',')}"
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
if message_regex
|
|
181
|
+
expected_str += " with message matching #{message_regex.inspect}"
|
|
182
|
+
end
|
|
174
183
|
if failure.actual
|
|
175
|
-
expected_str = if (failure.expected.size == 1) then failure.expected.first else "one of #{failure.expected.join(',')}" end
|
|
176
184
|
@err_ios.puts colorize(:info, "expected: #{expected_str}; actual: #{failure.actual.class}: #{failure.actual.message}")
|
|
177
185
|
DohTest::BacktraceParser.new(failure.actual.backtrace).relevant_stack.each do |path, line|
|
|
178
186
|
@err_ios.puts "#{path}:#{line}"
|
|
179
187
|
end
|
|
180
188
|
else
|
|
181
|
-
@err_ios.puts colorize(:info, "expected: #{
|
|
189
|
+
@err_ios.puts colorize(:info, "expected: #{expected_str}, but no exception was raised")
|
|
182
190
|
end
|
|
183
191
|
end
|
|
184
192
|
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'dohtest/group_runner'
|
|
2
|
+
require 'dohtest/capture_output'
|
|
3
|
+
|
|
4
|
+
module DohTest
|
|
5
|
+
|
|
6
|
+
# runs a test group with CaptureOutput, so a Minitest::Test can check the events it reports
|
|
7
|
+
module GroupRunnerHelper
|
|
8
|
+
def verify_event(expected_pairs, event)
|
|
9
|
+
expected_pairs.each_pair do |key, value|
|
|
10
|
+
assert_equal(value, event[key])
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def run_group(group_klass, config_overrides = {})
|
|
15
|
+
@group_klass = group_klass
|
|
16
|
+
@output = CaptureOutput.new
|
|
17
|
+
@runner = GroupRunner.new(@group_klass, @output, DohTest.config.merge(config_overrides))
|
|
18
|
+
@runner.run
|
|
19
|
+
@events = @output.events
|
|
20
|
+
assert_equal({:name => 'group_begin', :group_name => @group_klass.to_s}, @events.shift)
|
|
21
|
+
verify_event({:name => 'group_end', :group_name => @group_klass.to_s}, @events.last)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
require 'dohroot'; Doh.find_root_from_file
|
|
2
|
+
require 'minitest/autorun'
|
|
3
|
+
require 'dohtest/group_runner'
|
|
4
|
+
require 'dohtest/capture_output'
|
|
5
|
+
require File.join(Doh.root, 'test/support/group_runner_helper')
|
|
6
|
+
|
|
7
|
+
module DohTest
|
|
8
|
+
|
|
9
|
+
class TestAssertions < Minitest::Test
|
|
10
|
+
include GroupRunnerHelper
|
|
11
|
+
|
|
12
|
+
def verify_passed(group_klass)
|
|
13
|
+
run_group(group_klass)
|
|
14
|
+
assert_equal(4, @events.size)
|
|
15
|
+
assert_equal('test_begin', @events.shift[:name])
|
|
16
|
+
assert_equal('assertion_passed', @events.shift[:name])
|
|
17
|
+
assert_equal('test_end', @events.shift[:name])
|
|
18
|
+
verify_event({:tests_ran => 1, :tests_skipped => 0, :assertions_passed => 1, :assertions_failed => 0}, @events.shift)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def run_failed_group(group_klass)
|
|
22
|
+
run_group(group_klass)
|
|
23
|
+
assert_equal(4, @events.size)
|
|
24
|
+
assert_equal('test_begin', @events.shift[:name])
|
|
25
|
+
event = @events.shift
|
|
26
|
+
assert_equal('assertion_failed', event[:name])
|
|
27
|
+
assert_equal('test_end', @events.shift[:name])
|
|
28
|
+
verify_event({:tests_ran => 1, :tests_skipped => 0, :assertions_passed => 0, :assertions_failed => 1}, @events.shift)
|
|
29
|
+
assert_equal(:raises, event[:failure].assert)
|
|
30
|
+
return event[:failure]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def verify_argument_error(group_klass)
|
|
34
|
+
run_group(group_klass)
|
|
35
|
+
assert_equal(4, @events.size)
|
|
36
|
+
assert_equal('test_begin', @events.shift[:name])
|
|
37
|
+
event = @events.shift
|
|
38
|
+
assert_equal('test_error', event[:name])
|
|
39
|
+
assert_equal(ArgumentError, event[:error].class)
|
|
40
|
+
assert_equal('test_end', @events.shift[:name])
|
|
41
|
+
verify_event({:tests_ran => 1, :tests_skipped => 0, :assertions_passed => 0, :assertions_failed => 0}, @events.shift)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
class RaisesClass < DohTest::TestGroup
|
|
45
|
+
def test_raises
|
|
46
|
+
assert_raises(ArgumentError) { raise ArgumentError }
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_raises_class
|
|
51
|
+
verify_passed(RaisesClass)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
class RaisesOneOfSeveralClasses < DohTest::TestGroup
|
|
55
|
+
def test_raises
|
|
56
|
+
assert_raises(TypeError, ArgumentError) { raise ArgumentError }
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def test_raises_one_of_several_classes
|
|
61
|
+
verify_passed(RaisesOneOfSeveralClasses)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
module TaggedError; end
|
|
65
|
+
class TaggedRuntimeError < RuntimeError
|
|
66
|
+
include TaggedError
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
class RaisesModule < DohTest::TestGroup
|
|
70
|
+
def test_raises
|
|
71
|
+
assert_raises(TaggedError) { raise TaggedRuntimeError }
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def test_raises_module
|
|
76
|
+
verify_passed(RaisesModule)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
class RaisesWrongClass < DohTest::TestGroup
|
|
80
|
+
def test_raises
|
|
81
|
+
assert_raises(TypeError) { raise ArgumentError }
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def test_raises_wrong_class
|
|
86
|
+
failure = run_failed_group(RaisesWrongClass)
|
|
87
|
+
assert_equal(ArgumentError, failure.actual.class)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
class RaisesSubclass < DohTest::TestGroup
|
|
91
|
+
def test_raises
|
|
92
|
+
assert_raises(StandardError) { raise ArgumentError }
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def test_raises_subclass
|
|
97
|
+
failure = run_failed_group(RaisesSubclass)
|
|
98
|
+
assert_equal(ArgumentError, failure.actual.class)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
class RaisesNothing < DohTest::TestGroup
|
|
102
|
+
def test_raises
|
|
103
|
+
assert_raises(ArgumentError) { nil }
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def test_raises_nothing
|
|
108
|
+
failure = run_failed_group(RaisesNothing)
|
|
109
|
+
assert_nil(failure.actual)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
class RaisesMatchingMessage < DohTest::TestGroup
|
|
113
|
+
def test_raises
|
|
114
|
+
assert_raises(ArgumentError, /abc/) { raise ArgumentError, 'xx abc xx' }
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def test_raises_matching_message
|
|
119
|
+
verify_passed(RaisesMatchingMessage)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
class RaisesNonMatchingMessage < DohTest::TestGroup
|
|
123
|
+
def test_raises
|
|
124
|
+
assert_raises(ArgumentError, /abc/) { raise ArgumentError, 'xyz' }
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def test_raises_non_matching_message
|
|
129
|
+
failure = run_failed_group(RaisesNonMatchingMessage)
|
|
130
|
+
assert_equal('xyz', failure.actual.message)
|
|
131
|
+
assert_equal({:classes => [ArgumentError], :message_regex => /abc/}, failure.expected)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
class RaisesMatchingMessageWrongClass < DohTest::TestGroup
|
|
135
|
+
def test_raises
|
|
136
|
+
assert_raises(TypeError, /abc/) { raise ArgumentError, 'abc' }
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def test_raises_matching_message_wrong_class
|
|
141
|
+
failure = run_failed_group(RaisesMatchingMessageWrongClass)
|
|
142
|
+
assert_equal(ArgumentError, failure.actual.class)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
class RaisesNothingWithRegex < DohTest::TestGroup
|
|
146
|
+
def test_raises
|
|
147
|
+
assert_raises(ArgumentError, /abc/) { nil }
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def test_raises_nothing_with_regex
|
|
152
|
+
failure = run_failed_group(RaisesNothingWithRegex)
|
|
153
|
+
assert_nil(failure.actual)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
class RaisesWithFailureMessage < DohTest::TestGroup
|
|
157
|
+
def test_raises
|
|
158
|
+
assert_raises(TypeError, 'custom message') { raise ArgumentError }
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def test_raises_with_failure_message
|
|
163
|
+
failure = run_failed_group(RaisesWithFailureMessage)
|
|
164
|
+
assert_equal('custom message', failure.message)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
class RaisesWithRegexAndFailureMessage < DohTest::TestGroup
|
|
168
|
+
def test_raises
|
|
169
|
+
assert_raises(ArgumentError, /abc/, 'custom message') { raise ArgumentError, 'xyz' }
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def test_raises_with_regex_and_failure_message
|
|
174
|
+
failure = run_failed_group(RaisesWithRegexAndFailureMessage)
|
|
175
|
+
assert_equal('custom message', failure.message)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
class RaisesNoArguments < DohTest::TestGroup
|
|
179
|
+
def test_raises
|
|
180
|
+
assert_raises { nil }
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def test_raises_no_arguments
|
|
185
|
+
verify_argument_error(RaisesNoArguments)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
class RaisesOnlyRegex < DohTest::TestGroup
|
|
189
|
+
def test_raises
|
|
190
|
+
assert_raises(/abc/) { nil }
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def test_raises_only_regex
|
|
195
|
+
verify_argument_error(RaisesOnlyRegex)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
class RaisesOnlyFailureMessage < DohTest::TestGroup
|
|
199
|
+
def test_raises
|
|
200
|
+
assert_raises('custom message') { nil }
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def test_raises_only_failure_message
|
|
205
|
+
verify_argument_error(RaisesOnlyFailureMessage)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
class RaisesRegexBeforeClass < DohTest::TestGroup
|
|
209
|
+
def test_raises
|
|
210
|
+
assert_raises(/abc/, ArgumentError) { nil }
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def test_raises_regex_before_class
|
|
215
|
+
verify_argument_error(RaisesRegexBeforeClass)
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
class RaisesRegexAfterFailureMessage < DohTest::TestGroup
|
|
219
|
+
def test_raises
|
|
220
|
+
assert_raises(ArgumentError, 'custom message', /abc/) { nil }
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def test_raises_regex_after_failure_message
|
|
225
|
+
verify_argument_error(RaisesRegexAfterFailureMessage)
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
class RaisesNonClassArgument < DohTest::TestGroup
|
|
229
|
+
def test_raises
|
|
230
|
+
assert_raises(ArgumentError, 5) { nil }
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def test_raises_non_class_argument
|
|
235
|
+
verify_argument_error(RaisesNonClassArgument)
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
require 'dohroot'; Doh.find_root_from_file
|
|
2
|
+
require 'minitest/autorun'
|
|
3
|
+
require 'tmpdir'
|
|
4
|
+
|
|
5
|
+
module DohTest
|
|
6
|
+
|
|
7
|
+
# runs bin/dohtest and bin/dohtest_repeat as subprocesses against generated
|
|
8
|
+
# fixture suites, pinning the exit-code contract: 0 only when tests ran and
|
|
9
|
+
# every assertion passed, 1 otherwise
|
|
10
|
+
class TestExitCodes < Minitest::Test
|
|
11
|
+
BIN_DIR = File.join(Doh.root, 'bin')
|
|
12
|
+
LIB_DIR = File.join(Doh.root, 'lib')
|
|
13
|
+
|
|
14
|
+
PASSING_GROUP = <<~EOT
|
|
15
|
+
class TestExitPass < DohTest::TestGroup
|
|
16
|
+
def test_pass
|
|
17
|
+
assert_equal(4, 2 + 2)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
EOT
|
|
21
|
+
|
|
22
|
+
FAILING_GROUP = <<~EOT
|
|
23
|
+
class TestExitFail < DohTest::TestGroup
|
|
24
|
+
def test_pass
|
|
25
|
+
assert_equal(4, 2 + 2)
|
|
26
|
+
end
|
|
27
|
+
def test_fail
|
|
28
|
+
assert_equal(5, 2 + 2)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
EOT
|
|
32
|
+
|
|
33
|
+
ERROR_GROUP = <<~EOT
|
|
34
|
+
class TestExitError < DohTest::TestGroup
|
|
35
|
+
def test_error
|
|
36
|
+
raise 'boom'
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
EOT
|
|
40
|
+
|
|
41
|
+
NO_ASSERTION_GROUP = <<~EOT
|
|
42
|
+
class TestExitNoAssertions < DohTest::TestGroup
|
|
43
|
+
def test_nothing
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
EOT
|
|
47
|
+
|
|
48
|
+
def run_dohtest(path)
|
|
49
|
+
system('ruby', "-I#{LIB_DIR}", File.join(BIN_DIR, 'dohtest'), '-q', path, :out => File::NULL, :err => File::NULL)
|
|
50
|
+
return $?.exitstatus
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def run_dohtest_repeat(path)
|
|
54
|
+
env = {'PATH' => "#{BIN_DIR}:#{ENV['PATH']}", 'RUBYLIB' => LIB_DIR}
|
|
55
|
+
system(env, 'ruby', File.join(BIN_DIR, 'dohtest_repeat'), '-q', path, :out => File::NULL, :err => File::NULL)
|
|
56
|
+
return $?.exitstatus
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def with_fixture(group_source)
|
|
60
|
+
Dir.mktmpdir do |dir|
|
|
61
|
+
File.write(File.join(dir, 'dohroot'), '')
|
|
62
|
+
path = File.join(dir, 'fixture.dt.rb')
|
|
63
|
+
File.write(path, group_source)
|
|
64
|
+
yield path
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def test_all_assertions_passing_exits_zero
|
|
69
|
+
with_fixture(PASSING_GROUP) do |path|
|
|
70
|
+
assert_equal(0, run_dohtest(path))
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def test_assertion_failure_exits_one
|
|
75
|
+
with_fixture(FAILING_GROUP) do |path|
|
|
76
|
+
assert_equal(1, run_dohtest(path))
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def test_error_exits_one
|
|
81
|
+
with_fixture(ERROR_GROUP) do |path|
|
|
82
|
+
assert_equal(1, run_dohtest(path))
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def test_no_assertions_exits_one
|
|
87
|
+
with_fixture(NO_ASSERTION_GROUP) do |path|
|
|
88
|
+
assert_equal(1, run_dohtest(path))
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def test_no_test_files_exits_one
|
|
93
|
+
Dir.mktmpdir do |dir|
|
|
94
|
+
File.write(File.join(dir, 'dohroot'), '')
|
|
95
|
+
assert_equal(1, run_dohtest(dir))
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def test_dohtest_repeat_propagates_failure
|
|
100
|
+
with_fixture(FAILING_GROUP) do |path|
|
|
101
|
+
assert_equal(1, run_dohtest_repeat(path))
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
end
|
data/test/test_group_runner.rb
CHANGED
|
@@ -2,27 +2,12 @@ require 'dohroot'; Doh.find_root_from_file
|
|
|
2
2
|
require 'minitest/autorun'
|
|
3
3
|
require 'dohtest/group_runner'
|
|
4
4
|
require 'dohtest/capture_output'
|
|
5
|
+
require File.join(Doh.root, 'test/support/group_runner_helper')
|
|
5
6
|
|
|
6
7
|
module DohTest
|
|
7
8
|
|
|
8
|
-
class TestGroupRunner <
|
|
9
|
-
|
|
10
|
-
expected_pairs.each_pair do |key, value|
|
|
11
|
-
assert_equal(value, event[key])
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def run_group(group_klass, grepstr = nil)
|
|
16
|
-
@group_klass = group_klass
|
|
17
|
-
@output = CaptureOutput.new
|
|
18
|
-
config = if grepstr then DohTest.config.merge({:grep => grepstr}) else nil end
|
|
19
|
-
@runner = GroupRunner.new(@group_klass, @output, config)
|
|
20
|
-
@runner.run
|
|
21
|
-
@events = @output.events
|
|
22
|
-
assert_equal({:name => 'group_begin', :group_name => @group_klass.to_s}, @events.shift)
|
|
23
|
-
verify_event({:name => 'group_end', :group_name => @group_klass.to_s}, @events.last)
|
|
24
|
-
end
|
|
25
|
-
|
|
9
|
+
class TestGroupRunner < Minitest::Test
|
|
10
|
+
include GroupRunnerHelper
|
|
26
11
|
|
|
27
12
|
class EmptyTestGroup < DohTest::TestGroup; end
|
|
28
13
|
def test_empty_group
|
|
@@ -120,6 +105,39 @@ class TestGroupRunner < MiniTest::Test
|
|
|
120
105
|
assert(@group_klass.class_variable_get(:@@ran_after))
|
|
121
106
|
end
|
|
122
107
|
|
|
108
|
+
class AssertionFailureGroup < DohTest::TestGroup
|
|
109
|
+
def test_failed_assertion
|
|
110
|
+
assert_equal(1, 2)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def test_assertion_failure
|
|
115
|
+
run_group(AssertionFailureGroup)
|
|
116
|
+
assert_equal(4, @events.size)
|
|
117
|
+
assert_equal('test_begin', @events.shift[:name])
|
|
118
|
+
event = @events.shift
|
|
119
|
+
assert_equal('assertion_failed', event[:name])
|
|
120
|
+
assert_equal(:equal, event[:failure].assert)
|
|
121
|
+
assert_equal('test_end', @events.shift[:name])
|
|
122
|
+
verify_event({:tests_ran => 1, :tests_skipped => 0, :assertions_passed => 0, :assertions_failed => 1}, @events.shift)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
class CallbackFailureGroup < DohTest::TestGroup
|
|
126
|
+
def test_pass
|
|
127
|
+
assert(true)
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def test_callback_failure
|
|
132
|
+
run_group(CallbackFailureGroup, :pre_group_callback => [proc { false }])
|
|
133
|
+
assert_equal(5, @events.size)
|
|
134
|
+
assert_equal('callback_failed', @events.shift[:name])
|
|
135
|
+
assert_equal('test_begin', @events.shift[:name])
|
|
136
|
+
assert_equal('assertion_passed', @events.shift[:name])
|
|
137
|
+
assert_equal('test_end', @events.shift[:name])
|
|
138
|
+
verify_event({:tests_ran => 1, :tests_skipped => 0, :assertions_passed => 1, :assertions_failed => 0}, @events.shift)
|
|
139
|
+
end
|
|
140
|
+
|
|
123
141
|
class GreppingWithPass < DohTest::TestGroup
|
|
124
142
|
def test_blah
|
|
125
143
|
assert(true)
|
|
@@ -146,22 +164,22 @@ class TestGroupRunner < MiniTest::Test
|
|
|
146
164
|
end
|
|
147
165
|
|
|
148
166
|
def test_grepping_with_pass_grep_blah
|
|
149
|
-
run_group(GreppingWithPass, 'blah')
|
|
167
|
+
run_group(GreppingWithPass, :grep => 'blah')
|
|
150
168
|
verify_event({:tests_ran => 4, :tests_skipped => 1, :assertions_passed => 13, :assertions_failed => 0}, @events.last)
|
|
151
169
|
end
|
|
152
170
|
|
|
153
171
|
def test_grepping_with_pass_grep_blee
|
|
154
|
-
run_group(GreppingWithPass, 'blee')
|
|
172
|
+
run_group(GreppingWithPass, :grep => 'blee')
|
|
155
173
|
verify_event({:tests_ran => 2, :tests_skipped => 3, :assertions_passed => 6, :assertions_failed => 0}, @events.last)
|
|
156
174
|
end
|
|
157
175
|
|
|
158
176
|
def test_grepping_with_pass_grep_bloo
|
|
159
|
-
run_group(GreppingWithPass, 'bloo')
|
|
177
|
+
run_group(GreppingWithPass, :grep => 'bloo')
|
|
160
178
|
verify_event({:tests_ran => 1, :tests_skipped => 4, :assertions_passed => 5, :assertions_failed => 0}, @events.last)
|
|
161
179
|
end
|
|
162
180
|
|
|
163
181
|
def test_grepping_with_pass_grep_zzz
|
|
164
|
-
run_group(GreppingWithPass, 'zzz')
|
|
182
|
+
run_group(GreppingWithPass, :grep => 'zzz')
|
|
165
183
|
verify_event({:tests_ran => 0, :tests_skipped => 5, :assertions_passed => 0, :assertions_failed => 0}, @events.last)
|
|
166
184
|
end
|
|
167
185
|
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'dohroot'; Doh.find_root_from_file
|
|
2
|
+
require 'minitest/autorun'
|
|
3
|
+
require 'dohtest/master_runner'
|
|
4
|
+
require 'dohtest/capture_output'
|
|
5
|
+
|
|
6
|
+
module DohTest
|
|
7
|
+
|
|
8
|
+
class TestMasterRunner < Minitest::Test
|
|
9
|
+
def test_no_tests_found
|
|
10
|
+
output = CaptureOutput.new
|
|
11
|
+
runner = MasterRunner.new(output, DohTest.config.merge(:test_files => [], :seed => 1))
|
|
12
|
+
assert_equal(1, runner.run)
|
|
13
|
+
events = output.events
|
|
14
|
+
assert_equal(2, events.size)
|
|
15
|
+
assert_equal('run_begin', events.shift[:name])
|
|
16
|
+
assert_equal('no_tests_found', events.shift[:name])
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dohtest
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.56
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- ATPSoft
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: dohroot
|
|
@@ -63,13 +62,16 @@ files:
|
|
|
63
62
|
- lib/dohtest/master_runner.rb
|
|
64
63
|
- lib/dohtest/stream_output.rb
|
|
65
64
|
- lib/dohtest/test_group.rb
|
|
65
|
+
- test/support/group_runner_helper.rb
|
|
66
|
+
- test/test_assertions.rb
|
|
66
67
|
- test/test_backtrace_parser.rb
|
|
68
|
+
- test/test_exit_codes.rb
|
|
67
69
|
- test/test_group_runner.rb
|
|
70
|
+
- test/test_master_runner.rb
|
|
68
71
|
homepage: https://github.com/atpsoft/dohtest
|
|
69
72
|
licenses:
|
|
70
73
|
- MIT
|
|
71
74
|
metadata: {}
|
|
72
|
-
post_install_message:
|
|
73
75
|
rdoc_options: []
|
|
74
76
|
require_paths:
|
|
75
77
|
- lib
|
|
@@ -84,10 +86,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
84
86
|
- !ruby/object:Gem::Version
|
|
85
87
|
version: '0'
|
|
86
88
|
requirements: []
|
|
87
|
-
rubygems_version:
|
|
88
|
-
signing_key:
|
|
89
|
+
rubygems_version: 4.0.17
|
|
89
90
|
specification_version: 4
|
|
90
91
|
summary: minimalist unit test framework
|
|
91
92
|
test_files:
|
|
93
|
+
- test/support/group_runner_helper.rb
|
|
94
|
+
- test/test_assertions.rb
|
|
92
95
|
- test/test_backtrace_parser.rb
|
|
96
|
+
- test/test_exit_codes.rb
|
|
93
97
|
- test/test_group_runner.rb
|
|
98
|
+
- test/test_master_runner.rb
|