wongi-engine 0.3.5 → 0.3.7

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.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +80 -0
  4. data/.travis.yml +8 -15
  5. data/Gemfile +4 -0
  6. data/README.md +3 -3
  7. data/Rakefile +1 -2
  8. data/examples/ex01.rb +1 -1
  9. data/examples/ex02.rb +3 -7
  10. data/examples/graphviz.rb +1 -1
  11. data/examples/rdf.rb +1 -1
  12. data/examples/timeline.rb +6 -6
  13. data/lib/wongi-engine/alpha_memory.rb +5 -9
  14. data/lib/wongi-engine/beta/aggregate_node.rb +93 -0
  15. data/lib/wongi-engine/beta/assignment_node.rb +10 -18
  16. data/lib/wongi-engine/beta/beta_memory.rb +20 -9
  17. data/lib/wongi-engine/beta/beta_node.rb +14 -22
  18. data/lib/wongi-engine/beta/filter_node.rb +12 -15
  19. data/lib/wongi-engine/beta/join_node.rb +47 -61
  20. data/lib/wongi-engine/beta/ncc_node.rb +17 -20
  21. data/lib/wongi-engine/beta/ncc_partner.rb +17 -17
  22. data/lib/wongi-engine/beta/neg_node.rb +37 -37
  23. data/lib/wongi-engine/beta/optional_node.rb +53 -60
  24. data/lib/wongi-engine/beta/or_node.rb +6 -9
  25. data/lib/wongi-engine/beta/production_node.rb +6 -9
  26. data/lib/wongi-engine/beta.rb +1 -0
  27. data/lib/wongi-engine/compiler.rb +38 -22
  28. data/lib/wongi-engine/core_ext.rb +11 -20
  29. data/lib/wongi-engine/data_overlay.rb +23 -26
  30. data/lib/wongi-engine/dsl/action/assign_action.rb +1 -1
  31. data/lib/wongi-engine/dsl/action/base.rb +1 -4
  32. data/lib/wongi-engine/dsl/action/error_generator.rb +9 -9
  33. data/lib/wongi-engine/dsl/action/simple_action.rb +14 -10
  34. data/lib/wongi-engine/dsl/action/simple_collector.rb +10 -25
  35. data/lib/wongi-engine/dsl/action/statement_generator.rb +15 -14
  36. data/lib/wongi-engine/dsl/action/trace_action.rb +9 -9
  37. data/lib/wongi-engine/dsl/any_rule.rb +16 -20
  38. data/lib/wongi-engine/dsl/assuming.rb +8 -15
  39. data/lib/wongi-engine/dsl/builder.rb +13 -12
  40. data/lib/wongi-engine/dsl/clause/aggregate.rb +21 -0
  41. data/lib/wongi-engine/dsl/clause/assign.rb +4 -4
  42. data/lib/wongi-engine/dsl/clause/fact.rb +10 -6
  43. data/lib/wongi-engine/dsl/clause/gen.rb +3 -5
  44. data/lib/wongi-engine/dsl/clause/generic.rb +7 -9
  45. data/lib/wongi-engine/dsl/generated.rb +6 -12
  46. data/lib/wongi-engine/dsl/ncc_subrule.rb +6 -9
  47. data/lib/wongi-engine/dsl/query.rb +12 -15
  48. data/lib/wongi-engine/dsl/rule.rb +45 -50
  49. data/lib/wongi-engine/dsl.rb +30 -16
  50. data/lib/wongi-engine/enumerators.rb +2 -1
  51. data/lib/wongi-engine/error.rb +6 -7
  52. data/lib/wongi-engine/filter/asserting_test.rb +4 -7
  53. data/lib/wongi-engine/filter/equality_test.rb +15 -18
  54. data/lib/wongi-engine/filter/filter_test.rb +3 -6
  55. data/lib/wongi-engine/filter/greater_than_or_equal_test.rb +5 -2
  56. data/lib/wongi-engine/filter/greater_than_test.rb +15 -18
  57. data/lib/wongi-engine/filter/inequality_test.rb +15 -18
  58. data/lib/wongi-engine/filter/less_than_or_equal_test.rb +5 -2
  59. data/lib/wongi-engine/filter/less_than_test.rb +15 -18
  60. data/lib/wongi-engine/filter.rb +1 -1
  61. data/lib/wongi-engine/graph.rb +13 -20
  62. data/lib/wongi-engine/network/collectable.rb +10 -14
  63. data/lib/wongi-engine/network/debug.rb +16 -24
  64. data/lib/wongi-engine/network.rb +110 -129
  65. data/lib/wongi-engine/ruleset.rb +18 -20
  66. data/lib/wongi-engine/template.rb +31 -30
  67. data/lib/wongi-engine/token.rb +33 -33
  68. data/lib/wongi-engine/version.rb +1 -1
  69. data/lib/wongi-engine/wme.rb +17 -23
  70. data/lib/wongi-engine/wme_match_data.rb +5 -9
  71. data/lib/wongi-engine.rb +0 -4
  72. data/spec/action_class_spec.rb +43 -49
  73. data/spec/beta_node_spec.rb +2 -8
  74. data/spec/bug_specs/issue_4_spec.rb +12 -20
  75. data/spec/dataset_spec.rb +3 -6
  76. data/spec/filter_specs/assert_test_spec.rb +12 -31
  77. data/spec/filter_specs/greater_than_equality_test_spec.rb +2 -5
  78. data/spec/filter_specs/less_test_spec.rb +7 -17
  79. data/spec/filter_specs/less_than_equality_test_spec.rb +3 -6
  80. data/spec/generation_spec.rb +45 -54
  81. data/spec/high_level_spec.rb +95 -141
  82. data/spec/network_spec.rb +77 -68
  83. data/spec/overlay_spec.rb +4 -5
  84. data/spec/rule_specs/aggregate_spec.rb +197 -0
  85. data/spec/rule_specs/any_rule_spec.rb +73 -19
  86. data/spec/rule_specs/assign_spec.rb +10 -16
  87. data/spec/rule_specs/assuming_spec.rb +10 -17
  88. data/spec/rule_specs/maybe_rule_spec.rb +4 -15
  89. data/spec/rule_specs/ncc_spec.rb +48 -65
  90. data/spec/rule_specs/negative_rule_spec.rb +13 -27
  91. data/spec/rule_specs/or_rule_spec.rb +3 -13
  92. data/spec/ruleset_spec.rb +11 -17
  93. data/spec/simple_action_spec.rb +4 -14
  94. data/spec/wme_spec.rb +14 -21
  95. data/wongi-engine.gemspec +22 -22
  96. metadata +19 -41
  97. data/.hgignore +0 -7
  98. data/spec/dsl_spec.rb +0 -9
