sequitur 0.1.23 → 0.1.24

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.
@@ -7,98 +7,98 @@ require_relative '../../lib/sequitur/production'
7
7
  require_relative '../../lib/sequitur/production_ref'
8
8
 
9
9
  module Sequitur # Re-open the module to get rid of qualified names
10
- describe ProductionRef do
11
- let(:target) { Production.new }
12
- let(:another_target) { Production.new }
13
-
14
- subject { ProductionRef.new(target) }
15
-
16
- context 'Creation & initialization:' do
17
- it 'should be created with a production argument' do
18
- expect { ProductionRef.new(target) }.not_to raise_error
19
- expect(target.refcount).to eq(1)
20
- end
21
-
22
- it 'should clone with reference count incrementing' do
23
- expect(target.refcount).to eq(0)
24
- expect(subject.production.refcount).to eq(1)
25
- klone = subject.clone
26
- expect(klone.production.refcount).to eq(2)
27
- duplicate = subject.dup
28
- expect(duplicate.production.refcount).to eq(3)
29
- end
30
-
31
- it 'should know its referenced production' do
32
- instance = ProductionRef.new(target)
33
- expect(instance.production).to eq(target)
34
- end
35
- end # context
36
-
37
- context 'Provided services:' do
38
- it 'should render its referenced production' do
39
- expect(subject.to_s).to eq(target.object_id.to_s)
40
- end
41
-
42
- it 'should unbind itself from its production' do
43
- expect(target.refcount).to eq(0)
44
- expect(subject).not_to be_unbound
45
- expect(target.refcount).to eq(1)
46
- subject.unbind
47
- expect(target.refcount).to eq(0)
48
- expect(subject.production).to be_nil
49
- expect(subject).to be_unbound
50
- end
51
-
52
- it 'should bind to a production' do
53
- expect(target.refcount).to eq(0)
54
-
55
- expect(subject).not_to be_unbound
56
- expect(target.refcount).to eq(1)
57
-
58
- # Case: bind again to same production
59
- expect { subject.bind_to(target) }.not_to raise_error
60
- expect(target.refcount).to eq(1)
61
-
62
- # Case: bind to another production
63
- expect(another_target.refcount).to eq(0)
64
- subject.bind_to(another_target)
65
- expect(target.refcount).to eq(0)
66
- expect(another_target.refcount).to eq(1)
67
- end
68
-
69
- it 'should complain when binding to something else than production' do
70
- subject.bind_to(target)
71
- msg = 'Illegal production type String'
72
- expect { subject.bind_to('WRONG') }.to raise_error(StandardError, msg)
73
- end
74
-
75
- it 'should compare to other production (reference)' do
76
- same = ProductionRef.new(target)
77
- expect(subject).to eq(subject) # Strict identity
78
- expect(subject).to eq(same) # 2 references pointing to same production
79
- expect(subject).to eq(target)
80
- end
81
-
82
- it 'should return the hash value of its production' do
83
- expectation = target.hash
84
- expect(subject.hash).to eq(expectation)
85
- end
86
-
87
- it 'should complain when requested for a hash and unbound' do
88
- subject.unbind
89
- expect { subject.hash }.to raise_error(StandardError)
90
- end
91
-
92
- it 'should accept a visitor' do
93
- # Use a mock visitor
94
- fake = double('fake_visitor')
95
-
96
- # Visitor should receive a visit message
97
- expect(fake).to receive(:visit_prod_ref).once
98
- expect { subject.accept(fake) }.not_to raise_error
99
- end
100
- end # context
101
- end # describe
10
+ describe ProductionRef do
11
+ let(:target) { Production.new }
12
+ let(:another_target) { Production.new }
13
+
14
+ subject { ProductionRef.new(target) }
15
+
16
+ context 'Creation & initialization:' do
17
+ it 'should be created with a production argument' do
18
+ expect { ProductionRef.new(target) }.not_to raise_error
19
+ expect(target.refcount).to eq(1)
20
+ end
21
+
22
+ it 'should clone with reference count incrementing' do
23
+ expect(target.refcount).to eq(0)
24
+ expect(subject.production.refcount).to eq(1)
25
+ klone = subject.clone
26
+ expect(klone.production.refcount).to eq(2)
27
+ duplicate = subject.dup
28
+ expect(duplicate.production.refcount).to eq(3)
29
+ end
30
+
31
+ it 'should know its referenced production' do
32
+ instance = ProductionRef.new(target)
33
+ expect(instance.production).to eq(target)
34
+ end
35
+ end # context
36
+
37
+ context 'Provided services:' do
38
+ it 'should render its referenced production' do
39
+ expect(subject.to_s).to eq(target.object_id.to_s)
40
+ end
41
+
42
+ it 'should unbind itself from its production' do
43
+ expect(target.refcount).to eq(0)
44
+ expect(subject).not_to be_unbound
45
+ expect(target.refcount).to eq(1)
46
+ subject.unbind
47
+ expect(target.refcount).to eq(0)
48
+ expect(subject.production).to be_nil
49
+ expect(subject).to be_unbound
50
+ end
51
+
52
+ it 'should bind to a production' do
53
+ expect(target.refcount).to eq(0)
54
+
55
+ expect(subject).not_to be_unbound
56
+ expect(target.refcount).to eq(1)
57
+
58
+ # Case: bind again to same production
59
+ expect { subject.bind_to(target) }.not_to raise_error
60
+ expect(target.refcount).to eq(1)
61
+
62
+ # Case: bind to another production
63
+ expect(another_target.refcount).to eq(0)
64
+ subject.bind_to(another_target)
65
+ expect(target.refcount).to eq(0)
66
+ expect(another_target.refcount).to eq(1)
67
+ end
68
+
69
+ it 'should complain when binding to something else than production' do
70
+ subject.bind_to(target)
71
+ msg = 'Illegal production type String'
72
+ expect { subject.bind_to('WRONG') }.to raise_error(StandardError, msg)
73
+ end
74
+
75
+ it 'should compare to other production (reference)' do
76
+ same = ProductionRef.new(target)
77
+ expect(subject).to eq(subject) # Strict identity
78
+ expect(subject).to eq(same) # 2 references pointing to same production
79
+ expect(subject).to eq(target)
80
+ end
81
+
82
+ it 'should return the hash value of its production' do
83
+ expectation = target.hash
84
+ expect(subject.hash).to eq(expectation)
85
+ end
86
+
87
+ it 'should complain when requested for a hash and unbound' do
88
+ subject.unbind
89
+ expect { subject.hash }.to raise_error(StandardError)
90
+ end
91
+
92
+ it 'should accept a visitor' do
93
+ # Use a mock visitor
94
+ fake = double('fake_visitor')
95
+
96
+ # Visitor should receive a visit message
97
+ expect(fake).to receive(:visit_prod_ref).once
98
+ expect { subject.accept(fake) }.not_to raise_error
99
+ end
100
+ end # context
101
+ end # describe
102
102
  end # module
