rushcheck 0.5 → 0.6

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 (52) hide show
  1. data/Rakefile +9 -1
  2. data/Rakefile.in +9 -1
  3. data/data/rushcheck/doc/rushcheck.thtml +55 -0
  4. data/data/rushcheck/examples/proc.rb +1 -1
  5. data/data/rushcheck/examples/rspec/stack.rb +42 -0
  6. data/data/rushcheck/examples/rspec/stack_spec.rb +223 -0
  7. data/data/rushcheck/rdoc/classes/RushCheck/Arbitrary.src/M000035.html +1 -1
  8. data/data/rushcheck/rdoc/classes/RushCheck/Assertion.html +14 -3
  9. data/data/rushcheck/rdoc/classes/RushCheck/Assertion.src/M000073.html +1 -2
  10. data/data/rushcheck/rdoc/classes/RushCheck/Assertion.src/M000074.html +6 -33
  11. data/data/rushcheck/rdoc/classes/RushCheck/Claim.html +199 -0
  12. data/data/rushcheck/rdoc/classes/RushCheck/Claim.src/M000107.html +21 -0
  13. data/data/rushcheck/rdoc/classes/RushCheck/Coarbitrary.src/M000058.html +1 -1
  14. data/data/rushcheck/rdoc/classes/RushCheck/Gen.html +3 -3
  15. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000076.html +0 -1
  16. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000077.html +1 -1
  17. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000078.html +1 -1
  18. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000079.html +1 -1
  19. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000080.html +1 -1
  20. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000081.html +1 -1
  21. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000082.html +1 -1
  22. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000083.html +1 -1
  23. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000084.html +1 -1
  24. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000085.html +1 -1
  25. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000086.html +1 -1
  26. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000087.html +1 -1
  27. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000088.html +1 -1
  28. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000089.html +1 -1
  29. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000090.html +1 -1
  30. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000091.html +1 -1
  31. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000092.html +1 -1
  32. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000093.html +1 -1
  33. data/data/rushcheck/rdoc/classes/RushCheck/Gen.src/M000094.html +1 -1
  34. data/data/rushcheck/rdoc/classes/RushCheck.html +25 -1
  35. data/data/rushcheck/rdoc/created.rid +1 -1
  36. data/data/rushcheck/rdoc/files/rushcheck/arbitrary_rb.html +20 -2
  37. data/data/rushcheck/rdoc/files/rushcheck/assertion_rb.html +1 -1
  38. data/data/rushcheck/rdoc/files/rushcheck/claim_rb.html +119 -0
  39. data/data/rushcheck/rdoc/files/rushcheck/gen_rb.html +1 -1
  40. data/data/rushcheck/rdoc/files/rushcheck/random_rb.html +1 -1
  41. data/data/rushcheck/rdoc/files/rushcheck/version_rb.html +107 -0
  42. data/data/rushcheck/rdoc/files/rushcheck_rb.html +3 -1
  43. data/data/rushcheck/rdoc/fr_class_index.html +1 -0
  44. data/data/rushcheck/rdoc/fr_file_index.html +2 -0
  45. data/data/rushcheck/rdoc/fr_method_index.html +8 -7
  46. data/lib/rushcheck/arbitrary.rb +15 -1
  47. data/lib/rushcheck/assertion.rb +21 -6
  48. data/lib/rushcheck/claim.rb +56 -0
  49. data/lib/rushcheck/gen.rb +2 -4
  50. data/lib/rushcheck/version.rb +1 -1
  51. data/lib/rushcheck.rb +1 -0
  52. metadata +11 -2
data/Rakefile CHANGED
@@ -6,10 +6,18 @@ require 'rubygems'
6
6
  require 'rake'
7
7
  require 'rake/gempackagetask'
8
8
 
9
+ RUSHCHECK_VERSION="0.6"
10
+ task :default => ["dist", "gem"]
11
+
12
+ task :dist do
13
+ system "darcs dist -d rushcheck-#{RUSHCHECK_VERSION}"
14
+ system "mv rushcheck-#{RUSHCHECK_VERSION}.tar.gz pkg/"
15
+ end
16
+
9
17
  spec = Gem::Specification.new do |s|
