test_tube 2.0.0 → 2.1.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: b343e487d9f73eb0af9f0aeee5ba11c35cab9f644e7a106b3f8a259f3567d142
4
- data.tar.gz: 9b28e9986b96cc1af7f1db0b9e98715364a4ff08579038d0a9663a67bd6dbf78
3
+ metadata.gz: 6aa09337dc5d35dd53da1f517ff92bced3b0d0c4f9c25eef1cd9287b63e14bbf
4
+ data.tar.gz: 36026bb1f5f3532e70ff51ebc25a1ddcf8c6098214c438e6a6fb6ad0305b249c
5
5
  SHA512:
6
- metadata.gz: 3dd6be662939a33715130137e2ea9c6f5cebf95b9c33c18bf56457f2c08ac5e50e094c7e63eff045a1d7d9b4bfcee1db2652d43bcd1fc0a324e3ad99e3e1d17e
7
- data.tar.gz: 9139defd6aa5d96e1d7b2dcfd676a60757b6bb496fb8ea071164e04c624de3e2d327bede1148e5fd793b5c39c57e7715e69f2982f8de6df9bfc95ed85b7b4c27
6
+ metadata.gz: 668493142591c985ece8e150691d7e60d6834b5da976361ff4c4aea34204b0c645aea61352424daf6964366014df424f881fd6b27fb416c581399395b9c7f8af
7
+ data.tar.gz: ea4ce58827e8643b54811082bee5861502d339daa4489ac69355fc06c172ca15f6c1129c6db2bbee171184d06211dba70cca56995302e18d176b3801e61e9f8f
data/README.md CHANGED
@@ -58,12 +58,8 @@ of code:
58
58
  ```ruby
59
59
  block_of_code = -> { "101010".to_i(2) }
60
60
 
61
- experiment = TestTube.invoke(
62
- isolation: false,
63
- matcher: BeTheAnswer.new,
64
- negate: false,
65
- &block_of_code
66
- )
61
+ experiment = TestTube.invoke(isolate: false, matcher: BeTheAnswer.new, negate: false, &block_of_code)
62
+ # => <TestTube actual=42 error=nil got=true>
67
63
 
68
64
  experiment.actual # => 42
69
65
  experiment.error # => nil
@@ -75,11 +71,8 @@ An alternative would be to `pass` directly the actual value as a parameter:
75
71
  ```ruby
76
72
  actual_value = "101010".to_i(2)
77
73
 
78
- experiment = TestTube.pass(
79
- actual_value,
80
- matcher: BeTheAnswer.new,
81
- negate: false
82
- )
74
+ experiment = TestTube.pass(actual_value, matcher: BeTheAnswer.new, negate: false)
75
+ # => <TestTube actual=42 error=nil got=true>
83
76
 
84
77
  experiment.actual # => 42
85
78
  experiment.error # => nil
@@ -105,12 +98,11 @@ An example of successful experience:
105
98
 
106
99
  ```ruby
107
100
  experiment = TestTube.invoke(
108
- isolation: false,
109
- matcher: Matchi::Matcher::RaiseException.new(NoMethodError),
110
- negate: false
111
- ) do
112
- "foo".blank?
113
- end
101
+ isolate: false,
102
+ matcher: Matchi::Matcher::RaiseException.new(NoMethodError),
103
+ negate: false
104
+ ) { "foo".blank? }
105
+ # => <TestTube actual=#<NoMethodError: undefined method `blank?' for "foo":String> error=nil got=true>
114
106
 
115
107
  experiment.actual # => #<NoMethodError: undefined method `blank?' for "foo":String>
116
108
  experiment.error # => nil
@@ -121,11 +113,11 @@ Another example of an experiment that fails:
121
113
 
122
114
  ```ruby
123
115
  experiment = TestTube.invoke(
124
- isolation: false,
125
- matcher: Matchi::Matcher::Equal.new(0.3),
126
- negate: false,
116
+ isolate: false,
117
+ matcher: Matchi::Matcher::Equal.new(0.3),
118
+ negate: false,
127
119
  &-> { 0.1 + 0.2 }
128
- )
120
+ ) # => <TestTube actual=0.30000000000000004 error=nil got=false>
129
121
 
130
122
  experiment.actual # => 0.30000000000000004
131
123
  experiment.error # => nil
@@ -136,10 +128,11 @@ Finally, an experiment which causes an error:
136
128
 
137
129
  ```ruby
