assert 2.19.0 → 2.19.5

Sign up to get free protection for your applications and to get access to all the features.
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