@@ -1,24 +1,23 @@
1
1
  module Wongi::Engine
2
-
3
2
  class Token
4
-
5
3
  include CoreExt
6
4
 
7
- attr_reader :children
8
- attr_reader :wme
9
- attr_reader :node
10
- attr_reader :overlay
5
+ attr_reader :children, :wme, :node, :overlay, :neg_join_results, :opt_join_results, :ncc_results, :generated_wmes
11
6
  attr_accessor :owner, :parent
12
- attr_reader :neg_join_results
13
- attr_reader :opt_join_results
14
- attr_reader :ncc_results
15
- attr_reader :generated_wmes
7
+
16
8
  attr_predicate :optional
17
9
  attr_predicate :deleted
18
10
 
19
- def initialize node, token, wme, assignments
20
- @node, @parent, @wme, @assignments = node, token, wme, assignments
21
- @overlay = wme ? wme.overlay.highest(token.overlay) : (token ? token.overlay : node.rete.default_overlay)
11
+ def initialize(node, token, wme, assignments)
12
+ @node = node
13
+ @parent = token
14
+ @wme = wme
15
+ @assignments = assignments
16
+ @overlay = if wme
17
+ wme.overlay.highest(token.overlay)
18
+ else
19
+ token ? token.overlay : node.rete.default_overlay
20
+ end
22
21
  @children = []