103
103
 
104
104
  # End of file
@@ -5,22 +5,26 @@ require_relative '../spec_helper'
5
5
  # Load the class under test
6
6
  require_relative '../../lib/sequitur/production'
7
7
 
8
- module Sequitur # Re-open the module to get rid of qualified names
9
- describe Production do
8
+ describe Sequitur::Production do
9
+ # Factory method. Returns a Sequitur::Production
10
+ def make_production
11
+ Sequitur::Production.new
12
+ end
13
+
10
14
  # Helper method: convert list of digrams into an array
11
15
  # of symbol couples.
12
- def to_symbols(theDigrams)
13
- return theDigrams.map(&:symbols)
16
+ def to_symbols(digrams)
17
+ digrams.map(&:symbols)
14
18
  end
15
19
 
16
20
  let(:p_a) do
17
- instance = Production.new
18
- instance.append_symbol(:a)
19
- instance
21
+ instance = make_production
22
+ instance.append_symbol(:a)
23
+ instance
20
24
  end
21
25
 
22
26
  let(:p_bc) do
23
- instance = Production.new
27
+ instance = make_production
24
28
  instance.append_symbol('b')
25
29
  instance.append_symbol('c')
26
30
  instance
@@ -28,7 +32,7 @@ describe Production do
28
32
 
29
33
  context 'Creation & initialization:' do
30
34
  it 'should be created without argument' do
31
- expect { Production.new }.not_to raise_error
35
+ expect { make_production }.not_to raise_error
32
36
  end