10
18
  s.name = 'rushcheck'
11
19
  s.summary = "A lightweight random testing tool"
12
- s.version = "0.5"
20
+ s.version = RUSHCHECK_VERSION
13
21
  s.author = 'Daisuke IKEGAMI'
14
22
  s.email = 'ikegami@madscientist.jp'
15
23
  s.homepage = 'http://rushcheck.rubyforge.org'
data/Rakefile.in CHANGED
@@ -6,10 +6,18 @@ require 'rubygems'
6
6
  require 'rake'
7
7
  require 'rake/gempackagetask'
8
8
 
9
+ RUSHCHECK_VERSION="@VERSION@"
10
+ task :default => ["dist", "gem"]
11
+
12
+ task :dist do
13
+ system "darcs dist -d rushcheck-#{RUSHCHECK_VERSION}"
14
+ system "mv rushcheck-#{RUSHCHECK_VERSION}.tar.gz pkg/"
15
+ end
16
+
9
17
  spec = Gem::Specification.new do |s|
10
18
  s.name = 'rushcheck'
11
19
  s.summary = "A lightweight random testing tool"
12
- s.version = "@VERSION@"
20
+ s.version = RUSHCHECK_VERSION
13
21
  s.author = 'Daisuke IKEGAMI'
14
22
  s.email = 'ikegami@madscientist.jp'
15
23
  s.homepage = 'http://rushcheck.rubyforge.org'
@@ -19,6 +19,8 @@ h1. Index
19
19
  ## <a href="#Watching the statistics">Watching the statistics</a>
20
20
  ### <a href="#trivial">'trivial'</a>
21
21
  ### <a href="#classify">'classify'</a>
22
+ # <a href="Combining unit testing and RushCheck">Combining unit testing and RushCheck</a>
23
+ # <a href="Combining RSpec and RushCheck">Combining RSpec and RushCheck</a>
22
24
  ## <a href="#With another basic classes for assertions">With another basic classes for assertions</a>
23
25
  ### <a href="#SpecialString">SpecialString</a>
24
26
  ### <a href="#Array and RandomArray">Array and RandomArray</a>
@@ -307,6 +309,59 @@ true
307
309
  irb>
308
310
  </pre>
309
311
 
312
+ h2. <a name="Combining unit testing and RushCheck">Combining unit testing and RushCheck</a>
313
+
314
+ The library 'test/unit' of Ruby is useful for unit testing. Here is a trick to use 'test/unit'.
315
+
316
+ <pre>
317
+ def forall(*cs, &f)
318
+ assert(RushCheck::Claim.new(*cs, &f).check)
319
+ end
320
+ </pre>
321
+
322
+ The class Claim is a subclass of Assertion. The meaning is almost similar to Assertion, however
323
+ Claim does not check the result value of the given block 'f'. Because assertions in 'test/unit'
324
+ such as 'assert_equal' does not return any result, but return nil, we don't need to check the
325
+ result values of a sequence of assertions. Nevertheless we can check the testcase because
326
+ the assertions in 'test/unit' raises an exception if the testcase is failed.
327
+
328
+ Example:
329
+ <pre>
330
+ def test_not_empty_after_push
331
+ array = Array.new
332
+ forall(Integer) do |item|
333
+ array.push item
334
+ assert(! array.empty?)
335
+ end
336
+ end
337
+ </pre>
338
+
339
+ h2. <a name="Combining RSpec and RushCheck">Combining RSpec and RushCheck</a>
340
+ "RSpec":http://rspec.rubyforge.org is another testing framework which helps Behaviour Driven Development (BDD).
341
+ To combine RSpec and RushCheck, the following trick maybe useful and easy to read:
342
+ <pre>
343
+ def forall(*cs, &f)
344
+ RushCheck::Claim.new(*cs, &f).check.should_equal true
345
+ end
346
+ </pre>
347
+
348
+ Then, for example, we can write a specification of Array#push as follows:
349
+ <pre>
350
+ context "An empty array" do
351
+
352
+ specify "should not be empty after 'push'" do
353
+ forall(Integer) do |item|
354
+ array = Array.new
355
+ array.push item
356
+ array.should_not_be_empty
357
+ end
358
+ end
359
+
360
+ end
361
+ </pre>
362
+
363
+ See also 'examples/rspec' in the distribution of RushCheck for details.
364
+
310
365
  h2. <a name="With another basic classes for assertions">With another basic classes for assertions</a>