23
22
  @deleted = false
24
23
  @neg_join_results = []
@@ -36,10 +35,8 @@ module Wongi::Engine
36
35
  end
37
36
  end
38
37
 
39
- def subst variable, value
40
- if @assignments.has_key? variable
41
- @assignments[ variable ] = value
42
- end
38
+ def subst(variable, value)
39
+ @assignments[variable] = value if @assignments.key? variable
43
40
  end
44
41
 
45
42
  def set(variable, value)
@@ -50,19 +47,20 @@ module Wongi::Engine
50
47
  all_assignments
51
48
  end
52
49
 
53
- def [] var
54
- if a = assignments[ var ]
55
- a.respond_to?(:call) ? a.call( self ) : a
56
- end
50
+ def [](var)
51
+ a = assignments[var]
52
+ return unless a
53
+
54
+ a.respond_to?(:call) ? a.call(self) : a
57
55
  end
58
56
 
59
- def has_var? x
60
- assignments.has_key? x
57
+ def has_var?(x)
58
+ assignments.key? x
61
59
  end
62
60
 
63
- # TODO ignore assignments?
64
- def duplicate? other
65
- self.parent.equal?(other.parent) && @wme.equal?(other.wme) && self.assignments == other.assignments
61
+ # TODO: ignore assignments?
62
+ def duplicate?(other)
63
+ parent.equal?(other.parent) && @wme.equal?(other.wme) && assignments == other.assignments
66
64
  end
67
65
 
68
66
  def to_s
@@ -89,27 +87,30 @@ module Wongi::Engine
89
87
  end
90
88
 
91
89
  # for neg feedback loop protection
92
- def generated? wme
90
+ def generated?(wme)
93
91
  return true if generated_wmes.any? { |w| w == wme }
94
- return children.any? { |t| t.generated? wme }
92
+
93
+ children.any? { |t| t.generated? wme }
95
94
  end
96
95
 
97
96
  protected
98
97
 
99
98
  def all_assignments
100
- raise "Assignments is not a hash" unless @assignments.kind_of?( Hash )
99
+ raise "Assignments is not a hash" unless @assignments.is_a?(Hash)
100
+
101
101
  if @parent
102
102
  @parent.assignments.merge @assignments
103
103
  else
104
104
  @assignments
105
105
  end
106
106
  end
107
-
108
107
  end
109
108
 
110
109
  class FakeToken < Token
111
- def initialize token, wme, assignments
112
- @parent, @wme, @assignments = token, wme, assignments
110
+ def initialize(token, wme, assignments) # rubocop:disable Lint/MissingSuper
111
+ @parent = token
112
+ @wme = wme
113
+ @assignments = assignments
113
114
  @children = []
114
115
  @neg_join_results = []
115
116
  @opt_join_results = []
@@ -117,5 +118,4 @@ module Wongi::Engine
117
118
  @generated_wmes = []
118
119
  end
119
120
  end
120
-
121
121
  end
@@ -1,5 +1,5 @@
1
1
  module Wongi
2
2
  module Engine
3
- VERSION = "0.3.5"
3
+ VERSION = "0.3.7".freeze
4
4
  end
5
5
  end
@@ -1,7 +1,5 @@
1
1
  module Wongi::Engine
2
-
3
- WME = Struct.new( :subject, :predicate, :object ) do
4
-
2
+ WME = Struct.new(:subject, :predicate, :object) do
5
3
  include CoreExt
6
4
 
7
5
  attr_reader :rete
@@ -9,11 +7,11 @@ module Wongi::Engine
9
7
  attr_reader :generating_tokens
10
8
  attr_reader :neg_join_results, :opt_join_results
11
9
  attr_accessor :overlay
10
+
12
11
  attr_predicate :deleted