33
37
 
34
38
  it 'should not referenced yet' do
@@ -52,11 +56,11 @@ describe Production do
52
56
  end
53
57
 
54
58
  it 'should compare to a production reference' do
55
- ref_a = ProductionRef.new(p_a)
59
+ ref_a = Sequitur::ProductionRef.new(p_a)
56
60
  expect(p_a).to eq(ref_a)
57
61
  expect(p_bc).not_to eq(ref_a)
58
62
 
59
- ref_bc = ProductionRef.new(p_bc)
63
+ ref_bc = Sequitur::ProductionRef.new(p_bc)
60
64
  expect(p_a).not_to eq(ref_bc)
61
65
  expect(p_bc).to eq(ref_bc)
62
66
  end
@@ -78,13 +82,11 @@ describe Production do
78
82
  expect(subject.references).to eq([p_a])
79
83
  expect(subject.references_of(p_a).map(&:production)).to eq([p_a])
80
84
 
81
-
82
85
  # Case 3: production with repeated references
83
86
  subject.append_symbol(p_a) # second time
84
87
  expect(subject.references).to eq([p_a, p_a])
85
88
  expect(subject.references_of(p_a).map(&:production)).to eq([p_a, p_a])
86
89
 
87
-
88
90
  # Case 4: production with multiple distinct references
89
91
  subject.append_symbol(p_bc)
90
92
  expect(subject.references).to eq([p_a, p_a, p_bc])
@@ -138,7 +140,7 @@ describe Production do
138
140
 
139
141
  it 'should append a production ref in its rhs' do
140
142
  # Side-effect: refcount of production to append is incremented
141
- ref_a = ProductionRef.new(p_a)
143
+ ref_a = Sequitur::ProductionRef.new(p_a)
142
144
  expect(p_a.refcount).to be(1)
143
145
 
144
146
  input = [ref_a, :b, :c, :d, ref_a] # ref_a appears twice
@@ -157,7 +159,7 @@ describe Production do
157
159
 
158
160
  it 'should complain when appending ref to nil production' do
159
161
  # Side-effect: refcount of production to append is incremented
160
- ref_a = ProductionRef.new(p_a)
162
+ ref_a = Sequitur::ProductionRef.new(p_a)
161
163
  expect(p_a.refcount).to be(1)
162
164
 
163
165
  # Unbind the reference
@@ -167,7 +169,6 @@ describe Production do
167
169
  end
168
170
  end # context
169
171
 
170
-
171
172
  context 'Text representation of a production rule:' do
172
173
  it 'should emit minimal text when empty' do
173
174
  expectation = "#{subject.object_id} : ."
@@ -175,7 +176,7 @@ describe Production do
175
176
  end
176
177
 
177
178
  it 'should emit its text representation' do
178
- instance = Production.new
179
+ instance = make_production
179
180
  symbols = [:a, :b, 'c', :d, :e, 1000, instance]
180
181
  symbols.each { |symb| subject.append_symbol(symb) }
181
182
  expectation = +"#{subject.object_id} : "
@@ -204,17 +205,17 @@ describe Production do
204
205
 
205
206
  it 'should detect any repetition pattern' do
206
207
  # Positive cases
207
- cases = %w(abab abcdab abcdcd abcdefcd)
208
+ cases = %w[abab abcdab abcdcd abcdefcd]
208
209
  cases.each do |word|
209
- instance = Production.new
210
+ instance = make_production
210
211
  word.each_char { |symb| instance.append_symbol(symb) }
211
212
  expect(instance.repeated_digram?).to be_truthy
212
213
  end
213
214
 
214
215
  # Negative cases
215
- cases = %w(abc abb abba abcdef)
216
+ cases = %w[abc abb abba abcdef]
216
217
  cases.each do |word|
217
- instance = Production.new
218
+ instance = make_production
218
219
  word.each_char { |symb| instance.append_symbol(symb) }
219
220
  expect(instance.repeated_digram?).to be_falsey
220
221
  end
@@ -228,9 +229,8 @@ describe Production do
228
229
  expect(p_bc.refcount).to eq(0)
229
230
  end
230
231
 
231
-
232
232
  it 'should replace two-symbol sequence' do
