assert_statistically 0.1.1
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.
- data/CHANGELOG +2 -0
- data/MIT-LICENSE +20 -0
- data/README +28 -0
- data/lib/assert_statistically.rb +47 -0
- data/test/all_tests.rb +4 -0
- data/test/unit/assert_statistically_test.rb +176 -0
- data/test/unit/test_setup.rb +4 -0
- metadata +56 -0
data/CHANGELOG
ADDED
data/MIT-LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright (c) 2007 Zachary Holt
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
Please see the MIT-LICENSE file for copyright and distribution information.
|
|
2
|
+
|
|
3
|
+
assert_statistically is an addition to Test::Unit:TestCase that gives you a method
|
|
4
|
+
called :assert_statistically, that wraps :assert_block, with some extra functionality.
|
|
5
|
+
|
|
6
|
+
assert_statistically( :min => 3, :max => 6, :of => 10 ) do
|
|
7
|
+
some_method
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
The above snippet will run the block (which simply calls :some_method) 10 times. If
|
|
11
|
+
it passes (as defined by assert_block) no fewer than 3 times and no more than 6 times,
|
|
12
|
+
then the test "passes."
|
|
13
|
+
|
|
14
|
+
:of defaults to 1
|
|
15
|
+
:min defaults to :of
|
|
16
|
+
:max defaults to 0 (0 is equal to no maximum)
|
|
17
|
+
|
|
18
|
+
assert_statistically( :of => 10, :sleep => 3 ) do
|
|
19
|
+
some_method
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
The above snippet will run the block 10 times, sleeping 3 second between each run.
|
|
23
|
+
|
|
24
|
+
Note that if the :sleep key "points" to something that responds to :call (e.g.,
|
|
25
|
+
a Proc object), that something will have :call invoked on it, with a single parameter:
|
|
26
|
+
a Hash containing values for the keys :min, :max, :index (the current iteration), and
|
|
27
|
+
:passes (the number of times the test has passed thus far). The result from that
|
|
28
|
+
call will be passed to :sleep (so make it a number, eh?).
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module Test
|
|
2
|
+
module Unit
|
|
3
|
+
module Assertions
|
|
4
|
+
def assert_statistically( options={}, &blk )
|
|
5
|
+
options = { :message => options.to_s } unless options.is_a?( Hash )
|
|
6
|
+
of = options[:of].to_i > 0 ? options[:of].to_i : 1
|
|
7
|
+
|
|
8
|
+
max = options[:max].to_i > 0 ? options[:max].to_i : 0
|
|
9
|
+
min = options[:min].to_i > 0 ? options[:min].to_i : 0
|
|
10
|
+
min = of if min == 0 && max == 0 || min > of
|
|
11
|
+
max = 0 if max > 0 && max < min
|
|
12
|
+
sleep_time = options[:sleep]
|
|
13
|
+
|
|
14
|
+
message = options[:message].to_s.empty? ? 'assert_block (%d) failed' : options[:message].to_s
|
|
15
|
+
final_message = ''
|
|
16
|
+
passes = 0
|
|
17
|
+
|
|
18
|
+
1.upto( of ) do |i|
|
|
19
|
+
begin
|
|
20
|
+
assert_block nil, &blk
|
|
21
|
+
passes += 1
|
|
22
|
+
rescue AssertionFailedError => e
|
|
23
|
+
final_message << "#{message % i}\n"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
unless sleep_time.nil?
|
|
27
|
+
if sleep_time.respond_to?( :call )
|
|
28
|
+
sleep sleep_time.call( :index => i, :passes => passes, :of => of, :min => min, :max => max )
|
|
29
|
+
elsif sleep_time.respond_to?( :to_f )
|
|
30
|
+
sleep sleep_time.to_f
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
if min > 0
|
|
36
|
+
if max > 0
|
|
37
|
+
raise AssertionFailedError.new( final_message ) if passes < min || passes > max
|
|
38
|
+
else
|
|
39
|
+
raise AssertionFailedError.new( final_message ) if passes < min
|
|
40
|
+
end
|
|
41
|
+
else
|
|
42
|
+
raise AssertionFailedError.new( final_message ) if passes > max
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
data/test/all_tests.rb
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
#!/usr/local/bin/ruby
|
|
2
|
+
dir = File.expand_path( File.dirname( __FILE__ ) )
|
|
3
|
+
|
|
4
|
+
require 'test/unit'
|
|
5
|
+
require "#{File.expand_path( File.dirname( __FILE__ ) )}/test_setup"
|
|
6
|
+
|
|
7
|
+
class AssertStatisticallyTest < Test::Unit::TestCase
|
|
8
|
+
def setup
|
|
9
|
+
$counter = 0
|
|
10
|
+
end
|
|
11
|
+
def teardown
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_assert_statistically_block
|
|
15
|
+
assert_statistically( :min => 10, :of => 10 ) do
|
|
16
|
+
$counter += 1
|
|
17
|
+
true
|
|
18
|
+
end
|
|
19
|
+
assert_equal 10, $counter
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_assert_statistically_block_sleep
|
|
23
|
+
t1 = Time.now
|
|
24
|
+
assert_statistically( :of => 5, :sleep => 0.5 ) do
|
|
25
|
+
$counter += 1
|
|
26
|
+
true
|
|
27
|
+
end
|
|
28
|
+
t2 = Time.now
|
|
29
|
+
assert_in_delta 2.5, t2.to_f - t1.to_f, 0.2
|
|
30
|
+
assert_equal 5, $counter
|
|
31
|
+
|
|
32
|
+
$counter = 0
|
|
33
|
+
sleep_lambda = lambda { |o| $counter }
|
|
34
|
+
t1 = Time.now
|
|
35
|
+
assert_statistically( :of => 3, :sleep => sleep_lambda ) do
|
|
36
|
+
$counter += 1
|
|
37
|
+
true
|
|
38
|
+
end
|
|
39
|
+
t2 = Time.now
|
|
40
|
+
assert_in_delta 6, t2.to_f - t1.to_f, 0.2
|
|
41
|
+
assert_equal 3, $counter
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def test_assert_statistically_block_defaults
|
|
45
|
+
assert_statistically do
|
|
46
|
+
$counter += 1
|
|
47
|
+
end
|
|
48
|
+
assert_equal 1, $counter
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_assert_statistically_block_min
|
|
52
|
+
assert_statistically( :min => 100 ) do
|
|
53
|
+
$counter += 1
|
|
54
|
+
end
|
|
55
|
+
assert_equal 1, $counter
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
$counter = 0
|
|
60
|
+
begin
|
|
61
|
+
assert_statistically( :min => 2, :of => 5 ) do
|
|
62
|
+
$counter += 1
|
|
63
|
+
$counter < 3
|
|
64
|
+
end
|
|
65
|
+
rescue
|
|
66
|
+
flunk "Should not have failed"
|
|
67
|
+
end
|
|
68
|
+
assert_equal 5, $counter
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
$counter = 0
|
|
72
|
+
begin
|
|
73
|
+
assert_statistically( :min => 2, :of => 5 ) do
|
|
74
|
+
$counter += 1
|
|
75
|
+
$counter < 2
|
|
76
|
+
end
|
|
77
|
+
rescue
|
|
78
|
+
else
|
|
79
|
+
flunk "Should have failed"
|
|
80
|
+
end
|
|
81
|
+
assert_equal 5, $counter
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def test_assert_statistically_block_max
|
|
86
|
+
assert_statistically( :max => 100 ) do
|
|
87
|
+
$counter += 1
|
|
88
|
+
end
|
|
89
|
+
assert_equal 1, $counter
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
$counter = 0
|
|
93
|
+
begin
|
|
94
|
+
assert_statistically( :max => 3, :of => 5 ) do
|
|
95
|
+
$counter += 1
|
|
96
|
+
$counter < 3
|
|
97
|
+
end
|
|
98
|
+
rescue
|
|
99
|
+
flunk "Should not have failed"
|
|
100
|
+
end
|
|
101
|
+
assert_equal 5, $counter
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
$counter = 0
|
|
105
|
+
begin
|
|
106
|
+
assert_statistically( :max => 2, :of => 5 ) do
|
|
107
|
+
$counter += 1
|
|
108
|
+
$counter < 4
|
|
109
|
+
end
|
|
110
|
+
rescue
|
|
111
|
+
else
|
|
112
|
+
flunk "Should have failed"
|
|
113
|
+
end
|
|
114
|
+
assert_equal 5, $counter
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def test_assert_statistically_block_min_and_max
|
|
119
|
+
assert_statistically( :max => 100, :min => 100 ) do
|
|
120
|
+
$counter += 1
|
|
121
|
+
end
|
|
122
|
+
assert_equal 1, $counter
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
$counter = 0
|
|
126
|
+
begin
|
|
127
|
+
assert_statistically( :min => 2, :max => 3, :of => 5 ) do
|
|
128
|
+
$counter += 1
|
|
129
|
+
$counter == 1
|
|
130
|
+
end
|
|
131
|
+
rescue
|
|
132
|
+
else
|
|
133
|
+
flunk "Should have failed"
|
|
134
|
+
end
|
|
135
|
+
assert_equal 5, $counter
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
$counter = 0
|
|
139
|
+
begin
|
|
140
|
+
assert_statistically( :min => 2, :max => 3, :of => 5 ) do
|
|
141
|
+
$counter += 1
|
|
142
|
+
$counter < 5
|
|
143
|
+
end
|
|
144
|
+
rescue
|
|
145
|
+
else
|
|
146
|
+
flunk "Should have failed"
|
|
147
|
+
end
|
|
148
|
+
assert_equal 5, $counter
|
|
149
|
+
|
|
150
|
+
$counter = 0
|
|
151
|
+
begin
|
|
152
|
+
assert_statistically( :min => 2, :max => 3, :of => 5 ) do
|
|
153
|
+
$counter += 1
|
|
154
|
+
$counter < 3
|
|
155
|
+
end
|
|
156
|
+
rescue
|
|
157
|
+
flunk "Should not have failed"
|
|
158
|
+
end
|
|
159
|
+
assert_equal 5, $counter
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def test_assert_statistically_block_failure
|
|
165
|
+
begin
|
|
166
|
+
assert_statistically( :of => 2 ) do
|
|
167
|
+
false
|
|
168
|
+
end
|
|
169
|
+
rescue
|
|
170
|
+
assert_equal 'Test::Unit::AssertionFailedError', $!.class.name
|
|
171
|
+
assert_equal "assert_block (1) failed\nassert_block (2) failed\n", $!.message
|
|
172
|
+
else
|
|
173
|
+
flunk "Was supposed to raise a Test::Unit::AssertionFailedError"
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
rubygems_version: 0.9.0
|
|
3
|
+
specification_version: 1
|
|
4
|
+
name: assert_statistically
|
|
5
|
+
version: !ruby/object:Gem::Version
|
|
6
|
+
version: 0.1.1
|
|
7
|
+
date: 2007-07-17 00:00:00 -07:00
|
|
8
|
+
summary: Unit::Test::Assertions addition that allows you to run assert_blocks many times in one pass
|
|
9
|
+
require_paths:
|
|
10
|
+
- lib
|
|
11
|
+
email: z@wzph.com
|
|
12
|
+
homepage:
|
|
13
|
+
rubyforge_project: statistically
|
|
14
|
+
description: assert_statistically is an addition to Unit::Test::Assertions that wraps assert_block. You can set a number of times to run the block, a minimum and maximum number of times that the block must pass, a message for failure, and an amount of time to sleep between each run of the block. Alternately, you can pass a Proc object to be called to determine the amount of time to sleep between each block. The Proc object will be passed a single Hash containing all the relevant information.
|
|
15
|
+
autorequire: assert_statistically
|
|
16
|
+
default_executable:
|
|
17
|
+
bindir: bin
|
|
18
|
+
has_rdoc: false
|
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
20
|
+
requirements:
|
|
21
|
+
- - ">"
|
|
22
|
+
- !ruby/object:Gem::Version
|
|
23
|
+
version: 0.0.0
|
|
24
|
+
version:
|
|
25
|
+
platform: ruby
|
|
26
|
+
signing_key:
|
|
27
|
+
cert_chain:
|
|
28
|
+
post_install_message:
|
|
29
|
+
authors:
|
|
30
|
+
- Zachary Holt
|
|
31
|
+
files:
|
|
32
|
+
- lib/assert_statistically.rb
|
|
33
|
+
- test/all_tests.rb
|
|
34
|
+
- test/unit/assert_statistically_test.rb
|
|
35
|
+
- test/unit/test_setup.rb
|
|
36
|
+
- README
|
|
37
|
+
- MIT-LICENSE
|
|
38
|
+
- CHANGELOG
|
|
39
|
+
test_files:
|
|
40
|
+
- test/all_tests.rb
|
|
41
|
+
- test/unit/assert_statistically_test.rb
|
|
42
|
+
- test/unit/test_setup.rb
|
|
43
|
+
rdoc_options: []
|
|
44
|
+
|
|
45
|
+
extra_rdoc_files:
|
|
46
|
+
- README
|
|
47
|
+
- MIT-LICENSE
|
|
48
|
+
- CHANGELOG
|
|
49
|
+
executables: []
|
|
50
|
+
|
|
51
|
+
extensions: []
|
|
52
|
+
|
|
53
|
+
requirements: []
|
|
54
|
+
|
|
55
|
+
dependencies: []
|
|
56
|
+
|