fastruby 0.0.1

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,418 @@
1
+ require "fastruby"
2
+
3
+ describe FastRuby, "fastruby" do
4
+ class ::X6
5
+ fastruby "
6
+ def foo(ary)
7
+ ary.each do |a|
8
+ end
9
+ 0
10
+ end
11
+ "
12
+ end
13
+
14
+ it "should compile blocks" do
15
+ ::X6.new.foo([1,2,3]).should be == 0
16
+ end
17
+
18
+ class ::X7
19
+ fastruby "
20
+ def foo(ary)
21
+ ary.map do |a|
22
+ 0
23
+ end
24
+ end
25
+ "
26
+ end
27
+
28
+ it "should compile blocks with code inside" do
29
+ ::X7.new.foo([1,2,3]).should be == [0,0,0]
30
+ end
31
+
32
+ class ::X8
33
+ fastruby "
34
+ def foo(ary)
35
+ ary.map do |a|
36
+ a
37
+ end
38
+ end
39
+ "
40
+ end
41
+
42
+ it "should compile blocks with code inside refering block arguments" do
43
+ ::X8.new.foo([1,2,3]).should be == [1,2,3]
44
+ end
45
+
46
+ class ::X9
47
+ fastruby "
48
+ def foo(hash)
49
+ hash.map do |k,v|
50
+ k+v
51
+ end
52
+ end
53
+ "
54
+ end
55
+
56
+ it "should compile blocks with code inside refering multiple block arguments" do
57
+ ::X9.new.foo({1 => 2, 3 => 4}).sort.should be == [3,7]
58
+ end
59
+
60
+ class ::Y10
61
+ def bar(arg1)
62
+ yield
63
+ arg1
64
+ end
65
+ end
66
+
67
+ class ::X10
68
+ fastruby "
69
+ def foo(obj, arg1)
70
+ obj.bar(arg1) do |a|
71
+ end
72
+ end
73
+ "
74
+ end
75
+
76
+ it "should compile iter calls with arguments" do
77
+ ::X10.new.foo(::Y10.new, 10).should be == 10
78
+ end
79
+
80
+ class ::Y11
81
+ def bar(arg1, arg2)
82
+ yield
83
+ arg1+arg2
84
+ end
85
+ end
86
+
87
+ class ::X11
88
+ fastruby "
89
+ def foo(obj, arg1, arg2)
90
+ obj.bar(arg1, arg2) do |a|
91
+ end
92
+ end
93
+ "
94
+ end
95
+
96
+ it "should compile iter calls with multiple arguments" do
97
+ ::X11.new.foo(::Y11.new, 10, 9).should be == 19
98
+ end
99
+
100
+ class ::X12
101
+ fastruby "
102
+ def foo(ary)
103
+ a = 1
104
+ ary.map do |x|
105
+ a
106
+ end
107
+ end
108
+ "
109
+ end
110
+
111
+ it "should allow accessing local variables from block" do
112
+ ::X12.new.foo([1,2,3,4]).should be == [1,1,1,1]
113
+ end
114
+
115
+ class ::X13
116
+ fastruby "
117
+ def foo(ary)
118
+ a = 1
119
+ ary.map do |x|
120
+ a+x
121
+ end
122
+ end
123
+ "
124
+ end
125
+
126
+ it "should allow accessing local variables and block parameters from block" do
127
+ ::X13.new.foo([1,2,3,4]).should be == [2,3,4,5]
128
+ end
129
+
130
+ class ::Y14
131
+ fastruby "
132
+ def bar
133
+ block_given?
134
+ end
135
+ "
136
+ end
137
+
138
+ class ::X14
139
+ fastruby "
140
+ def foo(y)
141
+ y.bar
142
+ end
143
+ "
144
+ end
145
+
146
+ it "method calls should not repass blocks" do
147
+ ::X14.new.foo(::Y14.new){ }.should be == false
148
+ end
149
+
150
+ class ::X15
151
+ fastruby "
152
+ def foo
153
+ bar
154
+ end
155
+ "
156
+
157
+ private
158
+ def bar
159
+ true
160
+ end
161
+ end
162
+
163
+ it "should allow calls to private methods" do
164
+ ::X15.new.foo.should be == true
165
+ end
166
+
167
+ class ::X16
168
+ fastruby "
169
+ def foo
170
+ bar do
171
+ 12
172
+ end
173
+ end
174
+ "
175
+
176
+ def bar
177
+ yield
178
+ end
179
+ end
180
+
181
+ it "should allow calls with block to self methods" do
182
+ ::X16.new.foo.should be == 12
183
+ end
184
+
185
+ class ::X17
186
+ fastruby "
187
+ def foo(z)
188
+ i = 9
189
+ z.each do |x|
190
+ i = x
191
+ 0
192
+ end
193
+ i
194
+ end
195
+ "
196
+ end
197
+
198
+ it "should allow assignment of locals from blocks" do
199
+ ::X17.new.foo([1,2,3]).should be == 3
200
+ end
201
+
202
+ class ::X18
203
+ fastruby "
204
+ def foo
205
+ yield
206
+ end
207
+ "
208
+ end
209
+
210
+ it "should allow block calls" do
211
+ ::X18.new.foo{ 9 }.should be == 9
212
+ end
213
+
214
+ class ::Y19
215
+ fastruby "
216
+ def bar
217
+ yield
218
+ end
219
+ "
220
+ end
221
+
222
+ class ::X19
223
+ fastruby "
224
+ def foo(y)
225
+ y.bar {
226
+ 9
227
+ }
228
+ end
229
+ "
230
+ end
231
+
232
+ it "should execute block class between fastruby methods when no block is passed" do
233
+ ::X19.new.foo(::Y19.new).should be == 9
234
+ end
235
+
236
+ it "should execute block class between fastruby methods when block is passed" do
237
+ ::X19.new.foo(::Y19.new){}.should be == 9
238
+ end
239
+
240
+ class ::X20
241
+ fastruby "
242
+ def foo
243
+ yield(1)
244
+ end
245
+ "
246
+ end
247
+
248
+ it "should execute block from fastruby methods with one argument" do
249
+ ::X20.new.foo do |n1|
250
+ n1.should be == 1
251
+ end
252
+ end
253
+
254
+ class ::X21
255
+ fastruby "
256
+ def foo
257
+ yield(1,2)
258
+ end
259
+ "
260
+ end
261
+
262
+ it "should execute block from fastruby methods with two arguments" do
263
+ ::X21.new.foo do |n1,n2|
264
+ n1.should be == 1
265
+ n2.should be == 2
266
+ end
267
+ end
268
+
269
+ class ::Y22
270
+ fastruby "
271
+ def foo
272
+ yield
273
+ end
274
+ "
275
+
276
+ fastruby "
277
+ def bar(x)
278
+ i = 10
279
+ lvar_type(i,Fixnum)
280
+ x.foo do
281
+ i = i - 1
282
+ end
283
+ i
284
+ end
285
+ "
286
+ end
287
+
288
+ it "should execute block calls after lvar_type directive" do
289
+ y22 = ::Y22.new
290
+ y22.bar(y22).should be == 9
291
+ end
292
+
293
+ class ::Y23
294
+ def foo
295
+ yield
296
+ end
297
+
298
+ def foo2
299
+ 77
300
+ end
301
+
302
+ fastruby "
303
+ def bar(x)
304
+ i = 0
305
+ x.foo do
306
+ i = foo2
307
+ end
308
+ i
309
+ end
310
+ "
311
+ end
312
+
313
+ it "should call self methods from inside a block" do
314
+ y23 = ::Y23.new
315
+ y23.bar(y23).should be == 77
316
+ end
317
+
318
+ class ::Y24
319
+ def foo
320
+ yield
321
+ end
322
+
323
+ fastruby "
324
+ def bar(x)
325
+ i = 0
326
+ x.foo do
327
+ i = block_given?
328
+ end
329
+ i
330
+ end
331
+ "
332
+ end
333
+
334
+ it "should call block_given? from inside a block when a block is not passed should return false" do
335
+ y24 = ::Y24.new
336
+ y24.bar(y24).should be == false
337
+ end
338
+
339
+ it "should call block_given? from inside a block when a block is not passed should return true" do
340
+ y24 = ::Y24.new
341
+ y24.bar(y24){}.should be == true
342
+ end
343
+
344
+ class ::Y25
345
+ def foo
346
+ yield
347
+ end
348
+
349
+ fastruby "
350
+ def bar(x)
351
+ i = 0
352
+ x.foo do
353
+ i = block_given? do
354
+ end
355
+ end
356
+ i
357
+ end
358
+ "
359
+ end
360
+
361
+ it "should call block_given? with block from inside a block when a block is not passed should return false " do
362
+ y25 = ::Y25.new
363
+ y25.bar(y25).should be == false
364
+ end
365
+
366
+ it "should call block_given? with block from inside a block when a block is not passed should return true" do
367
+ y25 = ::Y25.new
368
+ y25.bar(y25){}.should be == true
369
+ end
370
+
371
+ class ::Y26
372
+ def bar
373
+ yield
374
+ end
375
+
376
+ fastruby "
377
+ def foo
378
+ bar do
379
+ yield
380
+ end
381
+ end
382
+ "
383
+ end
384
+
385
+ it "should call yield from inside a block" do
386
+ y26 = ::Y26.new
387
+
388
+ block_num_calls = 0
389
+
390
+ y26.foo do
391
+ block_num_calls = block_num_calls + 1
392
+ end
393
+
394
+ block_num_calls.should be == 1
395
+ end
396
+
397
+ class ::Y27
398
+ fastruby "
399
+ def foo(x)
400
+ x
401
+ end
402
+ "
403
+ end
404
+
405
+ class ::Y28
406
+ fastruby "
407
+ def foo(y27, a)
408
+ y27.foo(a) do
409
+ end
410
+ end
411
+ "
412
+ end
413
+
414
+ it "should pass arguments when call with block" do
415
+ y28 = ::Y28.new
416
+ y28.foo(::Y27.new, 713).should be == 713
417
+ end
418
+ end
@@ -0,0 +1,71 @@
1
+ require "fastruby"
2
+
3
+ describe FastRuby, "fastruby" do
4
+
5
+ class ::C1
6
+ fastruby '
7
+ def foo
8
+ ret = 0
9
+ if true
10
+ ret = 32
11
+ end
12
+ ret
13
+ end
14
+ '
15
+ end
16
+
17
+ it "should execute if when the condition is true" do
18
+ ::C1.new.foo.should be == 32
19
+ end
20
+
21
+ class ::C2
22
+ fastruby '
23
+ def foo
24
+ ret = 0
25
+ if false
26
+ ret = 32
27
+ end
28
+ ret
29
+ end
30
+ '
31
+ end
32
+
33
+ it "should execute if when the condition is false" do
34
+ ::C2.new.foo.should be == 0
35
+ end
36
+
37
+ class ::C3
38
+ fastruby '
39
+ def foo
40
+ ret = 0
41
+ if false
42
+ ret = 32
43
+ else
44
+ ret = 16
45
+ end
46
+ ret
47
+ end
48
+ '
49
+ end
50
+
51
+ it "should execute if with else when the condition is false" do
52
+ ::C3.new.foo.should be == 16
53
+ end
54
+
55
+ class ::C4
56
+ fastruby '
57
+ def foo
58
+ ret = 0
59
+ unless false
60
+ ret = 32
61
+ end
62
+ ret
63
+ end
64
+ '
65
+ end
66
+
67
+ it "should execute unless when the condition is false" do
68
+ # tip: unless is only a reverse if
69
+ ::C4.new.foo.should be == 32
70
+ end
71
+ end
@@ -0,0 +1,59 @@
1
+ require "fastruby"
2
+
3
+ describe FastRuby, "fastruby" do
4
+ class ::D5
5
+ fastruby '
6
+ def foo(a,b)
7
+ a == b
8
+ end
9
+ '
10
+ end
11
+
12
+ it "should execute unless when the condition is false" do
13
+ ::D5.new.foo(1,1).should be == true
14
+ ::D5.new.foo(1,2).should be == false
15
+ end
16
+
17
+ class ::D6
18
+ fastruby '
19
+ def foo(a,b)
20
+ a and b
21
+ end
22
+ '
23
+ end
24
+
25
+ it "should execute unless when the condition is false" do
26
+ ::D6.new.foo(false,false).should be == false
27
+ ::D6.new.foo(true,false).should be == false
28
+ ::D6.new.foo(false,true).should be == false
29
+ ::D6.new.foo(true,true).should be == true
30
+ end
31
+
32
+ class ::D7
33
+ fastruby '
34
+ def foo(a,b)
35
+ a or b
36
+ end
37
+ '
38
+ end
39
+
40
+ it "should execute unless when the condition is false" do
41
+ ::D7.new.foo(false,false).should be == false
42
+ ::D7.new.foo(true,false).should be == true
43
+ ::D7.new.foo(false,true).should be == true
44
+ ::D7.new.foo(true,true).should be == true
45
+ end
46
+
47
+ class ::D8
48
+ fastruby '
49
+ def foo(a)
50
+ not a
51
+ end
52
+ '
53
+ end
54
+
55
+ it "should execute unless when the condition is false" do
56
+ ::D8.new.foo(false).should be == true
57
+ ::D8.new.foo(true).should be == false
58
+ end
59
+ end
@@ -0,0 +1,74 @@
1
+ require "fastruby"
2
+
3
+ describe FastRuby, "fastruby" do
4
+
5
+ class ::Y1
6
+ fastruby "
7
+ def foo(x)
8
+ i = 0
9
+ lvar_type(i,Fixnum)
10
+ i = x
11
+ 0
12
+ end
13
+ "
14
+ end
15
+
16
+ it "should deny wrong type assignments at runtime by default" do
17
+ lambda {
18
+ ::Y1.new.foo("test string")
19
+ }.should raise_error(FastRuby::TypeMismatchAssignmentException)
20
+ end
21
+
22
+ class ::Y2
23
+ fastruby "
24
+ def foo(x)
25
+ i = 0
26
+ lvar_type(i,Fixnum)
27
+ i = x
28
+ 0
29
+ end
30
+ ", :validate_lvar_types => true
31
+ end
32
+
33
+ it "should deny wrong type assignments at runtime when validate_lvar_types is true" do
34
+ lambda {
35
+ ::Y2.new.foo("test string")
36
+ }.should raise_error(FastRuby::TypeMismatchAssignmentException)
37
+ end
38
+
39
+ class ::Y3
40
+ fastruby "
41
+ def foo(x)
42
+ i = 0
43
+ lvar_type(i,Fixnum)
44
+ i = x
45
+ 0
46
+ end
47
+ ", :validate_lvar_types => false
48
+ end
49
+
50
+ it "should NOT deny wrong type assignments at runtime when validate_lvar_types is false" do
51
+ lambda {
52
+ ::Y3.new.foo("test string")
53
+ }.should_not raise_error
54
+ end
55
+
56
+
57
+ class ::Y4
58
+ fastruby "
59
+ def foo(x)
60
+ x+1
61
+ end
62
+ "
63
+ end
64
+
65
+ it "should builds be re-entrants, multiple calls should not produce any error if the first call works" do
66
+ lambda {
67
+ ::Y4.build([Y4,Fixnum],:foo)
68
+ ::Y4.build([Y4,Fixnum],:foo)
69
+ ::Y4.build([Y4,Fixnum],:foo)
70
+
71
+ ::Y4.new.foo(1).should be ==2
72
+ }.should_not raise_error
73
+ end
74
+ end
@@ -0,0 +1,95 @@
1
+ require "fastruby"
2
+
3
+ describe FastRuby, "fastruby" do
4
+ class ::Z1
5
+ fastruby "
6
+ def foo
7
+ 0
8
+ end
9
+ "
10
+ end
11
+
12
+ it "should compile Fixnum literals" do
13
+ ::Z1.new.foo.should be == 0
14
+ end
15
+
16
+ class ::Z2
17
+ fastruby "
18
+ def foo
19
+ 'test string'
20
+ end
21
+ "
22
+ end
23
+
24
+ it "should compile string literals" do
25
+ ::Z2.new.foo.should be == 'test string'
26
+ end
27
+
28
+ class ::Z3
29
+ fastruby "
30
+ def foo
31
+ [1,2,3]
32
+ end
33
+ "
34
+ end
35
+
36
+ it "should compile array literals" do
37
+ ::Z3.new.foo.should be == [1,2,3]
38
+ end
39
+
40
+ class ::Z4
41
+ fastruby "
42
+ def foo
43
+ /aaa/
44
+ end
45
+ "
46
+ end
47
+
48
+ it "should compile regexp literals" do
49
+ ::Z4.new.foo.should be == /aaa/
50
+ end
51
+
52
+ class ::Z5
53
+ fastruby "
54
+ def foo
55
+ { 1 => 2, 3 => 4}
56
+ end
57
+ "
58
+ end
59
+
60
+ it "should compile hash literals" do
61
+ ::Z5.new.foo.should be == { 1 => 2, 3 => 4}
62
+ end
63
+
64
+ class ::Z6
65
+ fastruby "
66
+ def foo
67
+ nil
68
+ end
69
+ "
70
+ end
71
+
72
+ it "should compile nil" do
73
+ ::Z6.new.foo.should be == nil
74
+ end
75
+
76
+ class ::Z7
77
+ fastruby "
78
+ def foo(a,b)
79
+ (a..b)
80
+ end
81
+ "
82
+ end
83
+
84
+ def self.test_range(a,b)
85
+ it "should compile range (#{a}..#{b})" do
86
+ ::Z7.new.foo(a,b).should be == (a..b)
87
+ end
88
+ end
89
+
90
+ test_range 0,0
91
+ test_range 3,54
92
+ test_range 'a', 'f'
93
+ test_range 0.54,066
94
+
95
+ end