assert 2.19.2 → 2.19.3

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.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/assert.gemspec +10 -7
  3. data/lib/assert.rb +18 -6
  4. data/lib/assert/actual_value.rb +8 -6
  5. data/lib/assert/assert_runner.rb +36 -17
  6. data/lib/assert/assertions.rb +83 -50
  7. data/lib/assert/cli.rb +17 -66
  8. data/lib/assert/clirb.rb +55 -0
  9. data/lib/assert/config.rb +7 -7
  10. data/lib/assert/config_helpers.rb +55 -22
  11. data/lib/assert/context.rb +14 -18
  12. data/lib/assert/context/let_dsl.rb +5 -2
  13. data/lib/assert/context/setup_dsl.rb +21 -16
  14. data/lib/assert/context/subject_dsl.rb +6 -7
  15. data/lib/assert/context/suite_dsl.rb +2 -1
  16. data/lib/assert/context/test_dsl.rb +55 -19
  17. data/lib/assert/default_suite.rb +25 -15
  18. data/lib/assert/default_view.rb +47 -30
  19. data/lib/assert/file_line.rb +6 -6
  20. data/lib/assert/macro.rb +1 -1
  21. data/lib/assert/macros/methods.rb +71 -45
  22. data/lib/assert/result.rb +111 -62
  23. data/lib/assert/runner.rb +68 -51
  24. data/lib/assert/stub.rb +4 -4
  25. data/lib/assert/suite.rb +67 -28
  26. data/lib/assert/test.rb +40 -35
  27. data/lib/assert/utils.rb +19 -10
  28. data/lib/assert/version.rb +1 -1
  29. data/lib/assert/view.rb +44 -18
  30. data/lib/assert/view_helpers.rb +100 -92
  31. data/test/helper.rb +3 -1
  32. data/test/support/factory.rb +38 -21
  33. data/test/system/stub_tests.rb +180 -144
  34. data/test/system/test_tests.rb +86 -60
  35. data/test/unit/actual_value_tests.rb +69 -50
  36. data/test/unit/assert_tests.rb +39 -22
  37. data/test/unit/assertions/assert_block_tests.rb +10 -10
  38. data/test/unit/assertions/assert_changes_tests.rb +25 -21
  39. data/test/unit/assertions/assert_empty_tests.rb +14 -12
  40. data/test/unit/assertions/assert_equal_tests.rb +26 -26
  41. data/test/unit/assertions/assert_file_exists_tests.rb +15 -13
  42. data/test/unit/assertions/assert_includes_tests.rb +10 -10
  43. data/test/unit/assertions/assert_instance_of_tests.rb +14 -14
  44. data/test/unit/assertions/assert_is_a_tests.rb +128 -0
  45. data/test/unit/assertions/assert_match_tests.rb +10 -10
  46. data/test/unit/assertions/assert_nil_tests.rb +16 -12
  47. data/test/unit/assertions/assert_raises_tests.rb +27 -20
  48. data/test/unit/assertions/assert_respond_to_tests.rb +10 -10
  49. data/test/unit/assertions/assert_same_tests.rb +24 -24
  50. data/test/unit/assertions/assert_true_false_tests.rb +32 -24
  51. data/test/unit/assertions_tests.rb +14 -9
  52. data/test/unit/config_helpers_tests.rb +15 -10
  53. data/test/unit/config_tests.rb +10 -9
  54. data/test/unit/context/setup_dsl_tests.rb +24 -14
  55. data/test/unit/context/subject_dsl_tests.rb +3 -3
  56. data/test/unit/context/suite_dsl_tests.rb +4 -4
  57. data/test/unit/context/test_dsl_tests.rb +37 -17
  58. data/test/unit/context_info_tests.rb +4 -4
  59. data/test/unit/context_tests.rb +110 -54
  60. data/test/unit/default_suite_tests.rb +10 -6
  61. data/test/unit/factory_tests.rb +2 -2
  62. data/test/unit/file_line_tests.rb +7 -7
  63. data/test/unit/macro_tests.rb +11 -11
  64. data/test/unit/result_tests.rb +47 -41
  65. data/test/unit/runner_tests.rb +29 -16
  66. data/test/unit/suite_tests.rb +37 -15
  67. data/test/unit/test_tests.rb +63 -50
  68. data/test/unit/utils_tests.rb +48 -35
  69. data/test/unit/view_helpers_tests.rb +21 -14
  70. data/test/unit/view_tests.rb +5 -5
  71. metadata +26 -11
  72. data/test/unit/assertions/assert_kind_of_tests.rb +0 -68
