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.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -2
  3. data/assert.gemspec +11 -6
  4. data/bin/assert +1 -0
  5. data/lib/assert.rb +20 -6
  6. data/lib/assert/actual_value.rb +11 -6
  7. data/lib/assert/assert_runner.rb +38 -17
  8. data/lib/assert/assertions.rb +85 -50
  9. data/lib/assert/cli.rb +32 -70
  10. data/lib/assert/clirb.rb +55 -0
  11. data/lib/assert/config.rb +22 -8
  12. data/lib/assert/config_helpers.rb +57 -22
  13. data/lib/assert/context.rb +16 -18
  14. data/lib/assert/context/let_dsl.rb +8 -2
  15. data/lib/assert/context/method_missing.rb +3 -0
  16. data/lib/assert/context/setup_dsl.rb +24 -16
  17. data/lib/assert/context/subject_dsl.rb +9 -7
  18. data/lib/assert/context/suite_dsl.rb +5 -1
  19. data/lib/assert/context/test_dsl.rb +58 -19
  20. data/lib/assert/context_info.rb +2 -0
  21. data/lib/assert/default_runner.rb +2 -0
  22. data/lib/assert/default_suite.rb +27 -15
  23. data/lib/assert/default_view.rb +49 -30
  24. data/lib/assert/factory.rb +2 -0
  25. data/lib/assert/file_line.rb +8 -6
  26. data/lib/assert/macro.rb +3 -1
  27. data/lib/assert/macros/methods.rb +73 -45
  28. data/lib/assert/result.rb +114 -62
  29. data/lib/assert/runner.rb +70 -51
  30. data/lib/assert/stub.rb +44 -3
  31. data/lib/assert/suite.rb +69 -28
  32. data/lib/assert/test.rb +43 -36
  33. data/lib/assert/utils.rb +22 -11
  34. data/lib/assert/version.rb +3 -1
  35. data/lib/assert/view.rb +46 -18
  36. data/lib/assert/view_helpers.rb +102 -92
  37. data/test/helper.rb +8 -4
  38. data/test/support/factory.rb +40 -21
  39. data/test/support/inherited_stuff.rb +2 -0
  40. data/test/system/stub_tests.rb +182 -144
  41. data/test/system/test_tests.rb +88 -60
  42. data/test/unit/actual_value_tests.rb +71 -50
  43. data/test/unit/assert_tests.rb +42 -23
  44. data/test/unit/assertions/assert_block_tests.rb +12 -10
  45. data/test/unit/assertions/assert_changes_tests.rb +27 -21
  46. data/test/unit/assertions/assert_empty_tests.rb +16 -12
  47. data/test/unit/assertions/assert_equal_tests.rb +28 -26
  48. data/test/unit/assertions/assert_file_exists_tests.rb +17 -13
  49. data/test/unit/assertions/assert_includes_tests.rb +12 -10
  50. data/test/unit/assertions/assert_instance_of_tests.rb +16 -14
  51. data/test/unit/assertions/assert_is_a_tests.rb +128 -0
  52. data/test/unit/assertions/assert_match_tests.rb +12 -10
  53. data/test/unit/assertions/assert_nil_tests.rb +18 -12
  54. data/test/unit/assertions/assert_raises_tests.rb +29 -20
  55. data/test/unit/assertions/assert_respond_to_tests.rb +12 -10
  56. data/test/unit/assertions/assert_same_tests.rb +26 -24
  57. data/test/unit/assertions/assert_true_false_tests.rb +34 -24
  58. data/test/unit/assertions_tests.rb +16 -9
  59. data/test/unit/config_helpers_tests.rb +17 -10
  60. data/test/unit/config_tests.rb +36 -9
  61. data/test/unit/context/let_dsl_tests.rb +2 -0
  62. data/test/unit/context/setup_dsl_tests.rb +26 -14
  63. data/test/unit/context/subject_dsl_tests.rb +5 -3
  64. data/test/unit/context/suite_dsl_tests.rb +6 -4
  65. data/test/unit/context/test_dsl_tests.rb +39 -17
  66. data/test/unit/context_info_tests.rb +6 -4
  67. data/test/unit/context_tests.rb +112 -54
  68. data/test/unit/default_runner_tests.rb +2 -0
  69. data/test/unit/default_suite_tests.rb +12 -6
  70. data/test/unit/factory_tests.rb +4 -2
  71. data/test/unit/file_line_tests.rb +9 -7
  72. data/test/unit/macro_tests.rb +13 -11
  73. data/test/unit/result_tests.rb +49 -41
  74. data/test/unit/runner_tests.rb +33 -18
  75. data/test/unit/suite_tests.rb +39 -15
  76. data/test/unit/test_tests.rb +65 -50
  77. data/test/unit/utils_tests.rb +52 -37
  78. data/test/unit/view_helpers_tests.rb +23 -14
  79. data/test/unit/view_tests.rb +7 -5
  80. metadata +26 -11
  81. data/test/unit/assertions/assert_kind_of_tests.rb +0 -66
@@ -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; self; end
17
+ def runner
18
+ self
19
+ end
16
20
 
17
21
  def run
