assert 2.19.1 → 2.19.6

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 +30 -70
  8. data/lib/assert/clirb.rb +55 -0
  9. data/lib/assert/config.rb +20 -8
  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 +42 -3
  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 +34 -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
data/lib/assert/cli.rb CHANGED
@@ -3,10 +3,14 @@
3
3
  require "benchmark"
4
4
  require "set"
5
5
  require "assert/assert_runner"
6
+ require "assert/clirb"
6
7
  require "assert/version"
7
8
 
8
9
  module Assert
9
10
  class CLI
11
+ SUCCESS_EXIT_STATUS = 0
12
+ ERROR_EXIT_STATUS = 1
13
+
10
14
  def self.debug?(args)
11
15
  args.include?("-d") || args.include?("--debug")
12
16
  end
@@ -24,13 +28,17 @@ module Assert
24
28
  end
25
29
 
26
30
  def self.bench(start_msg, &block)
27
- if !Assert.config.debug
28
- block.call; return
31
+ unless Assert.config.debug
32
+ block.call
33
+ return
29
34
  end
35
+
30
36
  print debug_start_msg(start_msg)
31
- RoundedMillisecondTime.new(Benchmark.measure(&block).real).tap do |time_in_ms|
32
- puts debug_finish_msg(time_in_ms)
33
- end
37
+ RoundedMillisecondTime
38
+ .new(Benchmark.measure(&block).real)
39
+ .tap do |time_in_ms|
40
+ puts debug_finish_msg(time_in_ms)
41
+ end
34
42
  end
35
43
 
36
44
  def initialize(*args)
@@ -63,25 +71,31 @@ module Assert
63
71
  end
64
72
 
65
73
  def run
74
+ fails_plus_errors_count = 0
66
75
  begin
67
76
  @cli.parse!(@args)
68
77
  catch(:halt) do
69
- Assert::AssertRunner.new(Assert.config, @cli.args, @cli.opts).run
78
+ fails_plus_errors_count =
79
+ Assert::AssertRunner.new(Assert.config, @cli.args, @cli.opts).run
70
80
  end
71
81
  rescue CLIRB::HelpExit
72
82
  puts help
83
+ exit(SUCCESS_EXIT_STATUS)
73
84
  rescue CLIRB::VersionExit
74
85
  puts Assert::VERSION
75
- rescue CLIRB::Error => exception
76
- puts "#{exception.message}\n\n"
77
- puts Assert.config.debug ? exception.backtrace.join("\n") : help
78
- exit(1)
79
- rescue StandardError => exception
80
- puts "#{exception.class}: #{exception.message}"
81
- puts exception.backtrace.join("\n")
82
- exit(1)
86
+ exit(SUCCESS_EXIT_STATUS)
87
+ rescue CLIRB::Error => ex
88
+ puts "#{ex.message}\n\n"
89
+ puts Assert.config.debug ? ex.backtrace.join("\n") : help
90
+ exit(ERROR_EXIT_STATUS)
91
+ rescue => ex
92
+ puts "#{ex.class}: #{ex.message}"
93
+ puts ex.backtrace.join("\n")
94
+ exit(ERROR_EXIT_STATUS)
83
95
  end
84
- exit(0)
96
+ exit(
97
+ fails_plus_errors_count == 0 ? SUCCESS_EXIT_STATUS : ERROR_EXIT_STATUS,
98
+ )
85
99
  end
86
100
 
87
101
  def help
@@ -93,63 +107,9 @@ module Assert
93
107
 
94
108
  module RoundedMillisecondTime
95
109
  ROUND_PRECISION = 3
96
- ROUND_MODIFIER = 10 ** ROUND_PRECISION
110
+ ROUND_MODIFIER = 10**ROUND_PRECISION
97
111
  def self.new(time_in_seconds)
98
112
  (time_in_seconds * 1000 * ROUND_MODIFIER).to_i / ROUND_MODIFIER.to_f
99
113
  end
100
114
  end
