ruby_contracts 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -9,6 +9,10 @@ module Contracts
9
9
  end
10
10
  end
11
11
 
12
+ def implies(arg1, arg2)
13
+ ! arg1 || arg2
14
+ end
15
+
12
16
  module ClassMethods
13
17
  def inherited(subclass)
14
18
  super
@@ -77,9 +81,10 @@ module Contracts
77
81
  def __eval_before_contracts(name, context, arguments)
78
82
  last_failure_msg = nil
79
83
  __contracts_for(name).each do |contracts|
80
- next if contracts.empty?
84
+ before_contracts = contracts.before_contracts
85
+ next if before_contracts.empty?
81
86
  success = true
82
- contracts.before_contracts.each do |contract|
87
+ before_contracts.each do |contract|
83
88
  begin
84
89
  unless satisfied = contract.satisfied?(context, arguments)
85
90
  last_failure_msg = contract.message
@@ -100,8 +105,9 @@ module Contracts
100
105
 
101
106
  def __eval_after_contracts(name, context, arguments, result)
102
107
  __contracts_for(name).each do |contracts|
103
- next if contracts.empty?
104
- contracts.after_contracts.each do |contract|
108
+ after_contracts = contracts.after_contracts
109
+ next if after_contracts.empty?
110
+ after_contracts.each do |contract|
105
111
  begin
106
112
  unless satisfied = contract.satisfied?(context, arguments, result)
107
113
  __contract_failure!(name, contract.message, result, arguments)
@@ -1,3 +1,3 @@
1
1
  module RubyContracts
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.2"
3
3
  end
@@ -0,0 +1,17 @@
1
+ require 'test_helper'
2
+
3
+ require_relative 'fixtures/dsl_classes'
4
+
5
+ describe 'the implies keyword' do
6
+ it 'should be false and raise a Contracts::Error when the condition is true but the implication is false' do
7
+ proc { FalseImplies.new.method1 }.must_raise Contracts::Error
8
+ end
9
+
10
+ it 'should be true and not produce any Contracts::Error when the condition is false' do
11
+ TrueImplies.new.method1.must_be_nil
12
+ end
13
+
14
+ it 'should be true and not produce any Contracts::Error when the condition is true and the implication is true' do
15
+ TrueImplies.new.method2.must_be_nil
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ class FalseImplies
2
+ include Contracts::DSL
3
+
4
+ pre "true -> false" do implies(true, false) end
5
+ def method1
6
+ end
7
+ end
8
+
9
+ class TrueImplies
10
+ include Contracts::DSL
11
+
12
+ pre "false -> true" do implies(false, true) end
13
+ def method1
14
+ end
15
+
16
+ pre "true -> true" do implies(true, true) end
17
+ def method2
18
+ end
19
+ end
@@ -1,6 +1,5 @@
1
1
  class Parent
2
2
  include Contracts::DSL
3
- EPSILON = 1e-7
4
3
  attr_reader :value, :minimum_incr
5
4
 
6
5
  type :in => [Numeric, Numeric]
@@ -13,7 +12,7 @@ class Parent
13
12
 
14
13
  type :in => [Numeric], :out => Numeric
15
14
  pre "n > minimum_incr" do |n| n > minimum_incr end
16
- post "value == old value + n" do "[dummy]" end
15
+ post "result >= n" do |result, n| result >= n end
17
16
  def increment(n)
18
17
  @value += n
19
18
  end
@@ -36,6 +35,13 @@ class ChildWithAddedPrecondition < Parent
36
35
  end
37
36
  end
38
37
 
38
+ class ChildWithAddedPostcondition < Parent
39
+ post "true" do true end
40
+ def increment(n)
41
+ @value += n
42
+ end
43
+ end
44
+
39
45
  class ChildWithSuper < Parent
40
46
  def increment(n)
41
47
  super
@@ -46,13 +46,31 @@ describe 'the contracts behavior in an inheritance context' do
46
46
  end
47
47
  end
48
48
  end
49
+ end
49
50
 
50
- describe 'the super keyword usage' do
51
- let(:child) { ChildWithSuper.new(10, 3) }
51
+ describe 'the redifinition of an existing method with postcondition' do
52
+ describe 'the child\'s overriden method call' do
53
+ describe 'the child specifies no postcondition' do
54
+ let(:child) { ChildWithRedef.new(10,3) }
55
+ it 'satisfies the parent postconditions' do
56
+ child.increment(4).wont_be_nil
57
+ end
58
+ end
52
59
 
53
- it 'does not raise any error' do
54
- child.increment(5).wont_be_nil
60
+ describe 'the child specifies additionnal postconditions' do
61
+ let(:child) { ChildWithAddedPostcondition.new(10, 3) }
62
+ it 'satisfies the parent preconditions' do
63
+ proc { child.increment(2) }.must_raise Contracts::Error
64
+ end
55
65
  end
56
66
  end
57
67
  end
68
+
69
+ describe 'the super keyword usage' do
70
+ let(:child) { ChildWithSuper.new(10, 3) }
71
+
72
+ it 'does not raise any error' do
73
+ child.increment(5).wont_be_nil
74
+ end
75
+ end
58
76
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_contracts
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-17 00:00:00.000000000 Z
12
+ date: 2013-06-27 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Micro DSL to add pre & post condition to methods. It tries to bring some
15
15
  design by contract in the Ruby world.
@@ -34,6 +34,8 @@ files:
34
34
  - lib/ruby_contracts/precondition.rb
35
35
  - lib/ruby_contracts/version.rb
36
36
  - ruby_contracts.gemspec
37
+ - test/dsl_test.rb
38
+ - test/fixtures/dsl_classes.rb
37
39
  - test/fixtures/inheritance_classes.rb
38
40
  - test/fixtures/preconditions_classes.rb
39
41
  - test/inheritance_test.rb
@@ -65,6 +67,8 @@ specification_version: 3
65
67
  summary: Micro DSL to add pre & post condition to methods. It tries to bring some
66
68
  design by contract in the Ruby world.
67
69
  test_files:
70
+ - test/dsl_test.rb
71
+ - test/fixtures/dsl_classes.rb
68
72
  - test/fixtures/inheritance_classes.rb
69
73
  - test/fixtures/preconditions_classes.rb
70
74
  - test/inheritance_test.rb