assert 2.19.2 → 2.19.3

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -27,9 +27,9 @@ module Assert
27
27
  orig_caller = caller_locations
28
28
  begin
29
29
  MuchStub.stub_send(*args, &block)
30
- rescue MuchStub::NotStubbedError => err
31
- err.set_backtrace(orig_caller.map(&:to_s))
32
- raise err
30
+ rescue MuchStub::NotStubbedError => ex
31
+ ex.set_backtrace(orig_caller.map(&:to_s))
32
+ raise ex
33
33
  end
34
34
  end
35
35
 
@@ -80,7 +80,7 @@ module Assert
80
80
 
81
81
  # See MuchStub::CallSpy#inspect.
82
82
  def inspect
83
- "#<Assert::StubCallSpy:#{"0x0%x" % (self.__id__ << 1)}>"
83
+ "#<Assert::StubCallSpy:#{"0x0%x" % (__id__ << 1)}>"
84
84
  end
85
85
  end
86
86
  end
@@ -27,21 +27,31 @@ module Assert
27
27
  @end_time = @start_time
28
28
  end
29
29
 
30
- def suite; self; end
30
+ def suite
31
+ self
32
+ end
31
33
 
32
34
  def setup(&block)
33
- self.setups << (block || proc{})
35
+ setups << (block || proc{})
34
36
  end
35
37
  alias_method :startup, :setup
36
38
 
37
39
  def teardown(&block)
38
- self.teardowns << (block || proc{})
40
+ teardowns << (block || proc{})
39
41
  end
40
42
  alias_method :shutdown, :teardown
41
43
 
42
- def tests_to_run?; @tests.size > 0; end
43
- def tests_to_run_count; @tests.size; end
44
- 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
45
55
 
46
56
  def find_test_to_run(file_line)
47
57
  @tests.find{ |t| t.file_line == file_line }
@@ -51,32 +61,46 @@ module Assert
51
61
  @tests.sort.sort_by(&sort_by_proc)
52
62
  end
53
63
 
54
- def test_count; end
55
- def result_count; end
56
- def pass_result_count; end
57
- def fail_result_count; end
58
- def error_result_count; end
59
- def skip_result_count; end
60
- 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
61
84
 
62
85
  def run_time
63
86
  @end_time - @start_time
64
87
  end
65
88
 
66
89
  def test_rate
67
- get_rate(self.test_count, self.run_time)
90
+ get_rate(test_count, run_time)
68
91
  end
69
92
 
70
93
  def result_rate
71
- get_rate(self.result_count, self.run_time)
94
+ get_rate(result_count, run_time)
72
95
  end
73
96
 
74
97
  # Callbacks
75
98
 
76
- # define callback handlers to do special behavior during the test run. These
77
- # 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.
78
101
 
79
- def before_load(test_files); end
102
+ def before_load(test_files)
103
+ end
80
104
 
81
105
  # this is required to load tests into the suite, be sure to `super` if you
82
106
  # override this method
@@ -84,19 +108,34 @@ module Assert
84
108
  @tests << test
85
109
  end
86
110
 
87
- def after_load; end
88
- def on_start; end
89
- def before_test(test); end
90
- def on_result(result); end
91
- def after_test(test); end
92
- def on_finish; end
93
- def on_info(test); end
94
- 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
95
134
 
96
135
  def inspect
97
136
  "#<#{self.class}:#{"0x0%x" % (object_id << 1)}"\
98
- " test_count=#{self.test_count.inspect}"\
99
- " result_count=#{self.result_count.inspect}>"
137
+ " test_count=#{test_count.inspect}"\
138
+ " result_count=#{result_count.inspect}>"
100
139
  end
101
140
  end
102
141
  end
@@ -9,16 +9,16 @@ module Assert
9
9
  # Test is some code/method to run in the scope of a Context that may
10
10
  # produce results.
11
11
  def self.name_file_line_context_data(ci, name)
