propr 0.2.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.
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