skeem 0.0.23 → 0.0.24

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,263 +1,12 @@
1
1
  require 'ostruct'
2
2
  require_relative '../spec_helper' # Use the RSpec framework
3
+ require_relative '../../lib/skeem/runtime'
3
4
  require_relative '../../lib/skeem/s_expr_nodes' # Load the classes under test
4
5
 
5
6
  module Skeem
6
- describe SkmElement do
7
- let(:pos) {double('fake-position') }
8
- subject { SkmElement.new(pos) }
9
-
10
- context 'Initialization:' do
11
- it 'should be initialized with a position' do
12
- expect { SkmElement.new(pos) }.not_to raise_error
13
- end
14
-
15
- it 'should know its position' do
16
- expect(subject.position).to eq(pos)
17
- end
18
-
19
- # Default (overridable) behavior of SkmElement
20
- it 'should react by default to predicates' do
21
- expect(subject).not_to be_boolean
22
- expect(subject).not_to be_number
23
- expect(subject).not_to be_real
24
- expect(subject).not_to be_integer
25
- expect(subject).not_to be_string
26
- expect(subject).not_to be_symbol
27
- end
28
- end # context
29
- end # describe
30
-
31
- describe SkmTerminal do
32
- let(:pos) { double('fake-position') }
33
- let(:dummy_symbol) { double('fake-symbol') }
34
- let(:sample_value) { 'sample-value' }
35
- let(:dummy_token) do
36
- obj = OpenStruct.new
37
- obj.terminal = dummy_symbol
38
- obj.lexeme = sample_value
39
- obj
40
- end
41
- subject { SkmTerminal.new(dummy_token, pos) }
42
-
43
- context 'Initialization:' do
44
- it 'should be initialized with a token and a position' do
45
- expect { SkmTerminal.new(dummy_token, pos) }.not_to raise_error
46
- end
47
-
48
- it 'should know its token' do
49
- expect(subject.token).to eq(dummy_token)
50
- end
51
-
52
- it 'should know its value' do
53
- expect(subject.value).to eq(sample_value)
54
- end
55
-
56
- it "should know the token's symbol" do
57
- expect(subject.symbol).to eq(dummy_symbol)
58
- end
59
- end
60
-
61
- context 'Provided services:' do
62
- it 'should return its text representation' do
63
- expect(subject.inspect).to eq("<Skeem::SkmTerminal: sample-value>")
64
- end
65
- end # context
66
- end # describe
67
-
68
- describe SkmBoolean do
69
- let(:pos) { double('fake-position') }
70
- let(:dummy_symbol) { double('BOOLEAN') }
71
- let(:sample_value) { false }
72
- let(:dummy_token) do
73
- obj = OpenStruct.new
74
- obj.terminal = dummy_symbol
75
- obj.lexeme = sample_value
76
- obj
77
- end
78
- subject { SkmBoolean.new(dummy_token, pos) }
79
-
80
- context 'Initialization:' do
81
- it 'should be initialized with a token and a position' do
82
- expect { SkmBoolean.new(dummy_token, pos) }.not_to raise_error
83
- end
84
-
85
- it 'should react positively to boolean? predicate' do
86
- expect(subject).to be_boolean
87
- end
88
- end
89
-
90
- context 'Provided services:' do
91
- it 'should return its text representation' do
92
- expect(subject.inspect).to eq('<Skeem::SkmBoolean: false>')
93
- end
94
- end # context
95
- end # describe
96
-
97
- describe SkmNumber do
98
- let(:pos) { double('fake-position') }
99
- let(:dummy_symbol) { double('dummy') }
100
- let(:sample_value) { 0.5100 }
101
- let(:dummy_token) do
102
- obj = OpenStruct.new
103
- obj.terminal = dummy_symbol
104
- obj.lexeme = sample_value
105
- obj
106
- end
107
- subject { SkmNumber.new(dummy_token, pos) }
108
-
109
- context 'Initialization:' do
110
- it 'should be initialized with a token and a position' do
111
- expect { SkmNumber.new(dummy_token, pos) }.not_to raise_error
112
- end
113
- end
114
-
115
- context 'Provided services:' do
116
- it 'should react positively to number? predicate' do
117
- expect(subject).to be_number
118
- end
119
-
120
- it 'should return its text representation' do
121
- expect(subject.inspect).to eq('<Skeem::SkmNumber: 0.51>')
122
- end
123
- end # context
124
- end # describe
125
-
126
- describe SkmReal do
127
- let(:pos) { double('fake-position') }
128
- let(:dummy_symbol) { double('dummy') }
129
- let(:sample_value) { 0.5100 }
130
- let(:dummy_token) do
131
- obj = OpenStruct.new
132
- obj.terminal = dummy_symbol
133
- obj.lexeme = sample_value
134
- obj
135
- end
136
- subject { SkmReal.new(dummy_token, pos) }
137
-
138
- context 'Provided services:' do
139
- it 'should react positively to number? predicate' do
140
- expect(subject).to be_number
141
- end
142
-
143
- it 'should react positively to real? predicate' do
144
- expect(subject).to be_real
145
- end
146
- end
147
- end # describe
148
-
149
- describe SkmInteger do
150
- let(:pos) { double('fake-position') }
151
- let(:dummy_symbol) { double('dummy') }
152
- let(:sample_value) { 3 }
153
- let(:dummy_token) do
154
- obj = OpenStruct.new
155
- obj.terminal = dummy_symbol
156
- obj.lexeme = sample_value
157
- obj
158
- end
159
- subject { SkmInteger.new(dummy_token, pos) }
160
-
161
- context 'Provided services:' do
162
- it 'should react positively to number? predicate' do
163
- expect(subject).to be_number
164
- end
165
-
166
- it 'should react positively to real? predicate' do
167
- expect(subject).to be_real
168
- end
169
-
170
- it 'should react positively to integer? predicate' do
171
- expect(subject).to be_real
172
- end
173
- end
174
- end # describe
175
-
176
- describe SkmString do
177
- let(:pos) { double('fake-position') }
178
- let(:dummy_symbol) { double('dummy') }
179
- let(:sample_value) { 'Hello' }
180
- let(:dummy_token) do
181
- obj = OpenStruct.new
182
- obj.terminal = dummy_symbol
183
- obj.lexeme = sample_value
184
- obj
185
- end
186
- subject { SkmString.new(dummy_token, pos) }
187
-
188
- context 'Provided services:' do
189
- it 'should react positively to string? predicate' do
190
- expect(subject).to be_string
191
- end
192
-
193
- it 'should return its text representation' do
194
- expect(subject.inspect).to eq('<Skeem::SkmString: Hello>')
195
- end
196
- end
197
- end # describe
198
-
199
- describe SkmIdentifier do
200
- let(:pos) { double('fake-position') }
201
- let(:dummy_symbol) { double('dummy') }
202
- let(:sample_value) { 'this-is-it!' }
203
- let(:dummy_token) do
204
- obj = OpenStruct.new
205
- obj.terminal = dummy_symbol
206
- obj.lexeme = sample_value
207
- obj
208
- end
209
- subject { SkmIdentifier.new(dummy_token, pos) }
210
-
211
- context 'Provided services:' do
212
- it 'should react positively to symbol? predicate' do
213
- expect(subject).to be_symbol
214
- end
215
-
216
- it 'should return its text representation' do
217
- expect(subject.inspect).to eq('<Skeem::SkmIdentifier: this-is-it!>')
218
- end
219
- end # context
220
- end # describe
221
-
222
- describe SkmList do
223
- let(:sample_members) { [1, 2, 3] }
224
-
225
- subject { SkmList.new(sample_members) }
226
-
227
- context 'Initialization:' do
228
- it 'should be initialized with its members' do
229
- expect{ SkmList.new(sample_members) }.not_to raise_error
230
- end
231
-
232
- it 'should know its members' do
233
- expect(subject.members).to eq(sample_members)
234
-
235
- other = SkmList.new([])
236
- expect(other.members).to be_empty
237
- end
238
- end # context
239
-
240
- context 'Provided services:' do
241
- it 'should retrieve its first member' do
242
- expect(subject.first).to eq(1)
243
- expect(subject.head).to eq(1)
244
- end
245
-
246
- it 'should retrieve its tail members' do
247
- expect(subject.tail.inspect).to eq('<Skeem::SkmList: 2, 3>')
248
- expect(subject.rest.inspect).to eq('<Skeem::SkmList: 2, 3>')
249
- end
250
-
251
- it 'should return its text representation' do
252
- expect(subject.inspect).to eq('<Skeem::SkmList: 1, 2, 3>')
253
- end
254
- end # context
255
- end # describe
256
-
257
-
258
7
  describe SkmDefinition do
