nudge 0.2.1 → 0.2.2
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.
- data/VERSION +1 -1
- data/spec/instructions/bool/bool_duplicate_spec.rb +50 -0
- data/spec/instructions/bool/bool_from_float_spec.rb +41 -0
- data/spec/instructions/bool/bool_from_int_spec.rb +41 -0
- data/spec/instructions/bool/bool_pop_spec.rb +47 -0
- data/spec/instructions/bool/bool_rotate_spec.rb +60 -0
- data/spec/instructions/bool/bool_swap_spec.rb +64 -0
- data/spec/instructions/code/code_depth_spec.rb +39 -0
- data/spec/instructions/code/code_duplicate_spec.rb +50 -0
- data/spec/instructions/code/code_flush_spec.rb +37 -0
- data/spec/instructions/code/code_from_bool_spec.rb +37 -0
- data/spec/instructions/code/code_from_float_spec.rb +37 -0
- data/spec/instructions/code/code_from_int_spec.rb +37 -0
- data/spec/instructions/code/code_pop_spec.rb +47 -0
- data/spec/instructions/code/code_rotate_spec.rb +60 -0
- data/spec/instructions/code/code_swap_spec.rb +58 -0
- data/spec/instructions/float/float_duplicate_spec.rb +50 -0
- data/spec/instructions/float/float_from_bool_spec.rb +42 -0
- data/spec/instructions/float/float_from_int_spec.rb +37 -0
- data/spec/instructions/float/float_pop_spec.rb +47 -0
- data/spec/instructions/float/float_rotate_spec.rb +60 -0
- data/spec/instructions/float/float_swap_spec.rb +64 -0
- data/spec/instructions/int/int_duplicate_spec.rb +50 -0
- data/spec/instructions/int/int_from_bool_spec.rb +43 -0
- data/spec/instructions/int/int_from_float_spec.rb +37 -0
- data/spec/instructions/int/int_pop_spec.rb +47 -0
- data/spec/instructions/int/int_rotate_spec.rb +60 -0
- data/spec/instructions/int/int_swap_spec.rb +64 -0
- data/spec/instructions/name/name_duplicate_spec.rb +50 -0
- data/spec/instructions/name/name_pop_spec.rb +47 -0
- data/spec/instructions/name/name_rotate_spec.rb +60 -0
- data/spec/instructions/name/name_swap_spec.rb +58 -0
- data/spec/interpreter/interpreter_spec.rb +0 -2
- metadata +66 -16
- data/spec/instructions/code/code_stack_spec.rb +0 -386
- data/spec/instructions/split_these/bool_stack_spec.rb +0 -95
- data/spec/instructions/split_these/conversions_spec.rb +0 -103
- data/spec/instructions/split_these/float_stack_spec.rb +0 -92
- data/spec/instructions/split_these/int_stack_spec.rb +0 -81
- data/spec/instructions/split_these/name_stack_spec.rb +0 -84
- /data/spec/instructions/code/{code_fromname_spec.rb → code_from_name_spec.rb} +0 -0
@@ -1,386 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), "../../spec_helper")
|
2
|
-
include Nudge
|
3
|
-
|
4
|
-
theseInstructions = [
|
5
|
-
CodePopInstruction,
|
6
|
-
CodeSwapInstruction,
|
7
|
-
CodeDuplicateInstruction,
|
8
|
-
CodeRotateInstruction
|
9
|
-
]
|
10
|
-
|
11
|
-
namesTheyNeed = {
|
12
|
-
CodePopInstruction => 1,
|
13
|
-
CodeSwapInstruction => 2,
|
14
|
-
CodeDuplicateInstruction => 1,
|
15
|
-
CodeRotateInstruction => 3
|
16
|
-
}
|
17
|
-
|
18
|
-
resultTuples = {
|
19
|
-
CodePopInstruction => {["block {}", "do int_add"]=>["block {}"]},
|
20
|
-
CodeSwapInstruction => {["block {}", "do int_add"]=>["do int_add", "block {}"]},
|
21
|
-
CodeDuplicateInstruction => {["block {}"] => ["block {}", "block {}"]},
|
22
|
-
CodeRotateInstruction => {["block {}", "do int_add", "sample int(2)"] => ["do int_add", "sample int(2)", "block {}"]}
|
23
|
-
}
|
24
|
-
|
25
|
-
|
26
|
-
theseInstructions.each do |instName|
|
27
|
-
describe instName do
|
28
|
-
before(:each) do
|
29
|
-
@context = Interpreter.new
|
30
|
-
@i1 = instName.new(@context)
|
31
|
-
end
|
32
|
-
|
33
|
-
it "should have its context right" do
|
34
|
-
@i1.context.should == @context
|
35
|
-
end
|
36
|
-
|
37
|
-
[:preconditions?, :setup, :derive, :cleanup].each do |methodName|
|
38
|
-
it "should respond to \##{methodName}" do
|
39
|
-
@i1 = instName.new(@context)
|
40
|
-
@i1.should respond_to(methodName)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
describe "\#go" do
|
45
|
-
before(:each) do
|
46
|
-
@i1 = instName.new(@context)
|
47
|
-
@context.clear_stacks
|
48
|
-
@empty_block_code_value = ValuePoint.new("code", "block {}")
|
49
|
-
end
|
50
|
-
|
51
|
-
describe "\#preconditions?" do
|
52
|
-
it "should check that there are enough parameters" do
|
53
|
-
8.times {@context.stacks[:code].push(@empty_block_code_value)}
|
54
|
-
@i1.preconditions?.should == true
|
55
|
-
end
|
56
|
-
|
57
|
-
it "should raise an error if the preconditions aren't met" do
|
58
|
-
@context.clear_stacks # there are no params at all
|
59
|
-
lambda{@i1.preconditions?}.should raise_error(Instruction::NotEnoughStackItems)
|
60
|
-
end
|
61
|
-
|
62
|
-
it "should successfully run #go only if all preconditions are met" do
|
63
|
-
7.times {@context.stacks[:code].push(@empty_block_code_value)}
|
64
|
-
@i1.should_receive(:cleanup)
|
65
|
-
@i1.go
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
describe "\#cleanup" do
|
70
|
-
describe "should restructure the stack" do
|
71
|
-
examples = resultTuples[instName]
|
72
|
-
examples.each do |inputs, finalStackState|
|
73
|
-
params = inputs.inspect
|
74
|
-
expected = finalStackState.inspect
|
75
|
-
it "should end up with #{expected} on the \:code stack, starting with #{params}" do
|
76
|
-
inputs.each {|i| @context.stacks[:code].push(ValuePoint.new("code",i))}
|
77
|
-
@i1.go
|
78
|
-
finalStackState.reverse.each {|i| @context.stacks[:code].pop.raw.should == i}
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
|
88
|
-
describe CodeDepthInstruction do
|
89
|
-
before(:each) do
|
90
|
-
@context = Interpreter.new
|
91
|
-
@i1 = CodeDepthInstruction.new(@context)
|
92
|
-
end
|
93
|
-
|
94
|
-
it "should have its context set" do
|
95
|
-
@i1.context.should == @context
|
96
|
-
end
|
97
|
-
|
98
|
-
[:preconditions?, :setup, :derive, :cleanup].each do |methodName|
|
99
|
-
it "should respond to \##{methodName}" do
|
100
|
-
@i1.should respond_to(methodName)
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
describe "\#go" do
|
105
|
-
before(:each) do
|
106
|
-
@i1 = CodeDepthInstruction.new(@context)
|
107
|
-
@context.clear_stacks
|
108
|
-
@empty_block_code_value = ValuePoint.new("code", "block {}")
|
109
|
-
end
|
110
|
-
|
111
|
-
describe "\#preconditions?" do
|
112
|
-
it "should check that the :int stack responds to #depth" do
|
113
|
-
@i1.preconditions?.should == true
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
describe "\#cleanup" do
|
118
|
-
it "should count the items on the stack and push it onto the :int stack" do
|
119
|
-
@context.stacks[:int].depth.should == 0
|
120
|
-
@i1.go # there are no code literals
|
121
|
-
@context.stacks[:int].peek.value.should == 0
|
122
|
-
7.times {@context.stacks[:code].push @empty_block_code_value}
|
123
|
-
@i1.go
|
124
|
-
@context.stacks[:int].peek.value.should == 7
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
|
131
|
-
describe CodeFlushInstruction do
|
132
|
-
before(:each) do
|
133
|
-
@context = Interpreter.new
|
134
|
-
@i1 = CodeFlushInstruction.new(@context)
|
135
|
-
end
|
136
|
-
|
137
|
-
it "should have its context set right" do
|
138
|
-
@i1.context.should == @context
|
139
|
-
end
|
140
|
-
|
141
|
-
[:preconditions?, :setup, :derive, :cleanup].each do |methodName|
|
142
|
-
it "should respond to \##{methodName}" do
|
143
|
-
@i1.should respond_to(methodName)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
describe "\#go" do
|
148
|
-
before(:each) do
|
149
|
-
@i1 = CodeFlushInstruction.new(@context)
|
150
|
-
@context.clear_stacks
|
151
|
-
@empty_block_code_value = ValuePoint.new("code", "block {}")
|
152
|
-
end
|
153
|
-
|
154
|
-
describe "\#preconditions?" do
|
155
|
-
it "should check that the :int stack responds to #depth" do
|
156
|
-
@i1.preconditions?.should == true
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
describe "\#cleanup" do
|
161
|
-
it "should remove all items on the stack" do
|
162
|
-
11.times {@context.stacks[:code].push(@empty_block_code_value)}
|
163
|
-
@context.stacks[:code].depth.should == 11
|
164
|
-
@i1.go
|
165
|
-
@context.stacks[:code].depth.should == 0
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
|
172
|
-
describe CodeShoveInstruction do
|
173
|
-
before(:each) do
|
174
|
-
@context = Interpreter.new
|
175
|
-
@i1 = CodeShoveInstruction.new(@context)
|
176
|
-
end
|
177
|
-
|
178
|
-
it "should check its context is set" do
|
179
|
-
@i1.context.should == @context
|
180
|
-
end
|
181
|
-
|
182
|
-
[:preconditions?, :setup, :derive, :cleanup].each do |methodName|
|
183
|
-
it "should respond to \##{methodName}" do
|
184
|
-
@i1.should respond_to(methodName)
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
describe "\#go" do
|
189
|
-
before(:each) do
|
190
|
-
@i1 = CodeShoveInstruction.new(@context)
|
191
|
-
@context.clear_stacks
|
192
|
-
@empty_block_code_value = ValuePoint.new("code", "block {}")
|
193
|
-
|
194
|
-
end
|
195
|
-
|
196
|
-
describe "\#preconditions?" do
|
197
|
-
it "should check that there is one :int and at least one :code" do
|
198
|
-
@context.stacks[:int].push(ValuePoint.new("int", 4))
|
199
|
-
@context.stacks[:code].push(@empty_block_code_value)
|
200
|
-
@i1.preconditions?.should == true
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
describe "\#cleanup" do
|
205
|
-
before(:each) do
|
206
|
-
@context.clear_stacks
|
207
|
-
11.times {@context.stacks[:code].push(@empty_block_code_value)}
|
208
|
-
@context.stacks[:code].push(ValuePoint.new("code","do int_add")) # making it 12 deep
|
209
|
-
end
|
210
|
-
|
211
|
-
it "should not move the top item if the integer is negative" do
|
212
|
-
@context.stacks[:int].push(ValuePoint.new("int", -99))
|
213
|
-
@i1.go
|
214
|
-
@context.stacks[:code].depth.should == 12
|
215
|
-
@context.stacks[:code].peek.value.should == "do int_add"
|
216
|
-
end
|
217
|
-
|
218
|
-
it "should not move the top item if the integer is zero" do
|
219
|
-
@context.stacks[:int].push(ValuePoint.new("int", 0))
|
220
|
-
@i1.go
|
221
|
-
@context.stacks[:code].depth.should == 12
|
222
|
-
@context.stacks[:code].peek.value.should == "do int_add"
|
223
|
-
end
|
224
|
-
|
225
|
-
it "should move the top item farther down if the value is less than the depth" do
|
226
|
-
@context.stacks[:int].push(ValuePoint.new("int", 1000))
|
227
|
-
@i1.go
|
228
|
-
@context.stacks[:code].depth.should == 12
|
229
|
-
@context.stacks[:code].entries[0].value.should == "do int_add"
|
230
|
-
end
|
231
|
-
|
232
|
-
it "should move the top item to the bottom if the value is more than the depth" do
|
233
|
-
@context.stacks[:int].push(ValuePoint.new("int", 4))
|
234
|
-
@i1.go
|
235
|
-
@context.stacks[:code].depth.should == 12
|
236
|
-
@context.stacks[:code].entries[11].value.should == "block {}"
|
237
|
-
@context.stacks[:code].entries[7].value.should == "do int_add"
|
238
|
-
end
|
239
|
-
end
|
240
|
-
end
|
241
|
-
end
|
242
|
-
|
243
|
-
|
244
|
-
describe CodeYankInstruction do
|
245
|
-
before(:each) do
|
246
|
-
@context = Interpreter.new
|
247
|
-
@i1 = CodeYankInstruction.new(@context)
|
248
|
-
end
|
249
|
-
|
250
|
-
it "should check its context is set" do
|
251
|
-
@i1.context.should == @context
|
252
|
-
end
|
253
|
-
|
254
|
-
[:preconditions?, :setup, :derive, :cleanup].each do |methodName|
|
255
|
-
it "should respond to \##{methodName}" do
|
256
|
-
@i1.should respond_to(methodName)
|
257
|
-
end
|
258
|
-
end
|
259
|
-
|
260
|
-
describe "\#go" do
|
261
|
-
before(:each) do
|
262
|
-
@i1 = CodeYankInstruction.new(@context)
|
263
|
-
@context.clear_stacks
|
264
|
-
@int1 = ValuePoint.new("int", 3)
|
265
|
-
@empty_block_code_value = ValuePoint.new("code", "block {}")
|
266
|
-
end
|
267
|
-
|
268
|
-
describe "\#preconditions?" do
|
269
|
-
it "should check that there is one :name and at least one :int" do
|
270
|
-
@context.stacks[:code].push(@empty_block_code_value)
|
271
|
-
@context.stacks[:int].push(@int1)
|
272
|
-
@i1.preconditions?.should == true
|
273
|
-
end
|
274
|
-
end
|
275
|
-
|
276
|
-
describe "\#cleanup" do
|
277
|
-
before(:each) do
|
278
|
-
@context.clear_stacks
|
279
|
-
(4..6).each {|i| @context.stacks[:code].push(ValuePoint.new("code","ref a_#{i}"))}
|
280
|
-
end
|
281
|
-
|
282
|
-
it "should not change anything if the position integer is negative" do
|
283
|
-
@context.stacks[:int].push(ValuePoint.new("int", -99))
|
284
|
-
@i1.go
|
285
|
-
and_now = @context.stacks[:code].entries.collect {|i| i.value}
|
286
|
-
and_now.should == ["ref a_4", "ref a_5", "ref a_6"]
|
287
|
-
end
|
288
|
-
|
289
|
-
it "should not change anything if the position integer is zero" do
|
290
|
-
@context.stacks[:int].push(ValuePoint.new("int", 0))
|
291
|
-
@i1.go
|
292
|
-
and_now = @context.stacks[:code].entries.collect {|i| i.value}
|
293
|
-
and_now.should == ["ref a_4", "ref a_5", "ref a_6"]
|
294
|
-
end
|
295
|
-
|
296
|
-
it "should pull the last item on the stack to the top if the position is more than the stackdepth" do
|
297
|
-
@context.stacks[:int].push(ValuePoint.new("int", 1000))
|
298
|
-
@i1.go
|
299
|
-
and_now = @context.stacks[:code].entries.collect {|i| i.value}
|
300
|
-
and_now.should == ["ref a_5", "ref a_6", "ref a_4"]
|
301
|
-
end
|
302
|
-
|
303
|
-
it "should yank the indicated item to the top of the stack, counting from the 'top' 'down'" do
|
304
|
-
@context.stacks[:int].push(ValuePoint.new("int", 1))
|
305
|
-
@i1.go
|
306
|
-
and_now = @context.stacks[:code].entries.collect {|i| i.value}
|
307
|
-
and_now.should == ["ref a_4", "ref a_6", "ref a_5"]
|
308
|
-
end
|
309
|
-
end
|
310
|
-
end
|
311
|
-
end
|
312
|
-
|
313
|
-
|
314
|
-
describe CodeYankdupInstruction do
|
315
|
-
before(:each) do
|
316
|
-
@context = Interpreter.new
|
317
|
-
@i1 = CodeYankdupInstruction.new(@context)
|
318
|
-
end
|
319
|
-
|
320
|
-
it "should check its context is set" do
|
321
|
-
@i1.context.should == @context
|
322
|
-
end
|
323
|
-
|
324
|
-
[:preconditions?, :setup, :derive, :cleanup].each do |methodName|
|
325
|
-
it "should respond to \##{methodName}" do
|
326
|
-
@i1.should respond_to(methodName)
|
327
|
-
end
|
328
|
-
end
|
329
|
-
|
330
|
-
describe "\#go" do
|
331
|
-
before(:each) do
|
332
|
-
@i1 = CodeYankdupInstruction.new(@context)
|
333
|
-
@context.clear_stacks
|
334
|
-
@int1 = ValuePoint.new("int", 3)
|
335
|
-
@empty_block_code_value = ValuePoint.new("code", "block {}")
|
336
|
-
end
|
337
|
-
|
338
|
-
describe "\#preconditions?" do
|
339
|
-
it "should check that there is one :int and at least one :code" do
|
340
|
-
@context.stacks[:code].push(@empty_block_code_value)
|
341
|
-
@context.stacks[:int].push(@int1)
|
342
|
-
@i1.preconditions?.should == true
|
343
|
-
end
|
344
|
-
end
|
345
|
-
|
346
|
-
describe "\#cleanup" do
|
347
|
-
before(:each) do
|
348
|
-
@context.clear_stacks
|
349
|
-
(1..5).each {|i| @context.stacks[:code].push(ValuePoint.new("int", i))}
|
350
|
-
end
|
351
|
-
|
352
|
-
it "should duplicate the top item if the position integer is negative" do
|
353
|
-
@context.stacks[:int].push(ValuePoint.new("int", -99))
|
354
|
-
@i1.go
|
355
|
-
and_now = @context.stacks[:code].entries.collect {|i| i.value}
|
356
|
-
and_now.should == [1,2,3,4,5, 5]
|
357
|
-
end
|
358
|
-
|
359
|
-
it "should duplicate the top item if the position integer is zero" do
|
360
|
-
@context.stacks[:int].push(ValuePoint.new("int", 0))
|
361
|
-
@i1.go
|
362
|
-
and_now = @context.stacks[:code].entries.collect {|i| i.value}
|
363
|
-
and_now.should == [1,2,3,4,5, 5]
|
364
|
-
end
|
365
|
-
|
366
|
-
it "should clone the bottom item and push it if the position is more than the stackdepth" do
|
367
|
-
@context.stacks[:int].push(ValuePoint.new("int", 1000))
|
368
|
-
@i1.go
|
369
|
-
and_now = @context.stacks[:code].entries.collect {|i| i.value}
|
370
|
-
and_now.should == [1,2,3,4,5, 1]
|
371
|
-
end
|
372
|
-
|
373
|
-
it "should push a copy of the indicated item to the top of the stack, counting from the 'top down'" do
|
374
|
-
@context.stacks[:int].push(ValuePoint.new("int", 2))
|
375
|
-
@i1.go
|
376
|
-
and_now = @context.stacks[:code].entries.collect {|i| i.value}
|
377
|
-
and_now.should == [1,2,3,4,5, 3]
|
378
|
-
|
379
|
-
@context.stacks[:int].push(ValuePoint.new("int", 4))
|
380
|
-
@i1.go
|
381
|
-
and_now = @context.stacks[:code].entries.collect {|i| i.value}
|
382
|
-
and_now.should == [1,2,3,4,5, 3,2]
|
383
|
-
end
|
384
|
-
end
|
385
|
-
end
|
386
|
-
end
|
@@ -1,95 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), "../../spec_helper")
|
2
|
-
include Nudge
|
3
|
-
|
4
|
-
theseInstructions = [
|
5
|
-
BoolPopInstruction,
|
6
|
-
BoolSwapInstruction,
|
7
|
-
BoolDuplicateInstruction,
|
8
|
-
BoolRotateInstruction
|
9
|
-
]
|
10
|
-
|
11
|
-
boolsTheyNeed = {
|
12
|
-
BoolPopInstruction => 1,
|
13
|
-
BoolSwapInstruction => 2,
|
14
|
-
BoolDuplicateInstruction => 1,
|
15
|
-
BoolRotateInstruction => 3
|
16
|
-
}
|
17
|
-
|
18
|
-
resultTuples = {
|
19
|
-
BoolPopInstruction => {[false, true]=>[false]},
|
20
|
-
BoolSwapInstruction => {[false, true]=>[true, false]},
|
21
|
-
BoolDuplicateInstruction => {[true] => [true, true]},
|
22
|
-
BoolRotateInstruction => {[true, false, false] => [false, false, true]}
|
23
|
-
}
|
24
|
-
|
25
|
-
theseInstructions.each do |instName|
|
26
|
-
describe instName do
|
27
|
-
before(:each) do
|
28
|
-
@context = Interpreter.new
|
29
|
-
@i1 = instName.new(@context)
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should have its context right" do
|
33
|
-
@i1.context.should == @context
|
34
|
-
end
|
35
|
-
|
36
|
-
[:preconditions?, :setup, :derive, :cleanup].each do |methodName|
|
37
|
-
it "should respond to \##{methodName}" do
|
38
|
-
@i1 = instName.new(@context)
|
39
|
-
@i1.should respond_to(methodName)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
describe "\#go" do
|
44
|
-
before(:each) do
|
45
|
-
@i1 = instName.new(@context)
|
46
|
-
@context.clear_stacks
|
47
|
-
@bool1 = ValuePoint.new("bool", "true")
|
48
|
-
end
|
49
|
-
|
50
|
-
describe "\#preconditions?" do
|
51
|
-
it "should check that there are enough parameters" do
|
52
|
-
10.times {@context.stacks[:bool].push(@bool1)}
|
53
|
-
@i1.preconditions?.should == true
|
54
|
-
end
|
55
|
-
|
56
|
-
it "should raise an error if the preconditions aren't met" do
|
57
|
-
@context.clear_stacks # there are no params at all
|
58
|
-
lambda{@i1.preconditions?}.should raise_error(Instruction::NotEnoughStackItems)
|
59
|
-
end
|
60
|
-
|
61
|
-
it "should successfully run #go only if all preconditions are met" do
|
62
|
-
5.times {@context.stacks[:bool].push(@bool1)}
|
63
|
-
@i1.should_receive(:cleanup)
|
64
|
-
@i1.go
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
describe "\#cleanup" do
|
69
|
-
describe "should restructure the stack" do
|
70
|
-
examples = resultTuples[instName]
|
71
|
-
examples.each do |inputs, finalStackState|
|
72
|
-
params = inputs.inspect
|
73
|
-
expected = finalStackState.inspect
|
74
|
-
it "should end up with #{expected} on the \:bool stack, starting with #{params}" do
|
75
|
-
inputs.each {|i| @context.stacks[:bool].push(ValuePoint.new("bool", i.to_s))}
|
76
|
-
@i1.go
|
77
|
-
finalStackState.reverse.each {|i| @context.stacks[:bool].pop.value.should == i}
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
@@ -1,103 +0,0 @@
|
|
1
|
-
#encoding: utf-8
|
2
|
-
require File.join(File.dirname(__FILE__), "../../spec_helper")
|
3
|
-
include Nudge
|
4
|
-
|
5
|
-
theseInstructions = [
|
6
|
-
IntFromBoolInstruction,
|
7
|
-
BoolFromIntInstruction,
|
8
|
-
IntFromFloatInstruction,
|
9
|
-
FloatFromIntInstruction,
|
10
|
-
FloatFromBoolInstruction,
|
11
|
-
BoolFromFloatInstruction,
|
12
|
-
CodeFromFloatInstruction,
|
13
|
-
CodeFromIntInstruction,
|
14
|
-
CodeFromBoolInstruction
|
15
|
-
]
|
16
|
-
|
17
|
-
itNeeds = {
|
18
|
-
IntFromBoolInstruction => {"stack" => :bool, "stackname" => "bool", "becomes" => :int},
|
19
|
-
IntFromFloatInstruction => {"stack" => :float, "stackname" => "float", "becomes" => :int},
|
20
|
-
BoolFromIntInstruction => {"stack" => :int, "stackname" => "int", "becomes" => :bool},
|
21
|
-
BoolFromFloatInstruction => {"stack" => :float, "stackname" => "float", "becomes" => :bool},
|
22
|
-
FloatFromIntInstruction => {"stack" => :int, "stackname" => "int", "becomes" => :float},
|
23
|
-
FloatFromBoolInstruction => {"stack" => :bool, "stackname" => "bool", "becomes" => :float},
|
24
|
-
CodeFromFloatInstruction => {"stack" => :float, "stackname" => "float", "becomes" => :code},
|
25
|
-
CodeFromIntInstruction => {"stack" => :int, "stackname" => "int", "becomes" => :code},
|
26
|
-
CodeFromBoolInstruction => {"stack" => :bool, "stackname" => "bool", "becomes" => :code}}
|
27
|
-
|
28
|
-
whatHappens = {
|
29
|
-
IntFromBoolInstruction => {false => 0, true => 1},
|
30
|
-
IntFromFloatInstruction => {1.1 => 1, -31.71 => -31},
|
31
|
-
BoolFromIntInstruction => {0 => false, -2 => true, 122 => true},
|
32
|
-
BoolFromFloatInstruction => {0.0 => false, -2.2 => true, 122.2 => true},
|
33
|
-
FloatFromIntInstruction => {0 => 0.0, -2 => -2.0, 99 => 99.0},
|
34
|
-
FloatFromBoolInstruction => {false => 0.0, true => 1.0},
|
35
|
-
CodeFromFloatInstruction => {1.3 => "value «float»\n«float» 1.3", -2.8 => "value «float»\n«float» -2.8"},
|
36
|
-
CodeFromIntInstruction => {1882 => "value «int»\n«int» 1882", -9111 => "value «int»\n«int» -9111"},
|
37
|
-
CodeFromBoolInstruction => {false => "value «bool»\n«bool» false", true => "value «bool»\n«bool» true"}}
|
38
|
-
|
39
|
-
|
40
|
-
theseInstructions.each do |instName|
|
41
|
-
describe instName do
|
42
|
-
before(:each) do
|
43
|
-
@context = Interpreter.new
|
44
|
-
@i1 = instName.new(@context)
|
45
|
-
end
|
46
|
-
|
47
|
-
it "should have the right context" do
|
48
|
-
@i1.context.should == @context
|
49
|
-
end
|
50
|
-
|
51
|
-
[:preconditions?, :setup, :derive, :cleanup].each do |methodName|
|
52
|
-
it "should respond to \##{methodName}" do
|
53
|
-
@i1 = instName.new(@context)
|
54
|
-
@i1.should respond_to(methodName)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
describe "\#go" do
|
59
|
-
before(:each) do
|
60
|
-
@i1 = instName.new(@context)
|
61
|
-
@context.clear_stacks
|
62
|
-
@stackSymbol = itNeeds[instName]["stack"]
|
63
|
-
@stackName = itNeeds[instName]["stackname"]
|
64
|
-
@someValue = "anything_at_all"
|
65
|
-
@it_becomes = itNeeds[instName]["becomes"]
|
66
|
-
@myStarter = ValuePoint.new(@stackName,@someValue)
|
67
|
-
end
|
68
|
-
|
69
|
-
describe "\#preconditions?" do
|
70
|
-
it "should check that there are enough parameters" do
|
71
|
-
@context.stacks[@stackSymbol].push(@myStarter)
|
72
|
-
@i1.preconditions?.should == true
|
73
|
-
end
|
74
|
-
|
75
|
-
it "should raise an error if the preconditions aren't met" do
|
76
|
-
@context.clear_stacks # there are no params at all
|
77
|
-
lambda{@i1.preconditions?}.should raise_error(Instruction::NotEnoughStackItems)
|
78
|
-
end
|
79
|
-
|
80
|
-
it "should successfully run #go only if all preconditions are met" do
|
81
|
-
@context.stacks[@stackSymbol].push(@myStarter)
|
82
|
-
@i1.should_receive(:cleanup)
|
83
|
-
@i1.go
|
84
|
-
end
|
85
|
-
|
86
|
-
describe "\#cleanup" do
|
87
|
-
describe "should create and push the new (expected) value to the right place" do
|
88
|
-
before(:each) do
|
89
|
-
@context.clear_stacks
|
90
|
-
end
|
91
|
-
whatHappens[instName].each do |k,v|
|
92
|
-
it "\'#{k}\' becomes #{itNeeds[instName]["becomes"]} \'#{v}\'" do
|
93
|
-
@context.stacks[@stackSymbol].push(ValuePoint.new(@stackName,k))
|
94
|
-
@i1.go
|
95
|
-
@context.stacks[@it_becomes].peek.value.should == v
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
@@ -1,92 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), "../../spec_helper")
|
2
|
-
include Nudge
|
3
|
-
|
4
|
-
theseInstructions = [
|
5
|
-
FloatPopInstruction,
|
6
|
-
FloatSwapInstruction,
|
7
|
-
FloatDuplicateInstruction,
|
8
|
-
FloatRotateInstruction
|
9
|
-
]
|
10
|
-
|
11
|
-
floatsTheyNeed = {
|
12
|
-
FloatPopInstruction => 1,
|
13
|
-
FloatSwapInstruction => 2,
|
14
|
-
FloatDuplicateInstruction => 1,
|
15
|
-
FloatRotateInstruction => 3
|
16
|
-
}
|
17
|
-
|
18
|
-
resultTuples = {
|
19
|
-
FloatPopInstruction => {[1.0,2.0]=>[1.0]},
|
20
|
-
FloatSwapInstruction => {[1.1,2.2]=>[2.2,1.1]},
|
21
|
-
FloatDuplicateInstruction => {[33.3] => [33.3,33.3]},
|
22
|
-
FloatRotateInstruction => {[1.1,2.2,3.3] => [2.2,3.3,1.1]}
|
23
|
-
}
|
24
|
-
|
25
|
-
theseInstructions.each do |instName|
|
26
|
-
describe instName do
|
27
|
-
before(:each) do
|
28
|
-
@context = Interpreter.new
|
29
|
-
@i1 = instName.new(@context)
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should have its context right" do
|
33
|
-
@i1.context.should == @context
|
34
|
-
end
|
35
|
-
|
36
|
-
[:preconditions?, :setup, :derive, :cleanup].each do |methodName|
|
37
|
-
it "should respond to \##{methodName}" do
|
38
|
-
@i1 = instName.new(@context)
|
39
|
-
@i1.should respond_to(methodName)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
describe "\#go" do
|
44
|
-
before(:each) do
|
45
|
-
@i1 = instName.new(@context)
|
46
|
-
@context.clear_stacks
|
47
|
-
@float1 = ValuePoint.new("float", 1.0)
|
48
|
-
end
|
49
|
-
|
50
|
-
describe "\#preconditions?" do
|
51
|
-
it "should check that there are enough parameters" do
|
52
|
-
10.times {@context.stacks[:float].push(@float1)}
|
53
|
-
@i1.preconditions?.should == true
|
54
|
-
end
|
55
|
-
|
56
|
-
it "should raise an error if the preconditions aren't met" do
|
57
|
-
@context.clear_stacks # there are no params at all
|
58
|
-
lambda{@i1.preconditions?}.should raise_error(Instruction::NotEnoughStackItems)
|
59
|
-
end
|
60
|
-
|
61
|
-
it "should successfully run #go only if all preconditions are met" do
|
62
|
-
5.times {@context.stacks[:float].push(@float1)}
|
63
|
-
@i1.should_receive(:cleanup)
|
64
|
-
@i1.go
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
describe "\#cleanup" do
|
69
|
-
describe "should restructure the stack" do
|
70
|
-
examples = resultTuples[instName]
|
71
|
-
examples.each do |inputs, finalStackState|
|
72
|
-
params = inputs.inspect
|
73
|
-
expected = finalStackState.inspect
|
74
|
-
it "should end up with #{expected} on the \:float stack, starting with #{params}" do
|
75
|
-
inputs.each {|i| @context.stacks[:float].push(ValuePoint.new("float", i))}
|
76
|
-
@i1.go
|
77
|
-
finalStackState.reverse.each {|i| @context.stacks[:float].pop.value.should == i}
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|