r_spec-clone 1.2.4 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e5c67c5d900bbe71f8e647c1fd1c4e5bd6a96e01b9db3d228918dedb755edd2
4
- data.tar.gz: 3907ef8dab4a2bb8c751eacf281c5f643b2f3a9c774fbb71ec1cfc0707072dea
3
+ metadata.gz: c8475d853643279af5a0a255bf7b3fd5b4547f4dd596bc044fa37a5ac2d69ff0
4
+ data.tar.gz: 3d22158ee01cb6f0e4924bd57345225e35d40920b2bffaf0cf862575db4b62ca
5
5
  SHA512:
6
- metadata.gz: 758790442ee21c56a0d40f98385ad7bdfbcbc88d527fc266f86641623fed9c172b68144e538a4565dd19e211b53b3412d847813978991853bfe2d8ab82a67cd7
7
- data.tar.gz: fd4c45945f0f84de6361f68aaec5d84feb6f9983f27248b42abb5757b9c17a3fd15b00e4c0ab7314a6050d6234f8e3b8e5ef997d87df26b34e7f199322dc621d
6
+ metadata.gz: 2f6826b996db0d6b3f727a7bc16b7757f7fc1ae350ca2285cf81aaf4ce8bfb15f0c37a8910bb2413800821524109cd6c655275aa2b800f52ba25aba1c31c9ac7
7
+ data.tar.gz: 53b85ef4eb8b249cdf2f717de35a6c29916c65d28a125e28656e300a5bfb7263d62865fba6d53a2517ae035cf64daa0c2b7b04a82ecaca93903502b0f5c2a59d
data/README.md CHANGED
@@ -149,13 +149,13 @@ expect(actual).to match(expected) # passes if expected.match?(actual)
149
149
  expect { actual }.to raise_exception(expected) # passes if expected exception is raised
150
150
  ```
151
151
 
152
- #### Truth
152
+ #### True
153
153
 
154
154
  ```ruby
155
155
  expect(actual).to be_true # passes if true.equal?(actual)
156
156
  ```
157
157
 
158
- #### Untruth
158
+ #### False
159
159
 
160
160
  ```ruby
161
161
  expect(actual).to be_false # passes if false.equal?(actual)
@@ -174,6 +174,21 @@ expect(actual).to be_instance_of(expected) # passes if expected.equal?(actual
174
174
  expect(actual).to be_an_instance_of(expected) # passes if expected.equal?(actual.class)
