mrproper 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +8 -1
- data/lib/mrproper.rb +1 -0
- data/lib/mrproper/base.rb +1 -2
- data/lib/mrproper/data_block.rb +76 -0
- data/lib/mrproper/dsl.rb +1 -40
- metadata +40 -20
data/README.md
CHANGED
@@ -77,6 +77,8 @@ In addition to plain class names, we can feed `data` with more or less complex e
|
|
77
77
|
# or [-44, "eB"]
|
78
78
|
data [[Float]] # generates arrays of arrays of floats
|
79
79
|
# such as [[0.12, 3.41], [-2.31]]
|
80
|
+
data (1..10) # generates integers between 1 and 10
|
81
|
+
data (0.0..10.0) # generates floats between 1 and 10
|
80
82
|
data({Symbol => String}) # generates hashes whose keys are symbols
|
81
83
|
# and whose values are strings such as
|
82
84
|
# {:tR=>"m", :aSKnsndwWK=>"QUrGwAAh"}
|
@@ -85,8 +87,13 @@ In addition to plain class names, we can feed `data` with more or less complex e
|
|
85
87
|
# parser thinks we're defining a block `;)`)
|
86
88
|
data({String => [Integer]}) # generates hashes whose keys are strings
|
87
89
|
# and whose values are arrays of integers
|
90
|
+
data({:first => String,
|
91
|
+
:second => Integer}) # generates a hash with two keys, :first and
|
92
|
+
# :second, each one with an String or Integer
|
93
|
+
# value (this is specially useful for testing
|
94
|
+
# methods with more than one parameter)
|
88
95
|
|
89
|
-
|
96
|
+
You can combine this cases ad infinitum, but in case this is not enough, you can just use a block and do whatever you want to generate the data:
|
90
97
|
|
91
98
|
data do
|
92
99
|
rand > 0.5 ? Wadus.new(rand(9)) : FooBar.new(rand(9))
|
data/lib/mrproper.rb
CHANGED
data/lib/mrproper/base.rb
CHANGED
@@ -8,8 +8,7 @@ module MrProper
|
|
8
8
|
dsl.properties.each do |message, test_block|
|
9
9
|
define_method "test_property: #{message.inspect}" do
|
10
10
|
dsl.data_blocks.each do |data_block|
|
11
|
-
|
12
|
-
data = data_block.call
|
11
|
+
data_block.data.each do |data|
|
13
12
|
begin
|
14
13
|
instance_exec(data, &test_block)
|
15
14
|
rescue Test::Unit::AssertionFailedError, MiniTest::Assertion => e
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module MrProper
|
2
|
+
|
3
|
+
class DataBlock
|
4
|
+
|
5
|
+
EXAMPLES_PER_PROPERTY = 200
|
6
|
+
|
7
|
+
def initialize(spec = nil, &block)
|
8
|
+
@spec = spec
|
9
|
+
@block = block
|
10
|
+
end
|
11
|
+
|
12
|
+
def data
|
13
|
+
EXAMPLES_PER_PROPERTY.times.map { call }.uniq
|
14
|
+
end
|
15
|
+
|
16
|
+
def call
|
17
|
+
to_proc.call
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_proc
|
21
|
+
return @block if @block
|
22
|
+
|
23
|
+
case @spec
|
24
|
+
when Array
|
25
|
+
if @spec.size == 1
|
26
|
+
Proc.new { rand(20).times.map { DataBlock.new(@spec.first).call } }
|
27
|
+
else
|
28
|
+
Proc.new { @spec.map { |s| DataBlock.new(s).call }}
|
29
|
+
end
|
30
|
+
when Hash
|
31
|
+
if @spec.size == 1
|
32
|
+
Proc.new do
|
33
|
+
{}.tap do |h|
|
34
|
+
rand(20).times.each do
|
35
|
+
h[DataBlock.new(@spec.keys.first).call] = DataBlock.new(@spec.values.first).call
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
else
|
40
|
+
Proc.new do
|
41
|
+
{}.tap do |h|
|
42
|
+
@spec.each do |k, v|
|
43
|
+
h[DataBlock.new(k).call] = DataBlock.new(v).call
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
when Range
|
49
|
+
case @spec.begin
|
50
|
+
when Integer
|
51
|
+
Proc.new { @spec.begin + rand(@spec.end - @spec.begin) }
|
52
|
+
when Float
|
53
|
+
Proc.new { @spec.begin + rand * (@spec.end - @spec.begin) }
|
54
|
+
else
|
55
|
+
Proc.new { @spec }
|
56
|
+
end
|
57
|
+
when Class
|
58
|
+
if @spec == Integer
|
59
|
+
DataBlock.new(-500..500).to_proc
|
60
|
+
elsif @spec == Float
|
61
|
+
DataBlock.new(-5.0..5.0).to_proc
|
62
|
+
elsif @spec == String
|
63
|
+
Proc.new { String.random(rand(10)) }
|
64
|
+
elsif @spec == Symbol
|
65
|
+
Proc.new { DataBlock.new(String).call.to_sym }
|
66
|
+
elsif @spec == NilClass
|
67
|
+
Proc.new { nil }
|
68
|
+
end
|
69
|
+
else
|
70
|
+
Proc.new { @spec }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
data/lib/mrproper/dsl.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
module MrProper
|
2
2
|
|
3
|
-
TESTS_PER_PROPERTY = 100
|
4
|
-
|
5
3
|
class DSL
|
6
4
|
|
7
5
|
attr_reader :properties, :data_blocks
|
@@ -12,50 +10,13 @@ module MrProper
|
|
12
10
|
end
|
13
11
|
|
14
12
|
def data(spec = nil, &block)
|
15
|
-
@data_blocks <<
|
13
|
+
@data_blocks << DataBlock.new(spec, &block)
|
16
14
|
end
|
17
15
|
|
18
16
|
def property(message, &block)
|
19
17
|
@properties << [message, block]
|
20
18
|
end
|
21
19
|
|
22
|
-
private
|
23
|
-
|
24
|
-
def data_block(spec = nil, &block)
|
25
|
-
return block if block_given?
|
26
|
-
|
27
|
-
case spec
|
28
|
-
when Array
|
29
|
-
if spec.size == 1
|
30
|
-
Proc.new { rand(20).times.map { data_block(spec.first).call } }
|
31
|
-
else
|
32
|
-
Proc.new { spec.map { |s| data_block(s).call }}
|
33
|
-
end
|
34
|
-
when Hash
|
35
|
-
Proc.new do
|
36
|
-
{}.tap do |h|
|
37
|
-
rand(20).times.each do
|
38
|
-
h[data_block(spec.keys.first).call] = data_block(spec.values.first).call
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
when Class
|
43
|
-
if spec == Integer
|
44
|
-
Proc.new { rand(1000) - 500 }
|
45
|
-
elsif spec == Float
|
46
|
-
Proc.new { rand * 10 - 10 }
|
47
|
-
elsif spec == String
|
48
|
-
Proc.new { String.random(rand(10)) }
|
49
|
-
elsif spec == Symbol
|
50
|
-
Proc.new { data_block(String).call.to_sym }
|
51
|
-
elsif spec == NilClass
|
52
|
-
Proc.new { nil }
|
53
|
-
end
|
54
|
-
else
|
55
|
-
Proc.new { spec }
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
20
|
end
|
60
21
|
|
61
22
|
end
|
metadata
CHANGED
@@ -1,54 +1,74 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: mrproper
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Sergio Gil
|
9
|
-
- Mari Carmen
|
14
|
+
- "Mari Carmen Guti\xC3\xA9rrez"
|
10
15
|
autorequire:
|
11
16
|
bindir: bin
|
12
17
|
cert_chain: []
|
13
|
-
|
18
|
+
|
19
|
+
date: 2011-11-25 00:00:00 Z
|
14
20
|
dependencies: []
|
21
|
+
|
15
22
|
description:
|
16
23
|
email: sgilperez@gmail.com
|
17
24
|
executables: []
|
25
|
+
|
18
26
|
extensions: []
|
19
|
-
|
27
|
+
|
28
|
+
extra_rdoc_files:
|
20
29
|
- README.md
|
21
|
-
files:
|
30
|
+
files:
|
22
31
|
- README.md
|
23
32
|
- lib/mrproper/base.rb
|
24
33
|
- lib/mrproper/core_extensions/string_extensions.rb
|
34
|
+
- lib/mrproper/data_block.rb
|
25
35
|
- lib/mrproper/dsl.rb
|
26
36
|
- lib/mrproper/errors.rb
|
27
37
|
- lib/mrproper.rb
|
28
38
|
homepage: http://github.com/porras/mrproper
|
29
39
|
licenses: []
|
40
|
+
|
30
41
|
post_install_message:
|
31
|
-
rdoc_options:
|
42
|
+
rdoc_options:
|
32
43
|
- --main
|
33
44
|
- README.md
|
34
|
-
require_paths:
|
45
|
+
require_paths:
|
35
46
|
- lib
|
36
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
37
48
|
none: false
|
38
|
-
requirements:
|
39
|
-
- -
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
|
42
|
-
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
hash: 3
|
53
|
+
segments:
|
54
|
+
- 0
|
55
|
+
version: "0"
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
57
|
none: false
|
44
|
-
requirements:
|
45
|
-
- -
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 3
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
version: "0"
|
48
65
|
requirements: []
|
66
|
+
|
49
67
|
rubyforge_project:
|
50
68
|
rubygems_version: 1.8.10
|
51
69
|
signing_key:
|
52
70
|
specification_version: 3
|
53
71
|
summary: Property Based Testing library
|
54
72
|
test_files: []
|
73
|
+
|
74
|
+
has_rdoc:
|