propr 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. data/NOTES.md +62 -0
  2. data/README.md +553 -0
  3. data/Rakefile +83 -0
  4. data/TODO.md +64 -0
  5. data/lib/propr.rb +123 -0
  6. data/lib/propr/dsl.rb +6 -0
  7. data/lib/propr/dsl/check.rb +49 -0
  8. data/lib/propr/dsl/property.rb +62 -0
  9. data/lib/propr/property.rb +23 -0
  10. data/lib/propr/random.rb +143 -0
  11. data/lib/propr/random/array.rb +19 -0
  12. data/lib/propr/random/bigdecimal.rb +43 -0
  13. data/lib/propr/random/boolean.rb +7 -0
  14. data/lib/propr/random/complex.rb +0 -0
  15. data/lib/propr/random/date.rb +17 -0
  16. data/lib/propr/random/float.rb +60 -0
  17. data/lib/propr/random/hash.rb +55 -0
  18. data/lib/propr/random/integer.rb +38 -0
  19. data/lib/propr/random/maybe.rb +0 -0
  20. data/lib/propr/random/nil.rb +8 -0
  21. data/lib/propr/random/range.rb +32 -0
  22. data/lib/propr/random/rational.rb +0 -0
  23. data/lib/propr/random/set.rb +22 -0
  24. data/lib/propr/random/string.rb +41 -0
  25. data/lib/propr/random/symbol.rb +13 -0
  26. data/lib/propr/random/time.rb +14 -0
  27. data/lib/propr/rspec.rb +97 -0
  28. data/lib/propr/runner.rb +53 -0
  29. data/lib/propr/shrink/array.rb +16 -0
  30. data/lib/propr/shrink/bigdecimal.rb +17 -0
  31. data/lib/propr/shrink/boolean.rb +11 -0
  32. data/lib/propr/shrink/complex.rb +0 -0
  33. data/lib/propr/shrink/date.rb +12 -0
  34. data/lib/propr/shrink/float.rb +17 -0
  35. data/lib/propr/shrink/hash.rb +18 -0
  36. data/lib/propr/shrink/integer.rb +10 -0
  37. data/lib/propr/shrink/maybe.rb +11 -0
  38. data/lib/propr/shrink/nil.rb +5 -0
  39. data/lib/propr/shrink/object.rb +5 -0
  40. data/lib/propr/shrink/range.rb +4 -0
  41. data/lib/propr/shrink/rational.rb +4 -0
  42. data/lib/propr/shrink/set.rb +18 -0
  43. data/lib/propr/shrink/string.rb +19 -0
  44. data/lib/propr/shrink/symbol.rb +5 -0
  45. data/lib/propr/shrink/time.rb +9 -0
  46. data/spec/examples/choose/array.example +12 -0
  47. data/spec/examples/choose/hash.example +12 -0
  48. data/spec/examples/choose/range.example +13 -0
  49. data/spec/examples/choose/set.example +12 -0
  50. data/spec/examples/guard.example +38 -0
  51. data/spec/examples/random/array.example +38 -0
  52. data/spec/examples/random/hash.example +18 -0
  53. data/spec/examples/random/integer.example +23 -0
  54. data/spec/examples/random/range.example +43 -0
  55. data/spec/examples/scale.example +17 -0
  56. data/spec/examples/shrink/array.example +20 -0
  57. data/spec/examples/shrink/bigdecimal.example +20 -0
  58. data/spec/examples/shrink/float.example +20 -0
  59. data/spec/examples/shrink/hash.example +20 -0
  60. data/spec/examples/shrink/integer.example +21 -0
  61. data/spec/examples/shrink/maybe.example +24 -0
  62. data/spec/examples/shrink/set.example +21 -0
  63. data/spec/examples/shrink/string.example +17 -0
  64. data/spec/issues/003.example +9 -0
  65. data/spec/spec_helper.rb +24 -0
  66. 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
@@ -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