175
175
  ```
176
176
 
177
+ #### Change
178
+
179
+ ```ruby
180
+ expect { object.action }.to change(object, :value).from(old).to(new)
181
+ expect { object.action }.to change(object, :value).by(delta)
182
+ expect { object.action }.to change(object, :value).by_at_least(minimum_delta)
183
+ expect { object.action }.to change(object, :value).by_at_most(maximum_delta)
184
+ ```
185
+
186
+ #### Satisfy
187
+
188
+ ```ruby
189
+ expect(actual).to(satisfy { |value| value == expected })
190
+ ```
191
+
177
192
  ### Running specs
178
193
 
179
194
  By convention, specs live in the `spec/` directory of a project. Spec files should end with `_spec.rb` to be recognizable as such.
@@ -234,6 +249,12 @@ bundle exec rake
234
249
 
235
250
  ## Performance
236
251
 
252
+ The benchmarks compare the performance of [`r_spec-clone`](https://rubygems.org/gems/r_spec-clone) with the following frameworks (in alphabetical order):
253
+
254
+ * [`fix`](https://rubygems.org/gems/fix)
255
+ * [`minitest`](https://rubygems.org/gems/minitest)
256
+ * [`rspec`](https://rubygems.org/gems/rspec)
257
+
237
258
  ### Boot time
238
259
 
239
260
  Benchmark against [100 executions of a file containing 1 expectation](https://github.com/cyril/r_spec-clone.rb/blob/main/benchmark/boot_time/) (lower is better).
data/lib/r_spec.rb CHANGED
@@ -37,8 +37,8 @@ require_relative File.join("r_spec", "clone", "dsl")
37
37
  #
38
38
  # # Output to the console
39
39
  # # Success: expected to eq 3.
40
- # # Success: expected true to be true.
41
- # # Success: expected false to be false.
40
+ # # Success: expected to be true.
41
+ # # Success: expected to be false.
42
42
  #
43
43
  # @example An inherited definition of let
44
44
  # require "r_spec"
@@ -12,13 +12,13 @@ module RSpec
12
12
  # @return [nil] Write a pending expectation to STDOUT.
13
13
  def self.result(message)
14
14
  ::Expresenter.call(true).with(
15
- actual: new(message),
16
- error: nil,
17
- expected: self,
18
- got: false,
19
- matcher: :raise_exception,
20
- negate: true,
21
- level: :SHOULD
15
+ actual: new(message),
16
+ definition: "raise exception #{self}",
17
+ error: nil,
18
+ expected: self,
19
+ got: false,
20
+ negate: true,
21
+ level: :SHOULD
22
22
  )
23
23
  end
24
24
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "matchi/rspec"
4
- require "matchi/helper"
3
+ require "matchi"
5
4
 
6
5
  module RSpec
7
6
  module Clone
@@ -11,72 +10,192 @@ module RSpec
11
10
  # This module defines a number of methods to create expectations, which
12
11
  # are automatically included into examples.
13
12
  #
14
- # It also includes a collection of expectation matchers 🤹
15
- #
16
- # @example Equivalence matcher
17
- # matcher = eql("foo") # => Matchi::Matcher::Eql.new("foo")
18
- # matcher.matches? { "foo" } # => true
19
- # matcher.matches? { "bar" } # => false
20
- #
21
- # matcher = eq("foo") # => Matchi::Matcher::Eq.new("foo")
22
- # matcher.matches? { "foo" } # => true
23
- # matcher.matches? { "bar" } # => false
24
- #
25
- # @example Identity matcher
26
- # object = "foo"
27
- #
28
- # matcher = equal(object) # => Matchi::Matcher::Equal.new(object)
29
- # matcher.matches? { object } # => true
30
- # matcher.matches? { "foo" } # => false
31
- #
32
- # matcher = be(object) # => Matchi::Matcher::Be.new(object)
33
- # matcher.matches? { object } # => true
34
- # matcher.matches? { "foo" } # => false
35
- #
36
- # @example Regular expressions matcher
37
- # matcher = match(/^foo$/) # => Matchi::Matcher::Match.new(/^foo$/)
38
- # matcher.matches? { "foo" } # => true
39
- # matcher.matches? { "bar" } # => false
40
- #
41
- # @example Expecting errors matcher
42
- # matcher = raise_exception(NameError) # => Matchi::Matcher::RaiseException.new(NameError)
43
- # matcher.matches? { Boom } # => true
44
- # matcher.matches? { true } # => false
45
- #
46
- # @example Truth matcher
47
- # matcher = be_true # => Matchi::Matcher::BeTrue.new
48
- # matcher.matches? { true } # => true
49
- # matcher.matches? { false } # => false
50
- # matcher.matches? { nil } # => false
51
- # matcher.matches? { 4 } # => false
52
- #
53
- # @example Untruth matcher
54
- # matcher = be_false # => Matchi::Matcher::BeFalse.new
55
- # matcher.matches? { false } # => true
56
- # matcher.matches? { true } # => false
57
- # matcher.matches? { nil } # => false
58
- # matcher.matches? { 4 } # => false
59
- #
60
- # @example Nil matcher
61
- # matcher = be_nil # => Matchi::Matcher::BeNil.new
62
- # matcher.matches? { nil } # => true
63
- # matcher.matches? { false } # => false
64
- # matcher.matches? { true } # => false
65
- # matcher.matches? { 4 } # => false
66
- #
67
- # @example Type/class matcher
68
- # matcher = be_instance_of(String) # => Matchi::Matcher::BeInstanceOf.new(String)
69
- # matcher.matches? { "foo" } # => true
70
- # matcher.matches? { 4 } # => false
71
- #
72
- # matcher = be_an_instance_of(String) # => Matchi::Matcher::BeAnInstanceOf.new(String)
73
- # matcher.matches? { "foo" } # => true
74
- # matcher.matches? { 4 } # => false
13
+ # It also includes a collection of expectation matchers.
75
14
  #
76
15
  # @see https://github.com/fixrb/matchi
77
- # @see https://github.com/fixrb/matchi-rspec
78
16
  module Shared
79
- include ::Matchi::Helper
17
+ # Equivalence matcher
18
+ #
19
+ # @example
20
+ # matcher = eq("foo")
21
+ # matcher.matches? { "foo" } # => true
22
+ # matcher.matches? { "bar" } # => false
23
+ #
24
+ # @param expected [#eql?] An expected equivalent object.
25
+ #
26
+ # @return [#matches?] An equivalence matcher.
27
+ #
28
+ # @api public
29
+ def eq(expected)
30
+ ::Matchi::Eq.new(expected)
31
+ end
32
+
33
+ alias eql eq
34
+
35
+ # Identity matcher
36
+ #
37
+ # @example
38
+ # object = "foo"
39
+ # matcher = be(object)
40
+ # matcher.matches? { object } # => true
41
+ # matcher.matches? { "foo" } # => false
42
+ #
43
+ # @param expected [#equal?] The expected identical object.
44
+ #
45
+ # @return [#matches?] An identity matcher.
46
+ #
47
+ # @api public
48
+ def be(expected)
49
+ ::Matchi::Be.new(expected)
50
+ end
51
+
52
+ alias equal be
53
+
54
+ # Regular expressions matcher
55
+ #
56
+ # @example
57
+ # matcher = match(/^foo$/)
58
+ # matcher.matches? { "foo" } # => true
59
+ # matcher.matches? { "bar" } # => false
60
+ #
61
+ # @param expected [#match] A regular expression.
62
+ #
63
+ # @return [#matches?] A regular expression matcher.
64
+ #
65
+ # @api public
66
+ def match(expected)
67
+ ::Matchi::Match.new(expected)
68
+ end
69
+
70
+ # Expecting errors matcher
71
+ #
72
+ # @example
73
+ # matcher = raise_exception(NameError)
74
+ # matcher.matches? { Boom } # => true
75
+ # matcher.matches? { true } # => false
76
+ #
77
+ # @param expected [Exception, #to_s] The expected exception name.
78
+ #
79
+ # @return [#matches?] An error matcher.
80
+ #
81
+ # @api public
82
+ def raise_exception(expected)
83
+ ::Matchi::RaiseException.new(expected)
84
+ end
85
+
86
+ # True matcher
87
+ #
88
+ # @example
89
+ # matcher = be_true
90
+ # matcher.matches? { true } # => true
91
+ # matcher.matches? { false } # => false
92
+ # matcher.matches? { nil } # => false
93
+ # matcher.matches? { 4 } # => false
94
+ #
95
+ # @return [#matches?] A `true` matcher.
96
+ #
97
+ # @api public
98
+ def be_true
99
+ be(true)
100
+ end
101
+
102
+ # False matcher
103
+ #
104
+ # @example
105
+ # matcher = be_false
106
+ # matcher.matches? { false } # => true
107
+ # matcher.matches? { true } # => false
108
+ # matcher.matches? { nil } # => false
109
+ # matcher.matches? { 4 } # => false
110
+ #
111
+ # @return [#matches?] A `false` matcher.
112
+ #
113
+ # @api public
114
+ def be_false
115
+ be(false)
116
+ end
117
+
118
+ # Nil matcher
119
+ #
120
+ # @example
121
+ # matcher = be_nil
122
+ # matcher.matches? { nil } # => true
123
+ # matcher.matches? { false } # => false
124
+ # matcher.matches? { true } # => false
125
+ # matcher.matches? { 4 } # => false
126
+ #
127
+ # @return [#matches?] A `nil` matcher.
128
+ #
129
+ # @api public
130
+ def be_nil
131
+ be(nil)
132
+ end
133
+
134
+ # Type/class matcher
135
+ #
136
+ # @example
137
+ # matcher = be_an_instance_of(String)
138
+ # matcher.matches? { "foo" } # => true
139
+ # matcher.matches? { 4 } # => false
140
+ #
141
+ # @param expected [Class, #to_s] The expected class name.
142
+ #
143
+ # @return [#matches?] A type/class matcher.
144
+ #
145
+ # @api public
146
+ def be_an_instance_of(expected)
147
+ ::Matchi::BeAnInstanceOf.new(expected)
148
+ end
149
+
150
+ # Change matcher
151
+ #
152
+ # @example
153
+ # object = []
154
+ # matcher = change(object, :length).by(1)
155
+ # matcher.matches? { object << 1 } # => true
156
+ #
157
+ # object = []
158
+ # matcher = change(object, :length).by_at_least(1)
159
+ # matcher.matches? { object << 1 } # => true
160
+ #
161
+ # object = []
162
+ # matcher = change(object, :length).by_at_most(1)
163
+ # matcher.matches? { object << 1 } # => true
164
+ #
165
+ # object = "foo"
166
+ # matcher = change(object, :to_s).from("foo").to("FOO")
167
+ # matcher.matches? { object.upcase! } # => true
168
+ #
169
+ # object = "foo"
170
+ # matcher = change(object, :to_s).to("FOO")
171
+ # matcher.matches? { object.upcase! } # => true
172
+ #
173
+ # @param object [#object_id] An object.
174
+ # @param method [Symbol] The name of a method.
175
+ # @param args [Array] A list of arguments.
176
+ # @param kwargs [Hash] A list of keyword arguments.
177
+ #
178
+ # @return [#matches?] A change matcher.
179
+ #
180
+ # @api public
181
+ def change(object, method, *args, **kwargs, &block)
182
+ ::Matchi::Change.new(object, method, *args, **kwargs, &block)
183
+ end
184
+
185
+ # Satisfy matcher
186
+ #
187
+ # @example
188
+ # matcher = satisfy { |value| value == 42 }
189
+ # matcher.matches? { 42 } # => true
190
+ #
191
+ # @param expected [Proc] A block of code.
192
+ #
193
+ # @return [#matches?] A satisfy matcher.
194
+ #
195
+ # @api public
196
+ def satisfy(&expected)
197
+ ::Matchi::Satisfy.new(&expected)
198
+ end
80
199
  end
81
200
  end
82
201
  end
@@ -95,13 +95,13 @@ module RSpec
95
95
  # `Kernel.exit(false)` with a failure message written to STDERR.
96
96
  def result(passed, actual:, error:, got:, matcher:, negate:)
97
97
  Console.passed_spec ::Expresenter.call(passed).with(
98
- actual: actual,
99
- error: error,
100
- expected: matcher.expected,
101
- got: got,
102
- negate: negate,
103
- matcher: matcher.class.to_sym,
104
- level: :MUST
98
+ actual: actual,
99
+ definition: matcher.to_s,
100
+ error: error,
101
+ expected: matcher.expected,
102
+ got: got,
103
+ negate: negate,
104
+ level: :MUST
105
105
  )
106
106
  rescue ::Expresenter::Fail => e
107
107
  Console.failed_spec(e)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: r_spec-clone
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.4
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyril Kato
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-19 00:00:00.000000000 Z
11
+ date: 2021-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: expresenter
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.3.0
19
+ version: 1.4.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.3.0
26
+ version: 1.4.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: matchi-rspec
28
+ name: matchi
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.2.0
33
+ version: 3.1.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.2.0
40
+ version: 3.1.1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: test_tube
43
43
  requirement: !ruby/object:Gem::Requirement