clean_test 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|