311
366
 
312
367
  In previous sections, we have seen how to check assertions for any
@@ -13,7 +13,7 @@ class Proc
13
13
  end
14
14
  end
15
15
 
16
- class MyRandomProc < RushCheck::RandomProc; end
16
+ class MyRandomProc < RandomProc; end
17
17
 
18
18
  def associativity_integer
19
19
  MyRandomProc.set_pattern([Integer], [Integer])
@@ -0,0 +1,42 @@
1
+ # This example is quoted from the RSpec tutorial.
2
+ # check also http://rspec.rubyforge.org/tutorials/index.html
3
+
4
+ class StackUnderflowError < RuntimeError; end
5
+ class StackOverflowError < RuntimeError; end
6
+
7
+ class Stack
8
+
9
+ SIZE = 5
10
+
11
+ def initialize
12
+ @items = []
13
+ end
14
+
15
+ def empty?
16
+ @items.empty?
17
+ end
18
+
19
+ def length
20
+ @items.length
21
+ end
22
+
23
+ def full?
24
+ @items.length == SIZE
25
+ end
26
+
27
+ def push(item)
28
+ raise StackOverflowError if full?
29
+ @items.push item
30
+ end
31
+
32
+ def pop
33
+ raise StackUnderflowError if empty?
34
+ @items.pop
35
+ end
36
+
37
+ def peek
38
+ raise StackUnderflowError if empty?
39
+ @items.last
40
+ end
41
+
42
+ end
@@ -0,0 +1,223 @@
1
+ # This example is quoted from the RSpec tutorial and also
2
+ # test/spec.
3
+ # check also
4
+ # http://rspec.rubyforge.org/tutorials/index.html
5
+ # http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/217242
6
+ #
7
+ # To execute this example, you have to follow
8
+ # 1. install rspec
9
+ # % sudo gem install rspec
10
+ # 2. then, execute the 'spec' command
11
+ # % spec stack_spec.rb -f s
12
+ #
13
+ # On my PowerBook PC, this example takes about 50 seconds.
14
+
15
+ begin
16
+ require 'rubygems'
17
+ require_gem 'rushcheck'
18
+ rescue LoadError
19
+ require 'rushcheck'
20
+ end
21
+
22
+ def forall(*cs, &f)
23
+ RushCheck::Claim.new(*cs, &f).check.should_equal true
24
+ end
25
+
26
+ require 'stack'
27
+
28
+ context "An empty stack" do
29
+
30
+ specify "should not be empty after 'push'" do
31
+ forall(Integer) do |item|
32
+ stack = Stack.new
33
+ stack.push item
34
+ stack.should_not_be_empty
35
+ end
36
+ end
37
+
38
+ end
39
+
40
+ # setup for general stack
41
+ class NotEmptyAndFullStack < Stack
42
+ extend RushCheck::Arbitrary
43
+
44
+ def self.arbitrary
45
+ stack = self.new
46
+ RushCheck::Gen.choose(1, SIZE-2).bind do |size|
47
+ RushCheck::Gen.vector(String, size).fmap do |ary|
48
+ ary.each { |i| stack.push i }
49
+ stack
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ context "A stack (in general)" do
56
+
57
+ setup do
58
+ puts " This test consumes time. Please wait few seconds."
59
+ end
60
+
61
+ specify "should add the top when sent 'push'" do
62
+ forall(NotEmptyAndFullStack, String) do |stack, item|
63
+ stack.push item
64
+ stack.peek.should_equal item
65
+ end
66
+ end
67
+
68
+ specify "should NOT remove the top item when sent 'peek'" do
69
+ forall(NotEmptyAndFullStack, Integer) do |stack, item|
70
+ stack.push item
71
+ stack.peek.should_equal item
72
+ stack.peek.should_equal item
73
+ end
74
+ end
75
+
76
+ specify "should return the top item when sent 'pop'" do
77
+ forall(NotEmptyAndFullStack, Integer) do |stack, item|
78
+ stack.push item
79
+ stack.pop.should_equal item
80
+ end
81
+ end
82
+
83
+ specify "should remove the top item when sent 'pop'" do
84
+ forall(NotEmptyAndFullStack, Integer, Integer) do |stack, dummy, item|
85
+ stack.push item
86
+ stack.push dummy
87
+ stack.pop
88
+ stack.pop.should_equal item
89
+ end
90
+ end
91
+
92
+ end
93
+
94
+ context "An empty stack" do
95
+
96
+ specify "should be empty" do
97
+ Stack.new.should_be_empty
98
+ end
99
+
100
+ specify "should no longer be empty" do
101
+ forall(Integer) do |item|
102
+ stack = Stack.new
103
+ stack.push item
104
+ stack.should_not_be_empty
105
+ end
106
+ end
107
+
108
+ specify "should complain when sent 'peek'" do
109
+ lambda { Stack.new.peek }.should_raise StackUnderflowError
110
+ end
111
+
112
+ specify "should complain when sent 'pop'" do
113
+ lambda { Stack.new.pop }.should_raise StackUnderflowError
114
+ end
115
+ end
116
+
117
+ context "An almost empty stack (with one item)" do
118
+ specify "should not be empty" do
119
+ forall(Integer) do |item|
120
+ stack = Stack.new
121
+ stack.push item
122
+ stack.should_not_be_empty
123
+ end
124
+ end
125
+
126
+ specify "should remain not empty after 'peek'" do
127
+ forall(Integer) do |item|
128
+ stack = Stack.new
129
+ stack.push item
130
+ stack.peek
131
+ stack.should_not_be_empty
132
+ end
133
+ end
134
+
135
+ specify "should become empty after 'pop'" do
136
+ forall(Integer) do |item|
137
+ stack = Stack.new
138
+ stack.push item
139
+ stack.pop
140
+ stack.should_be_empty
141
+ end
142
+ end
143
+
144
+ end
145
+
146
+ # setup for almost full stack
147
+ class AlmostFullStack < Stack
148
+ extend RushCheck::Arbitrary
149
+
150
+ def self.arbitrary
151
+ stack = self.new
152
+ RushCheck::Gen.vector(String, SIZE-1).fmap do |ary|
153
+ ary.each { |i| stack.push i }
154
+ stack
155
+ end
156
+ end
157
+ end
158
+
159
+ context "An almost full stack (with one item less than capacity)" do
160
+
161
+ setup do
162
+ puts " This test consumes time. Please wait few seconds."
163
+ end
164
+
165
+ specify "should not be full" do
166
+ forall(AlmostFullStack) do |stack|
167
+ stack.should.not.be.full
168
+ end
169
+ end
170
+
171
+ specify "should become full when sent 'push'" do
172
+ forall(AlmostFullStack, Integer) do |stack, item|
173
+ stack.push item
174
+ stack.should.be.full
175
+ end
176
+ end
177
+ end
178
+
179
+ # setup for full stack
180
+ class FullStack < Stack
181
+ extend RushCheck::Arbitrary
182
+
183
+ def self.arbitrary
184
+ stack = self.new
185
+ RushCheck::Gen.vector(String, SIZE).fmap do |ary|
186
+ ary.each { |i| stack.push i }
187
+ stack
188
+ end
189
+ end
190
+ end
191
+
192
+ context "A full stack" do
193
+
194
+ setup do
195
+ puts " This test consumes time. Please wait few seconds."
196
+ end
197
+
198
+ specify "should be full" do
199
+ forall(FullStack) do |stack|
200
+ stack.should.be.full
201
+ end
202
+ end
203
+
204
+ specify "should remain full after 'peek'" do
205
+ forall(FullStack) do |stack|
206
+ stack.peek
207
+ stack.should.be.full
208
+ end
209
+ end
210
+
211
+ specify "should no longer be full after 'pop'" do
212
+ forall(FullStack) do |stack|
213
+ stack.pop
214
+ stack.should.not.be.full
215
+ end
216
+ end
217
+
218
+ specify "should complain on 'push'" do
219
+ forall(FullStack, Integer) do |stack, item|
220
+ lambda { stack.push item }.should.raise StackOverflowError
221
+ end
222
+ end
223
+ end
@@ -10,7 +10,7 @@
10
10
  <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
