propr 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/NOTES.md +62 -0
- data/README.md +553 -0
- data/Rakefile +83 -0
- data/TODO.md +64 -0
- data/lib/propr.rb +123 -0
- data/lib/propr/dsl.rb +6 -0
- data/lib/propr/dsl/check.rb +49 -0
- data/lib/propr/dsl/property.rb +62 -0
- data/lib/propr/property.rb +23 -0
- data/lib/propr/random.rb +143 -0
- data/lib/propr/random/array.rb +19 -0
- data/lib/propr/random/bigdecimal.rb +43 -0
- data/lib/propr/random/boolean.rb +7 -0
- data/lib/propr/random/complex.rb +0 -0
- data/lib/propr/random/date.rb +17 -0
- data/lib/propr/random/float.rb +60 -0
- data/lib/propr/random/hash.rb +55 -0
- data/lib/propr/random/integer.rb +38 -0
- data/lib/propr/random/maybe.rb +0 -0
- data/lib/propr/random/nil.rb +8 -0
- data/lib/propr/random/range.rb +32 -0
- data/lib/propr/random/rational.rb +0 -0
- data/lib/propr/random/set.rb +22 -0
- data/lib/propr/random/string.rb +41 -0
- data/lib/propr/random/symbol.rb +13 -0
- data/lib/propr/random/time.rb +14 -0
- data/lib/propr/rspec.rb +97 -0
- data/lib/propr/runner.rb +53 -0
- data/lib/propr/shrink/array.rb +16 -0
- data/lib/propr/shrink/bigdecimal.rb +17 -0
- data/lib/propr/shrink/boolean.rb +11 -0
- data/lib/propr/shrink/complex.rb +0 -0
- data/lib/propr/shrink/date.rb +12 -0
- data/lib/propr/shrink/float.rb +17 -0
- data/lib/propr/shrink/hash.rb +18 -0
- data/lib/propr/shrink/integer.rb +10 -0
- data/lib/propr/shrink/maybe.rb +11 -0
- data/lib/propr/shrink/nil.rb +5 -0
- data/lib/propr/shrink/object.rb +5 -0
- data/lib/propr/shrink/range.rb +4 -0
- data/lib/propr/shrink/rational.rb +4 -0
- data/lib/propr/shrink/set.rb +18 -0
- data/lib/propr/shrink/string.rb +19 -0
- data/lib/propr/shrink/symbol.rb +5 -0
- data/lib/propr/shrink/time.rb +9 -0
- data/spec/examples/choose/array.example +12 -0
- data/spec/examples/choose/hash.example +12 -0
- data/spec/examples/choose/range.example +13 -0
- data/spec/examples/choose/set.example +12 -0
- data/spec/examples/guard.example +38 -0
- data/spec/examples/random/array.example +38 -0
- data/spec/examples/random/hash.example +18 -0
- data/spec/examples/random/integer.example +23 -0
- data/spec/examples/random/range.example +43 -0
- data/spec/examples/scale.example +17 -0
- data/spec/examples/shrink/array.example +20 -0
- data/spec/examples/shrink/bigdecimal.example +20 -0
- data/spec/examples/shrink/float.example +20 -0
- data/spec/examples/shrink/hash.example +20 -0
- data/spec/examples/shrink/integer.example +21 -0
- data/spec/examples/shrink/maybe.example +24 -0
- data/spec/examples/shrink/set.example +21 -0
- data/spec/examples/shrink/string.example +17 -0
- data/spec/issues/003.example +9 -0
- data/spec/spec_helper.rb +24 -0
- metadata +143 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Propr::Random, "#scale" do
|
4
|
+
|
5
|
+
property("values"){|x| true }
|
6
|
+
# .check { Integer.random(center: 0, min: 0, max: 1e1) }
|
7
|
+
# .check { Integer.random(center: 0, min: 0, max: 1e1) }
|
8
|
+
# .check { Integer.random(center: 0, min: 0, max: 1e2) }
|
9
|
+
# .check { Integer.random(center: 0, min: 0, max: 1e3) }
|
10
|
+
# .check { Integer.random(center: 0, min: 0, max: 1e5) }
|
11
|
+
# .check { Integer.random(center: 0, min: 0, max: 1e8) }
|
12
|
+
# .check { Integer.random(center: 0, min: 0, max: 1e13) }
|
13
|
+
# .check { Integer.random(center: 0, min: 0, max: 1e21) }
|
14
|
+
# .check { Integer.random(center: 0, min: 0, max: 1e34) }
|
15
|
+
# .check { Integer.random(center: 0, min: 0, max: 1e55) }
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Array, "#shrink" do
|
4
|
+
|
5
|
+
property("self"){|x| not x.shrink.member?(x) }
|
6
|
+
.check{ Array.random { String.random }}
|
7
|
+
.check{ Array.random { Integer.random }}
|
8
|
+
|
9
|
+
property("smaller"){|x| x.shrink.all?{|y| y.size <= x.size }}
|
10
|
+
.check{ Array.random { String.random }}
|
11
|
+
.check{ Array.random { Integer.random }}
|
12
|
+
|
13
|
+
property("smallest"){|x| x.shrink.empty? }
|
14
|
+
.check{ unit [] }
|
15
|
+
|
16
|
+
property("contains smallest"){|x| guard !x.empty?; x.shrink.member?([]) }
|
17
|
+
.check{ Array.random(max: 50) { unit(nil) }}
|
18
|
+
.check{ Array.random(max: 50) { unit(nil) }}
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe BigDecimal, "#shrink" do
|
4
|
+
|
5
|
+
property("self"){|n| not n.shrink.member?(n) }
|
6
|
+
.check{ BigDecimal.random }
|
7
|
+
|
8
|
+
property("smaller"){|n| n.shrink.all?{|m| m > n }}
|
9
|
+
.check{ BigDecimal.random(max: -1) }
|
10
|
+
|
11
|
+
property("smaller"){|n| n.shrink.all?{|m| m < n }}
|
12
|
+
.check{ BigDecimal.random(min: 1) }
|
13
|
+
|
14
|
+
property("smallest"){|n| n.shrink.empty? }
|
15
|
+
.check(BigDecimal(0))
|
16
|
+
|
17
|
+
property("contains smallest"){|n| guard n != 0, n != -1; n.shrink.member?(0) }
|
18
|
+
.check{ BigDecimal.random }
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Float, "#shrink" do
|
4
|
+
|
5
|
+
property("self"){|n| not n.shrink.member?(n) }
|
6
|
+
.check{ Float.random }
|
7
|
+
|
8
|
+
property("smaller"){|n| guard n < 0; n.shrink.all?{|m| m > n }}
|
9
|
+
.check{ Float.random(max: -1) }
|
10
|
+
|
11
|
+
property("smaller"){|n| guard n > 0; n.shrink.all?{|m| m < n }}
|
12
|
+
.check{ Float.random(min: 1) }
|
13
|
+
|
14
|
+
property("smallest"){|n| n.shrink.empty? }
|
15
|
+
.check(0.0)
|
16
|
+
|
17
|
+
property("contains smallest"){|n| guard n != 0, n != -1; n.shrink.member?(0) }
|
18
|
+
.check{ Float.random }
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Hash, "#shrink" do
|
4
|
+
|
5
|
+
property("self"){|x| not x.shrink.member?(x) }
|
6
|
+
.check{ Hash.random { sequence [Symbol.random, Integer.random] }}
|
7
|
+
.check{ Hash.random { sequence [Integer.random, String.random] }}
|
8
|
+
|
9
|
+
property("smaller"){|x| x.shrink.all?{|y| y.size <= x.size }}
|
10
|
+
.check{ Hash.random { String.random }}
|
11
|
+
.check{ Hash.random { Integer.random }}
|
12
|
+
|
13
|
+
property("smallest"){|x| x.shrink.empty? }
|
14
|
+
.check{ unit({}) }
|
15
|
+
|
16
|
+
property("contains smallest"){|x| guard !x.empty?; x.shrink.member?({}) }
|
17
|
+
.check{ Hash.random(max: 50) { sequence [String.random, unit(nil)] }}
|
18
|
+
.check{ Hash.random(max: 50) { sequence [Integer.random, unit(nil)] }}
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Integer, "#shrink" do
|
4
|
+
|
5
|
+
property("self"){|n| not n.shrink.member?(n) }
|
6
|
+
.check{ Integer.random }
|
7
|
+
|
8
|
+
property("smaller"){|n| guard n < 0; n.shrink.all?{|m| m > n }}
|
9
|
+
.check{ Integer.random(max: -1) }
|
10
|
+
|
11
|
+
property("smaller"){|n| guard n > 0; n.shrink.all?{|m| m < n }}
|
12
|
+
.check{ Integer.random(min: 1) }
|
13
|
+
|
14
|
+
property("smallest"){|n| n.shrink.empty? }
|
15
|
+
.check(0)
|
16
|
+
.check(-1)
|
17
|
+
|
18
|
+
property("contains smallest"){|n| guard n != 0, n != -1; n.shrink.member?(0) }
|
19
|
+
.check{ Integer.random }
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Fr::Maybe, "#shrink" do
|
4
|
+
|
5
|
+
property("emtpty") { Fr.none.shrink.empty? }
|
6
|
+
.check
|
7
|
+
|
8
|
+
property("has some") do |o|
|
9
|
+
os = true.maybe(o).shrink
|
10
|
+
so = true.maybe(o.shrink)
|
11
|
+
os - [Fr.none] == [so]
|
12
|
+
end
|
13
|
+
.check { Integer.random }
|
14
|
+
.check { String.random }
|
15
|
+
|
16
|
+
property("has none") do |o|
|
17
|
+
os = true.maybe(o).shrink
|
18
|
+
so = true.maybe(o.shrink)
|
19
|
+
os - [so] == [Fr.none]
|
20
|
+
end
|
21
|
+
.check { Integer.random }
|
22
|
+
.check { String.random }
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "set"
|
3
|
+
|
4
|
+
describe Set, "#shrink" do
|
5
|
+
|
6
|
+
property("self"){|x| not x.shrink.member?(x) }
|
7
|
+
.check{ Set.random { Integer.random }}
|
8
|
+
|
9
|
+
property("smaller"){|x| x.shrink.all?{|y| y.size <= x.size }}
|
10
|
+
.check{ Set.random { String.random }}
|
11
|
+
.check{ Set.random { Integer.random }}
|
12
|
+
|
13
|
+
property("smallest"){|x| x.shrink.empty? }
|
14
|
+
.check{ unit Set.new }
|
15
|
+
|
16
|
+
property("contains smallest"){|x| guard !x.empty?; x.shrink.member?(Set.new) }
|
17
|
+
.check{ Set.random(max: 50) { String.random }}
|
18
|
+
.check{ Set.random(max: 50) { Integer.random }}
|
19
|
+
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe String, "#shrink" do
|
4
|
+
|
5
|
+
property("self"){|s| not s.shrink.member?(s) }
|
6
|
+
.check{ String.random }
|
7
|
+
|
8
|
+
property("smaller"){|x| x.shrink.all?{|y| y.size <= x.size }}
|
9
|
+
.check{ String.random }
|
10
|
+
|
11
|
+
property("smallest"){|x| x.shrink.empty? }
|
12
|
+
.check{ unit "" }
|
13
|
+
|
14
|
+
property("contains smallest"){|x| guard !x.empty?; x.shrink.member?("") }
|
15
|
+
.check{ String.random(max: 50) }
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Propr, "issue #3" do
|
4
|
+
property("exceptional"){|x,y| if x < 10 then true else raise "No!" end }
|
5
|
+
.check{ sequence [Integer.random, String.random] }
|
6
|
+
|
7
|
+
property("exceptional"){|x| if x < 10 then true else raise "No!" end }
|
8
|
+
.check{ Integer.random }
|
9
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require "rspec"
|
2
|
+
require "propr"
|
3
|
+
|
4
|
+
# Require supporting files with custom matchers and macros
|
5
|
+
Pathname.new(File.dirname(__FILE__)).tap do |specdir|
|
6
|
+
Dir["#{specdir}/support/**/*.rb"].each do |file|
|
7
|
+
require Pathname.new(file).relative_path_from(specdir)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
include Propr::RSpec
|
13
|
+
|
14
|
+
#srand 146211424375622429406889408197139382303
|
15
|
+
srand.tap{|seed| puts "Run with srand #{seed}"; srand seed }
|
16
|
+
|
17
|
+
# rspec -I lib -t random spec
|
18
|
+
# config.filter_run :random => true
|
19
|
+
|
20
|
+
# rspec -I lib -t ~random spec
|
21
|
+
# config.filter_run_excluding :random => true
|
22
|
+
# config.filter_run(:focus => true)
|
23
|
+
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: propr
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Kyle Putnam
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-06-18 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: fr
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.9.1
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.9.1
|
30
|
+
description:
|
31
|
+
email: putnam.kyle@gmail.com
|
32
|
+
executables: []
|
33
|
+
extensions: []
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- NOTES.md
|
37
|
+
- README.md
|
38
|
+
- TODO.md
|
39
|
+
- Rakefile
|
40
|
+
- lib/propr/dsl/check.rb
|
41
|
+
- lib/propr/dsl/property.rb
|
42
|
+
- lib/propr/dsl.rb
|
43
|
+
- lib/propr/property.rb
|
44
|
+
- lib/propr/random/array.rb
|
45
|
+
- lib/propr/random/bigdecimal.rb
|
46
|
+
- lib/propr/random/boolean.rb
|
47
|
+
- lib/propr/random/complex.rb
|
48
|
+
- lib/propr/random/date.rb
|
49
|
+
- lib/propr/random/float.rb
|
50
|
+
- lib/propr/random/hash.rb
|
51
|
+
- lib/propr/random/integer.rb
|
52
|
+
- lib/propr/random/maybe.rb
|
53
|
+
- lib/propr/random/nil.rb
|
54
|
+
- lib/propr/random/range.rb
|
55
|
+
- lib/propr/random/rational.rb
|
56
|
+
- lib/propr/random/set.rb
|
57
|
+
- lib/propr/random/string.rb
|
58
|
+
- lib/propr/random/symbol.rb
|
59
|
+
- lib/propr/random/time.rb
|
60
|
+
- lib/propr/random.rb
|
61
|
+
- lib/propr/rspec.rb
|
62
|
+
- lib/propr/runner.rb
|
63
|
+
- lib/propr/shrink/array.rb
|
64
|
+
- lib/propr/shrink/bigdecimal.rb
|
65
|
+
- lib/propr/shrink/boolean.rb
|
66
|
+
- lib/propr/shrink/complex.rb
|
67
|
+
- lib/propr/shrink/date.rb
|
68
|
+
- lib/propr/shrink/float.rb
|
69
|
+
- lib/propr/shrink/hash.rb
|
70
|
+
- lib/propr/shrink/integer.rb
|
71
|
+
- lib/propr/shrink/maybe.rb
|
72
|
+
- lib/propr/shrink/nil.rb
|
73
|
+
- lib/propr/shrink/object.rb
|
74
|
+
- lib/propr/shrink/range.rb
|
75
|
+
- lib/propr/shrink/rational.rb
|
76
|
+
- lib/propr/shrink/set.rb
|
77
|
+
- lib/propr/shrink/string.rb
|
78
|
+
- lib/propr/shrink/symbol.rb
|
79
|
+
- lib/propr/shrink/time.rb
|
80
|
+
- lib/propr.rb
|
81
|
+
- spec/examples/choose/array.example
|
82
|
+
- spec/examples/choose/hash.example
|
83
|
+
- spec/examples/choose/range.example
|
84
|
+
- spec/examples/choose/set.example
|
85
|
+
- spec/examples/guard.example
|
86
|
+
- spec/examples/random/array.example
|
87
|
+
- spec/examples/random/hash.example
|
88
|
+
- spec/examples/random/integer.example
|
89
|
+
- spec/examples/random/range.example
|
90
|
+
- spec/examples/scale.example
|
91
|
+
- spec/examples/shrink/array.example
|
92
|
+
- spec/examples/shrink/bigdecimal.example
|
93
|
+
- spec/examples/shrink/float.example
|
94
|
+
- spec/examples/shrink/hash.example
|
95
|
+
- spec/examples/shrink/integer.example
|
96
|
+
- spec/examples/shrink/maybe.example
|
97
|
+
- spec/examples/shrink/set.example
|
98
|
+
- spec/examples/shrink/string.example
|
99
|
+
- spec/issues/003.example
|
100
|
+
- spec/spec_helper.rb
|
101
|
+
homepage: https://github.com/kputnam/propr
|
102
|
+
licenses: []
|
103
|
+
post_install_message:
|
104
|
+
rdoc_options: []
|
105
|
+
require_paths:
|
106
|
+
- lib
|
107
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
109
|
+
requirements:
|
110
|
+
- - ! '>='
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ! '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
requirements: []
|
120
|
+
rubyforge_project:
|
121
|
+
rubygems_version: 1.8.24
|
122
|
+
signing_key:
|
123
|
+
specification_version: 3
|
124
|
+
summary: Property-based testing for Ruby (ala QuickCheck)
|
125
|
+
test_files:
|
126
|
+
- spec/examples/choose/array.example
|
127
|
+
- spec/examples/choose/hash.example
|
128
|
+
- spec/examples/choose/range.example
|
129
|
+
- spec/examples/choose/set.example
|
130
|
+
- spec/examples/guard.example
|
131
|
+
- spec/examples/random/array.example
|
132
|
+
- spec/examples/random/hash.example
|
133
|
+
- spec/examples/random/integer.example
|
134
|
+
- spec/examples/random/range.example
|
135
|
+
- spec/examples/scale.example
|
136
|
+
- spec/examples/shrink/array.example
|
137
|
+
- spec/examples/shrink/bigdecimal.example
|
138
|
+
- spec/examples/shrink/float.example
|
139
|
+
- spec/examples/shrink/hash.example
|
140
|
+
- spec/examples/shrink/integer.example
|
141
|
+
- spec/examples/shrink/maybe.example
|
142
|
+
- spec/examples/shrink/set.example
|
143
|
+
- spec/examples/shrink/string.example
|