assert 2.16.4 → 2.16.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- data.tar.gz: 1140a1218d3b3df2195ab376b494b275155951e2
4
- metadata.gz: e696cad6f5a6a309c43c72c059f7072ad7b5fa28
3
+ data.tar.gz: 624cea8dff7a65ada7c133ccf0ad93d8f70fb050
4
+ metadata.gz: f60b216b9827bab390bb1be74d2161392a087489
5
5
  SHA512:
6
- data.tar.gz: d819e6364e40bd86571d63e87b93ca4277f441914d25b862543504a58eef9ab6cc8c29a95e7db502288e526b8de62abc52c355c3f21bf372ab57d2f1a87cc00d
7
- metadata.gz: 6bd08bca020ce2e980da50aec61e574270c2e77e1441d3fc84c50d91b60651713c367b00c8aa78478abdb5bb2b0a379eb120ec73cd14c27d94a049f07bb0ac25
6
+ data.tar.gz: 7dda4ee76847adaeb2b3044e186baa73c36c1f1f52c8575fa5afb73366636a86ef84381f9db39049e728881981add634206deb1fb9f1ba97932cecb0aa141f75
7
+ metadata.gz: 13e4b4811041f08d2686edad2f41654f6d711fdb9ed7f6d2863f7a090397ec8b7e9f460cfb6d1aba55f04cfe149992b5a44d57744f98fda4c001bd6223e7dea5
data/README.md CHANGED
@@ -65,6 +65,16 @@ Assert is an assertion style testing framework, meaning you use assertion statem
65
65
 
66
66
  ## Stub
67
67
 
68
+ Assert comes with a stubbing API - all it does is replace method calls. In general it tries to be friendly and complain if stubbing doesn't match up with the object/method being stubbed:
69
+
70
+ * each stub takes a block that is called in place of the method
71
+ * complains if you stub a method that the object doesn't respond to
72
+ * complains if you stub with an arity mismatch
73
+ * no methods are added to `Object` to support stubbing
74
+ * stubs are auto-unstubbed on test teardown
75
+
76
+ **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).
77
+
68
78
  ```ruby
69
79
  myclass = Class.new do
70
80
  def mymeth; 'meth'; end
@@ -117,14 +127,6 @@ myobj.myval(456)
117
127
  # => 456
118
128
  ```
119
129
 
120
- Assert comes with a stubbing API - all it does is replace method calls. In general it tries to be friendly and complain if stubbing doesn't match up with the object/method being stubbed:
121
-
122
- * each stub takes a block that is called in place of the method
123
- * complains if you stub a method that the object doesn't respond to
124
- * complains if you stub with an arity mismatch
125
- * no methods are added to `Object` to support stubbing
126
- * stubs are auto-unstubbed on test teardown
127
-
128
130
  ## Factory
129
131
 
130
132
  ```ruby
@@ -173,6 +175,8 @@ module Factory
173
175
  end
174
176
  ```
175
177
 
178
+ **Note**: Assert's factory logic has been extracted into a separate gem: [MuchFactory](https://github.com/redding/much-factory/#muchfactory). However, the main api above is still available (it just delegates to MuchFactory now).
179
+
176
180
  ## CLI
177
181
 