11
11
  </head>
12
12
  <body class="standalone-code">
13
- <pre><span class="ruby-comment cmt"># File rushcheck/arbitrary.rb, line 16</span>
13
+ <pre><span class="ruby-comment cmt"># File rushcheck/arbitrary.rb, line 30</span>
14
14
  <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">arbitrary</span>
15
15
  <span class="ruby-identifier">raise</span>(<span class="ruby-constant">NotImplementedError</span>, <span class="ruby-value str">&quot;This method should be overrided.&quot;</span>)
16
16
  <span class="ruby-keyword kw">end</span></pre>
@@ -97,10 +97,21 @@ href="../Integer.html">Integer</a>, <a href="../String.html">String</a>) do
97
97
  end
98
98
  </p>
99
99
  <p>
100
+ The return value of the body of testcase is checked by the method
101
+ &#8216;check&#8217;.
102
+ </p>
103
+ <p>
100
104
  Note that the number of arguments in the block must be equal to the number
101
- of arguments of <a href="Assertion.html#M000073">Assertion.new</a>. See
102
- also the <a href="../RushCheck.html">RushCheck</a> tutorial and several
103
- examples.
105
+ of arguments of <a href="Assertion.html#M000073">Assertion.new</a>.
106
+ However, for a curried block, we can write also
107
+ </p>
108
+ <pre>
109
+ Assertion.new(*cs) {|*xs| ...}
110
+ </pre>
111
+ <p>
112
+ See also class <a href="Claim.html">Claim</a>, which is a subclass of <a
113
+ href="Assertion.html">Assertion</a> See also the <a
114
+ href="../RushCheck.html">RushCheck</a> tutorial and several examples.
104
115
  </p>