13
12
  attr_predicate :manual
14
13
 
15
- def initialize s, p, o, r = nil
16
-
14
+ def initialize(s, p, o, r = nil)
17
15
  manual!
18
16
 
19
17
  @deleted = false
@@ -24,35 +22,33 @@ module Wongi::Engine
24
22
 
25
23
  @rete = r
26
24
 
27
- # TODO: reintroduce Network#import when bringing back RDF support
28
- super( s, p, o )
29
-
25
+ # TODO: reintroduce Network#import when bringing back RDF support
26
+ super(s, p, o)
30
27
  end
31
28
 
32
- def import_into r
33
- self.class.new( subject, predicate, object, r ).tap do |wme|
29
+ def import_into(r)
30
+ self.class.new(subject, predicate, object, r).tap do |wme|
34
31
  wme.overlay = overlay
35
- wme.manual = self.manual?
32
+ wme.manual = manual?
36
33
  end
37
34
  end
38
35
 
39
36
  def dup
40
- self.class.new( subject, predicate, object, rete ).tap do |wme|
37
+ self.class.new(subject, predicate, object, rete).tap do |wme|
41
38
  wme.overlay = overlay
42
- wme.manual = self.manual?
39
+ wme.manual = manual?
43
40
  end
44
41
  end
45
42
 
46
- def == other
43
+ def ==(other)
47
44
  subject == other.subject && predicate == other.predicate && object == other.object
48
45
  end
49
46
 
50
- def =~ template
51
- raise Wongi::Engine::Error, "Cannot match a WME against a #{template.class}" unless Template === template
52
- result = match_member( self.subject, template.subject ) & match_member( self.predicate, template.predicate ) & match_member( self.object, template.object )
53
- if result.match?
54
- result
55
- end
47
+ def =~(template)
48
+ raise Wongi::Engine::Error, "Cannot match a WME against a #{template.class}" unless template.is_a?(Template)
49
+
50
+ result = match_member(subject, template.subject) & match_member(predicate, template.predicate) & match_member(object, template.object)
51
+ result if result.match?
56
52
  end
57
53
 
58
54
  def generated?
@@ -73,7 +69,7 @@ module Wongi::Engine
73
69
 
74
70
  protected
75
71
 
76
- def match_member mine, theirs
72
+ def match_member(mine, theirs)
77
73
  result = WMEMatchData.new
78
74
  if theirs == :_ || mine == theirs
79
75
  result.match!
@@ -83,7 +79,5 @@ module Wongi::Engine
83
79
  end
84
80
  result
85
81
  end
86
-
87
82
  end
88
-
89
83
  end
@@ -1,19 +1,17 @@
1
1
  module Wongi::Engine
2
-
3
2
  class WMEMatchData
4
-
5
3
  attr_reader :assignments
6
4
 
7
- def initialize assignments = { }, match = false
5
+ def initialize(assignments = {}, match = false)
8
6
  @assignments = assignments
9
7
  @match = match
10
8
  end
11
9
 
12
- def [] key
10
+ def [](key)
13
11
  assignments[key]
14
12
  end
15
13
 
16
- def []= key, value
14
+ def []=(key, value)
17
15
  assignments[key] = value
18
16
  end
19
17
 
@@ -25,10 +23,8 @@ module Wongi::Engine
25
23
  @match = true
26
24
  end
27
25
 
28
- def & other
29
- WMEMatchData.new( assignments.merge( other.assignments ), match? && other.match? )
26
+ def &(other)
27
+ WMEMatchData.new(assignments.merge(other.assignments), match? && other.match?)
30
28
  end
31
-
32
29
  end
33
-
34
30
  end
data/lib/wongi-engine.rb CHANGED
@@ -1,19 +1,15 @@
1
1
  module Wongi
2
2
  module Engine
3
-
4
3
  def self.create
5
4
  Network.new
6
5
  end
7
-
8
6
  end
9
7
 
10
8
  # pre-declare things to avoid undefined constants
