entitlements 0.1.8 → 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.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/bin/deploy-entitlements +10 -1
- data/lib/contracts-ruby2/CHANGELOG.markdown +115 -0
- data/lib/contracts-ruby2/Gemfile +17 -0
- data/lib/contracts-ruby2/LICENSE +23 -0
- data/lib/contracts-ruby2/README.md +108 -0
- data/lib/contracts-ruby2/Rakefile +8 -0
- data/lib/contracts-ruby2/TODO.markdown +6 -0
- data/lib/contracts-ruby2/TUTORIAL.md +773 -0
- data/lib/contracts-ruby2/benchmarks/bench.rb +67 -0
- data/lib/contracts-ruby2/benchmarks/hash.rb +69 -0
- data/lib/contracts-ruby2/benchmarks/invariants.rb +91 -0
- data/lib/contracts-ruby2/benchmarks/io.rb +62 -0
- data/lib/contracts-ruby2/benchmarks/wrap_test.rb +57 -0
- data/lib/contracts-ruby2/contracts.gemspec +17 -0
- data/lib/contracts-ruby2/cucumber.yml +1 -0
- data/lib/contracts-ruby2/dependabot.yml +20 -0
- data/lib/contracts-ruby2/features/README.md +17 -0
- data/lib/contracts-ruby2/features/basics/functype.feature +71 -0
- data/lib/contracts-ruby2/features/basics/pretty-print.feature +241 -0
- data/lib/contracts-ruby2/features/basics/simple_example.feature +210 -0
- data/lib/contracts-ruby2/features/builtin_contracts/README.md +22 -0
- data/lib/contracts-ruby2/features/builtin_contracts/and.feature +103 -0
- data/lib/contracts-ruby2/features/builtin_contracts/any.feature +44 -0
- data/lib/contracts-ruby2/features/builtin_contracts/args.feature +80 -0
- data/lib/contracts-ruby2/features/builtin_contracts/array_of.feature +1 -0
- data/lib/contracts-ruby2/features/builtin_contracts/bool.feature +64 -0
- data/lib/contracts-ruby2/features/builtin_contracts/enum.feature +1 -0
- data/lib/contracts-ruby2/features/builtin_contracts/eq.feature +1 -0
- data/lib/contracts-ruby2/features/builtin_contracts/exactly.feature +1 -0
- data/lib/contracts-ruby2/features/builtin_contracts/func.feature +1 -0
- data/lib/contracts-ruby2/features/builtin_contracts/hash_of.feature +1 -0
- data/lib/contracts-ruby2/features/builtin_contracts/int.feature +93 -0
- data/lib/contracts-ruby2/features/builtin_contracts/keyword_args.feature +1 -0
- data/lib/contracts-ruby2/features/builtin_contracts/maybe.feature +1 -0
- data/lib/contracts-ruby2/features/builtin_contracts/nat.feature +115 -0
- data/lib/contracts-ruby2/features/builtin_contracts/nat_pos.feature +119 -0
- data/lib/contracts-ruby2/features/builtin_contracts/neg.feature +115 -0
- data/lib/contracts-ruby2/features/builtin_contracts/none.feature +145 -0
- data/lib/contracts-ruby2/features/builtin_contracts/not.feature +1 -0
- data/lib/contracts-ruby2/features/builtin_contracts/num.feature +64 -0
- data/lib/contracts-ruby2/features/builtin_contracts/or.feature +83 -0
- data/lib/contracts-ruby2/features/builtin_contracts/pos.feature +116 -0
- data/lib/contracts-ruby2/features/builtin_contracts/range_of.feature +1 -0
- data/lib/contracts-ruby2/features/builtin_contracts/respond_to.feature +78 -0
- data/lib/contracts-ruby2/features/builtin_contracts/send.feature +147 -0
- data/lib/contracts-ruby2/features/builtin_contracts/set_of.feature +1 -0
- data/lib/contracts-ruby2/features/builtin_contracts/xor.feature +99 -0
- data/lib/contracts-ruby2/features/support/env.rb +6 -0
- data/lib/contracts-ruby2/lib/contracts/attrs.rb +24 -0
- data/lib/contracts-ruby2/lib/contracts/builtin_contracts.rb +542 -0
- data/lib/contracts-ruby2/lib/contracts/call_with.rb +108 -0
- data/lib/contracts-ruby2/lib/contracts/core.rb +52 -0
- data/lib/contracts-ruby2/lib/contracts/decorators.rb +47 -0
- data/lib/contracts-ruby2/lib/contracts/engine/base.rb +136 -0
- data/lib/contracts-ruby2/lib/contracts/engine/eigenclass.rb +50 -0
- data/lib/contracts-ruby2/lib/contracts/engine/target.rb +70 -0
- data/lib/contracts-ruby2/lib/contracts/engine.rb +26 -0
- data/lib/contracts-ruby2/lib/contracts/errors.rb +71 -0
- data/lib/contracts-ruby2/lib/contracts/formatters.rb +136 -0
- data/lib/contracts-ruby2/lib/contracts/invariants.rb +68 -0
- data/lib/contracts-ruby2/lib/contracts/method_handler.rb +187 -0
- data/lib/contracts-ruby2/lib/contracts/method_reference.rb +100 -0
- data/lib/contracts-ruby2/lib/contracts/support.rb +61 -0
- data/lib/contracts-ruby2/lib/contracts/validators.rb +139 -0
- data/lib/contracts-ruby2/lib/contracts/version.rb +3 -0
- data/lib/contracts-ruby2/lib/contracts.rb +281 -0
- data/lib/contracts-ruby2/script/docs-release +3 -0
- data/lib/contracts-ruby2/script/docs-staging +3 -0
- data/lib/contracts-ruby2/script/rubocop.rb +5 -0
- data/lib/contracts-ruby2/spec/attrs_spec.rb +119 -0
- data/lib/contracts-ruby2/spec/builtin_contracts_spec.rb +461 -0
- data/lib/contracts-ruby2/spec/contracts_spec.rb +770 -0
- data/lib/contracts-ruby2/spec/fixtures/fixtures.rb +730 -0
- data/lib/contracts-ruby2/spec/invariants_spec.rb +17 -0
- data/lib/contracts-ruby2/spec/methods_spec.rb +54 -0
- data/lib/contracts-ruby2/spec/module_spec.rb +18 -0
- data/lib/contracts-ruby2/spec/override_validators_spec.rb +162 -0
- data/lib/contracts-ruby2/spec/ruby_version_specific/contracts_spec_1.9.rb +24 -0
- data/lib/contracts-ruby2/spec/ruby_version_specific/contracts_spec_2.0.rb +55 -0
- data/lib/contracts-ruby2/spec/ruby_version_specific/contracts_spec_2.1.rb +63 -0
- data/lib/contracts-ruby2/spec/spec_helper.rb +102 -0
- data/lib/contracts-ruby2/spec/support.rb +10 -0
- data/lib/contracts-ruby2/spec/support_spec.rb +21 -0
- data/lib/contracts-ruby2/spec/validators_spec.rb +47 -0
- data/lib/contracts-ruby3/CHANGELOG.markdown +117 -0
- data/lib/contracts-ruby3/Gemfile +21 -0
- data/lib/contracts-ruby3/LICENSE +23 -0
- data/lib/contracts-ruby3/README.md +114 -0
- data/lib/contracts-ruby3/Rakefile +10 -0
- data/lib/contracts-ruby3/TODO.markdown +6 -0
- data/lib/contracts-ruby3/TUTORIAL.md +773 -0
- data/lib/contracts-ruby3/benchmarks/bench.rb +67 -0
- data/lib/contracts-ruby3/benchmarks/hash.rb +69 -0
- data/lib/contracts-ruby3/benchmarks/invariants.rb +91 -0
- data/lib/contracts-ruby3/benchmarks/io.rb +62 -0
- data/lib/contracts-ruby3/benchmarks/wrap_test.rb +57 -0
- data/lib/contracts-ruby3/contracts.gemspec +20 -0
- data/lib/contracts-ruby3/cucumber.yml +1 -0
- data/lib/contracts-ruby3/dependabot.yml +20 -0
- data/lib/contracts-ruby3/features/README.md +17 -0
- data/lib/contracts-ruby3/features/basics/functype.feature +71 -0
- data/lib/contracts-ruby3/features/basics/pretty-print.feature +241 -0
- data/lib/contracts-ruby3/features/basics/simple_example.feature +210 -0
- data/lib/contracts-ruby3/features/builtin_contracts/README.md +22 -0
- data/lib/contracts-ruby3/features/builtin_contracts/and.feature +103 -0
- data/lib/contracts-ruby3/features/builtin_contracts/any.feature +44 -0
- data/lib/contracts-ruby3/features/builtin_contracts/args.feature +80 -0
- data/lib/contracts-ruby3/features/builtin_contracts/array_of.feature +1 -0
- data/lib/contracts-ruby3/features/builtin_contracts/bool.feature +64 -0
- data/lib/contracts-ruby3/features/builtin_contracts/enum.feature +1 -0
- data/lib/contracts-ruby3/features/builtin_contracts/eq.feature +1 -0
- data/lib/contracts-ruby3/features/builtin_contracts/exactly.feature +1 -0
- data/lib/contracts-ruby3/features/builtin_contracts/func.feature +1 -0
- data/lib/contracts-ruby3/features/builtin_contracts/hash_of.feature +1 -0
- data/lib/contracts-ruby3/features/builtin_contracts/int.feature +93 -0
- data/lib/contracts-ruby3/features/builtin_contracts/keyword_args.feature +1 -0
- data/lib/contracts-ruby3/features/builtin_contracts/maybe.feature +1 -0
- data/lib/contracts-ruby3/features/builtin_contracts/nat.feature +115 -0
- data/lib/contracts-ruby3/features/builtin_contracts/nat_pos.feature +119 -0
- data/lib/contracts-ruby3/features/builtin_contracts/neg.feature +115 -0
- data/lib/contracts-ruby3/features/builtin_contracts/none.feature +145 -0
- data/lib/contracts-ruby3/features/builtin_contracts/not.feature +1 -0
- data/lib/contracts-ruby3/features/builtin_contracts/num.feature +64 -0
- data/lib/contracts-ruby3/features/builtin_contracts/or.feature +83 -0
- data/lib/contracts-ruby3/features/builtin_contracts/pos.feature +116 -0
- data/lib/contracts-ruby3/features/builtin_contracts/range_of.feature +1 -0
- data/lib/contracts-ruby3/features/builtin_contracts/respond_to.feature +78 -0
- data/lib/contracts-ruby3/features/builtin_contracts/send.feature +147 -0
- data/lib/contracts-ruby3/features/builtin_contracts/set_of.feature +1 -0
- data/lib/contracts-ruby3/features/builtin_contracts/xor.feature +99 -0
- data/lib/contracts-ruby3/features/support/env.rb +8 -0
- data/lib/contracts-ruby3/lib/contracts/attrs.rb +26 -0
- data/lib/contracts-ruby3/lib/contracts/builtin_contracts.rb +575 -0
- data/lib/contracts-ruby3/lib/contracts/call_with.rb +119 -0
- data/lib/contracts-ruby3/lib/contracts/core.rb +54 -0
- data/lib/contracts-ruby3/lib/contracts/decorators.rb +50 -0
- data/lib/contracts-ruby3/lib/contracts/engine/base.rb +137 -0
- data/lib/contracts-ruby3/lib/contracts/engine/eigenclass.rb +51 -0
- data/lib/contracts-ruby3/lib/contracts/engine/target.rb +72 -0
- data/lib/contracts-ruby3/lib/contracts/engine.rb +28 -0
- data/lib/contracts-ruby3/lib/contracts/errors.rb +74 -0
- data/lib/contracts-ruby3/lib/contracts/formatters.rb +140 -0
- data/lib/contracts-ruby3/lib/contracts/invariants.rb +72 -0
- data/lib/contracts-ruby3/lib/contracts/method_handler.rb +197 -0
- data/lib/contracts-ruby3/lib/contracts/method_reference.rb +102 -0
- data/lib/contracts-ruby3/lib/contracts/support.rb +63 -0
- data/lib/contracts-ruby3/lib/contracts/validators.rb +143 -0
- data/lib/contracts-ruby3/lib/contracts/version.rb +5 -0
- data/lib/contracts-ruby3/lib/contracts.rb +290 -0
- data/lib/contracts-ruby3/script/docs-release +3 -0
- data/lib/contracts-ruby3/script/docs-staging +3 -0
- data/lib/contracts-ruby3/script/rubocop.rb +5 -0
- data/lib/contracts-ruby3/spec/attrs_spec.rb +119 -0
- data/lib/contracts-ruby3/spec/builtin_contracts_spec.rb +457 -0
- data/lib/contracts-ruby3/spec/contracts_spec.rb +773 -0
- data/lib/contracts-ruby3/spec/fixtures/fixtures.rb +725 -0
- data/lib/contracts-ruby3/spec/invariants_spec.rb +17 -0
- data/lib/contracts-ruby3/spec/methods_spec.rb +54 -0
- data/lib/contracts-ruby3/spec/module_spec.rb +18 -0
- data/lib/contracts-ruby3/spec/override_validators_spec.rb +162 -0
- data/lib/contracts-ruby3/spec/ruby_version_specific/contracts_spec_1.9.rb +24 -0
- data/lib/contracts-ruby3/spec/ruby_version_specific/contracts_spec_2.0.rb +55 -0
- data/lib/contracts-ruby3/spec/ruby_version_specific/contracts_spec_2.1.rb +63 -0
- data/lib/contracts-ruby3/spec/spec_helper.rb +102 -0
- data/lib/contracts-ruby3/spec/support.rb +10 -0
- data/lib/contracts-ruby3/spec/support_spec.rb +21 -0
- data/lib/contracts-ruby3/spec/validators_spec.rb +47 -0
- data/lib/entitlements/data/groups/calculated/yaml.rb +7 -1
- data/lib/entitlements/data/people/yaml.rb +9 -1
- data/lib/entitlements/extras/ldap_group/rules/ldap_group.rb +5 -1
- data/lib/entitlements/extras/orgchart/person_methods.rb +7 -1
- data/lib/entitlements.rb +13 -2
- data/lib/ruby_version_check.rb +17 -0
- metadata +209 -14
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
Feature: Bool
|
|
2
|
+
|
|
3
|
+
Checks that the argument is a `true` or `false`.
|
|
4
|
+
|
|
5
|
+
```ruby
|
|
6
|
+
Contract String => C::Bool
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Background:
|
|
10
|
+
Given a file named "bool_usage.rb" with:
|
|
11
|
+
"""ruby
|
|
12
|
+
require "contracts"
|
|
13
|
+
C = Contracts
|
|
14
|
+
|
|
15
|
+
class Example
|
|
16
|
+
include Contracts::Core
|
|
17
|
+
|
|
18
|
+
Contract String => C::Bool
|
|
19
|
+
def self.strong?(password)
|
|
20
|
+
return if password == ""
|
|
21
|
+
password.length > 22
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
Scenario: Accepts `true`
|
|
27
|
+
Given a file named "true.rb" with:
|
|
28
|
+
"""ruby
|
|
29
|
+
require "./bool_usage"
|
|
30
|
+
puts Example.strong?("verystrongandLon774gPassword!ForYouHere")
|
|
31
|
+
"""
|
|
32
|
+
When I run `ruby true.rb`
|
|
33
|
+
Then output should contain:
|
|
34
|
+
"""
|
|
35
|
+
true
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
Scenario: Accepts `false`
|
|
39
|
+
Given a file named "false.rb" with:
|
|
40
|
+
"""ruby
|
|
41
|
+
require "./bool_usage"
|
|
42
|
+
puts Example.strong?("welcome")
|
|
43
|
+
"""
|
|
44
|
+
When I run `ruby false.rb`
|
|
45
|
+
Then output should contain:
|
|
46
|
+
"""
|
|
47
|
+
false
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
Scenario: Rejects everything else
|
|
51
|
+
Given a file named "nil.rb" with:
|
|
52
|
+
"""ruby
|
|
53
|
+
require "./bool_usage"
|
|
54
|
+
puts Example.strong?("")
|
|
55
|
+
"""
|
|
56
|
+
When I run `ruby nil.rb`
|
|
57
|
+
Then output should contain:
|
|
58
|
+
"""
|
|
59
|
+
: Contract violation for return value: (ReturnContractError)
|
|
60
|
+
Expected: Bool,
|
|
61
|
+
Actual: nil
|
|
62
|
+
Value guarded in: Example::strong?
|
|
63
|
+
With Contract: String => Bool
|
|
64
|
+
"""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Feature: Enum (TODO)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Feature: Eq (TODO)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Feature: Exactly (TODO)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Feature: Func (TODO)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Feature: HashOf (TODO)
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
Feature: Int
|
|
2
|
+
|
|
3
|
+
Checks that an argument is an integer.
|
|
4
|
+
|
|
5
|
+
```ruby
|
|
6
|
+
Contract C::Int => C::Int
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Background:
|
|
10
|
+
Given a file named "int_usage.rb" with:
|
|
11
|
+
"""ruby
|
|
12
|
+
require "contracts"
|
|
13
|
+
C = Contracts
|
|
14
|
+
|
|
15
|
+
class Integr
|
|
16
|
+
include Contracts::Core
|
|
17
|
+
|
|
18
|
+
Contract C::Int => C::Int
|
|
19
|
+
def prev(number)
|
|
20
|
+
number - 1
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
Scenario: Accepts positive integers
|
|
26
|
+
Given a file named "accepts_positive_integers.rb" with:
|
|
27
|
+
"""ruby
|
|
28
|
+
require "./int_usage"
|
|
29
|
+
puts Integr.new.prev(7)
|
|
30
|
+
"""
|
|
31
|
+
When I run `ruby accepts_positive_integers.rb`
|
|
32
|
+
Then output should contain:
|
|
33
|
+
"""
|
|
34
|
+
6
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
Scenario: Accepts zero
|
|
38
|
+
Given a file named "accepts_zero.rb" with:
|
|
39
|
+
"""ruby
|
|
40
|
+
require "./int_usage"
|
|
41
|
+
puts Integr.new.prev(1)
|
|
42
|
+
"""
|
|
43
|
+
When I run `ruby accepts_zero.rb`
|
|
44
|
+
Then output should contain:
|
|
45
|
+
"""
|
|
46
|
+
0
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
Scenario: Accepts negative integers
|
|
50
|
+
Given a file named "accepts_negative_integers.rb" with:
|
|
51
|
+
"""ruby
|
|
52
|
+
require "./int_usage"
|
|
53
|
+
puts Integr.new.prev(-1)
|
|
54
|
+
"""
|
|
55
|
+
When I run `ruby accepts_negative_integers.rb`
|
|
56
|
+
Then output should contain:
|
|
57
|
+
"""
|
|
58
|
+
-2
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
Scenario: Rejects floats
|
|
62
|
+
Given a file named "rejects_floats.rb" with:
|
|
63
|
+
"""ruby
|
|
64
|
+
require "./int_usage"
|
|
65
|
+
puts Integr.new.prev(3.43)
|
|
66
|
+
"""
|
|
67
|
+
When I run `ruby rejects_floats.rb`
|
|
68
|
+
Then output should contain:
|
|
69
|
+
"""
|
|
70
|
+
: Contract violation for argument 1 of 1: (ParamContractError)
|
|
71
|
+
Expected: Int,
|
|
72
|
+
Actual: 3.43
|
|
73
|
+
Value guarded in: Integr::prev
|
|
74
|
+
With Contract: Int => Int
|
|
75
|
+
"""
|
|
76
|
+
And output should contain "int_usage.rb:8"
|
|
77
|
+
|
|
78
|
+
Scenario: Rejects other values
|
|
79
|
+
Given a file named "rejects_others.rb" with:
|
|
80
|
+
"""ruby
|
|
81
|
+
require "./int_usage"
|
|
82
|
+
puts Integr.new.prev("foo")
|
|
83
|
+
"""
|
|
84
|
+
When I run `ruby rejects_others.rb`
|
|
85
|
+
Then output should contain:
|
|
86
|
+
"""
|
|
87
|
+
: Contract violation for argument 1 of 1: (ParamContractError)
|
|
88
|
+
Expected: Int,
|
|
89
|
+
Actual: "foo"
|
|
90
|
+
Value guarded in: Integr::prev
|
|
91
|
+
With Contract: Int => Int
|
|
92
|
+
"""
|
|
93
|
+
And output should contain "int_usage.rb:8"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Feature: KeywordArgs (TODO)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Feature: Maybe (TODO)
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
Feature: Nat
|
|
2
|
+
|
|
3
|
+
Checks that an argument is a natural number.
|
|
4
|
+
|
|
5
|
+
```ruby
|
|
6
|
+
Contract C::Nat => C::Nat
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Background:
|
|
10
|
+
Given a file named "nat_usage.rb" with:
|
|
11
|
+
"""ruby
|
|
12
|
+
require "contracts"
|
|
13
|
+
C = Contracts
|
|
14
|
+
|
|
15
|
+
class Natural
|
|
16
|
+
include Contracts::Core
|
|
17
|
+
|
|
18
|
+
Contract C::Nat => C::Nat
|
|
19
|
+
def prev(number)
|
|
20
|
+
number - 1
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
Scenario: Accepts positive integers
|
|
26
|
+
Given a file named "accepts_positive_integers.rb" with:
|
|
27
|
+
"""ruby
|
|
28
|
+
require "./nat_usage"
|
|
29
|
+
puts Natural.new.prev(7)
|
|
30
|
+
"""
|
|
31
|
+
When I run `ruby accepts_positive_integers.rb`
|
|
32
|
+
Then output should contain:
|
|
33
|
+
"""
|
|
34
|
+
6
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
Scenario: Accepts zero
|
|
38
|
+
Given a file named "accepts_zero.rb" with:
|
|
39
|
+
"""ruby
|
|
40
|
+
require "./nat_usage"
|
|
41
|
+
puts Natural.new.prev(1)
|
|
42
|
+
"""
|
|
43
|
+
When I run `ruby accepts_zero.rb`
|
|
44
|
+
Then output should contain:
|
|
45
|
+
"""
|
|
46
|
+
0
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
Scenario: Rejects negative integers
|
|
50
|
+
Given a file named "rejects_negative_integers.rb" with:
|
|
51
|
+
"""ruby
|
|
52
|
+
require "./nat_usage"
|
|
53
|
+
puts Natural.new.prev(-1)
|
|
54
|
+
"""
|
|
55
|
+
When I run `ruby rejects_negative_integers.rb`
|
|
56
|
+
Then output should contain:
|
|
57
|
+
"""
|
|
58
|
+
: Contract violation for argument 1 of 1: (ParamContractError)
|
|
59
|
+
Expected: Nat,
|
|
60
|
+
Actual: -1
|
|
61
|
+
Value guarded in: Natural::prev
|
|
62
|
+
With Contract: Nat => Nat
|
|
63
|
+
"""
|
|
64
|
+
And output should contain "nat_usage.rb:8"
|
|
65
|
+
|
|
66
|
+
Scenario: Rejects negative integers as a return value
|
|
67
|
+
Given a file named "rejects_negative_integers.rb" with:
|
|
68
|
+
"""ruby
|
|
69
|
+
require "./nat_usage"
|
|
70
|
+
puts Natural.new.prev(0)
|
|
71
|
+
"""
|
|
72
|
+
When I run `ruby rejects_negative_integers.rb`
|
|
73
|
+
Then output should contain:
|
|
74
|
+
"""
|
|
75
|
+
: Contract violation for return value: (ReturnContractError)
|
|
76
|
+
Expected: Nat,
|
|
77
|
+
Actual: -1
|
|
78
|
+
Value guarded in: Natural::prev
|
|
79
|
+
With Contract: Nat => Nat
|
|
80
|
+
"""
|
|
81
|
+
And output should contain "nat_usage.rb:8"
|
|
82
|
+
|
|
83
|
+
Scenario: Rejects floats
|
|
84
|
+
Given a file named "rejects_floats.rb" with:
|
|
85
|
+
"""ruby
|
|
86
|
+
require "./nat_usage"
|
|
87
|
+
puts Natural.new.prev(3.43)
|
|
88
|
+
"""
|
|
89
|
+
When I run `ruby rejects_floats.rb`
|
|
90
|
+
Then output should contain:
|
|
91
|
+
"""
|
|
92
|
+
: Contract violation for argument 1 of 1: (ParamContractError)
|
|
93
|
+
Expected: Nat,
|
|
94
|
+
Actual: 3.43
|
|
95
|
+
Value guarded in: Natural::prev
|
|
96
|
+
With Contract: Nat => Nat
|
|
97
|
+
"""
|
|
98
|
+
And output should contain "nat_usage.rb:8"
|
|
99
|
+
|
|
100
|
+
Scenario: Rejects other values
|
|
101
|
+
Given a file named "rejects_others.rb" with:
|
|
102
|
+
"""ruby
|
|
103
|
+
require "./nat_usage"
|
|
104
|
+
puts Natural.new.prev("foo")
|
|
105
|
+
"""
|
|
106
|
+
When I run `ruby rejects_others.rb`
|
|
107
|
+
Then output should contain:
|
|
108
|
+
"""
|
|
109
|
+
: Contract violation for argument 1 of 1: (ParamContractError)
|
|
110
|
+
Expected: Nat,
|
|
111
|
+
Actual: "foo"
|
|
112
|
+
Value guarded in: Natural::prev
|
|
113
|
+
With Contract: Nat => Nat
|
|
114
|
+
"""
|
|
115
|
+
And output should contain "nat_usage.rb:8"
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
Feature: NatPos
|
|
2
|
+
|
|
3
|
+
Checks that an argument is a positive natural number.
|
|
4
|
+
|
|
5
|
+
```ruby
|
|
6
|
+
Contract C::NatPos => C::NatPos
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Background:
|
|
10
|
+
Given a file named "nat_pos_usage.rb" with:
|
|
11
|
+
"""ruby
|
|
12
|
+
require "contracts"
|
|
13
|
+
C = Contracts
|
|
14
|
+
|
|
15
|
+
class NaturalPositive
|
|
16
|
+
include Contracts::Core
|
|
17
|
+
|
|
18
|
+
Contract C::NatPos => C::NatPos
|
|
19
|
+
def prev(number)
|
|
20
|
+
number - 1
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
Scenario: Accepts positive integers
|
|
26
|
+
Given a file named "accepts_positive_integers.rb" with:
|
|
27
|
+
"""ruby
|
|
28
|
+
require "./nat_pos_usage"
|
|
29
|
+
puts NaturalPositive.new.prev(7)
|
|
30
|
+
"""
|
|
31
|
+
When I run `ruby accepts_positive_integers.rb`
|
|
32
|
+
Then output should contain:
|
|
33
|
+
"""
|
|
34
|
+
6
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
Scenario: Rejects zero
|
|
38
|
+
Given a file named "rejects_zero.rb" with:
|
|
39
|
+
"""ruby
|
|
40
|
+
require "./nat_pos_usage"
|
|
41
|
+
puts NaturalPositive.new.prev(0)
|
|
42
|
+
"""
|
|
43
|
+
When I run `ruby rejects_zero.rb`
|
|
44
|
+
Then output should contain:
|
|
45
|
+
"""
|
|
46
|
+
: Contract violation for argument 1 of 1: (ParamContractError)
|
|
47
|
+
Expected: NatPos,
|
|
48
|
+
Actual: 0
|
|
49
|
+
Value guarded in: NaturalPositive::prev
|
|
50
|
+
With Contract: NatPos => NatPos
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
Scenario: Rejects negative integers
|
|
54
|
+
Given a file named "rejects_negative_integers.rb" with:
|
|
55
|
+
"""ruby
|
|
56
|
+
require "./nat_pos_usage"
|
|
57
|
+
puts NaturalPositive.new.prev(-1)
|
|
58
|
+
"""
|
|
59
|
+
When I run `ruby rejects_negative_integers.rb`
|
|
60
|
+
Then output should contain:
|
|
61
|
+
"""
|
|
62
|
+
: Contract violation for argument 1 of 1: (ParamContractError)
|
|
63
|
+
Expected: NatPos,
|
|
64
|
+
Actual: -1
|
|
65
|
+
Value guarded in: NaturalPositive::prev
|
|
66
|
+
With Contract: NatPos => NatPos
|
|
67
|
+
"""
|
|
68
|
+
And output should contain "nat_pos_usage.rb:8"
|
|
69
|
+
|
|
70
|
+
Scenario: Rejects negative integers as a return value
|
|
71
|
+
Given a file named "rejects_negative_integers.rb" with:
|
|
72
|
+
"""ruby
|
|
73
|
+
require "./nat_pos_usage"
|
|
74
|
+
puts NaturalPositive.new.prev(1)
|
|
75
|
+
"""
|
|
76
|
+
When I run `ruby rejects_negative_integers.rb`
|
|
77
|
+
Then output should contain:
|
|
78
|
+
"""
|
|
79
|
+
: Contract violation for return value: (ReturnContractError)
|
|
80
|
+
Expected: NatPos,
|
|
81
|
+
Actual: 0
|
|
82
|
+
Value guarded in: NaturalPositive::prev
|
|
83
|
+
With Contract: NatPos => NatPos
|
|
84
|
+
"""
|
|
85
|
+
And output should contain "nat_pos_usage.rb:8"
|
|
86
|
+
|
|
87
|
+
Scenario: Rejects floats
|
|
88
|
+
Given a file named "rejects_floats.rb" with:
|
|
89
|
+
"""ruby
|
|
90
|
+
require "./nat_pos_usage"
|
|
91
|
+
puts NaturalPositive.new.prev(3.43)
|
|
92
|
+
"""
|
|
93
|
+
When I run `ruby rejects_floats.rb`
|
|
94
|
+
Then output should contain:
|
|
95
|
+
"""
|
|
96
|
+
: Contract violation for argument 1 of 1: (ParamContractError)
|
|
97
|
+
Expected: NatPos,
|
|
98
|
+
Actual: 3.43
|
|
99
|
+
Value guarded in: NaturalPositive::prev
|
|
100
|
+
With Contract: NatPos => NatPos
|
|
101
|
+
"""
|
|
102
|
+
And output should contain "nat_pos_usage.rb:8"
|
|
103
|
+
|
|
104
|
+
Scenario: Rejects other values
|
|
105
|
+
Given a file named "rejects_others.rb" with:
|
|
106
|
+
"""ruby
|
|
107
|
+
require "./nat_pos_usage"
|
|
108
|
+
puts NaturalPositive.new.prev("foo")
|
|
109
|
+
"""
|
|
110
|
+
When I run `ruby rejects_others.rb`
|
|
111
|
+
Then output should contain:
|
|
112
|
+
"""
|
|
113
|
+
: Contract violation for argument 1 of 1: (ParamContractError)
|
|
114
|
+
Expected: NatPos,
|
|
115
|
+
Actual: "foo"
|
|
116
|
+
Value guarded in: NaturalPositive::prev
|
|
117
|
+
With Contract: NatPos => NatPos
|
|
118
|
+
"""
|
|
119
|
+
And output should contain "nat_pos_usage.rb:8"
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
Feature: Neg
|
|
2
|
+
|
|
3
|
+
Checks that an argument is negative `Numeric`.
|
|
4
|
+
|
|
5
|
+
```ruby
|
|
6
|
+
Contract C::Neg => C::Neg
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Background:
|
|
10
|
+
Given a file named "pos_usage.rb" with:
|
|
11
|
+
"""ruby
|
|
12
|
+
require "contracts"
|
|
13
|
+
C = Contracts
|
|
14
|
+
|
|
15
|
+
class Example
|
|
16
|
+
include Contracts::Core
|
|
17
|
+
|
|
18
|
+
Contract C::Neg => C::Neg
|
|
19
|
+
def double_expense(amount)
|
|
20
|
+
amount * 2
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
Scenario: Accepts negative integers
|
|
26
|
+
Given a file named "accepts_negative_integers.rb" with:
|
|
27
|
+
"""ruby
|
|
28
|
+
require "./pos_usage"
|
|
29
|
+
puts Example.new.double_expense(-50)
|
|
30
|
+
"""
|
|
31
|
+
When I run `ruby accepts_negative_integers.rb`
|
|
32
|
+
Then output should contain:
|
|
33
|
+
"""
|
|
34
|
+
-100
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
Scenario: Accepts negative floats
|
|
38
|
+
Given a file named "accepts_negative_floats.rb" with:
|
|
39
|
+
"""ruby
|
|
40
|
+
require "./pos_usage"
|
|
41
|
+
puts Example.new.double_expense(-37.99)
|
|
42
|
+
"""
|
|
43
|
+
When I run `ruby accepts_negative_floats.rb`
|
|
44
|
+
Then output should contain:
|
|
45
|
+
"""
|
|
46
|
+
-75.98
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
Scenario: Rejects positive integers
|
|
50
|
+
Given a file named "rejects_positive_integers.rb" with:
|
|
51
|
+
"""ruby
|
|
52
|
+
require "./pos_usage"
|
|
53
|
+
puts Example.new.double_expense(50)
|
|
54
|
+
"""
|
|
55
|
+
When I run `ruby rejects_positive_integers.rb`
|
|
56
|
+
Then output should contain:
|
|
57
|
+
"""
|
|
58
|
+
: Contract violation for argument 1 of 1: (ParamContractError)
|
|
59
|
+
Expected: Neg,
|
|
60
|
+
Actual: 50
|
|
61
|
+
Value guarded in: Example::double_expense
|
|
62
|
+
With Contract: Neg => Neg
|
|
63
|
+
"""
|
|
64
|
+
And output should contain "pos_usage.rb:8"
|
|
65
|
+
|
|
66
|
+
Scenario: Rejects positive floats
|
|
67
|
+
Given a file named "rejects_positive_floats.rb" with:
|
|
68
|
+
"""ruby
|
|
69
|
+
require "./pos_usage"
|
|
70
|
+
puts Example.new.double_expense(42.50)
|
|
71
|
+
"""
|
|
72
|
+
When I run `ruby rejects_positive_floats.rb`
|
|
73
|
+
Then output should contain:
|
|
74
|
+
"""
|
|
75
|
+
: Contract violation for argument 1 of 1: (ParamContractError)
|
|
76
|
+
Expected: Neg,
|
|
77
|
+
Actual: 42.5
|
|
78
|
+
Value guarded in: Example::double_expense
|
|
79
|
+
With Contract: Neg => Neg
|
|
80
|
+
"""
|
|
81
|
+
And output should contain "pos_usage.rb:8"
|
|
82
|
+
|
|
83
|
+
Scenario: Rejects zero
|
|
84
|
+
Given a file named "rejects_zero.rb" with:
|
|
85
|
+
"""ruby
|
|
86
|
+
require "./pos_usage"
|
|
87
|
+
puts Example.new.double_expense(0)
|
|
88
|
+
"""
|
|
89
|
+
When I run `ruby rejects_zero.rb`
|
|
90
|
+
Then output should contain:
|
|
91
|
+
"""
|
|
92
|
+
: Contract violation for argument 1 of 1: (ParamContractError)
|
|
93
|
+
Expected: Neg,
|
|
94
|
+
Actual: 0
|
|
95
|
+
Value guarded in: Example::double_expense
|
|
96
|
+
With Contract: Neg => Neg
|
|
97
|
+
"""
|
|
98
|
+
And output should contain "pos_usage.rb:8"
|
|
99
|
+
|
|
100
|
+
Scenario: Rejects other values
|
|
101
|
+
Given a file named "rejects_others.rb" with:
|
|
102
|
+
"""ruby
|
|
103
|
+
require "./pos_usage"
|
|
104
|
+
puts Example.new.double_expense("foo")
|
|
105
|
+
"""
|
|
106
|
+
When I run `ruby rejects_others.rb`
|
|
107
|
+
Then output should contain:
|
|
108
|
+
"""
|
|
109
|
+
: Contract violation for argument 1 of 1: (ParamContractError)
|
|
110
|
+
Expected: Neg,
|
|
111
|
+
Actual: "foo"
|
|
112
|
+
Value guarded in: Example::double_expense
|
|
113
|
+
With Contract: Neg => Neg
|
|
114
|
+
"""
|
|
115
|
+
And output should contain "pos_usage.rb:8"
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
Feature: None
|
|
2
|
+
|
|
3
|
+
Fails for any argument.
|
|
4
|
+
|
|
5
|
+
Often used to explicitly specify that method does not accept any arguments:
|
|
6
|
+
|
|
7
|
+
```ruby
|
|
8
|
+
Contract C::None => Symbol
|
|
9
|
+
def a_symbol
|
|
10
|
+
:a_symbol
|
|
11
|
+
end
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The same behavior can be achieved when argument list omitted:
|
|
15
|
+
|
|
16
|
+
```ruby
|
|
17
|
+
Contract Symbol
|
|
18
|
+
def a_symbol
|
|
19
|
+
:a_symbol
|
|
20
|
+
end
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Background:
|
|
24
|
+
Given a file named "helper.rb" with:
|
|
25
|
+
"""ruby
|
|
26
|
+
def autorescue
|
|
27
|
+
yield
|
|
28
|
+
rescue => e
|
|
29
|
+
puts e.inspect
|
|
30
|
+
end
|
|
31
|
+
"""
|
|
32
|
+
Given a file named "none_usage.rb" with:
|
|
33
|
+
"""ruby
|
|
34
|
+
require "contracts"
|
|
35
|
+
require "./helper"
|
|
36
|
+
C = Contracts
|
|
37
|
+
|
|
38
|
+
class Example
|
|
39
|
+
include Contracts::Core
|
|
40
|
+
|
|
41
|
+
Contract C::None => Symbol
|
|
42
|
+
def self.a_symbol(*args)
|
|
43
|
+
:a_symbol
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
Scenario: Accepts nothing
|
|
49
|
+
Given a file named "nothing.rb" with:
|
|
50
|
+
"""ruby
|
|
51
|
+
require "./none_usage"
|
|
52
|
+
puts Example.a_symbol
|
|
53
|
+
"""
|
|
54
|
+
When I run `ruby nothing.rb`
|
|
55
|
+
Then output should contain:
|
|
56
|
+
"""
|
|
57
|
+
a_symbol
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
Scenario: Rejects any argument
|
|
61
|
+
Given a file named "anything.rb" with:
|
|
62
|
+
"""ruby
|
|
63
|
+
require "./none_usage"
|
|
64
|
+
autorescue { Example.a_symbol(nil) }
|
|
65
|
+
autorescue { Example.a_symbol(12) }
|
|
66
|
+
autorescue { Example.a_symbol(37.5) }
|
|
67
|
+
autorescue { Example.a_symbol("foo") }
|
|
68
|
+
autorescue { Example.a_symbol(:foo) }
|
|
69
|
+
autorescue { Example.a_symbol({}) }
|
|
70
|
+
autorescue { Example.a_symbol([]) }
|
|
71
|
+
autorescue { Example.a_symbol(Object) }
|
|
72
|
+
"""
|
|
73
|
+
When I run `ruby anything.rb`
|
|
74
|
+
|
|
75
|
+
Then output should contain:
|
|
76
|
+
"""
|
|
77
|
+
ParamContractError: Contract violation for argument 1 of 1:
|
|
78
|
+
Expected: None,
|
|
79
|
+
Actual: nil
|
|
80
|
+
Value guarded in: Example::a_symbol
|
|
81
|
+
With Contract: None => Symbol
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
Then output should contain:
|
|
85
|
+
"""
|
|
86
|
+
ParamContractError: Contract violation for argument 1 of 1:
|
|
87
|
+
Expected: None,
|
|
88
|
+
Actual: 12
|
|
89
|
+
Value guarded in: Example::a_symbol
|
|
90
|
+
With Contract: None => Symbol
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
Then output should contain:
|
|
94
|
+
"""
|
|
95
|
+
ParamContractError: Contract violation for argument 1 of 1:
|
|
96
|
+
Expected: None,
|
|
97
|
+
Actual: 37.5
|
|
98
|
+
Value guarded in: Example::a_symbol
|
|
99
|
+
With Contract: None => Symbol
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
Then output should contain:
|
|
103
|
+
"""
|
|
104
|
+
ParamContractError: Contract violation for argument 1 of 1:
|
|
105
|
+
Expected: None,
|
|
106
|
+
Actual: "foo"
|
|
107
|
+
Value guarded in: Example::a_symbol
|
|
108
|
+
With Contract: None => Symbol
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
Then output should contain:
|
|
112
|
+
"""
|
|
113
|
+
ParamContractError: Contract violation for argument 1 of 1:
|
|
114
|
+
Expected: None,
|
|
115
|
+
Actual: :foo
|
|
116
|
+
Value guarded in: Example::a_symbol
|
|
117
|
+
With Contract: None => Symbol
|
|
118
|
+
"""
|
|
119
|
+
|
|
120
|
+
Then output should contain:
|
|
121
|
+
"""
|
|
122
|
+
ParamContractError: Contract violation for argument 1 of 1:
|
|
123
|
+
Expected: None,
|
|
124
|
+
Actual: {}
|
|
125
|
+
Value guarded in: Example::a_symbol
|
|
126
|
+
With Contract: None => Symbol
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
Then output should contain:
|
|
130
|
+
"""
|
|
131
|
+
ParamContractError: Contract violation for argument 1 of 1:
|
|
132
|
+
Expected: None,
|
|
133
|
+
Actual: []
|
|
134
|
+
Value guarded in: Example::a_symbol
|
|
135
|
+
With Contract: None => Symbol
|
|
136
|
+
"""
|
|
137
|
+
|
|
138
|
+
Then output should contain:
|
|
139
|
+
"""
|
|
140
|
+
ParamContractError: Contract violation for argument 1 of 1:
|
|
141
|
+
Expected: None,
|
|
142
|
+
Actual: Object
|
|
143
|
+
Value guarded in: Example::a_symbol
|
|
144
|
+
With Contract: None => Symbol
|
|
145
|
+
"""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Feature: Not (TODO)
|