105
116
 
106
117
  </div>
@@ -10,9 +10,8 @@
10
10
  <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
11
11
  </head>
12
12
  <body class="standalone-code">
13
- <pre><span class="ruby-comment cmt"># File rushcheck/assertion.rb, line 28</span>
13
+ <pre><span class="ruby-comment cmt"># File rushcheck/assertion.rb, line 35</span>
14
14
  <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">xs</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">f</span>)
15
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">f</span>.<span class="ruby-identifier">arity</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">xs</span>.<span class="ruby-identifier">length</span>
16
15
  <span class="ruby-ivar">@inputs</span> = <span class="ruby-identifier">xs</span>[<span class="ruby-value">0</span><span class="ruby-operator">..</span>(<span class="ruby-identifier">f</span>.<span class="ruby-identifier">arity</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>)]
17
16
  <span class="ruby-ivar">@proc</span> = <span class="ruby-identifier">f</span>
18
17
  <span class="ruby-keyword kw">end</span></pre>
@@ -10,41 +10,14 @@
10
10
  <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
11
11
  </head>
12
12
  <body class="standalone-code">
13
- <pre><span class="ruby-comment cmt"># File rushcheck/assertion.rb, line 34</span>
13
+ <pre><span class="ruby-comment cmt"># File rushcheck/assertion.rb, line 79</span>
14
14
  <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">property</span>