233
- %w(a b c d e b c e).each { |symb| subject.append_symbol(symb) }
233
+ %w[a b c d e b c e].each { |symb| subject.append_symbol(symb) }
234
234
  p_bc_before = p_bc.to_string
235
235
  subject.reduce_step(p_bc)
236
236
 
@@ -240,9 +240,8 @@ describe Production do
240
240
  expect(p_bc.to_string).to eq(p_bc_before)
241
241
  end
242
242
 
243
-
244
243
  it 'should replace a starting two-symbol sequence' do
245
- %w(b c d e b c e).each { |symb| subject.append_symbol(symb) }
244
+ %w[b c d e b c e].each { |symb| subject.append_symbol(symb) }
246
245
  subject.reduce_step(p_bc)
247
246
 
248
247
  expect(subject.rhs.size).to eq(5)
@@ -250,9 +249,8 @@ describe Production do
250
249
  expect(p_bc.refcount).to eq(2)
251
250
  end
252
251
 
253
-
254
252
  it 'should replace an ending two-symbol sequence' do
255
- %w(a b c d e b c).each { |symb| subject.append_symbol(symb) }
253
+ %w[a b c d e b c].each { |symb| subject.append_symbol(symb) }
256
254
  subject.reduce_step(p_bc)
257
255
 
258
256
  expect(subject.rhs.size).to eq(5)
@@ -261,7 +259,7 @@ describe Production do
261
259
  end
262
260
 
263
261
  it 'should replace two consecutive two-symbol sequences' do
264
- %w(a b c b c d).each { |symb| subject.append_symbol(symb) }
262
+ %w[a b c b c d].each { |symb| subject.append_symbol(symb) }
265
263
  subject.reduce_step(p_bc)
266
264
 
267
265
  expect(subject.rhs.size).to eq(4)
@@ -282,18 +280,17 @@ describe Production do
282
280
 
283
281
  subject.derive_step(p_bc)
284
282
  expect(subject.rhs.size).to eq(3)
285
- expect(subject.rhs).to eq(%w(b c d))
283
+ expect(subject.rhs).to eq(%w[b c d])
286
284
  expect(p_bc.refcount).to eq(0)
287
285
  end
288
286
 
289
-
290
287
  it 'should replace a production at the end' do
291
288
  ['d', p_bc].each { |symb| subject.append_symbol(symb) }
292
289
  expect(p_bc.refcount).to eq(1)
293
290
  subject.derive_step(p_bc)
294
291
 
295
292
  expect(subject.rhs.size).to eq(3)
296
- expect(subject.rhs).to eq(%w(d b c))
293
+ expect(subject.rhs).to eq(%w[d b c])
297
294
  expect(p_bc.refcount).to eq(0)
298
295
  end
299
296
 
@@ -302,7 +299,7 @@ describe Production do
302
299
  subject.derive_step(p_bc)
303
300
 
304
301
  expect(subject.rhs.size).to eq(2)
305
- expect(subject.rhs).to eq(%w(b c))
302
+ expect(subject.rhs).to eq(%w[b c])
306
303
  end
307
304
 
308
305
  it 'should replace a production in the middle' do
@@ -310,7 +307,7 @@ describe Production do
310
307
  subject.derive_step(p_bc)
311
308
 
312
309
  expect(subject.rhs.size).to eq(4)
313
- expect(subject.rhs).to eq(%w(a b c d))
310
+ expect(subject.rhs).to eq(%w[a b c d])
314
311
  end
315
312
  end # context
316
313
 
@@ -358,6 +355,5 @@ describe Production do
358
355
  end
359
356
  end # context
360
357
  end # describe
361
- end # module
362
358
 
363
359
  # End of file
@@ -5,20 +5,24 @@ require_relative '../spec_helper'
5
5
  # Load the class under test
6
6
  require_relative '../../lib/sequitur/sequitur_grammar'
7
7
 
8
- module Sequitur # Re-open the module to get rid of qualified names
9
- describe SequiturGrammar do
8
+ describe Sequitur::SequiturGrammar do
9
+ # Factory method. Returns a SequiturGrammar
10
+ def sequitur_grammar(enumerator)
11
+ Sequitur::SequiturGrammar.new(enumerator)
12
+ end
13
+
10
14
  # Factory method. Returns an empty enumerator (
11
15
  # i.e. without elements to iterate)
