assert 2.18.0 → 2.19.0

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +66 -37
  3. data/assert.gemspec +4 -3
  4. data/lib/assert/actual_value.rb +140 -0
  5. data/lib/assert/assertions.rb +80 -20
  6. data/lib/assert/context.rb +31 -37
  7. data/lib/assert/context/let_dsl.rb +13 -0
  8. data/lib/assert/context/method_missing.rb +19 -0
  9. data/lib/assert/context/subject_dsl.rb +23 -24
  10. data/lib/assert/macros/methods.rb +4 -4
  11. data/lib/assert/result.rb +5 -1
  12. data/lib/assert/stub.rb +16 -0
  13. data/lib/assert/suite.rb +7 -10
  14. data/lib/assert/test.rb +0 -8
  15. data/lib/assert/version.rb +1 -1
  16. data/test/helper.rb +23 -25
  17. data/test/support/factory.rb +15 -0
  18. data/test/system/stub_tests.rb +332 -333
  19. data/test/system/test_tests.rb +99 -109
  20. data/test/unit/actual_value_tests.rb +371 -0
  21. data/test/unit/assert_tests.rb +111 -43
  22. data/test/unit/assertions/assert_block_tests.rb +30 -31
  23. data/test/unit/assertions/assert_changes_tests.rb +97 -0
  24. data/test/unit/assertions/assert_empty_tests.rb +33 -32
  25. data/test/unit/assertions/assert_equal_tests.rb +94 -74
  26. data/test/unit/assertions/assert_file_exists_tests.rb +32 -33
  27. data/test/unit/assertions/assert_includes_tests.rb +38 -37
  28. data/test/unit/assertions/assert_instance_of_tests.rb +34 -33
  29. data/test/unit/assertions/assert_kind_of_tests.rb +34 -33
  30. data/test/unit/assertions/assert_match_tests.rb +34 -33
  31. data/test/unit/assertions/assert_nil_tests.rb +30 -31
  32. data/test/unit/assertions/assert_raises_tests.rb +55 -55
  33. data/test/unit/assertions/assert_respond_to_tests.rb +36 -35
  34. data/test/unit/assertions/assert_same_tests.rb +86 -81
  35. data/test/unit/assertions/assert_true_false_tests.rb +60 -60
  36. data/test/unit/assertions_tests.rb +26 -24
  37. data/test/unit/config_helpers_tests.rb +43 -38
  38. data/test/unit/config_tests.rb +38 -34
  39. data/test/unit/context/let_dsl_tests.rb +10 -0
  40. data/test/unit/context/setup_dsl_tests.rb +70 -81
  41. data/test/unit/context/subject_dsl_tests.rb +15 -43
  42. data/test/unit/context/suite_dsl_tests.rb +15 -16
  43. data/test/unit/context/test_dsl_tests.rb +50 -52
  44. data/test/unit/context_info_tests.rb +23 -15
  45. data/test/unit/context_tests.rb +184 -179
  46. data/test/unit/default_runner_tests.rb +2 -5
  47. data/test/unit/default_suite_tests.rb +57 -53
  48. data/test/unit/factory_tests.rb +5 -3
  49. data/test/unit/file_line_tests.rb +33 -35
  50. data/test/unit/macro_tests.rb +14 -10
  51. data/test/unit/result_tests.rb +159 -183
  52. data/test/unit/runner_tests.rb +64 -64
  53. data/test/unit/suite_tests.rb +56 -59
  54. data/test/unit/test_tests.rb +118 -139
  55. data/test/unit/utils_tests.rb +43 -45
  56. data/test/unit/view_helpers_tests.rb +54 -52
  57. data/test/unit/view_tests.rb +22 -23
  58. metadata +29 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 20bea593cdc98d699ba8e3cc3a946d178800c3e08afce5ccc19bc844851c8a1c
