assert 2.18.0 → 2.19.0

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