11
9
  module RDF
12
-
13
10
  class Document; end
14
11
  class Statement; end
15
12
  class Node; end
16
-
17
13
  end
18
14
  end
19
15
 
@@ -1,62 +1,56 @@
1
1
  require 'spec_helper'
2
2
 
3
-
4
3
  describe 'action classes' do
5
-
6
- include Wongi::Engine::DSL
4
+ include Wongi::Engine::DSL
7
5
 
8
6
  let :engine do
9
- Wongi::Engine.create
7
+ Wongi::Engine.create
10
8
  end
11
9
 
12
10
  let :action_class do
13
- Class.new do
14
- class << self
15
- attr_accessor :execute_body
16
- attr_accessor :deexecute_body
17
- end
18
-
19
- def execute(token)
20
- self.class.execute_body.call(token)
21
- end
22
-
23
- def deexecute(token)
24
- self.class.deexecute_body.call(token)
25
- end
26
- end
11
+ Class.new do
12
+ class << self
13
+ attr_accessor :execute_body, :deexecute_body
14
+ end
15
+
16
+ def execute(token)
17
+ self.class.execute_body.call(token)
18
+ end
19
+
20
+ def deexecute(token)
21
+ self.class.deexecute_body.call(token)
22
+ end
23
+ end
27
24
  end
28
25
 
29
26
  it 'should have appropriate callbacks executed' do
30
-
31
- executed = 0
32
- deexecuted = 0
33
-
34
- klass = action_class
35
-
36
- klass.execute_body = lambda do |token|
37
- executed += 1
38
- end
39
- klass.deexecute_body = lambda do |token|
40
- deexecuted += 1
41
- end
42
-
43
- engine << rule {
44
- forall {
45
- has :A, :x, :B
46
- }
47
- make {
48
- action klass
49
- }
50
- }
51
-
52
- engine << [1, :x, 2]
53
- expect(executed).to be == 1
54
- expect(deexecuted).to be == 0
55
-
56
- engine.retract [1, :x, 2]
57
- expect(executed).to be == 1
58
- expect(deexecuted).to be == 1
59
-
27
+ executed = 0
28
+ deexecuted = 0
29
+
30
+ klass = action_class
31
+
32
+ klass.execute_body = lambda do |_token|
33
+ executed += 1
34
+ end
35
+ klass.deexecute_body = lambda do |_token|
36
+ deexecuted += 1
37
+ end
38
+
39
+ engine << rule {
40
+ forall {
41
+ has :A, :x, :B
42
+ }
43
+ make {
44
+ action klass
45
+ }
46
+ }
47
+
48
+ engine << [1, :x, 2]
49
+ expect(executed).to be == 1
50
+ expect(deexecuted).to be == 0
51
+
52
+ engine.retract [1, :x, 2]
53
+ expect(executed).to be == 1
54
+ expect(deexecuted).to be == 1
60
55
  end
61
-
62
56
  end
@@ -1,15 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Wongi::Engine::BetaNode do
4
-
5
4
  include Wongi::Engine::DSL
6
5
 
7
- let( :engine ) { Wongi::Engine.create }
6
+ let(:engine) { Wongi::Engine.create }
8
7
 
9
8
  describe '#tokens' do
10
-
11
9
  it 'should be enumerable' do