178
182
  ```sh
@@ -18,4 +18,7 @@ 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.add_dependency("much-factory", ["~> 0.1.0"])
22
+ gem.add_dependency("much-stub", ["~> 0.1.0"])
23
+
21
24
  end
@@ -1,162 +1,10 @@
1
- require 'date'
2
- require 'time'
1
+ require 'much-factory'
3
2
 
4
3
  module Assert
5
4
 
6
5
  module Factory
7
- extend self
8
-
9
- def integer(max = nil)
10
- self.type_cast(Random.integer(max), :integer)
11
- end
12
-
13
- def float(max = nil)
14
- self.type_cast(Random.float(max), :float)
15
- end
16
-
17
- DAYS_IN_A_YEAR = 365
18
- SECONDS_IN_DAY = 24 * 60 * 60
19
-
20
- def date
21
- @date ||= self.type_cast(Random.date_string, :date)
22
- @date + Random.integer(DAYS_IN_A_YEAR)
23
- end
24
-
25
- def time
26
- @time ||= self.type_cast(Random.time_string, :time)
27
- @time + (Random.float(DAYS_IN_A_YEAR) * SECONDS_IN_DAY).to_i
28
- end
29
-
30
- def datetime
31
- @datetime ||= self.type_cast(Random.datetime_string, :datetime)
32
- @datetime + (Random.float(DAYS_IN_A_YEAR) * SECONDS_IN_DAY).to_i
33
- end
34
-
35
- def string(length = nil)
36
- self.type_cast(Random.string(length || 10), :string)
37
- end
38
-
39
- def text(length = nil)
40
- self.type_cast(Random.string(length || 20), :string)
41
- end
42
-
43
- def slug(length = nil)
44
- self.type_cast(Random.string(length || 5), :string)
45
- end
46
-
47
- def hex(length = nil)
48
- self.type_cast(Random.hex_string(length), :string)
49
- end
50
-
51
- def file_name(length = nil)
52
- self.type_cast(Random.file_name_string(length), :string)
53
- end
54
-
55
- def dir_path(length = nil)
56
- self.type_cast(Random.dir_path_string(length), :string)
57
- end
58
-
59
- def file_path
60
- self.type_cast(Random.file_path_string, :string)
61
- end
62
-
63
- alias_method :path, :dir_path
64
-
65
- def url(host = nil, length = nil)
66
- self.type_cast(Random.url_string(host, length), :string)
67
- end
68
-
69
- def email(domain = nil, length = nil)
70
- self.type_cast(Random.email_string(domain, length), :string)
71
- end
72
-
73
- def binary
74
- self.type_cast(Random.binary, :binary)
75
- end
76
-
77
- def boolean
78
- self.type_cast(Random.integer.even?, :boolean)
79
- end
80
-
81
- def type_cast(value, type)
82
- self.type_converter.send(type, value)
83
- end
84
-
85
- def type_converter; TypeConverter; end
86
-
87
- module TypeConverter
88
- def self.string(input); input.to_s; end
89
- def self.integer(input); input.to_i; end
90
- def self.float(input); input.to_f; end
91
- def self.datetime(input); DateTime.parse(input.to_s); end
92
- def self.time(input); Time.parse(input.to_s); end
93
- def self.date(input); Date.parse(input.to_s); end
94
- def self.boolean(input); !!input; end
95
- def self.binary(input); input; end
96
- end
97
-
98
- module Random
99
-
100
- # rand given a max int value returns integers between 0 and max-1
101
- def self.integer(max = nil)
102
- rand(max || 32_766) + 1
103
- end
104
-
105
- # `rand` with no args gives a float between 0 and 1
106
- def self.float(max = nil)
107
- (max || 100).to_f * rand
108
- end
109
-
110
- def self.date_string
111
- Time.now.strftime("%Y-%m-%d")
112
- end
113
-
114
- def self.datetime_string
115
- Time.now.strftime("%Y-%m-%d %H:%M:%S")
116
- end
117
-
118
- def self.time_string
119
- Time.now.strftime("%H:%M:%S")
120
- end
121
-
122
- DICTIONARY = [*'a'..'z'].freeze
123
- def self.string(length = nil)
124
- [*0..((length || 10) - 1)].map{ |n| DICTIONARY[rand(DICTIONARY.size)] }.join
125
- end
126
-
127
- def self.hex_string(length = nil)
128
- length ||= 10
129
- self.integer(("f" * length).hex - 1).to_s(16).rjust(length, '0')
130
- end
131
-
132
- def self.file_name_string(length = nil)
133
- length ||= 6
134
- "#{self.string(length)}.#{self.string(3)}"
135
- end
136
-
137
- def self.dir_path_string(length = nil)
138
- length ||= 12
139
- File.join(*self.string(length).scan(/.{1,4}/))
140
- end
141
-
142
- def self.file_path_string
143
- File.join(self.dir_path_string, self.file_name_string)
144
- end
145
-
146
- def self.url_string(host = nil, length = nil)
147
- File.join(host.to_s, self.dir_path_string(length))
148
- end
149
-
150
- def self.email_string(domain = nil, length = nil)
151
- domain ||= "#{self.string(5)}.com"
152
- "#{self.string(length)}@#{domain}"
153
- end
154
-
155
- def self.binary
156
- [ self.integer(10000) ].pack('N*')
157
- end
158
-
159
- end
6
+ extend MuchFactory
7
+ include MuchFactory
160
8
 
161
9
  end
162
10
 
@@ -1,203 +1,31 @@
1
+ require 'much-stub'
2
+
1
3
  module Assert
2
4
 
3
5
  def self.stubs
4
- @stubs ||= {}
6
+ MuchStub.stubs
5
7
  end
6
8
 
7
- def self.stub(obj, meth, &block)
8
- (self.stubs[Assert::Stub.key(obj, meth)] ||= begin
9
- Assert::Stub.new(obj, meth, caller_locations)
10
- end).tap{ |s| s.do = block }
9
+ def self.stub(*args, &block)
10
+ MuchStub.stub(*args, &block)
11
11
  end
12
12
 
13
- def self.unstub(obj, meth)
14
- (self.stubs.delete(Assert::Stub.key(obj, meth)) || Assert::Stub::NullStub.new).teardown
13
+ def self.unstub(*args)
14
+ MuchStub.unstub(*args)
15
15
  end
16
16
 
17
17
  def self.unstub!
18
- self.stubs.keys.each{ |key| self.stubs.delete(key).teardown }
18
+ MuchStub.unstub!
19
19
  end
20
20
 
21
- def self.stub_send(obj, meth, *args, &block)
21
+ def self.stub_send(*args, &block)
22
22
  orig_caller = caller_locations
23
- stub = self.stubs.fetch(Assert::Stub.key(obj, meth)) do
24
- raise NotStubbedError, "`#{meth}` not stubbed.", orig_caller.map(&:to_s)
25
- end
26
- stub.call_method(args, &block)
27
- end
28
-
29
- StubError = Class.new(ArgumentError)
30
- NotStubbedError = Class.new(StubError)
31
- StubArityError = Class.new(StubError)
32
-
33
- class Stub
34
-
35
- NullStub = Class.new do
36
- def teardown; end # no-op
37
- end
38
-
39
- def self.key(object, method_name)
40
- "--#{object.object_id}--#{method_name}--"
41
- end
42
-
43
- attr_reader :method_name, :name, :ivar_name, :do
44
-
45
- def initialize(object, method_name, orig_caller = nil, &block)
46
- orig_caller ||= caller_locations
47
- @metaclass = class << object; self; end
48
- @method_name = method_name.to_s
49
- @name = "__assert_stub__#{object.object_id}_#{@method_name}"
50
- @ivar_name = "@__assert_stub_#{object.object_id}_" \
51
- "#{@method_name.to_sym.object_id}"
52
-
53
- setup(object, orig_caller)
54
-
55
- @do = block
56
- @lookup = {}
57
- end
58
-
59
- def do=(block)
60
- @do = block || @do
61
- end
62
-
63
- def call_method(args, &block)
64
- @method.call(*args, &block)
65
- end
66
-
67
- def call(args, orig_caller = nil, &block)
68
- orig_caller ||= caller_locations
69
- unless arity_matches?(args)
70
- msg = "arity mismatch on `#{@method_name}`: " \
71
- "expected #{number_of_args(@method.arity)}, " \
72
- "called with #{args.size}"
73
- raise StubArityError, msg, orig_caller.map(&:to_s)
74
- end
75
- lookup(args, orig_caller).call(*args, &block)
76
- rescue NotStubbedError => exception
77
- @lookup.rehash
78
- lookup(args, orig_caller).call(*args, &block)
79
- end
80
-
81
- def with(*args, &block)
82
- orig_caller = caller_locations
83
- unless arity_matches?(args)
84
- msg = "arity mismatch on `#{@method_name}`: " \
85
- "expected #{number_of_args(@method.arity)}, " \
86
- "stubbed with #{args.size}"
87
- raise StubArityError, msg, orig_caller.map(&:to_s)
88
- end
89
- @lookup[args] = block
90
- end
91
-
92
- def teardown
93
- @metaclass.send(:undef_method, @method_name)
94
- Assert.send(:remove_instance_variable, @ivar_name)
95
- @metaclass.send(:alias_method, @method_name, @name)
96
- @metaclass.send(:undef_method, @name)
97
- end
98
-
99
- def inspect
100
- "#<#{self.class}:#{'0x0%x' % (object_id << 1)}" \
101
- " @method_name=#{@method_name.inspect}" \
102
- ">"
103
- end
104
-
105
- private
106
-
107
- def setup(object, orig_caller)
108
- unless object.respond_to?(@method_name)
109
- msg = "#{object.inspect} does not respond to `#{@method_name}`"
110
- raise StubError, msg, orig_caller.map(&:to_s)
111
- end
112
- is_constant = object.kind_of?(Module)
113
- local_object_methods = object.methods(false).map(&:to_s)
114
- all_object_methods = object.methods.map(&:to_s)
115
- if (is_constant && !local_object_methods.include?(@method_name)) ||
116
- (!is_constant && !all_object_methods.include?(@method_name))
117
- params_list = ParameterList.new(object, @method_name)
118
- @metaclass.class_eval <<-method
119
- def #{@method_name}(#{params_list}); super; end
120
- method
121
- end
122
-
123
- if !local_object_methods.include?(@name) # already stubbed
124
- @metaclass.send(:alias_method, @name, @method_name)
125
- end
126
- @method = object.method(@name)
127
-
128
- Assert.instance_variable_set(@ivar_name, self)
129
- @metaclass.class_eval <<-stub_method
130
- def #{@method_name}(*args, &block)
131
- Assert.instance_variable_get("#{@ivar_name}").call(args, caller_locations, &block)
132
- end
133
- stub_method
134
- end
135
-
136
- def lookup(args, orig_caller)
137
- @lookup.fetch(args) do
138
- self.do || begin
139
- msg = "#{inspect_call(args)} not stubbed."
140
- inspect_lookup_stubs.tap do |stubs|
141
- msg += "\nStubs:\n#{stubs}" if !stubs.empty?
142
- end
143
- raise NotStubbedError, msg, orig_caller.map(&:to_s)
144
- end
145
- end
146
- end
147
-
148
- def arity_matches?(args)
149
- return true if @method.arity == args.size # mandatory args
150
- return true if @method.arity < 0 && args.size >= (@method.arity+1).abs # variable args
151
- return false
152
- end
153
-
154
- def inspect_lookup_stubs
155
- @lookup.keys.map{ |args| " - #{inspect_call(args)}" }.join("\n")
23
+ begin
24
+ MuchStub.stub_send(*args, &block)
25
+ rescue MuchStub::NotStubbedError => err
26
+ err.set_backtrace(orig_caller.map(&:to_s))
27
+ raise err
156
28
  end