259
8
  let(:pos) { double('fake-position') }
260
- let(:sample_symbol) { SkmIdentifier.create('this-is-it!') }
9
+ let(:sample_symbol) { SkmIdentifier.create('ten') }
261
10
  let(:sample_expr) { SkmInteger.create(10) }
262
11
 
263
12
  subject { SkmDefinition.new(pos, sample_symbol, sample_expr) }
@@ -277,34 +26,23 @@ describe SkmIdentifier do
277
26
  end # context
278
27
 
279
28
  context 'Provided services:' do
280
- it 'should return its text representation' do
281
- txt1 = '<Skeem::SkmDefinition: <Skeem::SkmIdentifier: this-is-it!>,'
282
- txt2 = ' <Skeem::SkmInteger: 10>>'
283
- expect(subject.inspect).to eq(txt1 + txt2)
284
- end
285
- end # context
286
- end # describe
287
-
288
- describe SkmVariableReference do
289
- let(:pos) { double('fake-position') }
290
- let(:sample_symbol) { SkmIdentifier.create('this-is-it!') }
291
-
292
- subject { SkmVariableReference.new(pos, sample_symbol) }
29
+ let(:runtime) { Runtime.new(Environment.new) }
293
30
 
294
- context 'Initialization:' do
295
- it 'should be initialized with a position and a symbol' do
296
- expect{ SkmVariableReference.new(pos, sample_symbol) }.not_to raise_error
31
+ it 'should create an entry when evaluating' do
32
+ expect(runtime).not_to include(sample_symbol)
33
+ subject.evaluate(runtime)
34
+ expect(runtime).to include(sample_symbol)
297
35
  end