101
-
102
- class CLIRB # Version 1.1.0, https://github.com/redding/cli.rb
103
- Error = Class.new(RuntimeError);
104
- HelpExit = Class.new(RuntimeError); VersionExit = Class.new(RuntimeError)
105
- attr_reader :argv, :args, :opts, :data
106
-
107
- def initialize(&block)
108
- @options = []; instance_eval(&block) if block
109
- require "optparse"
110
- @data, @args, @opts = [], [], {}; @parser = OptionParser.new do |p|
111
- p.banner = ""; @options.each do |o|
112
- @opts[o.name] = o.value; p.on(*o.parser_args){ |v| @opts[o.name] = v }
113
- end
114
- p.on_tail("--version", ""){ |v| raise VersionExit, v.to_s }
115
- p.on_tail("--help", ""){ |v| raise HelpExit, v.to_s }
116
- end
117
- end
118
-
119
- def option(*args); @options << Option.new(*args); end
120
- def parse!(argv)
121
- @args = (argv || []).dup.tap do |args_list|
122
- begin; @parser.parse!(args_list)
123
- rescue OptionParser::ParseError => err; raise Error, err.message; end
124
- end; @data = @args + [@opts]
125
- end
126
- def to_s; @parser.to_s; end
127
- def inspect
128
- "#<#{self.class}:#{"0x0%x" % (object_id << 1)} @data=#{@data.inspect}>"
129
- end
130
-
131
- class Option
132
- attr_reader :name, :opt_name, :desc, :abbrev, :value, :klass, :parser_args
133
-
134
- def initialize(name, desc = nil, abbrev: nil, value: nil)
135
- @name, @desc = name, desc || ""
136
- @opt_name, @abbrev = parse_name_values(name, abbrev)
137
- @value, @klass = gvalinfo(value)
138
- @parser_args = if [TrueClass, FalseClass, NilClass].include?(@klass)
139
- ["-#{@abbrev}", "--[no-]#{@opt_name}", @desc]
140
- else
141
- ["-#{@abbrev}", "--#{@opt_name} VALUE", @klass, @desc]
142
- end
143
- end
144
-
145
- private
146
-
147
- def parse_name_values(name, custom_abbrev)
148
- [ (processed_name = name.to_s.strip.downcase).gsub("_", "-"),
149
- custom_abbrev || processed_name.gsub(/[^a-z]/, "").chars.first || "a"
150
- ]
151
- end
152
- def gvalinfo(v); v.kind_of?(Class) ? [nil,v] : [v,v.class]; end
153
- end
154
- end
155
115
  end
@@ -0,0 +1,55 @@
1
+ module Assert
2
+ class CLIRB # Version 1.1.0, https://github.com/redding/cli.rb
3
+ Error = Class.new(RuntimeError);
4
+ HelpExit = Class.new(RuntimeError); VersionExit = Class.new(RuntimeError)
5
+ attr_reader :argv, :args, :opts, :data
6
+
7
+ def initialize(&block)
8
+ @options = []; instance_eval(&block) if block
9
+ require "optparse"
10
+ @data, @args, @opts = [], [], {}; @parser = OptionParser.new do |p|
11
+ p.banner = ""; @options.each do |o|
12
+ @opts[o.name] = o.value; p.on(*o.parser_args){ |v| @opts[o.name] = v }
13
+ end
14
+ p.on_tail("--version", ""){ |v| raise VersionExit, v.to_s }
15
+ p.on_tail("--help", ""){ |v| raise HelpExit, v.to_s }
16
+ end
17
+ end
18
+
19
+ def option(*args); @options << Option.new(*args); end
20
+ def parse!(argv)
21
+ @args = (argv || []).dup.tap do |args_list|
22
+ begin; @parser.parse!(args_list)
23
+ rescue OptionParser::ParseError => err; raise Error, err.message; end
24
+ end; @data = @args + [@opts]
25
+ end
26
+ def to_s; @parser.to_s; end
27
+ def inspect
28
+ "#<#{self.class}:#{"0x0%x" % (object_id << 1)} @data=#{@data.inspect}>"
29
+ end
30
+
31
+ class Option
32
+ attr_reader :name, :opt_name, :desc, :abbrev, :value, :klass, :parser_args
33
+
34
+ def initialize(name, desc = nil, abbrev: nil, value: nil)
35
+ @name, @desc = name, desc || ""
36
+ @opt_name, @abbrev = parse_name_values(name, abbrev)
37
+ @value, @klass = gvalinfo(value)
38
+ @parser_args = if [TrueClass, FalseClass, NilClass].include?(@klass)
39
+ ["-#{@abbrev}", "--[no-]#{@opt_name}", @desc]
40
+ else
41
+ ["-#{@abbrev}", "--#{@opt_name} VALUE", @klass, @desc]
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def parse_name_values(name, custom_abbrev)
48
+ [ (processed_name = name.to_s.strip.downcase).gsub("_", "-"),
49
+ custom_abbrev || processed_name.gsub(/[^a-z]/, "").chars.first || "a"
50
+ ]
51
+ end
52
+ def gvalinfo(v); v.kind_of?(Class) ? [nil,v] : [v,v.class]; end
53
+ end
54
+ end
55
+ end
data/lib/assert/config.rb CHANGED
@@ -11,7 +11,7 @@ module Assert
11
11
  def self.settings(*items)
12
12
  items.each do |item|
13
13
  define_method(item) do |*args|
14
- if !(value = args.size > 1 ? args : args.first).nil?
14
+ unless (value = args.size > 1 ? args : args.first).nil?
15
15
  instance_variable_set("@#{item}", value)
