wongi-engine 0.0.16 → 0.0.17

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Wongi::Engine::BetaNode do
4
+
5
+ let( :engine ) { Wongi::Engine.create }
6
+
7
+ describe '#tokens' do
8
+
9
+ it 'should be enumerable' do
10
+
11
+ production = engine << rule {
12
+ forall {
13
+ has :x, :y, :Z
14
+ }
15
+ }
16
+
17
+ engine << [:x, :y, 1]
18
+ engine << [:x, :y, 2]
19
+ engine << [:x, :y, 3]
20
+ zs = production.tokens.map { |token| token[:Z] }
21
+ expect( zs ).to be == [1, 2, 3]
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
data/spec/dataset_spec.rb CHANGED
@@ -20,6 +20,7 @@ describe Wongi::Engine::Network do
20
20
  ds << [1, 2, 3]
21
21
 
22
22
  expect(production.size).to eq(1)
23
+ expect( production.size ).to be == 1
23
24
 
24
25
  end
25
26
 
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ describe Wongi::Engine::AssumingClause do
4
+
5
+ let( :engine ) { Wongi::Engine.create }
6
+
7
+ it 'should include base rules' do
8
+
9
+ engine << rule( :base ) {
10
+ forall {
11
+ has :x, :y, :Z
12
+ }
13
+ }
14
+
15
+ extended = engine << rule {
16
+ forall {
17
+ assuming :base
18
+ has :Z, :u, :W
19
+ }
20
+ }
21
+
22
+ engine << [:x, :y, 1]
23
+ engine << [:x, :y, 2]
24
+ engine << [1, :u, :a]
25
+ engine << [2, :u, :b]
26
+ result = Hash[ extended.tokens.map { |token| [ token[:Z], token[:W] ] } ]
27
+ expect( result ).to eq(1 => :a, 2 => :b)
28
+
29
+ end
30
+
31
+ it 'should check for base rule\'s existence' do
32
+
33
+ f = -> {
34
+ engine << rule {
35
+ forall {
36
+ assuming :base
37
+ }
38
+ }
39
+ }
40
+
41
+ expect( &f ).to raise_error Wongi::Engine::UndefinedBaseRule
42
+
43
+ end
44
+
45
+ it 'should come first in a rule' do
46
+
47
+ f = -> {
48
+ engine << rule( :base ) {
49
+ forall {
50
+ has :x, :y, :Z
51
+ }
52
+ }
53
+
54
+ engine << rule {
55
+ forall {
56
+ has :Z, :u, :W
57
+ assuming :base
58
+ }
59
+ }
60
+ }
61
+
62
+ expect( &f ).to raise_error Wongi::Engine::DefinitionError
63
+
64
+ end
65
+
66
+ end
@@ -22,6 +22,19 @@ describe "NCC rule" do
22
22
  }
23
23
  end
24
24
 
25
+ def ncc_rule_post_has
26
+ rule('ncc post has') {
27
+ forall {
28
+ has "base", "is", :Base
29
+ none {
30
+ has :Base, 2, :X
31
+ has :X, 4, 5
32
+ }
33
+ has "base", "is", :Base2
34
+ }
35
+ }
36
+ end
37
+
25
38
  it 'should pass with a mismatching subchain' do
26
39
 
27
40
  engine << ncc_rule
@@ -60,6 +73,26 @@ describe "NCC rule" do
60
73
 
61
74
  end
62
75
 
76
+ it 'can handle an alpha node template introduced after the negative-conjunctive-condition' do
77
+
78
+ engine << ncc_rule_post_has
79
+
80
+ production = engine.productions['ncc post has']
81
+
82
+ engine << ["base", "is", 1]
83
+ engine << [1, 2, 3]
84
+ engine << [3, 4, 5]
85
+
86
+ expect( production ).to have(0).tokens
87
+
88
+ engine.retract [3, 4, 5]
89
+ expect( production ).to have(1).tokens
90
+
91
+ engine.retract ["base", "is", 1]
92
+ expect( production ).to have(0).tokens
93
+
94
+ end
95
+
63
96
  it 'should clean up correctly' do
64
97
 
65
98
  engine.rule :rule1 do