15
- <span class="ruby-identifier">g</span> = <span class="ruby-constant">RushCheck</span><span class="ruby-operator">::</span><span class="ruby-constant">Gen</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">n</span>, <span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
16
- <span class="ruby-identifier">r2</span> = <span class="ruby-identifier">r</span>
17
- <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@inputs</span>
18
- <span class="ruby-keyword kw">then</span>
19
- <span class="ruby-ivar">@inputs</span>.<span class="ruby-identifier">map</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
20
- <span class="ruby-identifier">r1</span>, <span class="ruby-identifier">r2</span> = <span class="ruby-identifier">r2</span>.<span class="ruby-identifier">split</span>
21
- <span class="ruby-identifier">c</span>.<span class="ruby-identifier">arbitrary</span>.<span class="ruby-identifier">value</span>(<span class="ruby-identifier">n</span>, <span class="ruby-identifier">r1</span>)
22
- <span class="ruby-keyword kw">end</span>
23
- <span class="ruby-keyword kw">else</span>
24
- []
15
+ <span class="ruby-identifier">_property</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">args</span><span class="ruby-operator">|</span>
16
+ <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@proc</span>.<span class="ruby-identifier">call</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">args</span>)
17
+ <span class="ruby-keyword kw">then</span> <span class="ruby-constant">RushCheck</span><span class="ruby-operator">::</span><span class="ruby-constant">Result</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">true</span>)
18
+ <span class="ruby-keyword kw">else</span> <span class="ruby-constant">RushCheck</span><span class="ruby-operator">::</span><span class="ruby-constant">Result</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">false</span>)
25
19
  <span class="ruby-keyword kw">end</span>
26
- <span class="ruby-keyword kw">end</span>.<span class="ruby-identifier">bind</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">args</span><span class="ruby-operator">|</span>
27
- <span class="ruby-identifier">test</span> = <span class="ruby-keyword kw">begin</span>
28
- <span class="ruby-ivar">@proc</span>.<span class="ruby-identifier">call</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">args</span>)
29
- <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">ex</span>
30
- <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">ex</span>
31
- <span class="ruby-keyword kw">when</span> <span class="ruby-constant">RushCheck</span><span class="ruby-operator">::</span><span class="ruby-constant">GuardException</span>
32
- <span class="ruby-constant">RushCheck</span><span class="ruby-operator">::</span><span class="ruby-constant">Result</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">nil</span>)
33
- <span class="ruby-keyword kw">else</span>
34
- <span class="ruby-identifier">err</span> = <span class="ruby-node">&quot;Unexpected exception: #{ex.inspect}\n&quot;</span> <span class="ruby-operator">+</span>
35
- <span class="ruby-identifier">ex</span>.<span class="ruby-identifier">backtrace</span>.<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;\n&quot;</span>)
36
- <span class="ruby-constant">RushCheck</span><span class="ruby-operator">::</span><span class="ruby-constant">Result</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">false</span>, [], [<span class="ruby-identifier">err</span>])
37
- <span class="ruby-keyword kw">end</span>
38
- <span class="ruby-keyword kw">end</span>
39
- <span class="ruby-comment cmt"># not use ensure here because ensure clause</span>
40
- <span class="ruby-comment cmt"># does not return values</span>
41
- <span class="ruby-identifier">test</span>.<span class="ruby-identifier">property</span>.<span class="ruby-identifier">gen</span>.<span class="ruby-identifier">fmap</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">res</span><span class="ruby-operator">|</span>
42
- <span class="ruby-identifier">res</span>.<span class="ruby-identifier">arguments</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">args</span>.<span class="ruby-identifier">inspect</span>
43
- <span class="ruby-identifier">res</span>
44
- <span class="ruby-keyword kw">end</span>
45
- <span class="ruby-keyword kw">end</span>
46
-
47
- <span class="ruby-constant">RushCheck</span><span class="ruby-operator">::</span><span class="ruby-constant">Property</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">g</span>)
20
+ }
48
21
  <span class="ruby-keyword kw">end</span></pre>
49
22
  </body>
50
23
  </html>