12
16
  def empty_enum
13
- return [].to_enum
17
+ [].to_enum
14
18
  end
15
19
 
16
20
  context 'Creation from an enumeration of tokens:' do
17
21
  it 'could be created with an empty enumerator' do
18
- expect { SequiturGrammar.new(empty_enum) }.not_to raise_error
22
+ expect { sequitur_grammar(empty_enum) }.not_to raise_error
19
23
 
20
24
  # Creation
21
- instance = SequiturGrammar.new(empty_enum)
25
+ instance = sequitur_grammar(empty_enum)
22
26
 
23
27
  # Initialization
24
28
  expect(instance.productions.size).to eq(1)
@@ -28,7 +32,7 @@ describe SequiturGrammar do
28
32
 
29
33
  it 'could be created with single token' do
30
34
  # Creation
31
- instance = SequiturGrammar.new([:a].to_enum)
35
+ instance = sequitur_grammar([:a].to_enum)
32
36
 
33
37
  # Initialization
34
38
  expect(instance.productions.size).to eq(1)
@@ -38,7 +42,7 @@ describe SequiturGrammar do
38
42
 
39
43
  it 'could be created with multiple unique tokens' do
40
44
  # Creation
41
- instance = SequiturGrammar.new(%i[a b c d].to_enum)
45
+ instance = sequitur_grammar(%i[a b c d].to_enum)
42
46
 
43
47
  # Initialization
44
48
  expect(instance.productions.size).to eq(1)
@@ -47,7 +51,7 @@ describe SequiturGrammar do
47
51
  end
48
52
 
49
53
  it 'could be created with a repeating digram' do
50
- instance = SequiturGrammar.new(%i[a b a b].to_enum)
54
+ instance = sequitur_grammar(%i[a b a b].to_enum)
51
55
 
52
56
  # Expectations:
53
57
  # S : A A.
@@ -59,7 +63,7 @@ describe SequiturGrammar do
59
63
  end
60
64
 
61
65
  it 'should enforce the utility rule' do
62
- instance = SequiturGrammar.new(%i[a b c a b c].to_enum)
66
+ instance = sequitur_grammar(%i[a b c a b c].to_enum)
63
67
 
64
68
  # Expectations without utility rule:
65
69
  # S : B B.
@@ -79,15 +83,14 @@ describe SequiturGrammar do
79
83
  input = 'aaac' # This sequence raised an exception
80
84
 
81
85
  # Creation
82
- expect { SequiturGrammar.new(input.chars) }.not_to raise_error
86
+ expect { sequitur_grammar(input.chars) }.not_to raise_error
83
87
  end
84
88
 
85
-
86
89
  it 'should cope with the example from presentation' do
87
90
  input = 'bbebeebebebbebee'
88
91
 
89
92
  # Creation
90
- instance = SequiturGrammar.new(input.chars)
93
+ instance = sequitur_grammar(input.chars)
91
94
 
92
95
  # Expectations:
93
96
  # S: P3 P2 P3
@@ -97,7 +100,7 @@ describe SequiturGrammar do
97
100
  expect(instance.productions.size).to eq(4)
98
101
  (p1, p2, p3) = instance.productions[1..3]
99
102
  expect(instance.start.rhs).to eq([p3, p2, p3])
100
- expect(p1.rhs).to eq(%w(b e))
103
+ expect(p1.rhs).to eq(%w[b e])
101
104
  expect(p2.rhs).to eq([p1, p1])
102
105
  expect(p3.rhs).to eq(['b', p2, 'e'])
103
106
  end
@@ -110,7 +113,7 @@ describe SequiturGrammar do
110
113
  input = raw_input.chars.map { |ch| "letter_#{ch}" }
111
114
 
112
115
  # Creation
113
- instance = SequiturGrammar.new(input.to_enum)
116
+ instance = sequitur_grammar(input.to_enum)
114
117
 
115
118
  # Expectations:
116
119
  # S: P3 P2 P3
@@ -120,7 +123,7 @@ describe SequiturGrammar do
120
123
  expect(instance.productions.size).to eq(4)
121
124
  (p1, p2, p3) = instance.productions[1..3]
122
125
  expect(instance.start.rhs).to eq([p3, p2, p3])