157
-
158
- def inspect_call(args)
159
- "`#{@method_name}(#{args.map(&:inspect).join(',')})`"
160
- end
161
-
162
- def number_of_args(arity)
163
- if arity < 0
164
- "at least #{(arity + 1).abs}"
165
- else
166
- arity
167
- end
168
- end
169
-
170
- module ParameterList
171
- LETTERS = ('a'..'z').to_a.freeze
172
-
173
- def self.new(object, method_name)
174
- arity = get_arity(object, method_name)
175
- params = build_params_from_arity(arity)
176
- params << '*args' if arity < 0
177
- params << '&block'
178
- params.join(', ')
179
- end
180
-
181
- private
182
-
183
- def self.get_arity(object, method_name)
184
- object.method(method_name).arity
185
- rescue NameError
186
- -1
187
- end
188
-
189
- def self.build_params_from_arity(arity)
190
- number = arity < 0 ? (arity + 1).abs : arity
191
- (0..(number - 1)).map{ |param_index| get_param_name(param_index) }
192
- end
193
-
194
- def self.get_param_name(param_index)
195
- param_index += LETTERS.size # avoid getting 0 for the number of letters
196
- number_of_letters, letter_index = param_index.divmod(LETTERS.size)
197
- LETTERS[letter_index] * number_of_letters
198
- end
199
- end
200
-
201
29
  end