@@ -5,39 +5,44 @@ require "assert/file_line"
5
5
  module Assert; end
6
6
 
7
7
  module Assert::Result
8
- class Base ; end
9
- class Pass < Base ; end
10
- class Ignore < Base ; end
11
- class Fail < Base ; end
12
- class Error < Base ; end
13
- class Skip < Base ; end
8
+ class Base; end
9
+ class Pass < Base; end
10
+ class Ignore < Base; end
11
+ class Fail < Base; end
12
+ class Error < Base; end
13
+ class Skip < Base; end
14
14
 
15
15
  def self.types
16
- @types ||= Hash.new{ |h, k| Base }.tap do |hash|
16
+ @types ||= Hash.new{ |_h, _k| Base }.tap{ |hash|
17
17
  hash[:pass] = Pass
18
18
  hash[:fail] = Fail
19
19
  hash[:ignore] = Ignore
20
20
  hash[:skip] = Skip
21
21
  hash[:error] = Error
22
- end.freeze
22
+ }.freeze
23
23
  end
24
24
 
25
25
  def self.new(data = nil)
26
26
  data ||= {}
27
- self.types[data[:type]].new(data)
27
+ types[data[:type]].new(data)
28
28
  end
29
29
 
30
30
  class Base
31
- def self.type; :unknown; end
32
- def self.name; ""; end
31
+ def self.type
32
+ :unknown
33
+ end
34
+
35
+ def self.name
36
+ ""
37
+ end
33
38
 
34
39
  def self.for_test(test, message, bt)
