hypothesis-specs 0.0.3

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.
data/src/lib.rs ADDED
@@ -0,0 +1,170 @@
1
+ // "Bridging" root code that exists exclusively to provide
2
+ // a ruby -> Hypothesis engine binding. Long term the code
3
+ // in here is the only code that is going to stay in this
4
+ // crate, and everything else is going to get factored out
5
+ // into its own.
6
+
7
+ #![recursion_limit = "256"]
8
+ #![deny(warnings, missing_debug_implementations)]
9
+
10
+ extern crate core;
11
+ #[macro_use]
12
+ extern crate helix;
13
+ extern crate rand;
14
+
15
+ mod engine;
16
+ mod data;
17
+ mod distributions;
18
+
19
+ use std::mem;
20
+
21
+ use engine::Engine;
22
+ use data::{DataSource, Status};
23
+ use distributions::Repeat;
24
+
25
+ ruby! {
26
+ class HypothesisCoreDataSource {
27
+ struct {
28
+ source: Option<DataSource>,
29
+ }
30
+
31
+ def initialize(helix, engine: &mut HypothesisCoreEngine){
32
+ let mut result = HypothesisCoreDataSource{helix, source: None};
33
+ mem::swap(&mut result.source, &mut engine.pending);
34
+ return result;
35
+ }
36
+ }
37
+
38
+ class HypothesisCoreEngine {
39
+ struct {
40
+ engine: Engine,
41
+ pending: Option<DataSource>,
42
+ }
43
+
44
+ def initialize(helix, seed: u64, max_examples: u64){
45
+ let xs: [u32; 2] = [seed as u32, (seed >> 32) as u32];
46
+ HypothesisCoreEngine{
47
+ helix,
48
+ engine: Engine::new(max_examples, &xs),
49
+ pending: None,
50
+ }
51
+ }
52
+
53
+ def new_source(&mut self) -> Option<HypothesisCoreDataSource> {
54
+ match self.engine.next_source() {
55
+ None => None,
56
+ Some(source) => {
57
+ self.pending = Some(source);
58
+ Some(HypothesisCoreDataSource::new(self))
59
+ },
60
+ }
61
+ }
62
+
63
+ def failing_example(&mut self) -> Option<HypothesisCoreDataSource> {
64
+ if let Some(source) = self.engine.best_source() {
65
+ self.pending = Some(source);
66
+ return Some(HypothesisCoreDataSource::new(self));
67
+ } else {
68
+ return None;
69
+ }
70
+ }
71
+
72
+ def was_unsatisfiable(&mut self) -> bool {
73
+ self.engine.was_unsatisfiable()
74
+ }
75
+
76
+ def finish_overflow(&mut self, child: &mut HypothesisCoreDataSource){
77
+ mark_child_status(&mut self.engine, child, Status::Overflow);
78
+ }
79
+
80
+ def finish_invalid(&mut self, child: &mut HypothesisCoreDataSource){
81
+ mark_child_status(&mut self.engine, child, Status::Invalid);
82
+ }
83
+
84
+ def finish_interesting(&mut self, child: &mut HypothesisCoreDataSource){
85
+ mark_child_status(&mut self.engine, child, Status::Interesting);
86
+ }
87
+
88
+ def finish_valid(&mut self, child: &mut HypothesisCoreDataSource){
89
+ mark_child_status(&mut self.engine, child, Status::Valid);
90
+ }
91
+ }
92
+
93
+ class HypothesisCoreBitPossible{
94
+ struct {
95
+ n_bits: u64,
96
+ }
97
+
98
+ def initialize(helix, n_bits: u64){
99
+ return HypothesisCoreBitPossible{helix, n_bits: n_bits};
100
+ }
101
+
102
+ def provide(&mut self, data: &mut HypothesisCoreDataSource) -> Option<u64>{
103
+ match &mut data.source {
104
+ &mut None => None,
105
+ &mut Some(ref mut source) => source.bits(self.n_bits).ok(),
106
+ }
107
+ }
108
+ }
109
+
110
+ class HypothesisCoreRepeatValues{
111
+ struct {
112
+ repeat: Repeat,
113
+ }
114
+
115
+ def initialize(helix, min_count: u64, max_count: u64, expected_count: f64){
116
+ return HypothesisCoreRepeatValues{
117
+ helix, repeat: Repeat::new(min_count, max_count, expected_count)
118
+ }
119
+ }
120
+
121
+ def _should_continue(&mut self, data: &mut HypothesisCoreDataSource) -> Option<bool>{
122
+ return data.source.as_mut().and_then(|ref mut source| {
123
+ self.repeat.should_continue(source).ok()
124
+ })
125
+ }
126
+
127
+ def reject(&mut self){
128
+ self.repeat.reject();
129
+ }
130
+ }
131
+
132
+ class HypothesisCoreIntegers{
133
+ struct {
134
+ bitlengths: distributions::Sampler,
135
+ }
136
+ def initialize(helix){
137
+ return HypothesisCoreIntegers{helix,bitlengths: distributions::good_bitlengths()};
138
+ }
139
+ def provide(&mut self, data: &mut HypothesisCoreDataSource) -> Option<i64>{
140
+ data.source.as_mut().and_then(|ref mut source| {
141
+ distributions::integer_from_bitlengths(source, &self.bitlengths).ok()
142
+ })
143
+ }
144
+ }
145
+
146
+ class HypothesisCoreBoundedIntegers{
147
+ struct {
148
+ max_value: u64,
149
+ }
150
+ def initialize(helix, max_value: u64){
151
+ return HypothesisCoreBoundedIntegers{helix, max_value: max_value};
152
+ }
153
+
154
+ def provide(&mut self, data: &mut HypothesisCoreDataSource) -> Option<u64>{
155
+ data.source.as_mut().and_then(|ref mut source| {
156
+ distributions::bounded_int(source, self.max_value).ok()
157
+ })
158
+ }
159
+ }
160
+ }
161
+
162
+ fn mark_child_status(engine: &mut Engine, child: &mut HypothesisCoreDataSource, status: Status) {
163
+ let mut replacement = None;
164
+ mem::swap(&mut replacement, &mut child.source);
165
+
166
+ match replacement {
167
+ Some(source) => engine.mark_finished(source, status),
168
+ None => (),
169
+ }
170
+ }
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hypothesis-specs
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - David R. Maciver
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-02-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: helix_runtime
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.7.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.7.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ description: 'A port of the Hypothesis property-based testing library to Ruby
42
+
43
+ '
44
+ email: david@drmaciver.com
45
+ executables: []
46
+ extensions:
47
+ - ext/extconf.rb
48
+ extra_rdoc_files: []
49
+ files:
50
+ - CHANGELOG.md
51
+ - Cargo.toml
52
+ - LICENSE.txt
53
+ - README.markdown
54
+ - Rakefile
55
+ - ext/Makefile
56
+ - ext/extconf.rb
57
+ - lib/hypothesis.rb
58
+ - lib/hypothesis/engine.rb
59
+ - lib/hypothesis/errors.rb
60
+ - lib/hypothesis/possible.rb
61
+ - lib/hypothesis/testcase.rb
62
+ - lib/hypothesis/world.rb
63
+ - src/data.rs
64
+ - src/distributions.rs
65
+ - src/engine.rs
66
+ - src/lib.rs
67
+ homepage: http://github.com/HypothesisWorks/hypothesis-ruby
68
+ licenses:
69
+ - MPL-2.0
70
+ metadata: {}
71
+ post_install_message:
72
+ rdoc_options: []
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ requirements: []
86
+ rubyforge_project:
87
+ rubygems_version: 2.6.14
88
+ signing_key:
89
+ specification_version: 4
90
+ summary: A port of the Hypothesis property-based testing library to Ruby
91
+ test_files: []