202
30
 
203
31
  end
@@ -1,3 +1,3 @@
1
1
  module Assert
2
- VERSION = "2.16.4"
2
+ VERSION = "2.16.5"
3
3
  end
@@ -2,6 +2,7 @@ require 'assert'
2
2
 
3
3
  require 'assert/config'
4
4
  require 'assert/stub'
5
+ require 'much-stub'
5
6
 
6
7
  module Assert
7
8
 
@@ -41,7 +42,7 @@ module Assert
41
42
 
42
43
  should "build a stub" do
43
44
  stub1 = Assert.stub(@myobj, :mymeth)
44
- assert_kind_of Assert::Stub, stub1
45
+ assert_kind_of MuchStub::Stub, stub1
45
46
  end
46
47
 
47
48
  should "lookup stubs that have been called before" do
@@ -52,7 +53,7 @@ module Assert
52
53
 
53
54
  should "set the stub's do block if given a block" do
54
55
  Assert.stub(@myobj, :mymeth)
55
- assert_raises(NotStubbedError){ @myobj.mymeth }
56
+ assert_raises(MuchStub::NotStubbedError){ @myobj.mymeth }
56
57
  Assert.stub(@myobj, :mymeth){ @stub_value }
57
58
  assert_equal @stub_value, @myobj.mymeth
58
59
  end
@@ -96,7 +97,7 @@ module Assert
96
97
  end
97
98
 
98
99
  should "be able to call a stub's original method" do
99
- err = assert_raises(NotStubbedError){ Assert.stub_send(@myobj, :mymeth) }
100
+ err = assert_raises(MuchStub::NotStubbedError){ Assert.stub_send(@myobj, :mymeth) }
100
101
  assert_includes 'not stubbed.', err.message
101
102
  assert_includes 'test/unit/assert_tests.rb', err.backtrace.first
102
103
 
@@ -1,166 +1,27 @@
1
1
  require 'assert'
2
2
  require 'assert/factory'
3
3
 
4
+ require 'much-factory'
5
+
4
6
  module Assert::Factory
5
7
 
6
8
  class UnitTests < Assert::Context
7
9
  desc "Assert::Factory"
8
10
  subject{ Assert::Factory }
9
11
 
10
- should have_imeths :integer, :float
11
- should have_imeths :date, :time, :datetime
12
- should have_imeths :string, :text, :slug, :hex
13
- should have_imeths :file_name, :dir_path, :file_path
14
- should have_imeths :path, :url, :email
15
- should have_imeths :binary, :boolean
16
- should have_imeths :type_cast, :type_converter
17
-
18
- should "return a random integer using `integer`" do
19
- assert_kind_of Integer, subject.integer
20
- end
21
-
22
- should "allow passing a maximum value using `integer`" do
23
- assert_includes subject.integer(2), [1, 2]
24
- end
25
-
26
- should "return a random float using `float`" do
27
- assert_kind_of Float, subject.float
28
- end
29
-
30
- should "allow passing a maximum value using `float`" do
31
- float = subject.float(2)
32
- assert float <= 2
33
- assert float >= 0
34
-
35
- float = subject.float(0)
36
- assert_equal 0.0, float
37
- end
38
-
39
- should "return a random date using `date`" do
40
- assert_kind_of Date, subject.date
41
- end
42
-
43
- should "return a random time object using `time`" do
44
- assert_kind_of Time, subject.time
45
- end
46
-
47
- should "return a random time object using `datetime`" do
48
- assert_kind_of DateTime, subject.datetime
49
- end
50
-
51
- should "return a random string using `string`" do
52
- assert_kind_of String, subject.string
53
- assert_equal 10, subject.string.length
54
- end
55
-
56
- should "allow passing a maximum length using `string`" do
57
- assert_equal 1, subject.string(1).length
58
- end
59
-
60
- should "return a random string using `text`" do
61
- assert_kind_of String, subject.text
62
- assert_equal 20, subject.text.length
63
- end
64
-
65
- should "allow passing a maximum length using `text`" do
66
- assert_equal 1, subject.text(1).length
67
- end
68
-
69
- should "return a random string using `slug`" do
70
- assert_kind_of String, subject.slug
71
- assert_equal 5, subject.slug.length
72
- end
73
-
74
- should "allow passing a maximum length using `slug`" do
75
- assert_equal 1, subject.slug(1).length
76
- end
77
-
78
- should "return a random hex string using `hex`" do
79
- assert_kind_of String, subject.hex
80
- assert_match /\A[0-9a-f]{10}\Z/, subject.hex
81
- end
82
-
83
- should "allow passing a maximum length using `hex`" do
84
- assert_equal 1, subject.hex(1).length
85
- end
86
-
87
- should "return a random file name string using `file_name`" do
88
- assert_kind_of String, subject.file_name
89
- assert_match /\A[a-z]{6}\.[a-z]{3}\Z/, subject.file_name
90
- end
91
-
92
- should "allow passing a name length using `file_name`" do
93
- assert_match /\A[a-z]{1}.[a-z]{3}\Z/, subject.file_name(1)
94
- end
12
+ should "include and extend MuchFactory" do
13
+ assert_includes MuchFactory, subject
95
14
 