12
-
13
10
  production = engine << rule {
14
11
  forall {
15
12
  has :x, :y, :Z
@@ -20,10 +17,7 @@ describe Wongi::Engine::BetaNode do
20
17
  engine << [:x, :y, 2]
21
18
  engine << [:x, :y, 3]
22
19
  zs = production.tokens.map { |token| token[:Z] }
23
- expect( zs ).to be == [1, 2, 3]
24
-
20
+ expect(zs).to be == [1, 2, 3]
25
21
  end
26
-
27
22
  end
28
-
29
23
  end
@@ -1,12 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe "issue 4" do
4
-
5
4
  it "should correctly retract pre-added items from within a rule" do
6
-
7
5
  engine = Wongi::Engine.create
8
6
 
9
- 10.times{ |i| engine << [i, :is_number, true] }
7
+ 10.times { |i| engine << [i, :is_number, true] }
10
8
 
11
9
  engine.rule 'segregate' do
12
10
  forall {
@@ -26,11 +24,9 @@ describe "issue 4" do
26
24
 
27
25
  expect(numbers).to be_empty
28
26
  expect(evens.length).to eq(10)
29
-
30
27
  end
31
28
 
32
29
  it "should correctly retract post-added items from within a rule" do
33
-
34
30
  engine = Wongi::Engine.create
35
31
 
36
32
  engine.rule 'segregate' do
@@ -46,22 +42,20 @@ describe "issue 4" do
46
42
  }
47
43
  end
48
44
 
49
- 10.times{ |i| engine << [i, :is_number, true] }
45
+ 10.times { |i| engine << [i, :is_number, true] }
50
46
 
51
47
  numbers = engine.select :_, :is_number, true
52
48
  evens = engine.select :_, :is_even, true
53
49
 
54
50
  expect(numbers).to be_empty
55
51
  expect(evens.length).to eq(10)
56
-
57
52
  end
58
53
 
59
54
  # cascaded processing affects this
60
55
  it "should not retract later items from within a rule" do
61
-
62
56
  engine = Wongi::Engine.create
63
57
 
64
- 10.times{ |i| engine << [i, :is_number, true] }
58
+ 10.times { |i| engine << [i, :is_number, true] }
65
59
 
66
60
  engine.rule 'segregate' do
67
61
  forall {
@@ -70,7 +64,7 @@ describe "issue 4" do
70
64
  make {
71
65
  action { |token|
72
66
  number = token[:Number]
73
- if number % 2 == 0
67
+ if number.even?
74
68
  engine << [number, :is_even, true]
75
69
  engine.retract [number, :is_number, true]
76
70
  engine.retract [number + 1, :is_number, true]
@@ -89,14 +83,12 @@ describe "issue 4" do
89
83
  expect(numbers).to be_empty
90
84
  expect(evens).to have(5).items
91
85
  expect(odds).to have(5).items
92
-
93
86
  end
94
87
 
95
-
96
88
  it "should not lose track when another rule affects a set" do
97
89
  engine = Wongi::Engine.create
98
90
 
99
- 10.times{ |i| engine << [i, :is_number, true] }
91
+ 10.times { |i| engine << [i, :is_number, true] }
100
92
 
101
93
  engine.rule 'find odds' do
102
94
  forall {
@@ -106,7 +98,7 @@ describe "issue 4" do
106
98
  make {
107
99
  action { |token|
108
100
  number = token[:Number]
109
- if number % 2 != 0
101
+ if number.odd?
110
102
  engine << [number, :is_odd, true]
111
103
  engine.retract [number, :is_number, true]
112
104
  end
@@ -121,11 +113,11 @@ describe "issue 4" do
121
113
  make {
122
114
  action { |token|
123
115
  number = token[:Number]
124
- if number % 2 == 0
125
- engine << [number, :is_even, true]
126
- else
127
- engine << [number, :probably_odd, true]
128
- end
116
+ engine << if number.even?
117
+ [number, :is_even, true]
118
+ else
119
+ [number, :probably_odd, true]
120
+ end
129
121
  }
130
122
  }
131
123
  end
@@ -134,7 +126,7 @@ describe "issue 4" do
134
126
  evens = engine.select :_, :is_even, true
135
127
  odds = engine.select :_, :is_odd, true
136
128
 
137
- # numbers.should be_empty
129
+ expect(numbers.length).to eq(5)
138
130
  expect(evens.length).to eq(5)
139
131
  expect(odds.length).to eq(5)
140
132
  end
data/spec/dataset_spec.rb CHANGED
@@ -1,9 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Wongi::Engine::Network do
4
-
3
+ describe Wongi::Engine::Network do
4
+ include Wongi::Engine::DSL
5
5
  it 'should expose compiled productions' do
6
-
7
6
  ds = Wongi::Engine::Network.new
8
7
 
9
8
  ds << rule('test-rule') {
@@ -20,8 +19,6 @@ describe Wongi::Engine::Network do
20
19
  ds << [1, 2, 3]
21
20
 
22
21
  expect(production.size).to eq(1)
23
- expect( production.size ).to be == 1
24
-
22
+ expect(production.size).to be == 1
25
23
  end
26
-
27
24
  end
@@ -1,53 +1,40 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe "ASSERT test" do
4
+ include Wongi::Engine::DSL
5
+ let(:engine) { Wongi::Engine.create }
4
6
 
5
- before :each do
6
- @engine = Wongi::Engine.create
7
- end
8
-
9
- def engine
10
- @engine
11
- end
12
-
13
- def production
14
- @production
15
- end
7
+ attr_reader :production
16
8
 
17
- def test_rule &block
18
- @production = ( engine << rule( 'test-rule', &block ) )
9
+ def test_rule(&block)
10
+ @production = (engine << rule('test-rule', &block))
19
11
  end
20
12
 
21
13
  it "should pass with a constant 'true'" do
22
-
23
14
  test_rule {
24
15
  forall {
25
- assert { |token|
16
+ assert { |_token|
26
17
  true
27
18
  }
28
19
  }
29
20
  }
30
21
 
31
22
  expect(production).to have(1).token
32
-
33
23
  end
34
24
 
35
25
  it "should fail with a constant 'false'" do
36
-
37
26
  test_rule {
38
27
  forall {
39
- assert { |token|
28
+ assert { |_token|
40
29
  false
41
30
  }
42
31
  }
43
32
  }
44
33
 
45
34
  expect(production).to have(0).tokens
46
-
47
35
  end
48
36
 
49
37
  it "should use the token with no arguments" do
50
-
51
38
  test_rule {
52
39
  forall {
53
40
  has :X, "is", :Y
@@ -57,15 +44,13 @@ describe "ASSERT test" do
57
44
  }
58
45
  }
59
46
 
60
- engine << ["resistance", "is", "futile"]
47
+ engine << %w[resistance is futile]
61
48
 
62
49
  expect(production).to have(1).token
63
50
  expect(production.tokens.first[:X]).to eq("resistance")
64
-
65
51
  end
66
52
 
67
53
  it "should be retractable" do
68
-
69
54
  test_rule {
70
55
  forall {
71
56
  has :X, "is", :Y
@@ -75,28 +60,24 @@ describe "ASSERT test" do
75
60
  }
76
61
  }
77
62
 
78
- engine << ["resistance", "is", "futile"]
79
- engine.retract ["resistance", "is", "futile"]
63
+ engine << %w[resistance is futile]
64
+ engine.retract %w[resistance is futile]
80
65
  expect(production).to have(0).tokens
81
-
82
66
  end
83
67
 
84
68
  it "should use individual variables with arguments" do
85
-
86
69
  test_rule {
87
70
  forall {
88
71
  has :X, "is", :Y
89
- assert :X, :Y do |x, y|
72
+ assert :X, :Y do |_x, y|
90
73
  y == "futile"
91
74
  end
92
75
  }
93
76
  }
94
77
 
95
- engine << ["resistance", "is", "futile"]
78
+ engine << %w[resistance is futile]
96
79
 
97
80
  expect(production).to have(1).token
98
81
  expect(production.tokens.first[:X]).to eq("resistance")
99
-
100
82
  end
101
-
102
83
  end
@@ -3,11 +3,8 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe 'Greater Than Or Equal test' do
6
- before :each do
7
- @engine = Wongi::Engine.create
8
- end
9
-
10
- attr_reader :engine
6
+ include Wongi::Engine::DSL
7
+ let(:engine) { Wongi::Engine.create }
11
8
 
12
9
  attr_reader :production
13
10