4
- data.tar.gz: 3eb6857857d305066936768ff680d30449bb6ee2e5730805227ab0f8120465e9
3
+ metadata.gz: 9486fb389a6e45657eaf3c79f7c2cfea3e8cd6d9b8593c28597b716f9316c86b
4
+ data.tar.gz: dea0bd1b5061630fddad2f2feaa43e3faf0e64504bf444599747035b3ca8e40f
5
5
  SHA512:
6
- metadata.gz: 67b54d007f1a3da01a789d9b5bf77fd8850fb21cb2997b41719c9ec88ad93ebe7a94a4b1874f85c81adc31c09818f5cdc44e20d39ea7488710a8bb09dba7562a
7
- data.tar.gz: 17ce1c4d21f34fcb1b229c28fa5ff9685df1ab0a498116edcd5b8a637ba3cdb4e18e36813e957aa05dd113a22c96eca60ca9a9c5ecffc2484fd590b1bec5f56a
6
+ metadata.gz: c6e57f7df5c6b7273a3ccb190ecc77f014fe597fa15fb6cc72f4bdadd77a12066736e9dffc12cc02d4854f7cf92751fe1994d5142ad24c44eb196906eb079d64
7
+ data.tar.gz: cd2c4c0ef5c647abab8a9aac3340d17219ccd5b9d8eed5df34f47238296187122ee4b0df2c09aa9989e7dc8ddcb5d0529e3c615f539cf22e3e4f5d35a8b81575
data/README.md CHANGED
@@ -9,7 +9,7 @@ require "assert"
9
9
 
10
10
  class MyTests < Assert::Context
11
11
  test "something" do
12
- assert_equal 1, 1
12
+ assert_that(1).equals(1)
13
13
  end
14
14
  end
15
15
  ```
@@ -33,13 +33,13 @@ Running tests in random order, seeded with "56382"
33
33
 
34
34
  ## What Assert is not
35
35
 
36
- * **RSpec/spec-anything**: define tests using assertion statements
37
- * **Unit/Functional/Integration/etc**: Assert is agnostic - you define whatever kinds of tests you like (one or more of the above) and assert runs them in context
38
- * **Mock/Spec/BDD/etc**: Assert is the framework and there are a variety of 3rd party tools to do such things - feel free to use whatever you like
36
+ * **RSpec/spec-anything**: define tests using assertion statements.
37
+ * **Unit/Functional/Integration/etc**: Assert is agnostic - you define whatever kinds of tests you like and Assert runs them in context.
38
+ * **Mock/Spec/BDD/etc**: Assert is the framework and there are a variety of 3rd party tools to do such things. Feel free to use whatever you like.
39
39
 
40
40
  ## Description
41
41
 
42
- Assert is an assertion style testing framework, meaning you use assertion statements to define your tests and create results. Assert uses class-based contexts so if you want to nest your contexts, use inheritance.
42
+ Assert is an assertion-style testing framework, meaning you use assertion statements to define your tests and create results. Assert uses class-based contexts so if you want to nest your contexts, use inheritance.
43
43
 
44
44
  ### Features
45
45
 
@@ -50,6 +50,7 @@ Assert is an assertion style testing framework, meaning you use assertion statem
50
50
  * class-based contexts
51
51
  * multiple before/setup & after/teardown blocks
52
52
  * around blocks
53
+ * `let` value declarations
53
54
  * full backtrace for errors
54
55
  * optionally pretty print objects in failure descriptions
55
56
  * [stubbing API](https://github.com/redding/assert#stub)
@@ -71,58 +72,86 @@ Assert comes with a stubbing API - all it does is replace method calls. In gene
71
72
  * no methods are added to `Object` to support stubbing
72
73
  * stubs are auto-unstubbed on test teardown
73
74
 
74
- **Note**: Assert's stubbing logic has been extracted into a separate gem: [MuchStub](https://github.com/redding/much-stub/#muchstub). However, the main `Assert.{stub|unstub|stub_send|etc}` api is still available (it just proxies MuchStub now).
75
+ **Note**: Assert's stubbing logic has been extracted into a separate gem: [MuchStub](https://github.com/redding/much-stub/#muchstub). However, the main `Assert.{stub|unstub|stub_send|stub_tap|etc}` api is still available (it just proxies to MuchStub now).
75
76
 
76
77
  ```ruby