35
- self.new({
36
- :test_name => test.name,
37
- :test_file_line => test.file_line,
38
- :message => message,
39
- :output => test.output,
40
- :backtrace => Backtrace.new(bt)
40
+ new({
41
+ test_name: test.name,
42
+ test_file_line: test.file_line,
43
+ message: message,
44
+ output: test.output,
45
+ backtrace: Backtrace.new(bt),
41
46
  })
42
47
  end
43
48
 
@@ -59,14 +64,20 @@ module Assert::Result
59
64
  end
60
65
 
61
66
  def test_file_line
62
- @test_file_line ||= (@build_data[:test_file_line] || Assert::FileLine.parse(""))
67
+ @test_file_line ||=
68
+ (@build_data[:test_file_line] || Assert::FileLine.parse(""))
63
69
  end
64
70
 
65
- def test_file_name; self.test_file_line.file; end
66
- def test_line_num; self.test_file_line.line.to_i; end
71
+ def test_file_name
72
+ test_file_line.file
73
+ end
74
+
75
+ def test_line_num
76
+ test_file_line.line.to_i
77
+ end
67
78
 
68
79
  def test_id
69
- self.test_file_line.to_s
80
+ test_file_line.to_s
70
81
  end
71
82
 
72
83
  def message
@@ -108,32 +119,38 @@ module Assert::Result
108
119
  end
109
120
 
110
121
  def src_line
111
- @src_line ||= first_filtered_bt_line(self.backtrace)
122
+ @src_line ||= first_filtered_bt_line(backtrace)
112
123
  end
113
124
 
114
125
  def file_line
115
- @file_line ||= Assert::FileLine.parse(self.src_line)
126
+ @file_line ||= Assert::FileLine.parse(src_line)
116
127
  end
117
128
 
118
- def file_name; self.file_line.file; end
119
- def line_num; self.file_line.line.to_i; end
129
+ def file_name
130
+ file_line.file
131
+ end
132
+
133
+ def line_num
134
+ file_line.line.to_i
135
+ end
120
136
 
121
137
  Assert::Result.types.keys.each do |type|
122
138
  define_method("#{type}?"){ self.type == type }
123
139
  end
124
140
 
125
- def to_sym; self.type; end
141
+ def to_sym
142
+ type
143
+ end
126
144
 
127
145
  def to_s
128
- [ "#{self.name.upcase}: #{self.test_name}",
129
- self.message,
130
- self.trace
131
- ].reject(&:empty?).join("\n")
146
+ ["#{name.upcase}: #{test_name}", message, trace]
147
+ .reject(&:empty?)
148
+ .join("\n")
132
149
  end
133
150
 
134
- def ==(other_result)
135
- if other_result.is_a?(self.class)
136
- self.type == other_result.type && self.message == other_result.message
151
+ def ==(other)
152
+ if other.is_a?(self.class)
153
+ type == other.type && message == other.message
137
154
  else
138
155
  super
139
156
  end
@@ -141,9 +158,9 @@ module Assert::Result
141
158
 
142
159
  def inspect
143
160
  "#<#{self.class}:#{"0x0%x" % (object_id << 1)} "\
144
- "@message=#{self.message.inspect} "\
145
- "@file_line=#{self.file_line.to_s.inspect} "\
146
- "@test_file_line=#{self.test_file_line.to_s.inspect}>"
161
+ "@message=#{message.inspect} "\
162
+ "@file_line=#{file_line.to_s.inspect} "\
163
+ "@test_file_line=#{test_file_line.to_s.inspect}>"
147
164
  end
148
165
 
149
166
  private
@@ -153,10 +170,10 @@ module Assert::Result
153
170
  # filtered line of the backtrace). This is overridden for error results
154
171
  # as they always show their full backtrace.
155
172
  def build_trace
156
- if self.with_bt_set?
157
- Backtrace.to_s(@with_bt+[first_filtered_bt_line(self.backtrace)])
173
+ if with_bt_set?
174
+ Backtrace.to_s(@with_bt + [first_filtered_bt_line(backtrace)])
158
175
  else
159
- self.src_line
176
+ src_line
160
177
  end
161
178
  end
162
179
 
@@ -169,13 +186,23 @@ module Assert::Result
169
186
  end
170
187
 
171
188
  class Pass < Base
172
- def self.type; :pass; end
173
- def self.name; "Pass"; end
189
+ def self.type
190
+ :pass
191
+ end
192
+
193
+ def self.name
194
+ "Pass"
195
+ end
174
196
  end
175
197
 
176
198
  class Ignore < Base
177
- def self.type; :ignore; end
178
- def self.name; "Ignore"; end
199
+ def self.type
200
+ :ignore
201
+ end
202
+
203
+ def self.name
204
+ "Ignore"
205
+ end
179
206
  end
180
207
 
181
208
  class HaltingTestResultError < RuntimeError
@@ -186,17 +213,26 @@ module Assert::Result
186
213
  TestFailure = Class.new(HaltingTestResultError)
187
214
 
188
215
  class Fail < Base
189
- def self.type; :fail; end
190
- def self.name; "Fail"; end
216
+ def self.type
217
+ :fail
218
+ end
219
+
220
+ def self.name
221
+ "Fail"
222
+ end
191
223
 
192
- # fail results can be generated manually or by raising Assert::Result::TestFailure
224
+ # fail results can be generated manually or by raising
225
+ # Assert::Result::TestFailure
193
226
  def self.for_test(test, msg_or_err, bt = nil)
194
- if msg_or_err.kind_of?(TestFailure)
227
+ if msg_or_err.is_a?(TestFailure)
195
228
  super(test, msg_or_err.message, msg_or_err.backtrace).tap do |result|
196
229
  result.set_with_bt(msg_or_err.assert_with_bt)
197
230
  end
198
- elsif msg_or_err.kind_of?(Exception)
199
- raise ArgumentError, "generate fail results by raising Assert::Result::TestFailure"
231
+ elsif msg_or_err.is_a?(Exception)
232
+ raise(
233
+ ArgumentError,
234
+ "generate fail results by raising Assert::Result::TestFailure",
235
+ )
200
236
  else
201
237
  super(test, msg_or_err, bt)
202
238
  end
@@ -207,17 +243,25 @@ module Assert::Result
207
243
  TestSkipped = Class.new(HaltingTestResultError)
208
244
 
209
245
  class Skip < Base
210
- def self.type; :skip; end
211
- def self.name; "Skip"; end
246
+ def self.type
247
+ :skip
248
+ end
249
+
250
+ def self.name
251
+ "Skip"
252
+ end
212
253
 
213
254
  # skip results are generated by raising Assert::Result::TestSkipped
214
255
  def self.for_test(test, msg_or_err, bt = nil)
215
- if msg_or_err.kind_of?(TestSkipped)
256
+ if msg_or_err.is_a?(TestSkipped)
216
257
  super(test, msg_or_err.message, msg_or_err.backtrace).tap do |result|
217
258
  result.set_with_bt(msg_or_err.assert_with_bt)
218
259
  end
219
- elsif msg_or_err.kind_of?(Exception)
220
- raise ArgumentError, "generate skip results by raising Assert::Result::TestSkipped"
260
+ elsif msg_or_err.is_a?(Exception)
261
+ raise(
262
+ ArgumentError,
263
+ "generate skip results by raising Assert::Result::TestSkipped",
264
+ )
221
265
  else
222
266
  super(test, msg_or_err, bt)
223
267
  end
@@ -225,12 +269,17 @@ module Assert::Result
225
269
  end
226
270
 
227
271
  class Error < Base
228
- def self.type; :error; end
229
- def self.name; "Error"; end
272
+ def self.type
273
+ :error
274
+ end
275
+
276
+ def self.name
277
+ "Error"
278
+ end
230
279
 
231
280
  # error results are generated by raising exceptions in tests
232
281
  def self.for_test(test, err)
233
- if err.kind_of?(Exception)
282
+ if err.is_a?(Exception)
234
283
  super(test, "#{err.message} (#{err.class.name})", err.backtrace)
235
284
  else
236
285
  raise ArgumentError, "generate error results by raising an exception"
@@ -246,10 +295,10 @@ module Assert::Result
246
295
  end
247
296
 
248
297
  class Backtrace < ::Array
249
- DELIM = "\n".freeze
298
+ DELIM = "\n"
250
299
 
251
300
  def self.parse(bt)
252
- self.new(bt.to_s.split(DELIM))
301
+ new(bt.to_s.split(DELIM))
253
302
  end
254
303
 
255
304
  def self.to_s(bt_array)
@@ -261,7 +310,7 @@ module Assert::Result
261
310
  end
262
311
 
263
312
  def filtered
264
- self.class.new(self.reject { |line| filter_out?(line.to_s) })
313
+ self.class.new(reject{ |line| filter_out?(line.to_s) })
265
314
  end
266
315
 
267
316
  protected
@@ -271,8 +320,8 @@ module Assert::Result
271
320
  # "./lib" in project dir, or "/usr/local/blahblah" if installed
272
321
  assert_lib_path = File.expand_path("../..", __FILE__)
273
322
  assert_macros_path = File.join(assert_lib_path, "assert/macros")
274
- assert_bin_regex = /bin\/assert\:/
275
- ( line.rindex(assert_lib_path, 0) &&
323
+ assert_bin_regex = %r{bin/assert\:}
324
+ (line.rindex(assert_lib_path, 0) &&
276
325
  !line.rindex(assert_macros_path, 0)
277
326
  ) ||
278
327
  line =~ assert_bin_regex
@@ -14,21 +14,21 @@ module Assert
14
14
  @config = config
15
15
  end
16
16
 
17
- def runner; self; end
17
+ def runner
18
+ self
19
+ end
18
20
 
19
21
  def run
20
- self.on_start
21
- self.suite.on_start
22
- self.view.on_start
23
-
24
- if self.single_test?
25
- self.view.print "Running test: #{self.single_test_file_line}"
26
- elsif self.tests_to_run?
27
- self.view.print "Running tests in random order"
28
- end
29
- if self.tests_to_run?
30
- 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"
31
30
  end
31
+ view.puts ", seeded with \"#{runner_seed}\"" if tests_to_run?
32
32
 
33
33
  @current_running_test = nil
34
34
 
@@ -36,46 +36,46 @@ module Assert
36
36
  # (Ctrl+T on Macs), process it
37
37
  if Signal.list.keys.include?("INFO")
38
38
  Signal.trap("INFO") do
39
- self.on_info(@current_running_test)
40
- self.suite.on_info(@current_running_test)
41
- self.view.on_info(@current_running_test)
39
+ on_info(@current_running_test)
40
+ suite.on_info(@current_running_test)
41
+ view.on_info(@current_running_test)
42
42
  end
43
43
  end
44
44
 
45
45
  begin
46
- self.suite.start_time = Time.now
47
- self.suite.setups.each(&:call)
48
- tests_to_run.tap{ self.suite.clear_tests_to_run }.delete_if do |test|
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|
49
49
  @current_running_test = test
50
50
 
51
- self.before_test(test)
52
- self.suite.before_test(test)
53
- self.view.before_test(test)
51
+ before_test(test)
52
+ suite.before_test(test)
53
+ view.before_test(test)
54
54
  test.run do |result|
55
- self.on_result(result)
56
- self.suite.on_result(result)
57
- self.view.on_result(result)
55
+ on_result(result)
56
+ suite.on_result(result)
57
+ view.on_result(result)
58
58
  end
59
- self.after_test(test)
60
- self.suite.after_test(test)
61
- self.view.after_test(test)
59
+ after_test(test)
60
+ suite.after_test(test)
61
+ view.after_test(test)
62
62
 
63
63
  # always delete `test` from `tests_to_run` since it has been run
64
64
  true
65
65
  end
66
- self.suite.teardowns.each(&:call)
67
- self.suite.end_time = Time.now
68
- rescue Interrupt => err
69
- self.on_interrupt(err)
70
- self.suite.on_interrupt(err)
71
- self.view.on_interrupt(err)
72
- raise(err)
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)
73
73
  end
74
74
 
75
- (self.fail_result_count + self.error_result_count).tap do
76
- self.view.on_finish
77
- self.suite.on_finish
78
- self.on_finish
75
+ (fail_result_count + error_result_count).tap do
76
+ view.on_finish
77
+ suite.on_finish
78
+ on_finish
79
79
  end
80
80
  end
81
81
 
@@ -84,24 +84,41 @@ module Assert
84
84
  # define callback handlers to do special behavior during the test run. These
85
85
  # will be called by the test runner
86
86
 
87
- def before_load(test_files); end
88
- def after_load; end
89
- def on_start; end
90
- def before_test(test); end
91
- def on_result(result); end
92
- def after_test(test); end
93
- def on_finish; end
94
- def on_info(test); end
95
- def on_interrupt(err); end
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
96
113
 
97
114
  private
98
115
 
99
116
  def tests_to_run
100
- srand self.runner_seed
101
- if self.single_test?
102
- [self.suite.find_test_to_run(self.single_test_file_line)].compact
117
+ srand runner_seed
118
+ if single_test?
119
+ [suite.find_test_to_run(single_test_file_line)].compact
103
120
  else
104
- self.suite.sorted_tests_to_run{ rand self.tests_to_run_count }
121
+ suite.sorted_tests_to_run{ rand tests_to_run_count }
105
122
  end
106
123
  end
107
124
  end