16
16
  end
17
17
  instance_variable_get("@#{item}")
@@ -41,7 +41,7 @@ module Assert
41
41
  @run_diff_proc = Assert::U.syscmd_diff_proc
42
42
 
43
43
  # option settings
44
- @runner_seed = begin; srand; srand % 0xFFFF; end.to_i
44
+ @runner_seed = (env_runner_seed || random_runner_seed).to_i
45
45
  @changed_only = false
46
46
  @changed_ref = ""
47
47
  @single_test = ""
@@ -53,30 +53,42 @@ module Assert
53
53
  @list = false
54
54
  @debug = false
55
55
 
56
- self.apply(settings || {})
56
+ apply(settings || {})
57
57
  end
58
58
 
59
59
  def apply(settings)
60
60
  settings.keys.each do |name|
61
- if !settings[name].nil? && self.respond_to?(name.to_s)
62
- self.send(name.to_s, settings[name])
61
+ if !settings[name].nil? && respond_to?(name.to_s)
62
+ send(name.to_s, settings[name])
63
63
  end
64
64
  end
65
65
  @single_test_file_line = nil
66
66
  end
67
67
 
68
68
  def single_test?
69
- !self.single_test.empty?
69
+ !single_test.empty?
70
70
  end
71
71
 
72
72
  def single_test_file_line
73
73
  @single_test_file_line ||= Assert::FileLine.parse(
74
- File.expand_path(self.single_test, Dir.pwd)
74
+ File.expand_path(single_test, Dir.pwd),
75
75
  )
76
76
  end
77
77
 
78
78
  def single_test_file_path
79
- self.single_test_file_line.file if self.single_test_file_line
79
+ single_test_file_line&.file
80
+ end
81
+
82
+ def env_runner_seed
83
+ ENV["SEED"]
84
+ end
85
+
86
+ def random_runner_seed
87
+ @random_runner_seed ||=
88
+ begin
89
+ srand
90
+ srand % 0xFFFF
91
+ end
80
92
  end
81
93
  end
82
94
  end
@@ -2,35 +2,68 @@
2
2
 
3
3
  module Assert
4
4
  module ConfigHelpers
5
- def runner; self.config.runner; end
6
- def suite; self.config.suite; end
7
- def view; self.config.view; end
5
+ def runner
6
+ config.runner
7
+ end
8
+
9
+ def suite
10
+ config.suite
11
+ end
12
+
13
+ def view
14
+ config.view
15
+ end
8
16
 
9
17
  def runner_seed
10
- self.config.runner_seed
18
+ config.runner_seed
11
19
  end
12
20
 
13
21
  def single_test?
14
- self.config.single_test?
22
+ config.single_test?
15
23
  end
16
24
 
17
25
  def single_test_file_line
18
- self.config.single_test_file_line
26
+ config.single_test_file_line
19
27
  end
20
28
 
21
- def tests_to_run?; self.config.suite.tests_to_run?; end
22
- def tests_to_run_count; self.config.suite.tests_to_run_count; end
29
+ def tests_to_run?
30
+ config.suite.tests_to_run?
31
+ end
23
32
 
24
- def test_count; self.config.suite.test_count; end
25
- def result_count; self.config.suite.result_count; end
26
- def pass_result_count; self.config.suite.pass_result_count; end
27
- def fail_result_count; self.config.suite.fail_result_count; end
28
- def error_result_count; self.config.suite.error_result_count; end
29
- def skip_result_count; self.config.suite.skip_result_count; end
30
- def ignore_result_count; self.config.suite.ignore_result_count; end
33
+ def tests_to_run_count
34
+ config.suite.tests_to_run_count
35
+ end
36
+
37
+ def test_count
38
+ config.suite.test_count
39
+ end
40
+
41
+ def result_count
42
+ config.suite.result_count
43
+ end
44
+
45
+ def pass_result_count
46
+ config.suite.pass_result_count
47
+ end
48
+
49
+ def fail_result_count
50
+ config.suite.fail_result_count
51
+ end
52
+
53
+ def error_result_count
54
+ config.suite.error_result_count
55
+ end
56
+
57
+ def skip_result_count
58
+ config.suite.skip_result_count
59
+ end
60
+
61
+ def ignore_result_count
62
+ config.suite.ignore_result_count
63
+ end
31
64
 
32
65
  def all_pass?
33
- self.pass_result_count == self.result_count
66
+ pass_result_count == result_count
34
67
  end
35
68
 
36
69
  def formatted_run_time(run_time, format = "%.6f")
@@ -46,29 +79,29 @@ module Assert
46
79
  end
47
80
 
48
81
  def formatted_suite_run_time(format = "%.6f")