298
-
299
- it 'should know its variable' do
300
- expect(subject.variable).to eq(sample_symbol)
36
+
37
+ it 'should quasiquote its variable and expression' do
38
+ alter_ego = subject.quasiquote(runtime)
39
+ expect(alter_ego).to eq(subject)
301
40
  end
302
- end # context
303
41
 
304
- context 'Provided services:' do
305
42
  it 'should return its text representation' do
306
- txt1 = '<Skeem::SkmVariableReference: <Skeem::SkmIdentifier: this-is-it!>>'
307
- expect(subject.inspect).to eq(txt1)
43
+ txt1 = '<Skeem::SkmDefinition: <Skeem::SkmIdentifier: ten>,'
44
+ txt2 = ' <Skeem::SkmInteger: 10>>'
45
+ expect(subject.inspect).to eq(txt1 + txt2)
308
46
  end
309
47
  end # context
310
48
  end # describe
@@ -383,7 +121,7 @@ describe SkmIdentifier do
383
121
  let(:s_body) do { defs: s_defs, sequence: s_sequence } end
384
122
 
385
123
  subject { SkmLambda.new(pos, s_formals, s_body) }
386
-
124
+
387
125
  context 'Initialization:' do
388
126
  it 'should be initialized with a pos and 3 expressions' do