77
78
  myclass = Class.new do
78
- def mymeth; "meth"; end
79
- def myval(val); val; end
79
+ def my_method
80
+ "my_method"
81
+ end
82
+
83
+ def my_value(value)
84
+ value
85
+ end
80
86
  end
81
- myobj = myclass.new
87
+ my_object = myclass.new
82
88
 
83
- myobj.mymeth
84
- # => "meth"
85
- myobj.myval(123)
89
+ my_object.my_method
90
+ # => "my_method"
91
+ my_object.my_value(123)
86
92
  # => 123
87
- myobj.myval(456)
93
+ my_object.my_value(456)
88
94
  # => 456
89
95
 
90
- Assert.stub(myobj, :mymeth)
91
- myobj.mymeth
92
- # => StubError: `mymeth` not stubbed.
93
- Assert.stub(myobj, :mymeth){ "stub-meth" }
94
- myobj.mymeth
96
+ Assert.stub(my_object, :my_method)
97
+ my_object.my_method
98
+ # => StubError: `my_method` not stubbed.
99
+ Assert.stub(my_object, :my_method){ "stub-meth" }
100
+ my_object.my_method
95
101
  # => "stub-meth"
96
- myobj.mymeth(123)
102
+ my_object.my_method(123)
97
103
  # => StubError: arity mismatch
98
- Assert.stub(myobj, :mymeth).with(123){ "stub-meth" }
104
+ Assert.stub(my_object, :my_method).with(123){ "stub-meth" }
99
105
  # => StubError: arity mismatch
100
- Assert.stub_send(myobj, :mymeth) # call to the original method post-stub
101
- # => "meth"
102
106
 
103
- Assert.stub(myobj, :myval){ "stub-meth" }
107
+ # Call the original method after it has been stubbed.
108
+ Assert.stub_send(my_object, :my_method)
109
+ # => "my_method"
110
+
111
+ Assert.stub(my_object, :my_value){ "stub-meth" }
104
112
  # => StubError: arity mismatch
105
- Assert.stub(myobj, :myval).with(123){ |val| val.to_s }
106
- myobj.myval
113
+ Assert.stub(my_object, :my_value).with(123){ |val| val.to_s }
114
+ my_object.my_value
107
115
  # => StubError: arity mismatch
108
- myobj.myval(123)
116
+ my_object.my_value(123)
109
117
  # => "123"
110
- myobj.myval(456)
111
- # => StubError: `myval(456)` not stubbed.
112
- Assert.stub_send(myobj, :myval, 123) # call to the original method post-stub
118
+ my_object.my_value(456)
119
+ # => StubError: `my_value(456)` not stubbed.
120
+
121
+ # Call the original method after it has been stubbed.
122
+ Assert.stub_send(my_object, :my_value, 123)
113
123
  # => 123
114
- Assert.stub_send(myobj, :myval, 456)
124
+ Assert.stub_send(my_object, :my_value, 456)
115
125
  # => 456
116
126
 
117
- Assert.unstub(myobj, :mymeth)
118
- Assert.unstub(myobj, :myval)
127
+ # Stub a method while preserving its behavior and return value.
128
+ my_value_called_with = nil
129
+ Assert.stub_tap(my_object, :my_value) { |value, *args|
130
+ my_value_called_with = args
131
+ Assert.stub(value, :to_s) { "FIREWORKS!" }
132
+ }
133
+ value = my_object.my_value(123)
134
+ # => 123
135
+ my_value_called_with
136
+ # => [123]
137
+ value.to_s
138
+ # =>"FIREWORKS!"
139
+
140
+ # Unstub individual stubs
141
+ Assert.unstub(my_object, :my_method)
142
+ Assert.unstub(my_object, :my_value)
143
+
144
+ # OR blanket unstub all stubs
145
+ Assert.unstub!
119
146
 