@@ -1,70 +1,105 @@
1
- require 'spec_helper'
2
-
3
- describe "negative rule" do
4
-
5
- before :each do
6
- @engine = Wongi::Engine.create
7
- end
8
-
9
- def engine
10
- @engine
11
- end
12
-
13
- it "should not introduce variables" do
14
-
15
- proc = lambda {
16
-
17
- engine << rule('one-option') {
18
- forall {
19
- neg :Foo, :bar, :_
20
- }
21
- make {
22
- action { |tokens|
23
- raise "This should never get executed #{tokens}"
24
- }
25
- }
26
- }
27
-
28
- }
29
-
30
- expect( &proc ).to raise_error( Wongi::Engine::DefinitionError )
31
-
32
- end
33
-
34
- # it "should not create infinite feedback loops by default" do
35
-
36
- # engine << rule('feedback') {
37
- # forall {
38
- # neg :a, :b, :_
39
- # }
40
- # make {
41
- # gen :a, :b, :c
42
- # }
43
- # }
44
-
45
- # engine.should have(1).facts
46
-
47
- # end
48
-
49
- it "should create infinite feedback loops with unsafe option" do
50
-
51
- counter = 0
52
- exception = Class.new( StandardError )
53
-
54
- proc = lambda {
55
- engine << rule('feedback') {
56
- forall {
57
- neg :a, :b, :_, unsafe: true
58
- }
59
- make {
60
- action { counter += 1 ; if counter > 5 then raise exception.new end }
61
- gen :a, :b, :c
62
- }
63
- }
64
- }
65
-
66
- expect( &proc ).to raise_error( exception )
67
-
68
- end
69
-
70
- end
1
+ require 'spec_helper'
2
+
3
+ describe "negative rule" do
4
+
5
+ before :each do
6
+ @engine = Wongi::Engine.create
7
+ end
8
+
9
+ def engine
10
+ @engine
11
+ end
12
+
13
+ it "should not introduce variables" do
14
+
15
+ proc = lambda {
16
+
17
+ engine << rule('one-option') {
18
+ forall {
19
+ neg :Foo, :bar, :_
20
+ }
21
+ make {
22
+ action { |tokens|
23
+ raise "This should never get executed #{tokens}"
24
+ }
25
+ }
26
+ }
27
+
28
+ }
29
+
30
+ expect( &proc ).to raise_error( Wongi::Engine::DefinitionError )
31
+
32
+ end
33
+
34
+ specify "variable example 1" do
35
+
36
+ prod = engine << rule {
37
+ forall {
38
+ has :x, :y, :Z
39
+ neg :a, :b, :Z
40
+ }
41
+ }
42
+
43
+ engine << [:x, :y, 1]
44
+ expect( prod ).to have(1).tokens
45
+
46
+ engine << [:a, :b, 1]
47
+ expect( prod ).to have(0).tokens
48
+
49
+ end
50
+
51
+ specify "variable example 1" do
52
+
53
+ prod = engine << rule {
54
+ forall {
55
+ has :x, :y, :Z
56
+ neg :a, :b, :Z
57
+ }
58
+ }
59
+
60
+ engine << [:a, :b, 1]
61
+ engine << [:x, :y, 1]
62
+ expect( prod ).to have(0).tokens
63
+
64
+ engine.retract [:a, :b, 1]
65
+ expect( prod ).to have(1).tokens
66
+
67
+ end
68
+
69
+ # it "should not create infinite feedback loops by default" do
70
+
71
+ # engine << rule('feedback') {
72
+ # forall {
73
+ # neg :a, :b, :_
74
+ # }
75
+ # make {
76
+ # gen :a, :b, :c
77
+ # }
78
+ # }
79
+
80
+ # engine.should have(1).facts
81
+
82
+ # end
83
+
84
+ it "should create infinite feedback loops with unsafe option" do
85
+
86
+ counter = 0
87
+ exception = Class.new( StandardError )
88
+
89
+ proc = lambda {
90
+ engine << rule('feedback') {
91
+ forall {
92
+ neg :a, :b, :_, unsafe: true
93
+ }
94
+ make {
95
+ action { counter += 1 ; if counter > 5 then raise exception.new end }
96
+ gen :a, :b, :c
97
+ }
98
+ }
99
+ }
100
+
101
+ expect( &proc ).to raise_error( exception )
102
+
103
+ end
104
+
105
+ end
data/spec/wme_spec.rb CHANGED
File without changes
data/wongi-engine.gemspec CHANGED
File without changes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wongi-engine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.16
4
+ version: 0.0.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Valeri Sokolov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-16 00:00:00.000000000 Z
11
+ date: 2015-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -115,6 +115,7 @@ files:
115
115
  - lib/wongi-engine/dsl/actions/statement_generator.rb
116
116
  - lib/wongi-engine/dsl/actions/trace_action.rb
117
117
  - lib/wongi-engine/dsl/any_rule.rb
118
+ - lib/wongi-engine/dsl/assuming.rb
118
119
  - lib/wongi-engine/dsl/dsl_builder.rb
119
120
  - lib/wongi-engine/dsl/dsl_extensions.rb
120
121
  - lib/wongi-engine/dsl/extension_clause.rb
@@ -142,6 +143,7 @@ files:
142
143
  - lib/wongi-engine/version.rb
143
144
  - lib/wongi-engine/wme.rb
144
145
  - lib/wongi-engine/wme_match_data.rb
146
+ - spec/beta_node_spec.rb
145
147
  - spec/bug_specs/issue_4_spec.rb
146
148
  - spec/dataset_spec.rb
147
149
  - spec/dsl_spec.rb
@@ -150,6 +152,7 @@ files:
150
152
  - spec/high_level_spec.rb
151
153
  - spec/rule_specs/any_rule_spec.rb
152
154
  - spec/rule_specs/assign_spec.rb
155
+ - spec/rule_specs/assuming_spec.rb
153
156
  - spec/rule_specs/maybe_rule_spec.rb
154
157
  - spec/rule_specs/ncc_spec.rb
155
158
  - spec/rule_specs/negative_rule_spec.rb
@@ -183,6 +186,7 @@ signing_key:
183
186
  specification_version: 4
184
187
  summary: A forward-chaining rule engine in pure Ruby.
185
188
  test_files:
189
+ - spec/beta_node_spec.rb
186
190
  - spec/bug_specs/issue_4_spec.rb
187
191
  - spec/dataset_spec.rb
188
192
  - spec/dsl_spec.rb
@@ -191,6 +195,7 @@ test_files:
191
195
  - spec/high_level_spec.rb
192
196
  - spec/rule_specs/any_rule_spec.rb
193
197
  - spec/rule_specs/assign_spec.rb
198
+ - spec/rule_specs/assuming_spec.rb
194
199
  - spec/rule_specs/maybe_rule_spec.rb
195
200
  - spec/rule_specs/ncc_spec.rb
196
201
  - spec/rule_specs/negative_rule_spec.rb