96
- should "return a random folder path string using `dir_path`" do
97
- assert_kind_of String, subject.dir_path
98
- path_segments = subject.dir_path.split('/')
99
- assert_equal 3, path_segments.size
100
- path_segments.each{ |s| assert_match /\A[a-z]{4}\Z/, s }
15
+ # https://stackoverflow.com/questions/5197166/ruby-get-a-list-of-extended-modules
16
+ assert_includes MuchFactory, subject_metaclass.included_modules
101
17
  end
102
18
 
103
- should "allow passing a maximum length using `dir_path`" do
104
- assert_equal 1, subject.dir_path(1).length
105
- end
106
-
107
- should "return a random folder path and file name using `file_path`" do
108
- assert_kind_of String, subject.file_path
109
- segments = subject.file_path.split('/')
110
- assert_equal 4, segments.size
111
- segments[0..-2].each{ |s| assert_match /\A[a-z]{4}\Z/, s }
112
- assert_match /\A[a-z]{6}\.[a-z]{3}\Z/, segments.last
113
- end
114
-
115
- should "return a random url string using `url`" do
116
- u = subject.url
117
- segments = u.split('/')
118
-
119
- assert_kind_of String, u
120
- assert_match /\A\//, u
121
- assert_equal 4, segments.size
122
- segments[1..-1].each{ |s| assert_match /\A[a-z]{4}\Z/, s }
123
- end
124
-
125
- should "allow passing a host string using `url`" do
126
- host = "example.com"
127
- assert_match /\A#{host}\//, subject.url(host)
128
- end
129
-
130
- should "allow passing a maximum length using `url`" do
131
- assert_equal 2, subject.url('', 1).length # plus leading '/'
132
- end
133
-
134
- should "return a random email string using `email`" do
135
- e = subject.email
136
- assert_kind_of String, e
137
- assert_match /\A\w+@\w+\.com\Z/, e
138
- end
139
-
140
- should "allow passing a custom domain to `email`" do
141
- e = subject.email('example.org')
142
- assert_match /@example\.org\Z/, e
143
- end
144
-
145
- should "allow passing a mailbox length using `email`" do
146
- assert_equal 2, subject.email(nil, 2).split('@').first.size
147
- end
148
-
149
- should "return a random binary string using `binary`" do
150
- assert_kind_of String, subject.binary
151
- end
152
-
153
- should "return a random boolean using `boolean`" do
154
- assert_includes subject.boolean.class, [ TrueClass, FalseClass ]
155
- end
156
-
157
- should "type cast values to a specified type using `type_cast`" do
158
- expected = Date.parse('2013-01-01')
159
- assert_equal expected, subject.type_cast('2013-01-01', :date)
160
- end
19
+ private
161
20
 
162
- should "use `TypedConverter` for the default type converter" do
163
- assert_equal TypeConverter, subject.type_converter
21
+ def subject_metaclass
22
+ class << subject
23
+ self
24
+ end
164
25
  end
165
26
 
166
27
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: assert
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.16.4
4
+ version: 2.16.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kelly Redding
@@ -10,9 +10,27 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2018-05-13 00:00:00 Z
14
- dependencies: []
15
-
13
+ date: 2018-06-06 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: much-factory
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ~>
21
+ - &id002 !ruby/object:Gem::Version
22
+ version: 0.1.0
23
+ type: :runtime
24
+ version_requirements: *id001
25
+ - !ruby/object:Gem::Dependency
26
+ name: much-stub
27
+ prerelease: false
28
+ requirement: &id003 !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ~>
31
+ - *id002
32
+ type: :runtime
33
+ version_requirements: *id003
16
34
  description: Assertion style testing framework.
17
35
  email:
18
36
  - kelly@kellyredding.com
@@ -97,7 +115,6 @@ files:
97
115
  - test/unit/macro_tests.rb
98
116
  - test/unit/result_tests.rb
99
117
  - test/unit/runner_tests.rb
100
- - test/unit/stub_tests.rb
101
118
  - test/unit/suite_tests.rb
102
119
  - test/unit/test_tests.rb
103
120
  - test/unit/utils_tests.rb
@@ -116,13 +133,13 @@ require_paths:
116
133
  - lib
117
134
  required_ruby_version: !ruby/object:Gem::Requirement
118
135
  requirements:
119
- - &id001
136
+ - &id004
120
137
  - ">="
121
138
  - !ruby/object:Gem::Version
122
139
  version: "0"
123
140
  required_rubygems_version: !ruby/object:Gem::Requirement
124
141
  requirements:
125
- - *id001
142
+ - *id004
126
143
  requirements: []
127
144
 
128
145
  rubyforge_project:
@@ -168,7 +185,6 @@ test_files:
168
185
  - test/unit/macro_tests.rb
169
186
  - test/unit/result_tests.rb
170
187
  - test/unit/runner_tests.rb