123
- expect(p1.rhs).to eq(%w(letter_b letter_e))
126
+ expect(p1.rhs).to eq(%w[letter_b letter_e])
124
127
  expect(p2.rhs).to eq([p1, p1])
125
128
  expect(p3.rhs).to eq(['letter_b', p2, 'letter_e'])
126
129
  end
@@ -133,7 +136,7 @@ describe SequiturGrammar do
133
136
  input = raw_input.chars.map(&:to_sym)
134
137
 
135
138
  # Creation
136
- instance = SequiturGrammar.new(input.to_enum)
139
+ instance = sequitur_grammar(input.to_enum)
137
140
 
138
141
  # Expectations:
139
142
  # S: P3 P2 P3
@@ -148,16 +151,15 @@ describe SequiturGrammar do
148
151
  expect(p3.rhs).to eq([:b, p2, :e])
149
152
  end
150
153
 
151
-
152
154
  it 'should work with integer values as input tokens' do
153
155
  # Raw input is sequence of hex digits
154
156
  raw_input = 'bbebeebebebbebee'
155
157
 
156
- # Convert them into Fixnums
158
+ # Convert them into Integers
157
159
  input = raw_input.chars.map { |ch| ch.to_i(16) }
158
160
 
159
161
  # Creation
160
- instance = SequiturGrammar.new(input.to_enum)
162
+ instance = sequitur_grammar(input.to_enum)
161
163
 
162
164
  # Expectations:
163
165
  # S: P3 P2 P3
@@ -174,7 +176,7 @@ describe SequiturGrammar do
174
176
 
175
177
  it 'should cope with the example from sequitur.info website' do
176
178
  input = 'abcabdabcabd'
177
- instance = SequiturGrammar.new(input.chars)
179
+ instance = sequitur_grammar(input.chars)
178
180
 
179
181
  # Expectations:
180
182
  # 0 → 2 2
@@ -184,13 +186,13 @@ describe SequiturGrammar do
184
186
  expect(instance.productions.size).to eq(3)
185
187
  (p1, p2) = instance.productions[1..2]
186
188
  expect(instance.start.rhs).to eq([p2, p2])
187
- expect(p1.rhs).to eq(%w(a b))
189
+ expect(p1.rhs).to eq(%w[a b])
188
190
  expect(p2.rhs).to eq([p1, 'c', p1, 'd'])
189
191
  end
190
192
 
191
193
  it "should cope with the example from Salomon's book" do
192
194
  input = 'abcdbcabcdbc'
193
- instance = SequiturGrammar.new(input.chars)
195
+ instance = sequitur_grammar(input.chars)
194
196
 
195
197
  # Expectations:
196
198
  # S → CC
@@ -200,23 +202,23 @@ describe SequiturGrammar do
200
202
  expect(instance.productions.size).to eq(3)
201
203
  (p_a, p_c) = instance.productions[1..2]
202
204
  expect(instance.start.rhs).to eq([p_c, p_c])
203
- expect(p_a.rhs).to eq(%w(b c))
205
+ expect(p_a.rhs).to eq(%w[b c])
204
206
  expect(p_c.rhs).to eq(['a', p_a, 'd', p_a])
205
207
  end
206
208
 
207
209
  it 'should cope with the "porridge" example from sequitur.info' do
208
210
  # Another example from sequitur.info website
209
- input = <<-SNIPPET
210
- pease porridge hot,
211
- pease porridge cold,
212
- pease porridge in the pot,
213
- nine days old.
214
-
215
- some like it hot,
216
- some like it cold,
217
- some like it in the pot,
218
- nine days old.
219
- SNIPPET
211
+ input = <<~SNIPPET
212
+ pease porridge hot,
213
+ pease porridge cold,
214
+ pease porridge in the pot,
215
+ nine days old.
216
+
217
+ some like it hot,
218
+ some like it cold,
219
+ some like it in the pot,
220
+ nine days old.
221
+ SNIPPET
220
222
  # Expectations (sequitur.org)
221
223
  # 0 → 1 2 3 4 3 5 ↵ 6 2 7 4 7 5
222
224
  # 1 → p e a s 8 r r i d g 9 pease_porridge_
@@ -233,7 +235,7 @@ SNIPPET
233
235
  # 11 → o l d old
234
236
  # 12 → i n in