120
- myobj.mymeth
121
- # => "meth"
122
- myobj.myval(123)
147
+ my_object.my_method
148
+ # => "my_method"
149
+ my_object.my_value(123)
123
150
  # => 123
124
- myobj.myval(456)
151
+ value = my_object.my_value(456)
125
152
  # => 456
153
+ value.to_s
154
+ # => "456"
126
155
  ```
127
156
 
128
157
  ## Factory
@@ -638,4 +667,4 @@ If submitting a Pull Request, please:
638
667
 
639
668
  One note: please respect that Assert itself is intended to be the flexible, base-level, framework-type logic that should change little if at all. Pull requests for niche functionality or personal testing philosphy stuff will likely not be accepted.
640
669
 
641
- If you wish to extend Assert for your niche purpose/desire/philosophy, please do so in it's own gem (preferrably named `assert-<whatever>`) that uses Assert as a dependency.
670
+ If you wish to extend Assert for your niche purpose/desire/philosophy, please do so in its own gem (preferrably named `assert-<whatever>`) that uses Assert as a dependency.
@@ -18,8 +18,9 @@ Gem::Specification.new do |gem|
18
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
19
  gem.require_paths = ["lib"]
20
20
 
21
- gem.required_ruby_version = "~> 2.4"
21
+ gem.required_ruby_version = "~> 2.5"
22
22
 
23
- gem.add_dependency("much-factory", ["~> 0.1.0"])
24
- gem.add_dependency("much-stub", ["~> 0.1.1"])
23
+ gem.add_dependency("much-factory", ["~> 0.1.0"])
24
+ gem.add_dependency("much-not-given", ["~> 0.1.0"])
25
+ gem.add_dependency("much-stub", ["~> 0.1.4"])
25
26
  end
@@ -0,0 +1,140 @@
1
+ require "much-not-given"
2
+ require "much-stub"
3
+
4
+ module Assert; end
5
+ class Assert::ActualValue
6
+ include MuchNotGiven
7
+
8
+ def initialize(value = self.class.not_given, context:, &value_block)
9
+ @value = self.class.given?(value) ? value : value_block
10
+ @context = context
11
+ end
12
+
13
+ def returns_true(*args)
14
+ @context.assert_block(*args, &@value)
15
+ end
16
+
17
+ def does_not_return_true(*args)
18
+ @context.assert_not_block(*args, &@value)
19
+ end
20
+
21
+ def raises(*expected_exceptions)
22
+ @context.assert_raises(*expected_exceptions, &@value)
23
+ end
24
+
25
+ def does_not_raise(*expected_exceptions)
26
+ @context.assert_nothing_raised(*expected_exceptions, &@value)
27
+ end
28
+
29
+ def changes(*args)
30
+ @context.assert_changes(*args, &@value)
31
+ end
32
+
33
+ def does_not_change(*args)
34
+ @context.assert_not_changes(*args, &@value)
35
+ end
36
+
37
+ def is_a_kind_of(expected_class, *args)
38
+ @context.assert_kind_of(expected_class, @value, *args)
39
+ end
40
+ alias_method :is_kind_of, :is_a_kind_of
41
+
42
+ def is_not_a_kind_of(expected_class, *args)
43
+ @context.assert_not_kind_of(expected_class, @value, *args)
44
+ end
45
+ alias_method :is_not_kind_of, :is_not_a_kind_of
46
+
47
+ def is_an_instance_of(expected_class, *args)
48
+ @context.assert_instance_of(expected_class, @value, *args)
49
+ end
50
+ alias_method :is_instance_of, :is_an_instance_of
51
+
52
+ def is_not_an_instance_of(expected_class, *args)
53
+ @context.assert_not_instance_of(expected_class, @value, *args)
54
+ end
55
+ alias_method :is_not_instance_of, :is_not_an_instance_of
56
+
57
+ def responds_to(expected_method_name, *args)
58
+ @context.assert_responds_to(expected_method_name, @value, *args)
59
+ end
60
+
61
+ def does_not_respond_to(expected_method_name, *args)
62
+ @context.assert_not_responds_to(expected_method_name, @value, *args)
63
+ end
64
+
65
+ def is_the_same_as(expected_object, *args)
66
+ @context.assert_same(expected_object, @value, *args)
67
+ end
68
+ alias_method :is, :is_the_same_as
69
+
70
+ def is_not_the_same_as(expected_object, *args)
71
+ @context.assert_not_same(expected_object, @value, *args)
72
+ end
73
+ alias_method :is_not, :is_not_the_same_as
74
+
75
+ def equals(expected_value, *args)
76
+ @context.assert_equal(expected_value, @value, *args)
77
+ end
78
+ alias_method :is_equal_to, :equals
79
+
80
+ def does_not_equal(expected_value, *args)
81
+ @context.assert_not_equal(expected_value, @value, *args)
82
+ end
83
+ alias_method :is_not_equal_to, :does_not_equal
84
+
85
+ def matches(expected_regex, *args)
86
+ @context.assert_match(expected_regex, @value, *args)
87
+ end
88
+
89
+ def does_not_match(expected_regex, *args)
90
+ @context.assert_not_match(expected_regex, @value, *args)
91
+ end
92
+
93
+ def is_empty(*args)
94
+ @context.assert_empty(@value, *args)
95
+ end
96
+
97
+ def is_not_empty(*args)
98
+ @context.assert_not_empty(@value, *args)
99
+ end
100
+
101
+ def includes(object, *args)
102
+ @context.assert_includes(object, @value, *args)
103
+ end
104
+
105
+ def does_not_include(object, *args)
106
+ @context.assert_not_includes(object, @value, *args)
107
+ end
108
+
109
+ def is_nil(*args)
110
+ @context.assert_nil(@value, *args)
111
+ end
112
+
113
+ def is_not_nil(*args)
114
+ @context.assert_not_nil(@value, *args)
115
+ end
116
+
117
+ def is_true(*args)
118
+ @context.assert_true(@value, *args)
119
+ end
120
+
121
+ def is_not_true(*args)
122
+ @context.assert_not_true(@value, *args)
123
+ end
124
+
125
+ def is_false(*args)
126
+ @context.assert_false(@value, *args)
127
+ end
128
+
129
+ def is_not_false(*args)
130
+ @context.assert_not_false(@value, *args)
131
+ end
132
+
133
+ def is_a_file(*args)
134
+ @context.assert_file_exists(@value, *args)
135
+ end
136
+
137
+ def is_not_a_file(*args)
138
+ @context.assert_not_file_exists(@value, *args)
139
+ end
140
+ end
@@ -2,6 +2,15 @@ require "assert/utils"
2
2
 
3
3
  module Assert
4
4
  module Assertions
5
+ IGNORED_ASSERTION_HELPERS =
6
+ [
7
+ :assert_throws, :assert_nothing_thrown,
8
+ :assert_operator, :refute_operator,
9
+ :assert_in_epsilon, :refute_in_epsilon,
10
+ :assert_in_delta, :refute_in_delta,
11
+ :assert_send
12
+ ]
13
+
5
14
  def assert_block(desc = nil)
6
15
  assert(yield, desc){ "Expected block to return a true value." }
7
16
  end
@@ -25,7 +34,7 @@ module Assert
25
34
  alias_method :refute_empty, :assert_not_empty
26
35
 
27
36
  def assert_equal(exp, act, desc = nil)
28
- assert(exp == act, desc) do
37
+ assert(act == exp, desc) do
29
38
  c = __assert_config__
30
39
  exp_show = Assert::U.show_for_diff(exp, c)
31
40
  act_show = Assert::U.show_for_diff(act, c)
@@ -40,7 +49,7 @@ module Assert
40
49
  end
41
50
 
42
51
  def assert_not_equal(exp, act, desc = nil)
43
- assert(exp != act, desc) do
52
+ assert(act != exp, desc) do
44
53
  c = __assert_config__
45
54
  exp_show = Assert::U.show_for_diff(exp, c)
46
55
  act_show = Assert::U.show_for_diff(act, c)
@@ -189,6 +198,75 @@ module Assert
189
198
  alias_method :assert_not_raises, :assert_nothing_raised
190
199
  alias_method :assert_not_raise, :assert_nothing_raised
191
200
 
201
+ def assert_changes(
202
+ ruby_string_to_eval,
203
+ desc: nil,
204
+ from: Assert::ActualValue.not_given,
205
+ to: Assert::ActualValue.not_given,
206
+ &block
207
+ )
208
+ desc_msg = desc ? "#{desc}\n" : ""
209
+ from_eval = instance_eval(ruby_string_to_eval)
210
+ if Assert::ActualValue.given?(from)
211
+ assert_equal(
212
+ from,
213
+ from_eval,
214
+ "#{desc_msg}Expected `#{ruby_string_to_eval}` to change from `#{from.inspect}`."
215
+ )
216
+ end
217
+
218
+ block.call
219
+
220
+ to_eval = instance_eval(ruby_string_to_eval)
221
+ if Assert::ActualValue.given?(to)
222
+ assert_equal(
223
+ to,
224
+ to_eval,
225
+ "#{desc_msg}Expected `#{ruby_string_to_eval}` to change to `#{to.inspect}`."
226
+ )
227
+ end
228
+
229
+ if (
230
+ Assert::ActualValue.not_given?(from) &&
231
+ Assert::ActualValue.not_given?(to)
232
+ )
233
+ assert_not_equal(
234
+ from_eval,
235
+ to_eval,
236
+ "#{desc_msg}Expected `#{ruby_string_to_eval}` to change; "\
237
+ "it was `#{from_eval.inspect}` and didn't change."
238
+ )
239
+ end
240
+ end
241
+
242
+ def assert_not_changes(
243
+ ruby_string_to_eval,
244
+ desc: nil,
245
+ from: Assert::ActualValue.not_given,
246
+ &block
247
+ )
248
+ desc_msg = desc ? "#{desc}\n" : ""
249
+ from_eval = instance_eval(ruby_string_to_eval)
250
+ if Assert::ActualValue.given?(from)
251
+ assert_equal(
252
+ from,
253
+ from_eval,
254
+ "#{desc_msg}Expected `#{ruby_string_to_eval}` to not change from `#{from.inspect}`."
255
+ )
256
+ end
257
+
258
+ block.call
259
+
260
+ to_eval = instance_eval(ruby_string_to_eval)
261
+ assert_equal(
262
+ from_eval,
263
+ to_eval,
264
+ "#{desc_msg}Expected `#{ruby_string_to_eval}` to not change; "\
265
+ "it was `#{from_eval.inspect}` and changed to `#{to_eval.inspect}`."
266
+ )
267
+ end
268
+ alias_method :refute_changes, :assert_not_changes
269
+
192
270
  def assert_respond_to(method, object, desc = nil)
193
271
  assert(object.respond_to?(method), desc) do
194
272
  "Expected #{Assert::U.show(object, __assert_config__)} (#{object.class})"\
@@ -244,24 +322,6 @@ module Assert
244
322
  end
245
323
  alias_method :refute_same, :assert_not_same
246
324
 
247
- # ignored assertion helpers
248
-
249
- IGNORED_ASSERTION_HELPERS = [
250
- :assert_throws, :assert_nothing_thrown,
251
- :assert_operator, :refute_operator,
252
- :assert_in_epsilon, :refute_in_epsilon,
253
- :assert_in_delta, :refute_in_delta,
254
- :assert_send
255
- ]
256
- def method_missing(method, *args, &block)
257
- if IGNORED_ASSERTION_HELPERS.include?(method.to_sym)
258
- ignore "The assertion `#{method}` is not supported."\
259
- " Please use another assertion or the basic `assert`."
260
- else
261
- super
262
- end
263
- end
264
-
265
325
  private
266
326
 
267
327
  def __assert_config__