171
- - test/unit/stub_tests.rb
172
188
  - test/unit/suite_tests.rb
173
189
  - test/unit/test_tests.rb
174
190
  - test/unit/utils_tests.rb
@@ -1,375 +0,0 @@
1
- require 'assert'
2
- require 'assert/stub'
3
-
4
- require 'assert/factory'
5
-
6
- class Assert::Stub
7
-
8
- class UnitTests < Assert::Context
9
- desc "Assert::Stub"
10
- setup do
11
- @myclass = Class.new do
12
- def mymeth; 'meth'; end
13
- def myval(val); val; end
14
- def myargs(*args); args; end
15
- def myvalargs(val1, val2, *args); [val1, val2, args]; end
16
- def myblk(&block); block.call; end
17
- end
18
- @myobj = @myclass.new
19
-
20
- @stub = Assert::Stub.new(@myobj, :mymeth)
21
- end
22
- subject{ @stub }
23
-
24
- should have_readers :method_name, :name, :ivar_name, :do
25
- should have_writers :do
26
- should have_cmeths :key
27
- should have_imeths :call_method, :call, :with, :teardown
28
-
29
- should "generate a key given an object and method name" do
30
- obj = @myobj
31
- meth = :mymeth
32
- assert_equal "--#{obj.object_id}--#{meth}--", Assert::Stub.key(obj, meth)
33
- end
34
-
35
- should "know its names" do
36
- assert_equal 'mymeth', subject.method_name
37
- expected = "__assert_stub__#{@myobj.object_id}_#{subject.method_name}"
38
- assert_equal expected, subject.name
39
- expected = "@__assert_stub_#{@myobj.object_id}_" \
40
- "#{subject.method_name.to_sym.object_id}"
41
- assert_equal expected, subject.ivar_name
42
- end
43
-
44
- should "complain when called if no do block was given" do
45
- err = assert_raises(Assert::NotStubbedError){ @myobj.mymeth }
46
- assert_includes 'not stubbed.', err.message
47
- assert_includes 'test/unit/stub_tests.rb', err.backtrace.first
48
-
49
- subject.do = proc{ 'mymeth' }
50
- assert_nothing_raised do
51
- @myobj.mymeth
52
- end
53
-
54
- assert_nothing_raised do
55
- Assert::Stub.new(@myobj, :mymeth){ 'mymeth' }
56
- end
57
- end
58
-
59
- should "complain if stubbing a method that the object doesn't respond to" do
60
- err = assert_raises(Assert::StubError){ Assert::Stub.new(@myobj, :some_other_meth) }
61
- assert_includes 'does not respond to', err.message
62
- assert_includes 'test/unit/stub_tests.rb', err.backtrace.first
63
- end
64
-
65
- should "complain if stubbed and called with no `do` proc given" do
66
- assert_raises(Assert::NotStubbedError){ @myobj.mymeth }
67
- end
68
-
69
- should "complain if stubbed and called with mismatched arity" do
70
- Assert::Stub.new(@myobj, :myval){ 'myval' }
71
- err = assert_raises(Assert::StubArityError){ @myobj.myval }
72
- assert_includes 'arity mismatch on', err.message
73
- assert_includes 'test/unit/stub_tests.rb', err.backtrace.first
74
-
75
- assert_nothing_raised { @myobj.myval(1) }
76
- assert_raises(Assert::StubArityError){ @myobj.myval(1,2) }
77
-
78
- Assert::Stub.new(@myobj, :myargs){ 'myargs' }
79
- assert_nothing_raised { @myobj.myargs }
80
- assert_nothing_raised { @myobj.myargs(1) }
81
- assert_nothing_raised { @myobj.myargs(1,2) }
82
-
83
- Assert::Stub.new(@myobj, :myvalargs){ 'myvalargs' }
84
- assert_raises(Assert::StubArityError){ @myobj.myvalargs }
85
- assert_raises(Assert::StubArityError){ @myobj.myvalargs(1) }
86
- assert_nothing_raised { @myobj.myvalargs(1,2) }
87
- assert_nothing_raised { @myobj.myvalargs(1,2,3) }
88
- end
89
-
90
- should "complain if stubbed with mismatched arity" do
91
- err = assert_raises(Assert::StubArityError) do
92
- Assert::Stub.new(@myobj, :myval).with(){ 'myval' }
93
- end
94
- assert_includes 'arity mismatch on', err.message
95
- assert_includes 'test/unit/stub_tests.rb', err.backtrace.first
96
-
97
- assert_raises(Assert::StubArityError) do
98
- Assert::Stub.new(@myobj, :myval).with(1,2){ 'myval' }
99
- end
100
- assert_nothing_raised do
101
- Assert::Stub.new(@myobj, :myval).with(1){ 'myval' }
102
- end
103
-
104
- assert_nothing_raised do
105
- Assert::Stub.new(@myobj, :myargs).with(){ 'myargs' }
106
- end
107
- assert_nothing_raised do
108
- Assert::Stub.new(@myobj, :myargs).with(1,2){ 'myargs' }
109
- end
110
- assert_nothing_raised do
111
- Assert::Stub.new(@myobj, :myargs).with(1){ 'myargs' }
112
- end
113
-
114
- assert_raises(Assert::StubArityError) do
115
- Assert::Stub.new(@myobj, :myvalargs).with(){ 'myvalargs' }
116
- end
117
- assert_raises(Assert::StubArityError) do
118
- Assert::Stub.new(@myobj, :myvalargs).with(1){ 'myvalargs' }
119
- end
120
- assert_nothing_raised do
121
- Assert::Stub.new(@myobj, :myvalargs).with(1,2){ 'myvalargs' }
122
- end
123
- assert_nothing_raised do
124
- Assert::Stub.new(@myobj, :myvalargs).with(1,2,3){ 'myvalargs' }
125
- end
126
- end
127
-
128
- should "stub methods with no args" do
129
- subject.teardown
130
-
131
- assert_equal 'meth', @myobj.mymeth
132
- Assert::Stub.new(@myobj, :mymeth){ 'mymeth' }
133
- assert_equal 'mymeth', @myobj.mymeth
134
- end
135
-
136
- should "stub methods with required arg" do
137
- assert_equal 1, @myobj.myval(1)
138
- stub = Assert::Stub.new(@myobj, :myval){ |val| val.to_s }
139
- assert_equal '1', @myobj.myval(1)
140
- assert_equal '2', @myobj.myval(2)
141
- stub.with(2){ 'two' }
142
- assert_equal 'two', @myobj.myval(2)
143
- end
144
-
145
- should "stub methods with variable args" do
146
- assert_equal [1,2], @myobj.myargs(1,2)
147
- stub = Assert::Stub.new(@myobj, :myargs){ |*args| args.join(',') }
148
- assert_equal '1,2', @myobj.myargs(1,2)
149
- assert_equal '3,4,5', @myobj.myargs(3,4,5)
150
- stub.with(3,4,5){ 'three-four-five' }
151
- assert_equal 'three-four-five', @myobj.myargs(3,4,5)
152
- end
153
-
154
- should "stub methods with required args and variable args" do
155
- assert_equal [1,2, [3]], @myobj.myvalargs(1,2,3)
156
- stub = Assert::Stub.new(@myobj, :myvalargs){ |*args| args.join(',') }
157
- assert_equal '1,2,3', @myobj.myvalargs(1,2,3)
158
- assert_equal '3,4,5', @myobj.myvalargs(3,4,5)
159
- stub.with(3,4,5){ 'three-four-five' }
160
- assert_equal 'three-four-five', @myobj.myvalargs(3,4,5)
161
- end
162
-
163
- should "stub methods that yield blocks" do
164
- blkcalled = false
165
- blk = proc{ blkcalled = true }
166
- @myobj.myblk(&blk)
167
- assert_equal true, blkcalled
168
-
169
- blkcalled = false
170
- Assert::Stub.new(@myobj, :myblk){ blkcalled = 'true' }
171
- @myobj.myblk(&blk)
172
- assert_equal 'true', blkcalled
173
- end
174
-
175
- should "stub methods even if they are not local to the object" do
176
- mydelegatorclass = Class.new do
177
- def initialize(delegateclass)
178
- @delegate = delegateclass.new
179
- end
180
- def respond_to?(meth)
181
- @delegate.respond_to?(meth) || super
182
- end
183
- def method_missing(meth, *args, &block)
184
- respond_to?(meth) ? @delegate.send(meth, *args, &block) : super
185
- end
186
- end
187
- mydelegator = mydelegatorclass.new(@myclass)
188
-
189
- assert_equal [1,2,[3]], mydelegator.myvalargs(1,2,3)
190
- stub = Assert::Stub.new(mydelegator, :myvalargs){ |*args| args.inspect }
191
- assert_equal '[1, 2, 3]', mydelegator.myvalargs(1,2,3)
192
- assert_equal '[4, 5, 6]', mydelegator.myvalargs(4,5,6)
193
- stub.with(4,5,6){ 'four-five-six' }
194
- assert_equal 'four-five-six', mydelegator.myvalargs(4,5,6)
195
- end
196
-
197
- should "call to the original method" do
198
- subject.teardown
199
-
200
- # no args
201
- stub = Assert::Stub.new(@myobj, :mymeth){ 'mymeth' }
202
- assert_equal 'mymeth', stub.call([])
203
- assert_equal 'meth', stub.call_method([])
204
-
205
- # static args
206
- stub = Assert::Stub.new(@myobj, :myval){ |val| val.to_s }
207
- assert_equal '1', stub.call([1])
208
- assert_equal 1, stub.call_method([1])
209
- assert_equal '2', stub.call([2])
210
- assert_equal 2, stub.call_method([2])
211
- stub.with(2){ 'two' }
212
- assert_equal 'two', stub.call([2])
213
- assert_equal 2, stub.call_method([2])
214
-
215
- # dynamic args
216
- stub = Assert::Stub.new(@myobj, :myargs){ |*args| args.join(',') }
217
- assert_equal '1,2', stub.call([1,2])
218
- assert_equal [1,2], stub.call_method([1,2])
219
- assert_equal '3,4,5', stub.call([3,4,5])
220
- assert_equal [3,4,5], stub.call_method([3,4,5])
221
- stub.with(3,4,5){ 'three-four-five' }
222
- assert_equal 'three-four-five', stub.call([3,4,5])
223
- assert_equal [3,4,5], stub.call_method([3,4,5])
224
-
225
- # mixed static/dynamic args
226
- stub = Assert::Stub.new(@myobj, :myvalargs){ |*args| args.join(',') }
227
- assert_equal '1,2,3', stub.call([1,2,3])
228
- assert_equal [1,2, [3]], stub.call_method([1,2,3])
229
- assert_equal '3,4,5', stub.call([3,4,5])
230
- assert_equal [3,4,[5]], stub.call_method([3,4,5])
231
- stub.with(3,4,5){ 'three-four-five' }
232
- assert_equal 'three-four-five', stub.call([3,4,5])
233
- assert_equal [3,4,[5]], stub.call_method([3,4,5])
234
-
235
- # blocks
236
- blkcalled = false
237
- blk = proc{ blkcalled = true }
238
- stub = Assert::Stub.new(@myobj, :myblk){ blkcalled = 'true' }
239
- stub.call([], &blk)
240
- assert_equal 'true', blkcalled
241
- stub.call_method([], &blk)
242
- assert_equal true, blkcalled
243
- end
244
-
245
- should "store and remove itself on asserts main module" do
246
- assert_equal subject, Assert.instance_variable_get(subject.ivar_name)
247
- subject.teardown
248
- assert_nil Assert.instance_variable_get(subject.ivar_name)
249
- end
250
-
251
- should "be removable" do
252
- assert_equal 1, @myobj.myval(1)
253
- stub = Assert::Stub.new(@myobj, :myval){ |val| val.to_s }
254
- assert_equal '1', @myobj.myval(1)
255
- stub.teardown
256
- assert_equal 1, @myobj.myval(1)
257
- end
258
-
259
- should "have a readable inspect" do
260
- expected = "#<#{subject.class}:#{'0x0%x' % (subject.object_id << 1)}" \
261
- " @method_name=#{subject.method_name.inspect}>"
262
- assert_equal expected, subject.inspect
263
- end
264
-
265
- end
266
-
267
- class MutatingArgsStubTests < UnitTests
268
- desc "with args that are mutated after they've been used to stub"
269
- setup do
270
- @arg = ChangeHashObject.new
271
-
272
- @stub = Assert::Stub.new(@myobj, :myval)
273
- @stub.with(@arg){ true }
274
-
275
- @arg.change!
276
- end
277
- subject{ @stub }
278
-
279
- should "not raise a stub error when called" do
280
- assert_nothing_raised{ @stub.call([@arg]) }
281
- end
282
-
283
- end
284
-
285
- class StubInheritedMethodAfterStubbedOnParentTests < UnitTests
286
- desc "stubbing an inherited method after its stubbed on the parent class"
287
- setup do
288
- @parent_class = Class.new
289
- @child_class = Class.new(@parent_class)
290
-
291
- @parent_stub = Assert::Stub.new(@parent_class, :new)
292
- @child_stub = Assert::Stub.new(@child_class, :new)
293
- end
294
-
295
- should "allow stubbing them independently of each other" do
296
- assert_nothing_raised do
297
- @parent_stub.with(1, 2){ 'parent' }
298
- @child_stub.with(1, 2){ 'child' }
299
- end
300
- assert_equal 'parent', @parent_class.new(1, 2)
301
- assert_equal 'child', @child_class.new(1, 2)
302
- end
303
-
304
- should "not raise any errors when tearing down the parent before the child" do
305
- assert_nothing_raised do
306
- @parent_stub.teardown
307
- @child_stub.teardown
308
- end
309
- end
310
-
311
- end
312
-
313
- class NullStubTests < UnitTests
314
- desc "NullStub"
315
- setup do
316
- @ns = NullStub.new
317
- end
318
- subject{ @ns }
319
-
320
- should have_imeths :teardown
321
-
322
- end
323
-
324
- class ParameterListTests < UnitTests
325
- desc "ParameterList"
326
- setup do
327
- many_args = (0..ParameterList::LETTERS.size).map do
328
- Assert::Factory.string
329
- end.join(', ')
330
- @object = Class.new
331
- # use `class_eval` with string to easily define methods with many params
332
- @object.class_eval <<-methods
333
- def self.noargs; end
334
- def self.anyargs(*args); end
335
- def self.manyargs(#{many_args}); end
336
- def self.minargs(#{many_args}, *args); end
337
- methods
338
- end
339
- subject{ ParameterList }
340
-
341
- should "build a parameter list for a method that takes no args" do
342
- assert_equal '&block', subject.new(@object, 'noargs')
343
- end
344
-
345
- should "build a parameter list for a method that takes any args" do
346
- assert_equal '*args, &block', subject.new(@object, 'anyargs')
347
- end
348
-
349
- should "build a parameter list for a method that takes many args" do
350
- expected = "#{ParameterList::LETTERS.join(', ')}, aa, &block"
351
- assert_equal expected, subject.new(@object, 'manyargs')
352
- end
353
-
354
- should "build a parameter list for a method that takes a minimum number of args" do
355
- expected = "#{ParameterList::LETTERS.join(', ')}, aa, *args, &block"
356
- assert_equal expected, subject.new(@object, 'minargs')
357
- end
358
-
359
- end
360
-
361
- class ChangeHashObject
362
- def initialize
363
- @value = nil
364
- end
365
-
366
- def hash
367
- @value.hash
368
- end
369
-
370
- def change!
371
- @value = 1
372
- end
373
- end
374
-
375
- end