235
237
 
236
- instance = SequiturGrammar.new(input.chars)
238
+ instance = sequitur_grammar(input.chars)
237
239
  expect(instance.productions.size).to eq(13)
238
240
  p0 = instance.start
239
241
  expect(p0.rhs.size).to eq(13)
@@ -241,7 +243,7 @@ SNIPPET
241
243
  (p1, p2, p3, p4, p5, p6, p7, p8, p9) = instance.productions[1..9]
242
244
  (p10, p11, p12) = instance.productions[10..12]
243
245
 
244
- # Note: the productions aren't sorted the same way as
246
+ # NOTE: the productions aren't sorted the same way as
245
247
  # the sequitur.info implementation.
246
248
  p0_expectation = [
247
249
  p2, p8, p3, p10, p3, p12, "\n",
@@ -249,27 +251,27 @@ SNIPPET
249
251
  ]
250
252
  expect(p0.rhs).to eq(p0_expectation) # Rule 0 above
251
253
  expect(p1.rhs).to eq(['e', ' ']) # Rule 9 above
252
- expect(p2.rhs).to eq([%w(p e a s), p4, %w(r r i d g), p1].flatten) # R1
254
+ expect(p2.rhs).to eq([%w[p e a s], p4, %w[r r i d g], p1].flatten) # R1
253
255
  expect(p3.rhs).to eq([p5, p2]) # Rule 3 above
254
256
  expect(p4.rhs).to eq([p1, 'p', 'o']) # Rule 8 above
255
257
  expect(p5.rhs).to eq([',', "\n"]) # Rule 10 above
256
- expect(p6.rhs).to eq(%w(i n)) # Rule 12 above
257
- expect(p7.rhs).to eq(%w(o l d)) # Rule 11 above
258
- expect(p8.rhs).to eq(%w(h o t)) # Rule 2 above
259
- p9_expectation = [%w(s o m), p1, %w(l i k), p1, 'i', 't', ' '].flatten
258
+ expect(p6.rhs).to eq(%w[i n]) # Rule 12 above
259
+ expect(p7.rhs).to eq(%w[o l d]) # Rule 11 above
260
+ expect(p8.rhs).to eq(%w[h o t]) # Rule 2 above
261
+ p9_expectation = [%w[s o m], p1, %w[l i k], p1, 'i', 't', ' '].flatten
260
262
  expect(p9.rhs).to eq(p9_expectation) # Rule 6 above
261
263
  expect(p10.rhs).to eq(['c', p7]) # Rule 4 above
262
264
  expect(p11.rhs).to eq([p5, p9]) # Rule 7 above
263
265
  p12_expectation = [
264
266
  p6, ' ', 't', 'h', p4, 't', p5, 'n', p6, p1,
265
- %w(d a y s), ' ', p7, '.', "\n"
267
+ %w[d a y s], ' ', p7, '.', "\n"
266
268
  ].flatten
267
269
  expect(p12.rhs).to eq(p12_expectation) # Rule 5 above
268
270
  end
269
271
 
270
272
  it 'should work with a sequence of Ruby Symbols' do
271
273
  input = 'abcabdabcabd'.chars.map(&:to_sym)
272
- instance = SequiturGrammar.new(input.to_enum)
274
+ instance = sequitur_grammar(input.to_enum)
273
275
 
274
276
  # Expectations:
275
277
  # start : P2 P2.
@@ -286,19 +288,18 @@ SNIPPET
286
288
 
287
289
  context 'Generating a text representation of itself:' do
288
290
  it 'should generate a text representation when empty' do
289
- instance = SequiturGrammar.new(empty_enum)
291
+ instance = sequitur_grammar(empty_enum)
290
292
  expectation = "#{instance.start.object_id} : ."
291
293
 
292
294
  expect(instance.to_string).to eq(expectation)
293
295
  end
294
296
 
295
297
  it 'should generate a text representation of a simple production' do
296
- instance = SequiturGrammar.new([:a].to_enum)
298
+ instance = sequitur_grammar([:a].to_enum)
297
299
  expectation = "#{instance.start.object_id} : a."
298
300
  expect(instance.to_string).to eq(expectation)
299
301
  end
300
302
  end # context
301
303
  end # describe
302
- end # module
303
304
 
304
305
  # End of file