138
130
  experiment = TestTube.invoke(
139
- isolation: false,
140
- matcher: Matchi::Matcher::Match.new(/^foo$/),
141
- negate: false
131
+ isolate: false,
132
+ matcher: Matchi::Matcher::Match.new(/^foo$/),
133
+ negate: false
142
134
  ) { BOOM }
135
+ # => <TestTube actual=nil error=#<NameError: uninitialized constant BOOM> got=nil>
143
136
 
144
137
  experiment.actual # => nil
145
138
  experiment.error # => #<NameError: uninitialized constant BOOM>
@@ -149,27 +142,25 @@ experiment.got # => nil
149
142
  ### Code isolation
150
143
 
151
144
  When experimenting tests, side-effects may occur. Because they may or may not be
152
- desired, an `isolation` option is available.
145
+ desired, an `isolate` option is available.
153
146
 
154
147
  Let's for instance consider this block of code:
155
148
 
156
149
  ```ruby
157
150
  greeting = "Hello, world!"
158
- block_of_code = -> { greeting.gsub!("world", "Alice") }
151
+ block_of_code = -> { greeting.gsub!("world", "Alice") } # => #<Proc:0x00007f87f71b9690 (irb):42 (lambda)>
159
152
  ```
160
153
 
161
- By setting the `isolation` option to `true`, we can experiment while avoiding
154
+ By setting the `isolate` option to `true`, we can experiment while avoiding
162
155
  side effects:
163
156
 
164
157
  ```ruby
165
158
  experiment = TestTube.invoke(
166
- isolation: true,
167
- matcher: Matchi::Matcher::Eql.new("Hello, Alice!"),
168
- negate: false,
159
+ isolate: true,
160
+ matcher: Matchi::Matcher::Eql.new("Hello, Alice!"),
161
+ negate: false,
169
162
  &block_of_code
170
- )
171
-
172
- experiment.inspect # => <TestTube actual="Hello, Alice!" error=nil got=true>
163
+ ) # => <TestTube actual="Hello, Alice!" error=nil got=true>
173
164
 
174
165
  greeting # => "Hello, world!"
175
166
  ```
@@ -178,13 +169,11 @@ Otherwise, we can experiment without any code isolation:
178
169
 
179
170
  ```ruby
180
171
  experiment = TestTube.invoke(
181
- isolation: false,
182
- matcher: Matchi::Matcher::Eql.new("Hello, Alice!"),
183
- negate: false,
172
+ isolate: false,
173
+ matcher: Matchi::Matcher::Eql.new("Hello, Alice!"),
174
+ negate: false,
184
175
  &block_of_code
185
- )
186
-
187
- experiment.inspect # => <TestTube actual="Hello, Alice!" error=nil got=true>
176
+ ) # => <TestTube actual="Hello, Alice!" error=nil got=true>
188
177
 
189
178
  greeting # => "Hello, Alice!"
190
179
  ```
@@ -192,6 +181,8 @@ greeting # => "Hello, Alice!"
192
181
  ## Contact
193
182
 
194
183
  * Source code: https://github.com/fixrb/test_tube
184
+ * Chinese blog post: https://ruby-china.org/topics/41390
185
+ * Japanese blog post: https://qiita.com/cyril/items/36174b619ff1852c80ec
195
186
 
196
187
  ## Versioning
197
188
 