18
- self.on_start
19
- self.suite.on_start
20
- self.view.on_start
21
-
22
- if self.single_test?
23
- self.view.print "Running test: #{self.single_test_file_line}"
24
- elsif self.tests_to_run?
25
- self.view.print "Running tests in random order"
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
- self.on_info(@current_running_test)
38
- self.suite.on_info(@current_running_test)
39
- 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)
40
42
  end
41
43
  end
42
44
 
43
45
  begin
44
- self.suite.start_time = Time.now
45
- self.suite.setups.each(&:call)
46
- 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|
47
49
  @current_running_test = test
48
50
 
49
- self.before_test(test)
50
- self.suite.before_test(test)
51
- self.view.before_test(test)
51
+ before_test(test)
52
+ suite.before_test(test)
53
+ view.before_test(test)
52
54
  test.run do |result|
53
- self.on_result(result)
54
- self.suite.on_result(result)
55
- self.view.on_result(result)
55
+ on_result(result)
56
+ suite.on_result(result)
57
+ view.on_result(result)
56
58
  end
57
- self.after_test(test)
58
- self.suite.after_test(test)
59
- self.view.after_test(test)
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
- self.suite.teardowns.each(&:call)
65
- self.suite.end_time = Time.now
66
- rescue Interrupt => err
67
- self.on_interrupt(err)
68
- self.suite.on_interrupt(err)
69
- self.view.on_interrupt(err)
70
- 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)
71
73
  end
72
74
 
73
- (self.fail_result_count + self.error_result_count).tap do
74
- self.view.on_finish
75
- self.suite.on_finish
76
- self.on_finish
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); end
86
- def after_load; end
87
- def on_start; end
88
- def before_test(test); end
89
- def on_result(result); end
90
- def after_test(test); end
91
- def on_finish; end
92
- def on_info(test); end
93
- 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
94
113
 
95
114
  private
96
115
 
97
116
  def tests_to_run
98
- srand self.runner_seed
99
- if self.single_test?
100
- [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
101
120
  else
102
- self.suite.sorted_tests_to_run{ rand self.tests_to_run_count }
121
+ suite.sorted_tests_to_run{ rand tests_to_run_count }
103
122
  end
104
123
  end
105
124
  end
@@ -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 => err
29
- err.set_backtrace(orig_caller.map(&:to_s))
30
- raise err
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
@@ -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; self; end
30
+ def suite
31
+ self
32
+ end
29
33
 
30
34
  def setup(&block)
31
- self.setups << (block || proc{})
35
+ setups << (block || proc{})
32
36
  end
33
37
  alias_method :startup, :setup
34
38
 
35
39
  def teardown(&block)
36
- self.teardowns << (block || proc{})
40
+ teardowns << (block || proc{})
37
41
  end
38
42
  alias_method :shutdown, :teardown
39
43
 
40
- def tests_to_run?; @tests.size > 0; end
41
- def tests_to_run_count; @tests.size; end
42
- def clear_tests_to_run; @tests.clear; end
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; end
53
- def result_count; end
54
- def pass_result_count; end
55
- def fail_result_count; end
56
- def error_result_count; end
57
- def skip_result_count; end
58
- def ignore_result_count; end
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(self.test_count, self.run_time)
90
+ get_rate(test_count, run_time)
66
91
  end
67
92
 
68
93
  def result_rate
69
- get_rate(self.result_count, self.run_time)
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. These
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); end
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; end
86
- def on_start; end
87
- def before_test(test); end
88
- def on_result(result); end
89
- def after_test(test); end
90
- def on_finish; end
91
- def on_info(test); end
92
- def on_interrupt(err); end
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=#{self.test_count.inspect}"\
97
- " result_count=#{self.result_count.inspect}>"
137
+ " test_count=#{test_count.inspect}"\
138
+ " result_count=#{result_count.inspect}>"
98
139
  end
99
140
  end
100
141
  end
@@ -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
- { :name => ci.test_name(name),
11
- :file_line => ci.called_from
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
- self.new(self.name_file_line_context_data(context_info, name).merge({
17
- :context_info => context_info,
18
- :config => config,
19
- :code => block
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; self.file_line.file; end
33
- def line_num; self.file_line.line.to_i; end
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
- self.context_info.klass
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 = self.context_class.new(self, self.config, @result_callback)
72
+ scope = context_class.new(self, config, @result_callback)
66
73
  start_time = Time.now
67
74
  capture_output do
68
- self.context_class.run_arounds(scope){ run_test(scope) }
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 <=>(other_test)
75
- self.name <=> other_test.name
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}=#{self.send(attr).inspect}"
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
- self.context_class.run_setups(scope)
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(&(self.code || proc{}))
95
- rescue Result::TestFailure => err
96
- capture_result(Result::Fail, err)
97
- rescue Result::TestSkipped => err
98
- capture_result(Result::Skip, err)
99
- rescue SignalException => err
100
- raise(err)
101
- rescue Exception => err
102
- capture_result(Result::Error, err)
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
- self.context_class.run_teardowns(scope)
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 => err
110
- capture_result(Result::Fail, err)
111
- rescue Result::TestSkipped => err
112
- capture_result(Result::Skip, err)
113
- rescue SignalException => err
114
- raise(err)
115
- rescue Exception => err
116
- capture_result(Result::Error, err)
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 self.config.capture_output == true
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(self.output, "a+")
144
+ StringIO.new(output, "a+")
138
145
  end
139
146
  end
140
147
  end