wongi-engine 0.0.16 → 0.0.17

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.
@@ -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