@@ -199,7 +190,7 @@ __Test Tube__ follows [Semantic Versioning 2.0](https://semver.org/).
199
190
 
200
191
  ## License
201
192
 
202
- The [gem](https://rubygems.org/gems/test_tube) is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
193
+ The [gem](https://rubygems.org/gems/test_tube) is available as open source under the terms of the [MIT License](https://github.com/fixrb/test_tube/raw/main/LICENSE.md).
203
194
 
204
195
  ***
205
196
 
data/lib/test_tube.rb CHANGED
@@ -7,10 +7,10 @@ require_relative File.join("test_tube", "passer")
7
7
  #
8
8
  # @api public
9
9
  module TestTube
10
- # @param isolation [Boolean] Compute in isolation or not.
11
- # @param matcher [#matches?] A matcher.
12
- # @param negate [Boolean] Invert the matcher or not.
13
- # @param input [Proc] The callable object to test.
10
+ # @param isolate [Boolean] Compute in a subprocess.
11
+ # @param matcher [#matches?] A matcher.
12
+ # @param negate [Boolean] Invert the matcher or not.
13
+ # @param input [Proc] The callable object to test.
14
14
  #
15
15
  # @example
16
16
  # require "test_tube"
@@ -21,18 +21,18 @@ module TestTube
21
21
  # end
22
22
  # end
23
23
  #
24
- # TestTube.invoke(isolation: false, matcher: BeTheAnswer.new, negate: false) do
24
+ # TestTube.invoke(isolate: false, matcher: BeTheAnswer.new, negate: false) do
25
25
  # "101010".to_i(2)
26
26
  # end
27
27
  #
28
28
  # @return [Invoker] A software experiment.
29
- def self.invoke(isolation:, matcher:, negate:, &input)
30
- Invoker.new(isolation: isolation, matcher: matcher, negate: negate, &input)
29
+ def self.invoke(isolate:, matcher:, negate:, &input)
30
+ Invoker.new(isolate: isolate, matcher: matcher, negate: negate, &input)
31
31
  end
32
32
 
33
- # @param input [#object_id] The callable object to test.
34
- # @param matcher [#matches?] A matcher.
35
- # @param negate [Boolean] Invert the matcher or not.
33
+ # @param input [#object_id] The actual value to test.
34
+ # @param matcher [#matches?] A matcher.
35
+ # @param negate [Boolean] Invert the matcher or not.
36
36
  #
37
37
  # @example
38
38
  # require "test_tube"
@@ -8,21 +8,29 @@ module TestTube
8
8
  # Expectation's actual value.
9
9
  #
10
10
  # @return [#object_id] The actual value.
11
+ #
12
+ # @api public
11
13
  attr_reader :actual
12
14
 
13
15
  # Expectation's raised error.
14
16
  #
15
17
  # @return [Exception, nil] The raised error.
18
+ #
19
+ # @api public
16
20
  attr_reader :error
17
21
 
18
22
  # Expectation's returned boolean value.
19
23
  #
20
24
  # @return [Boolean, nil] The returned boolean value.
25
+ #
26
+ # @api public
21
27
  attr_reader :got
22
28
 
23
29
  # A string containing a human-readable representation of the experiment.
24
30
  #
25
31
  # @return [String] The human-readable representation of the experiment.
32
+ #
33
+ # @api public
26
34
  def inspect
27
35
  "<TestTube actual=#{actual.inspect} error=#{error.inspect} got=#{got.inspect}>"
28
36
  end
@@ -13,15 +13,15 @@ module TestTube
13
13
  #
14
14
  # rubocop:disable Lint/RescueException, Metrics/MethodLength
15
15
  #
16
- # @param isolation [Boolean] Compute in isolation or not.
17
- # @param matcher [#matches?] A matcher.
18
- # @param negate [Boolean] Invert the matcher or not.
19
- # @param input [Proc] The callable object to test.
20
- def initialize(isolation:, matcher:, negate:, &input)
16
+ # @param isolate [Boolean] Compute in a subprocess.
17
+ # @param matcher [#matches?] A matcher.
18
+ # @param negate [Boolean] Invert the matcher or not.
19
+ # @param input [Proc] The callable object to test.
20
+ def initialize(isolate:, matcher:, negate:, &input)
21
21
  super()
22
22
 
23
23
  @got = negate ^ matcher.matches? do
24
- value = if isolation
24
+ value = if isolate
25
25
  send_call.to!(input)
26
26
  else
27
27
  send_call.to(input)
@@ -9,7 +9,7 @@ module TestTube
9
9
  class Passer < Base
10
10
  # Class initializer.
11
11
  #
12
- # @param input [#object_id] An actual value to test.
12
+ # @param input [#object_id] The actual value to test.
13
13
  # @param matcher [#matches?] A matcher.
14
14
  # @param negate [Boolean] Invert the matcher or not.
15
15
  def initialize(input, matcher:, negate:)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test_tube
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.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-11 00:00:00.000000000 Z
11
+ date: 2021-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: defi