389
127
  expect{ SkmLambda.new(pos, s_formals, s_body) }.not_to raise_error
@@ -0,0 +1,132 @@
1
+ require_relative '../spec_helper' # Use the RSpec framework
2
+ require_relative '../../lib/skeem/datum_dsl'
3
+ require_relative '../../lib/skeem/skm_compound_datum' # Load the classes under test
4
+
5
+ module Skeem
6
+ describe SkmCompoundDatum do
7
+ include DatumDSL
8
+
9
+ let(:sample_members) { [1, 2, 3] }
10
+ let(:sample_members) { [integer(1), integer(2), integer(3)] }
11
+ subject { SkmCompoundDatum.new(sample_members) }
12
+
13
+ context 'Initialization:' do
14
+ it 'should be initialized with its members' do
15
+ expect{ SkmCompoundDatum.new(sample_members) }.not_to raise_error
16
+ end
17
+
18
+ it 'should know its members' do
19
+ expect(subject.members).to eq(sample_members)
20
+
21
+ other = SkmCompoundDatum.new([])
22
+ expect(other.members).to be_empty
23
+ end
24
+ end # context
25
+
26
+ context 'Provided basic services:' do
27
+ it 'should assert that it is equal to itself' do
28
+ expect(subject).to eq(subject)
29
+ end
30
+
31
+ it 'should assert the equality by member values' do
32
+ # Comparison with other instances
33
+ expect(subject).to eq(SkmCompoundDatum.new(sample_members))
34
+ expect(subject).not_to eq(SkmCompoundDatum.new([]))
35
+ expect(subject).not_to eq(SkmCompoundDatum.new(sample_members.rotate))
36
+
37
+ # Comparison with array of values
38
+ expect(subject).to eq(sample_members)
39
+ expect(subject).not_to eq(sample_members.rotate)
40
+ end
41
+
42
+ it 'should respond to visitor' do
43
+ visitor = double('fake-visitor')
44
+ expect(visitor).to receive(:visit_compound_datum).with(subject)
45
+ expect { subject.accept(visitor) }.not_to raise_error
46
+ end
47
+
48
+ it 'should return its text representation' do
49
+ txt1 = '<Skeem::SkmCompoundDatum: <Skeem::SkmInteger: 1>,'
50
+ txt2 = '<Skeem::SkmInteger: 2>, <Skeem::SkmInteger: 3>>'
51
+ expect(subject.inspect).to eq(txt1 + ' ' + txt2)
52
+ end
53
+ end # context
54
+
55
+ context 'Provided runtime services:' do
56
+ let(:quirk_datum) { double('two') }
57
+ let(:quirk_members) { [integer(1), quirk_datum, integer(3)] }
58
+ let(:runtime) { double('fake-runtime') }
59
+
60
+ it 'should evaluate its members' do
61
+ # subject contains simple literals
62
+ expect(subject.evaluate(runtime)).to eq(subject)
63
+
64
+ # Check that members receive the 'evaluate' message
65
+ expect(quirk_datum).to receive(:evaluate).with(runtime).and_return(integer(2))
66
+ instance = SkmCompoundDatum.new(quirk_members)
67
+ expect(instance.evaluate(runtime)).to eq(subject)
68
+ end
69
+
70
+ it 'should quasiquoting its members' do
71
+ # subject contains simple literals
72
+ expect(subject.quasiquote(runtime)).to eq(subject)
73
+
74
+ # Check that members receive the 'quasiquote' message
75
+ expect(quirk_datum).to receive(:quasiquote).with(runtime).and_return(integer(2))
76
+ instance = SkmCompoundDatum.new(quirk_members)
77
+ expect(instance.quasiquote(runtime)).to eq(subject)
78
+ end
79
+ end # context
80
+ end # describe
81
+
82
+ describe SkmList do
83
+ let(:sample_members) { [1, 2, 3] }
84
+ subject { SkmList.new(sample_members) }
85
+
86
+ context 'Initialization:' do
87
+ it 'should be initialized with its members' do
88
+ expect{ SkmList.new(sample_members) }.not_to raise_error
89
+ end
90
+
91
+ it 'should react positively to list? predicate' do
92
+ expect(subject).to be_list
93
+ end
94
+
95
+ it 'should react correctly to null? predicate' do
96
+ expect(subject).not_to be_null
97
+ expect(SkmList.new([])).to be_null
98
+ end
99
+ end # context
100
+
101
+ context 'Provided services:' do
102
+ it 'should retrieve its first member' do
103
+ expect(subject.first).to eq(1)
104
+ expect(subject.head).to eq(1)
105
+ end
106
+
107
+ it 'should retrieve its tail members' do
108
+ expect(subject.tail.inspect).to eq('<Skeem::SkmList: 2, 3>')
109
+ expect(subject.rest.inspect).to eq('<Skeem::SkmList: 2, 3>')
110
+ end
111
+
112
+ it 'should return its text representation' do
113
+ expect(subject.inspect).to eq('<Skeem::SkmList: 1, 2, 3>')
114
+ end
115
+ end # context
116
+ end # describe
117
+
118
+ describe SkmVector do
119
+ let(:sample_members) { [1, 2, 3] }
120
+ subject { SkmVector.new(sample_members) }
121
+
122
+ context 'Initialization:' do
123
+ it 'should be initialized with its members' do
124
+ expect{ SkmVector.new(sample_members) }.not_to raise_error
125
+ end
126
+
127
+ it 'should react positively to vector? predicate' do
128
+ expect(subject).to be_vector
129
+ end
130
+ end # context
131
+ end # describe
132
+ end # module
@@ -0,0 +1,50 @@
1
+ require_relative '../spec_helper' # Use the RSpec framework
2
+ require_relative '../../lib/skeem/skm_element' # Load the class under test
3
+
4
+ module Skeem
5
+ describe SkmElement do
6
+ let(:pos) { double('fake-position') }
7
+ subject { SkmElement.new(pos) }
8
+
9
+ context 'Initialization:' do
10
+ it 'should be initialized with a position' do
11
+ expect { SkmElement.new(pos) }.not_to raise_error
12
+ end
13
+
14
+ it 'should know its position' do
15
+ expect(subject.position).to eq(pos)
16
+ end
17
+
18
+ # Default (overridable) behavior of SkmElement
19
+ it 'should react by default to predicates' do
20
+ expect(subject).not_to be_boolean
21
+ expect(subject).not_to be_number
22
+ expect(subject).not_to be_real
23
+ expect(subject).not_to be_integer
24
+ expect(subject).not_to be_string
25
+ expect(subject).not_to be_symbol
26
+ expect(subject).not_to be_list
27
+ expect(subject).not_to be_null
28
+ expect(subject).not_to be_vector
29
+ end
30
+ end # context
31
+
32
+ context 'Provided services:' do
33
+ let(:runtime) { double('fake-runtime') }
34
+ let(:visitor) { double('fake-visitor') }
35
+ let(:not_implemented) { NotImplementedError }
36
+
37
+ it "should complain when receiving 'evaluate' message" do
38
+ expect { subject.evaluate(runtime) }.to raise_error(not_implemented)
39
+ end
40
+
41
+ it "should complain when receiving 'quasiquote' message" do
42
+ expect { subject.quasiquote(runtime) }.to raise_error(not_implemented)
43
+ end
44
+
45
+ it "should complain when receiving 'accept' message" do
46
+ expect { subject.accept(visitor) }.to raise_error(not_implemented)
47
+ end
48
+ end # context
49
+ end # describe
50
+ end # module