clean_test 0.10.0
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/.gitignore +6 -0
- data/.rvmrc +1 -0
- data/.travis.yml +12 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +201 -0
- data/README.rdoc +343 -0
- data/Rakefile +29 -0
- data/clean_test.gemspec +25 -0
- data/lib/clean_test/any.rb +169 -0
- data/lib/clean_test/given_when_then.rb +186 -0
- data/lib/clean_test/test_case.rb +32 -0
- data/lib/clean_test/test_that.rb +65 -0
- data/lib/clean_test/version.rb +5 -0
- data/test/bootstrap.rb +5 -0
- data/test/test_any.rb +144 -0
- data/test/test_circle.rb +17 -0
- data/test/test_simple_given.rb +107 -0
- data/test/test_test_that.rb +35 -0
- metadata +114 -0
@@ -0,0 +1,169 @@
|
|
1
|
+
require 'faker'
|
2
|
+
|
3
|
+
module Clean # :nodoc:
|
4
|
+
module Test # :nodoc:
|
5
|
+
# Public: Provides the ability to vend arbitrary values without using literals, or
|
6
|
+
# long calls to Faker. This has two levels of utility:
|
7
|
+
#
|
8
|
+
# helper methods - #any_number, #any_int, #any_string provide arbitrary primitives
|
9
|
+
# to make it clear what numbers, ints, and strings in your tests are
|
10
|
+
# relevant. Arbitrary values should use one of these any_ helpers.
|
11
|
+
#
|
12
|
+
# any sort of any - you can define your own "any" values by using #new_any, which allows you to
|
13
|
+
# extend things if you like. Of course, you could just make your own any_method as well.
|
14
|
+
#
|
15
|
+
# Example:
|
16
|
+
#
|
17
|
+
# class Person
|
18
|
+
# def initialize(first_name,last_name,age)
|
19
|
+
# # ...
|
20
|
+
# end
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# test_that "someone under 18 is a minor" {
|
24
|
+
# Given {
|
25
|
+
# # First name and last name aren't relevant to the test
|
26
|
+
# @person = Person.new(any_string,any_string,17)
|
27
|
+
# }
|
28
|
+
# When {
|
29
|
+
# @minor = @person.minor?
|
30
|
+
# }
|
31
|
+
# Then {
|
32
|
+
# assert @minor
|
33
|
+
# }
|
34
|
+
# }
|
35
|
+
#
|
36
|
+
# test_that "full_name gives the full name" {
|
37
|
+
# Given {
|
38
|
+
# # Age isn't relevant; it just needs to be positive
|
39
|
+
# @person = Person.new("Dave","Copeland",any_int :positive)
|
40
|
+
# }
|
41
|
+
# When {
|
42
|
+
# @full_name = @person.full_name
|
43
|
+
# }
|
44
|
+
# Then {
|
45
|
+
# assert_equal "Dave Copeland",@full_namej
|
46
|
+
# }
|
47
|
+
# }
|
48
|
+
module Any
|
49
|
+
MAX_RAND = 50000 # :nodoc:
|
50
|
+
|
51
|
+
# Public: Get any number; one that doesn't matter
|
52
|
+
#
|
53
|
+
# options - options to control what sort of number comes back:
|
54
|
+
# :positive - make sure that the number is greater than zero
|
55
|
+
# :negative - make sure that the number is less than zero
|
56
|
+
def any_number(*options)
|
57
|
+
any :number,options
|
58
|
+
end
|
59
|
+
|
60
|
+
# Public: Returns an integer. options is the same as for #any_number
|
61
|
+
def any_int(*options)
|
62
|
+
any :int,options
|
63
|
+
end
|
64
|
+
|
65
|
+
# Public: Get an arbitrary string of any potential length (the real max is 2048 characters if you don't override it)
|
66
|
+
#
|
67
|
+
# options - options to control the returned string:
|
68
|
+
# :max - the max size of the string you want
|
69
|
+
# :min - the minimum size we want to come back
|
70
|
+
#
|
71
|
+
# Example
|
72
|
+
#
|
73
|
+
# any_string :max => 255 # => ensure it'll fit into a varchar(255)
|
74
|
+
# any_string :min => 1024 # at least 1024 characters
|
75
|
+
#
|
76
|
+
def any_string(options = {})
|
77
|
+
any :string,options
|
78
|
+
end
|
79
|
+
|
80
|
+
# Public: Get a predefined, arbitrary any.
|
81
|
+
#
|
82
|
+
# sym - the any that has been defined already. By default, the following are defined:
|
83
|
+
# :string - does any_string
|
84
|
+
# String - does any_string
|
85
|
+
# :number - does any_number
|
86
|
+
# Numeric - does any_number
|
87
|
+
# Float - does any_number
|
88
|
+
# :int - does any_int
|
89
|
+
# Fixnum - does any_int
|
90
|
+
# Integer - does any_int
|
91
|
+
# options - whatever options are relevant to the user-defined any
|
92
|
+
#
|
93
|
+
# Example
|
94
|
+
#
|
95
|
+
# new_any(:foo) do |options|
|
96
|
+
# if options[:bar]
|
97
|
+
# 'bar'
|
98
|
+
# else
|
99
|
+
# 'quux'
|
100
|
+
# end
|
101
|
+
# end
|
102
|
+
#
|
103
|
+
# some_foo = any :foo
|
104
|
+
# some_other_foo = any :foo, :bar => true
|
105
|
+
def any(sym,options = {})
|
106
|
+
anies[sym].call(options)
|
107
|
+
end
|
108
|
+
|
109
|
+
# Public: Create a new any that can be retrieved via #any
|
110
|
+
#
|
111
|
+
# any - the identifer of your new any. Can be anything though a Symbol or classname would be appropriate
|
112
|
+
# block - the block that will be called whenever you #any your any.
|
113
|
+
def new_any(any,&block)
|
114
|
+
anies[any] = block
|
115
|
+
end
|
116
|
+
|
117
|
+
private
|
118
|
+
|
119
|
+
def anies
|
120
|
+
@anies ||= default_anies
|
121
|
+
end
|
122
|
+
|
123
|
+
ANY_STRING = Proc.new do |options| # :nodoc:
|
124
|
+
max_size = options[:max] || rand(2048)
|
125
|
+
min_size = options[:min] || rand(1024)
|
126
|
+
min_size = max_size if min_size > max_size
|
127
|
+
|
128
|
+
size = rand(max_size)
|
129
|
+
|
130
|
+
size = min_size if size < min_size
|
131
|
+
|
132
|
+
string = Faker::Lorem.words(1).join('')
|
133
|
+
while string.length < size
|
134
|
+
string += Faker::Lorem.words(1).join('')
|
135
|
+
end
|
136
|
+
|
137
|
+
string[0..(max_size-1)]
|
138
|
+
end
|
139
|
+
|
140
|
+
ANY_NUMBER = Proc.new do |options| # :nodoc:
|
141
|
+
number = (rand(2 * MAX_RAND) - MAX_RAND).to_f/100.0
|
142
|
+
if options.include? :positive
|
143
|
+
number + MAX_RAND
|
144
|
+
elsif options.include? :negative
|
145
|
+
number - MAX_RAND
|
146
|
+
else
|
147
|
+
number
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
ANY_INT = Proc.new do |options| # :nodoc:
|
152
|
+
(ANY_NUMBER.call(options)).to_i
|
153
|
+
end
|
154
|
+
|
155
|
+
def default_anies
|
156
|
+
{ :string => ANY_STRING,
|
157
|
+
String => ANY_STRING,
|
158
|
+
:number => ANY_NUMBER,
|
159
|
+
Numeric => ANY_NUMBER,
|
160
|
+
Float => ANY_NUMBER,
|
161
|
+
:int => ANY_INT,
|
162
|
+
Fixnum => ANY_INT,
|
163
|
+
Integer => ANY_INT,
|
164
|
+
}
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
@@ -0,0 +1,186 @@
|
|
1
|
+
module Clean # :nodoc:
|
2
|
+
module Test # :nodoc:
|
3
|
+
# A means of documenting the parts of your test code according
|
4
|
+
# to the class "Given/When/Then" system.
|
5
|
+
# This does no enforcement of any kind and is merely documentation to make
|
6
|
+
# your tests readable.
|
7
|
+
#
|
8
|
+
# Example:
|
9
|
+
#
|
10
|
+
# Given {
|
11
|
+
# @circle = Circle.new(10)
|
12
|
+
# }
|
13
|
+
# When {
|
14
|
+
# @area = @circle.area
|
15
|
+
# }
|
16
|
+
# Then {
|
17
|
+
# assert_equal 314,@area
|
18
|
+
# }
|
19
|
+
#
|
20
|
+
# There are also two additional methods provided ,#the_test_runs and
|
21
|
+
# #mocks_shouldve_been_called to assist with creating readable tests that use mocks. See those
|
22
|
+
# methods for an example
|
23
|
+
module GivenWhenThen
|
24
|
+
# Public: Set up the conditions for the test
|
25
|
+
#
|
26
|
+
# existing_block - a callable object (e.g. a Proc) that will be called immediately
|
27
|
+
# by this Given. If nil, &block is expected to be passed
|
28
|
+
# block - a block given to this call that will be executed immediately
|
29
|
+
# by this Given. If existing_block is non-nil, this is ignored
|
30
|
+
#
|
31
|
+
# Examples
|
32
|
+
#
|
33
|
+
# Given {
|
34
|
+
# @foo = "bar"
|
35
|
+
# }
|
36
|
+
#
|
37
|
+
# Returns the block that was executed
|
38
|
+
def Given(existing_block=nil,&block)
|
39
|
+
call_block_param_or_block_given(existing_block,&block)
|
40
|
+
end
|
41
|
+
# Public: Execute the code under test
|
42
|
+
#
|
43
|
+
# existing_block - a callable object (e.g. a Proc) that will be called immediately
|
44
|
+
# by this When. If nil, &block is expected to be passed
|
45
|
+
# block - a block given to this call that will be executed immediately
|
46
|
+
# by this When. If existing_block is non-nil, this is ignored
|
47
|
+
#
|
48
|
+
# Examples
|
49
|
+
#
|
50
|
+
# When {
|
51
|
+
# @foo.go
|
52
|
+
# }
|
53
|
+
#
|
54
|
+
# Returns the block that was executed
|
55
|
+
def When(existing_block=nil,&block)
|
56
|
+
Given(existing_block,&block)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Public: Verify the results of the test
|
60
|
+
#
|
61
|
+
# existing_block - a callable object (e.g. a Proc) that will be called immediately
|
62
|
+
# by this Then. If nil, &block is expected to be passed
|
63
|
+
# block - a block given to this call that will be executed immediately
|
64
|
+
# by this Then. If existing_block is non-nil, this is ignored
|
65
|
+
#
|
66
|
+
# Examples
|
67
|
+
#
|
68
|
+
# Then {
|
69
|
+
# assert_equal "bar",@foo
|
70
|
+
# }
|
71
|
+
#
|
72
|
+
# Returns the block that was executed
|
73
|
+
def Then(existing_block=nil,&block)
|
74
|
+
Given(existing_block,&block)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Public: Continue the previous Given/When/Then in a new block. The reason
|
78
|
+
# you might do this is if you wanted to use the existing block form of a
|
79
|
+
# Given/When/Then, but also need to do something custom. This allows you to
|
80
|
+
# write your test more fluently.
|
81
|
+
#
|
82
|
+
# existing_block - a callable object (e.g. a Proc) that will be called immediately
|
83
|
+
# by this Then. If nil, &block is expected to be passed
|
84
|
+
# block - a block given to this call that will be executed immediately
|
85
|
+
# by this Then. If existing_block is non-nil, this is ignored
|
86
|
+
#
|
87
|
+
# Examples
|
88
|
+
#
|
89
|
+
# def circle(radius)
|
90
|
+
# lambda { @circle = Circle.new(radius) }
|
91
|
+
# end
|
92
|
+
#
|
93
|
+
# Given circle(10)
|
94
|
+
# And {
|
95
|
+
# @another_circle = Circle.new(30)
|
96
|
+
# }
|
97
|
+
#
|
98
|
+
# Returns the block that was executed
|
99
|
+
def And(existing_block=nil,&block)
|
100
|
+
Given(existing_block,&block)
|
101
|
+
end
|
102
|
+
|
103
|
+
# Public: Continue the previous Given/When/Then in a new block. The reason
|
104
|
+
# you might do this is if you wanted to use the existing block form of a
|
105
|
+
# Given/When/Then, but also need to do something custom, and that custom thing
|
106
|
+
# contradicts or overrides the flow, so an "And" wouldn't read properly. This allows you to
|
107
|
+
# write your test more fluently.
|
108
|
+
#
|
109
|
+
# existing_block - a callable object (e.g. a Proc) that will be called immediately
|
110
|
+
# by this Then. If nil, &block is expected to be passed
|
111
|
+
# block - a block given to this call that will be executed immediately
|
112
|
+
# by this Then. If existing_block is non-nil, this is ignored
|
113
|
+
#
|
114
|
+
# Examples
|
115
|
+
#
|
116
|
+
# def options
|
117
|
+
# lambda {
|
118
|
+
# @options = {
|
119
|
+
# :foo => 'bar',
|
120
|
+
# :quux => 'baz',
|
121
|
+
# }
|
122
|
+
# }
|
123
|
+
# end
|
124
|
+
#
|
125
|
+
# Given options
|
126
|
+
# But {
|
127
|
+
# @options[:foo] = 'baz'
|
128
|
+
# }
|
129
|
+
#
|
130
|
+
# Returns the block that was executed
|
131
|
+
def But(existing_block=nil,&block)
|
132
|
+
Given(existing_block,&block)
|
133
|
+
end
|
134
|
+
|
135
|
+
# Public: Used to make clear the structure of tests using mocks.
|
136
|
+
# This returns a no-op, and is intended to be used with a "When"
|
137
|
+
# to delineate the creation of a mock in a Given, and the
|
138
|
+
# expectations of a mock in a "Then"
|
139
|
+
#
|
140
|
+
# Example:
|
141
|
+
#
|
142
|
+
# Given {
|
143
|
+
# @google = mock()
|
144
|
+
# }
|
145
|
+
# When the_test_runs
|
146
|
+
# Then {
|
147
|
+
# @google.expects(:search).with('foo').returns('bar')
|
148
|
+
# }
|
149
|
+
# Given {
|
150
|
+
# @my_search = Search.new(@google)
|
151
|
+
# }
|
152
|
+
# When {
|
153
|
+
# @result = @my_search.find('foo')
|
154
|
+
# }
|
155
|
+
# Then {
|
156
|
+
# assert_equal 'Found bar',@result
|
157
|
+
# }
|
158
|
+
# And mocks_shouldve_been_called
|
159
|
+
def the_test_runs
|
160
|
+
lambda {}
|
161
|
+
end
|
162
|
+
|
163
|
+
# Public: Similar to #test_runs, this is used to make clear what
|
164
|
+
# you are testing and what the assertions are. Since many Ruby mock
|
165
|
+
# frameworks do not require an explicit "verify" step, you often have tests
|
166
|
+
# that have no explicit asserts, the assertions being simply that the mocks were called
|
167
|
+
# as expected. This step, which is a no-op, allows you to document that you are
|
168
|
+
# expecting mocks to be called. See the example in #mocks_are_called for usage.
|
169
|
+
def mocks_shouldve_been_called
|
170
|
+
lambda {}
|
171
|
+
end
|
172
|
+
|
173
|
+
private
|
174
|
+
|
175
|
+
def call_block_param_or_block_given(existing_block,&block)
|
176
|
+
if existing_block.nil?
|
177
|
+
block.call
|
178
|
+
block
|
179
|
+
else
|
180
|
+
existing_block.call
|
181
|
+
existing_block
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'clean_test/given_when_then'
|
3
|
+
require 'clean_test/any'
|
4
|
+
require 'clean_test/test_that'
|
5
|
+
|
6
|
+
module Clean # :nodoc:
|
7
|
+
module Test # :nodoc:
|
8
|
+
# Public: A Base class brings in all modules that are part
|
9
|
+
# of Clean::Test.
|
10
|
+
#
|
11
|
+
# Example
|
12
|
+
#
|
13
|
+
# class TestCircle < Clean::Test::TestCase
|
14
|
+
# test_that {
|
15
|
+
# Given { @circle = Circle.new(10) }
|
16
|
+
# When { @area = @circle.area }
|
17
|
+
# Then { assert_equal 314,@area }
|
18
|
+
# }
|
19
|
+
# end
|
20
|
+
class TestCase < ::Test::Unit::TestCase
|
21
|
+
include GivenWhenThen
|
22
|
+
include TestThat
|
23
|
+
include Any
|
24
|
+
if RUBY_VERSION =~ /^1\.8\./
|
25
|
+
# Avoid the stupid behavior of
|
26
|
+
# complaining that no tests were specified for 1.8.-like rubies
|
27
|
+
def default_test
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Clean # :nodoc:
|
2
|
+
module Test # :nodoc:
|
3
|
+
# Public: Module that, when included, makes a class method, +#test_that+ available
|
4
|
+
# to create test methods in a more fluent way. See ClassMethods.
|
5
|
+
module TestThat
|
6
|
+
def self.included(base)
|
7
|
+
base.extend(ClassMethods)
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
|
12
|
+
# Public: Create a new test method with the given optional description and
|
13
|
+
# body.
|
14
|
+
#
|
15
|
+
# description - a string describing what is being tested; write this as a follow on
|
16
|
+
# from the phrase "test that". If nil, a name will be constructed
|
17
|
+
# based on the block
|
18
|
+
# block - the body of the test.
|
19
|
+
#
|
20
|
+
# Example
|
21
|
+
#
|
22
|
+
# # Create a rails-style test method
|
23
|
+
# test_that "area is computed based on positive radius" do
|
24
|
+
# Given {
|
25
|
+
# @circle = Circle.new(10)
|
26
|
+
# }
|
27
|
+
# When {
|
28
|
+
# @area = @circle.area
|
29
|
+
# }
|
30
|
+
# Then {
|
31
|
+
# assert_equal 314,@area
|
32
|
+
# }
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# # Create an "anonymous" test, where the test body
|
36
|
+
# # is clear enough as to what's being tested
|
37
|
+
# test_that {
|
38
|
+
# Given a_circle(:radius => 10)
|
39
|
+
# When get_area
|
40
|
+
# Then area_should_be(314)
|
41
|
+
# }
|
42
|
+
def test_that(description=nil,&block)
|
43
|
+
raise "You must provide a block" if block.nil?
|
44
|
+
description = make_up_name(block) if description.nil?
|
45
|
+
test_name = "test_#{description.gsub(/\s+/,'_')}".to_sym
|
46
|
+
defined = instance_method(test_name) rescue false
|
47
|
+
raise "#{test_name} is already defined in #{self}" if defined
|
48
|
+
define_method(test_name, &block)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def make_up_name(some_proc)
|
54
|
+
if some_proc.respond_to? :source_location
|
55
|
+
name,location = some_proc.source_location
|
56
|
+
"anonymous test at #{name}, line #{location}"
|
57
|
+
else
|
58
|
+
"anonymous test for proc #{some_proc.object_id}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/test/bootstrap.rb
ADDED
data/test/test_any.rb
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'clean_test/test_case'
|
3
|
+
|
4
|
+
class TestAny < Clean::Test::TestCase
|
5
|
+
test_that {
|
6
|
+
Given { random_seeded_for_negative_float }
|
7
|
+
When { @number = any_number }
|
8
|
+
Then {
|
9
|
+
assert @number < 0,"any_number should be negative, but we got #{@number}"
|
10
|
+
assert @number.to_i != @number,"Expected a float"
|
11
|
+
}
|
12
|
+
}
|
13
|
+
test_that {
|
14
|
+
Given { random_seeded_for_positive }
|
15
|
+
When { @number = any_number }
|
16
|
+
Then { assert @number > 0,"any_number should be positive, but we got #{@number}" }
|
17
|
+
}
|
18
|
+
|
19
|
+
test_that {
|
20
|
+
Given { random_seeded_for_negative_float }
|
21
|
+
When { @number = any_number :positive }
|
22
|
+
Then { assert @number > 0,"We specified :positive, but got a negative" }
|
23
|
+
}
|
24
|
+
|
25
|
+
test_that {
|
26
|
+
Given { random_seeded_for_positive }
|
27
|
+
When { @number = any_number :negative }
|
28
|
+
Then { assert @number < 0,"We specified :negative, but got a positive" }
|
29
|
+
}
|
30
|
+
|
31
|
+
test_that {
|
32
|
+
Given { random_seeded_for_negative_float }
|
33
|
+
When { @number = any_int }
|
34
|
+
Then {
|
35
|
+
assert @number < 0,"Expected int to be negative"
|
36
|
+
assert_equal @number.to_i,@number,"Expected an int, not a #{@number.class}"
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
test_that {
|
41
|
+
Given { random_seeded_for_negative_float }
|
42
|
+
When { @int = any_int :positive }
|
43
|
+
Then { assert @int > 0,"We specified :positive, but got a negative" }
|
44
|
+
}
|
45
|
+
|
46
|
+
test_that {
|
47
|
+
Given { random_seeded_for_positive }
|
48
|
+
When { @int = any_int :negative }
|
49
|
+
Then { assert @int < 0,"We specified :negative, but got a positive" }
|
50
|
+
}
|
51
|
+
|
52
|
+
test_that {
|
53
|
+
Given { random_seeded_for_long_string }
|
54
|
+
When { @string = any_string }
|
55
|
+
Then {
|
56
|
+
assert @string.length < 1441,"expected less than our rand value, but got #{@string.length}"
|
57
|
+
assert_equal String,@string.class
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
test_that {
|
62
|
+
Given { random_seeded_for_long_string }
|
63
|
+
When { @string = any_string :max => 255 }
|
64
|
+
Then {
|
65
|
+
assert @string.length <= 255,"Expected a string of less than 256 characters, got #{@string.length}"
|
66
|
+
assert_equal String,@string.class
|
67
|
+
}
|
68
|
+
}
|
69
|
+
|
70
|
+
test_that {
|
71
|
+
Given { random_seeded_for_long_string }
|
72
|
+
When { @string = any_string :min => 1000 }
|
73
|
+
Then {
|
74
|
+
assert @string.length > 1000,"Expected a string of at least 1500 characters, got one of #{@string.length} characters"
|
75
|
+
assert_equal String,@string.class
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
test_that "we can register custom anys" do
|
80
|
+
Given {
|
81
|
+
new_any :foo do
|
82
|
+
"bar"
|
83
|
+
end
|
84
|
+
}
|
85
|
+
When {
|
86
|
+
@result = any :foo
|
87
|
+
}
|
88
|
+
Then {
|
89
|
+
assert_equal 'bar',@result
|
90
|
+
}
|
91
|
+
end
|
92
|
+
|
93
|
+
test_that "custom anys can take options" do
|
94
|
+
Given {
|
95
|
+
new_any :foo do |options|
|
96
|
+
if options[:baaz]
|
97
|
+
'quux'
|
98
|
+
else
|
99
|
+
'bar'
|
100
|
+
end
|
101
|
+
end
|
102
|
+
}
|
103
|
+
When {
|
104
|
+
@result = any :foo, :baaz => true
|
105
|
+
}
|
106
|
+
Then {
|
107
|
+
assert_equal 'quux',@result
|
108
|
+
}
|
109
|
+
end
|
110
|
+
|
111
|
+
[String,[Integer,Fixnum],Fixnum,Float,[Numeric,Float]].each do |klass|
|
112
|
+
test_that "can get an any #{klass}" do
|
113
|
+
Given {
|
114
|
+
@class = @expected_class = klass
|
115
|
+
if @class.kind_of? Array
|
116
|
+
@expected_class = @class[1]
|
117
|
+
@class = @class[0]
|
118
|
+
end
|
119
|
+
}
|
120
|
+
When {
|
121
|
+
@value = any @class
|
122
|
+
}
|
123
|
+
Then {
|
124
|
+
assert_not_nil @value
|
125
|
+
assert_equal @expected_class,@value.class
|
126
|
+
}
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
private
|
131
|
+
|
132
|
+
def random_seeded_for_long_string
|
133
|
+
Random.srand(34)
|
134
|
+
end
|
135
|
+
|
136
|
+
def random_seeded_for_negative_float
|
137
|
+
Random.srand(45)
|
138
|
+
end
|
139
|
+
|
140
|
+
def random_seeded_for_positive
|
141
|
+
Random.srand(2)
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
data/test/test_circle.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'clean_test/test_case'
|
2
|
+
|
3
|
+
class Circle
|
4
|
+
def initialize(radius)
|
5
|
+
@radius = radius
|
6
|
+
end
|
7
|
+
|
8
|
+
def area; (3.14 * @radius * @radius).to_i; end
|
9
|
+
end
|
10
|
+
|
11
|
+
class TestCircle < Clean::Test::TestCase
|
12
|
+
test_that {
|
13
|
+
Given { @circle = Circle.new(10) }
|
14
|
+
When { @area = @circle.area }
|
15
|
+
Then { assert_equal 314,@area }
|
16
|
+
}
|
17
|
+
end
|