12
- { :name => ci.test_name(name),
13
- :file_line => ci.called_from
12
+ { name: ci.test_name(name),
13
+ file_line: ci.called_from,
14
14
  }
15
15
  end
16
16
 
17
17
  def self.for_block(name, context_info, config, &block)
18
- self.new(self.name_file_line_context_data(context_info, name).merge({
19
- :context_info => context_info,
20
- :config => config,
21
- :code => block
18
+ new(name_file_line_context_data(context_info, name).merge({
19
+ context_info: context_info,
20
+ config: config,
21
+ code: block,
22
22
  }))
23
23
  end
24
24
 
@@ -31,8 +31,13 @@ module Assert
31
31
  @file_line ||= FileLine.parse((@build_data[:file_line] || "").to_s)
32
32
  end
33
33
 
34
- def file_name; self.file_line.file; end
35
- 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
36
41
 
37
42
  def name
38
43
  @name ||= (@build_data[:name] || "")
@@ -51,7 +56,7 @@ module Assert
51
56
  end
52
57
 
53
58
  def context_class
54
- self.context_info.klass
59
+ context_info.klass
55
60
  end
56
61
 
57
62
  def config
@@ -64,22 +69,22 @@ module Assert
64
69
 
65
70
  def run(&result_callback)
66
71
  @result_callback = result_callback || proc{ |result| } # noop by default
67
- scope = self.context_class.new(self, self.config, @result_callback)
72
+ scope = context_class.new(self, config, @result_callback)
68
73
  start_time = Time.now
69
74
  capture_output do
70
- self.context_class.run_arounds(scope){ run_test(scope) }
75
+ context_class.run_arounds(scope){ run_test(scope) }
71
76
  end
72
77
  @result_callback = nil
73
78
  @run_time = Time.now - start_time
74
79
  end
75
80
 
76
- def <=>(other_test)
77
- self.name <=> other_test.name
81
+ def <=>(other)
82
+ name <=> other.name
78
83
  end
79
84
 
80
85
  def inspect
81
86
  attributes_string = ([:name, :context_info].collect do |attr|
82
- "@#{attr}=#{self.send(attr).inspect}"
87
+ "@#{attr}=#{send(attr).inspect}"
83
88
  end).join(" ")
84
89
  "#<#{self.class}:#{"0x0%x" % (object_id << 1)} #{attributes_string}>"
85
90
  end
@@ -89,33 +94,33 @@ module Assert
89
94
  def run_test(scope)
90
95
  begin
91
96
  # run any assert style "setup do" setups
92
- self.context_class.run_setups(scope)
97
+ context_class.run_setups(scope)
93
98
  # run any test/unit style "def setup" setups
94
99
  scope.setup if scope.respond_to?(:setup)
95
100
  # run the code block
96
- scope.instance_eval(&(self.code || proc{}))
97
- rescue Result::TestFailure => err
98
- capture_result(Result::Fail, err)
99
- rescue Result::TestSkipped => err
100
- capture_result(Result::Skip, err)
101
- rescue SignalException => err
102
- raise(err)
103
- rescue Exception => err
104
- 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)
105
110
  ensure
106
111
  begin
107
112
  # run any assert style "teardown do" teardowns
108
- self.context_class.run_teardowns(scope)
113
+ context_class.run_teardowns(scope)
109
114
  # run any test/unit style "def teardown" teardowns
110
115
  scope.teardown if scope.respond_to?(:teardown)
111
- rescue Result::TestFailure => err
112
- capture_result(Result::Fail, err)
113
- rescue Result::TestSkipped => err
114
- capture_result(Result::Skip, err)
115
- rescue SignalException => err
116
- raise(err)
117
- rescue Exception => err
118
- 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)
119
124
  end
120
125
  end
121
126
  end
@@ -125,7 +130,7 @@ module Assert
125
130
  end
126
131
 
127
132
  def capture_output(&block)
128
- if self.config.capture_output == true
133
+ if config.capture_output == true
129
134
  orig_stdout = $stdout.clone
130
135
  $stdout = capture_io
131
136
  block.call
@@ -136,7 +141,7 @@ module Assert
136
141
  end
137
142
 
138
143
  def capture_io
139
- StringIO.new(self.output, "a+")
144
+ StringIO.new(output, "a+")
140
145
  end
141
146
  end
142
147
  end
@@ -12,18 +12,21 @@ module Assert
12
12
  out
13
13
  end
14
14
 
15
- # show objects in a human-readable manner and make the output diff-able. This
16
- # expands on the basic `show` util by escaping newlines and making object id
17
- # hex-values generic.
15
+ # show objects in a human-readable manner and make the output diff-able.
16
+ # This expands on the basic `show` util by escaping newlines and making
17
+ # object id hex-values generic.
18
18
  def self.show_for_diff(obj, config)
19
- show(obj, config).gsub(/\\n/, "\n").gsub(/:0x[a-fA-F0-9]{4,}/m, ":0xXXXXXX")
19
+ show(obj, config)
20
+ .gsub(/\\n/, "\n")
21
+ .gsub(/:0x[a-fA-F0-9]{4,}/m, ":0xXXXXXX")
20
22
  end
21
23
 
22
24
  # open a tempfile and yield it
23
25
  def self.tempfile(name, content)
24
26
  require "tempfile"
25
27
  Tempfile.open(name) do |tmpfile|
26
- tmpfile.puts(content); tmpfile.flush
28
+ tmpfile.puts(content)
29
+ tmpfile.flush
27
30
  yield tmpfile if block_given?
28
31
  end
29
32
  end
@@ -34,7 +37,8 @@ module Assert
34
37
  Proc.new{ |obj| PP.pp(obj, +"", width || 79).strip }
35
38
  end
36
39
 
37
- # Return true if if either show output has newlines or is bigger than 29 chars
40
+ # Return true if if either show output has newlines or is bigger than 29
41
+ # chars.
38
42
  def self.default_use_diff_proc
39
43
  Proc.new do |exp_show_output, act_show_output|
40
44
  exp_show_output.include?("\n") || exp_show_output.size > 29 ||
@@ -62,10 +66,15 @@ module Assert
62
66
  def self.git_changed_proc
63
67
  Proc.new do |config, test_paths|
64
68
  files = []
65
- cmd = [
66
- "git diff --no-ext-diff --name-only #{config.changed_ref}", # changed files
67
- "git ls-files --others --exclude-standard" # added files
68
- ].map{ |c| "#{c} -- #{test_paths.join(" ")}" }.join(" && ")
69
+ cmd =
70
+ [
71
+ # changed files
72
+ "git diff --no-ext-diff --name-only #{config.changed_ref}",
73
+ # added files
74
+ "git ls-files --others --exclude-standard",
75
+ ]
76
+ .map{ |c| "#{c} -- #{test_paths.join(" ")}" }
77
+ .join(" && ")
69
78
  Assert::CLI.bench("Load only changed files") do
70
79
  files = `#{cmd}`.split("\n")
71
80
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Assert
4
- VERSION = "2.19.2"
4
+ VERSION = "2.19.3"
5
5
  end
@@ -16,16 +16,18 @@ module Assert
16
16
 
17
17
  def self.require_user_view(view_name)
18
18
  views_file = File.expand_path(
19
- File.join("#{ENV["HOME"]}/.assert/views", view_name, "lib", view_name)
19
+ File.join("#{ENV["HOME"]}/.assert/views", view_name, "lib", view_name),
20
20
  )
21
21
 
22
- if File.exists?(view_name) || File.exists?(view_name + ".rb")
22
+ if File.exist?(view_name) || File.exist?(view_name + ".rb")
23
23
  require view_name
24
- elsif File.exists?(views_file + ".rb")
24
+ elsif File.exist?(views_file + ".rb")
25
25
  require views_file
26
26
  else
27
- msg = "[WARN] Can't find or require #{view_name.inspect} view."
28
- msg << " Did you install it in `~/.assert/views`?" if !view_name.match(/\A\//)
27
+ msg = +"[WARN] Can't find or require #{view_name.inspect} view."
28
+ unless view_name.match(%r{\A/})
29
+ msg << " Did you install it in `~/.assert/views`?"
30
+ end
29
31
  warn msg
30
32
  end
31
33
  end
@@ -48,11 +50,13 @@ module Assert
48
50
  attr_reader :config
49
51
 
50
52
  def initialize(config, output_io)
51
- @config , @output_io, = config, output_io
53
+ @config, @output_io, = config, output_io
52
54
  @output_io.sync = true if @output_io.respond_to?(:sync=)
53
55
  end
54
56
 
55
- def view; self; end
57
+ def view
58
+ self
59
+ end
56
60
 
57
61
  def is_tty?
58
62
  !!@output_io.isatty
@@ -79,19 +83,41 @@ module Assert
79
83
  # the test suite
80
84
  # * `on_interrupt`: called when the test suite is interrupted while running
81
85
  # the interrupt exception is passed as an arg
82
- def before_load(test_files); end
83
- def after_load; end
84
- def on_start; end
85
- def before_test(test); end
86
- def on_result(result); end
87
- def after_test(test); end
88
- def on_finish; end
89
- def on_info(test); end
90
- def on_interrupt(err); end
86
+ def before_load(test_files)
87
+ end
88
+
89
+ def after_load
90
+ end
91
+
92
+ def on_start
93
+ end
94
+
95
+ def before_test(test)
96
+ end
97
+
98
+ def on_result(result)
99
+ end
100
+
101
+ def after_test(test)
102
+ end
103
+
104
+ def on_finish
105
+ end
106
+
107
+ def on_info(test)
108
+ end
109
+
110
+ def on_interrupt(err)
111
+ end
91
112
 
92
113
  # IO capture
93
114
 
94
- def puts(*args); @output_io.puts(*args); end
95
- def print(*args); @output_io.print(*args); end
115
+ def puts(*args)
116
+ @output_io.puts(*args)
117
+ end
118
+
119
+ def print(*args)
120
+ @output_io.print(*args)
121
+ end
96
122
  end
97
123
  end