49
- formatted_run_time(self.config.suite.run_time, format)
82
+ formatted_run_time(config.suite.run_time, format)
50
83
  end
51
84
 
52
85
  def formatted_suite_test_rate(format = "%.6f")
53
- formatted_test_rate(self.config.suite.test_rate, format)
86
+ formatted_test_rate(config.suite.test_rate, format)
54
87
  end
55
88
 
56
89
  def formatted_suite_result_rate(format = "%.6f")
57
- formatted_result_rate(self.config.suite.result_rate, format)
90
+ formatted_result_rate(config.suite.result_rate, format)
58
91
  end
59
92
 
60
93
  def show_test_profile_info?
61
- !!self.config.profile
94
+ !!config.profile
62
95
  end
63
96
 
64
97
  def show_test_verbose_info?
65
- !!self.config.verbose
98
+ !!config.verbose
66
99
  end
67
100
 
68
101
  # return a list of result type symbols that have actually occurred
69
102
  def ocurring_result_types
70
103
  @result_types ||= [:pass, :fail, :ignore, :skip, :error].select do |sym|
71
- self.send("#{sym}_result_count") > 0
104
+ send("#{sym}_result_count") > 0
72
105
  end
73
106
  end
74
107
 
@@ -38,7 +38,7 @@ module Assert
38
38
  @__assert_pending__ = 0
39
39
 
40
40
  @__assert_result_callback__ = proc do |result|
41
- if !@__assert_with_bt__.empty?
41
+ unless @__assert_with_bt__.empty?
42
42
  result.set_with_bt(@__assert_with_bt__.dup)
43
43
  end
44
44
  result_callback.call(result)
@@ -63,7 +63,8 @@ module Assert
63
63
  end
64
64
 
65
65
  # The opposite of assert. Check if the result is false. If so, create a new
66
- # pass result. Otherwise create a new fail result with the desc and fail msg.
66
+ # pass result. Otherwise create a new fail result with the desc and
67
+ # fail msg.
67
68
  def assert_not(assertion, fail_desc = nil)
68
69
  assert(!assertion, fail_desc) do
69
70
  "Failed assert_not: assertion was "\
@@ -74,8 +75,7 @@ module Assert
74
75
 
75
76
  def assert_that(
76
77
  actual_value = Assert::ActualValue.not_given,
77
- &actual_value_block
78
- )
78
+ &actual_value_block)
79
79
  Assert::ActualValue.new(actual_value, context: self, &actual_value_block)
80
80
  end
81
81
 
@@ -87,7 +87,7 @@ module Assert
87
87
  else
88
88
  capture_result(
89
89
  Assert::Result::Fail,
90
- "Pending pass (make it not pending)"
90
+ "Pending pass (make it not pending)",
91
91
  )
92
92
  end
93
93
  end
@@ -107,12 +107,10 @@ module Assert
107
107
  else
108
108
  capture_result(Assert::Result::Fail, message || "")
109
109
  end
110
+ elsif halt_on_fail?
111
+ raise Result::TestSkipped, "Pending fail: #{message || ""}"
110
112
  else
111
- if halt_on_fail?
112
- raise Result::TestSkipped, "Pending fail: #{message || ""}"
113
- else
114
- capture_result(Assert::Result::Skip, "Pending fail: #{message || ""}")
115
- end
113
+ capture_result(Assert::Result::Skip, "Pending fail: #{message || ""}")
116
114
  end
117
115
  end
118
116
  alias_method :flunk, :fail
@@ -139,11 +137,11 @@ module Assert
139
137
  begin
140
138
  @__assert_with_bt__.push(bt.first)
141
139
  instance_eval(&block)
142
- rescue Result::TestSkipped, Result::TestFailure => e
143
- if e.assert_with_bt.nil? && !@__assert_with_bt__.empty?
144
- e.assert_with_bt = @__assert_with_bt__.dup
140
+ rescue Result::TestSkipped, Result::TestFailure => ex
141
+ if ex.assert_with_bt.nil? && !@__assert_with_bt__.empty?
142
+ ex.assert_with_bt = @__assert_with_bt__.dup
145
143
  end
146
- raise(e)
144
+ raise(ex)
147
145
  ensure
148
146
  @__assert_with_bt__.pop
149
147
  end
@@ -178,12 +176,10 @@ module Assert
178
176
 
179
177
  def capture_result(result_klass, msg)
180
178
  @__assert_result_callback__.call(
181
- result_klass.for_test(@__assert_running_test__, msg, caller_locations)
179
+ result_klass.for_test(@__assert_running_test__, msg, caller_locations),
182
180
  )
183
181
  end
184
182
 
185
- def __assert_config__
186
- @__assert_config__
187
- end
183
+ attr_reader :__assert_config__
188
184
  end
189
185
  end