rubinius-melbourne 2.0.0.19 → 2.0.1.0
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +14 -0
- data/Gemfile +4 -0
- data/Rakefile +31 -0
- data/ext/rubinius/melbourne/extconf.rb +9 -2
- data/lib/rubinius/melbourne.rb +1 -1
- data/lib/rubinius/melbourne/version.rb +1 -1
- data/rubinius-melbourne.gemspec +5 -3
- data/spec/alias_spec.rb +40 -0
- data/spec/and_spec.rb +19 -0
- data/spec/array_spec.rb +81 -0
- data/spec/attrasgn_spec.rb +112 -0
- data/spec/back_ref_spec.rb +11 -0
- data/spec/call_spec.rb +298 -0
- data/spec/case_spec.rb +234 -0
- data/spec/cdecl_spec.rb +45 -0
- data/spec/class_spec.rb +83 -0
- data/spec/colon2_spec.rb +7 -0
- data/spec/colon3_spec.rb +7 -0
- data/spec/const_spec.rb +7 -0
- data/spec/custom/matchers/parse_as.rb +27 -0
- data/spec/custom/runner/relates.rb +83 -0
- data/spec/cvar_spec.rb +29 -0
- data/spec/cvasgn_spec.rb +30 -0
- data/spec/cvdecl_spec.rb +12 -0
- data/spec/default.mspec +4 -0
- data/spec/defined_spec.rb +117 -0
- data/spec/defn_spec.rb +554 -0
- data/spec/defs_spec.rb +81 -0
- data/spec/dot2_spec.rb +7 -0
- data/spec/dot3_spec.rb +7 -0
- data/spec/dregx_spec.rb +52 -0
- data/spec/dstr_spec.rb +169 -0
- data/spec/dsym_spec.rb +10 -0
- data/spec/dxstr_spec.rb +11 -0
- data/spec/ensure_spec.rb +117 -0
- data/spec/false_spec.rb +7 -0
- data/spec/flip2_spec.rb +43 -0
- data/spec/flip3_spec.rb +27 -0
- data/spec/for_spec.rb +61 -0
- data/spec/gasgn_spec.rb +13 -0
- data/spec/gvar_spec.rb +25 -0
- data/spec/hash_spec.rb +31 -0
- data/spec/iasgn_spec.rb +25 -0
- data/spec/if_spec.rb +131 -0
- data/spec/iter_spec.rb +613 -0
- data/spec/lasgn_spec.rb +377 -0
- data/spec/lit_spec.rb +61 -0
- data/spec/masgn_spec.rb +406 -0
- data/spec/match2_spec.rb +19 -0
- data/spec/match3_spec.rb +24 -0
- data/spec/match_spec.rb +7 -0
- data/spec/module_spec.rb +47 -0
- data/spec/nil_spec.rb +7 -0
- data/spec/not_spec.rb +17 -0
- data/spec/nth_ref_spec.rb +7 -0
- data/spec/op_asgn_spec.rb +246 -0
- data/spec/or_spec.rb +35 -0
- data/spec/postexe_spec.rb +7 -0
- data/spec/regex_spec.rb +28 -0
- data/spec/rescue_spec.rb +359 -0
- data/spec/return_spec.rb +57 -0
- data/spec/sclass_spec.rb +55 -0
- data/spec/str_spec.rb +97 -0
- data/spec/super_spec.rb +93 -0
- data/spec/true_spec.rb +7 -0
- data/spec/undef_spec.rb +98 -0
- data/spec/until_spec.rb +140 -0
- data/spec/valias_spec.rb +7 -0
- data/spec/while_spec.rb +192 -0
- data/spec/xstr_spec.rb +7 -0
- data/spec/yield_spec.rb +65 -0
- data/spec/zsuper_spec.rb +45 -0
- metadata +171 -13
data/spec/case_spec.rb
ADDED
@@ -0,0 +1,234 @@
|
|
1
|
+
describe "A Case node" do
|
2
|
+
relates <<-ruby do
|
3
|
+
var = 2
|
4
|
+
result = ""
|
5
|
+
case var
|
6
|
+
when 1 then
|
7
|
+
puts("something")
|
8
|
+
result = "red"
|
9
|
+
when 2, 3 then
|
10
|
+
result = "yellow"
|
11
|
+
when 4 then
|
12
|
+
# do nothing
|
13
|
+
else
|
14
|
+
result = "green"
|
15
|
+
end
|
16
|
+
case result
|
17
|
+
when "red" then
|
18
|
+
var = 1
|
19
|
+
when "yellow" then
|
20
|
+
var = 2
|
21
|
+
when "green" then
|
22
|
+
var = 3
|
23
|
+
else
|
24
|
+
# do nothing
|
25
|
+
end
|
26
|
+
ruby
|
27
|
+
|
28
|
+
parse do
|
29
|
+
[:block,
|
30
|
+
[:lasgn, :var, [:lit, 2]],
|
31
|
+
[:lasgn, :result, [:str, ""]],
|
32
|
+
[:case,
|
33
|
+
[:lvar, :var],
|
34
|
+
[:when,
|
35
|
+
[:array, [:lit, 1]],
|
36
|
+
[:block,
|
37
|
+
[:call, nil, :puts, [:arglist, [:str, "something"]]],
|
38
|
+
[:lasgn, :result, [:str, "red"]]]],
|
39
|
+
[:when,
|
40
|
+
[:array, [:lit, 2], [:lit, 3]],
|
41
|
+
[:lasgn, :result, [:str, "yellow"]]],
|
42
|
+
[:when, [:array, [:lit, 4]], nil],
|
43
|
+
[:lasgn, :result, [:str, "green"]]],
|
44
|
+
[:case,
|
45
|
+
[:lvar, :result],
|
46
|
+
[:when, [:array, [:str, "red"]], [:lasgn, :var, [:lit, 1]]],
|
47
|
+
[:when, [:array, [:str, "yellow"]], [:lasgn, :var, [:lit, 2]]],
|
48
|
+
[:when, [:array, [:str, "green"]], [:lasgn, :var, [:lit, 3]]],
|
49
|
+
nil]]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
relates <<-ruby do
|
54
|
+
case a
|
55
|
+
when b then
|
56
|
+
case
|
57
|
+
when (d and e) then
|
58
|
+
f
|
59
|
+
else
|
60
|
+
# do nothing
|
61
|
+
end
|
62
|
+
else
|
63
|
+
# do nothing
|
64
|
+
end
|
65
|
+
ruby
|
66
|
+
|
67
|
+
parse do
|
68
|
+
[:case,
|
69
|
+
[:call, nil, :a, [:arglist]],
|
70
|
+
[:when,
|
71
|
+
[:array, [:call, nil, :b, [:arglist]]],
|
72
|
+
[:case,
|
73
|
+
nil,
|
74
|
+
[:when,
|
75
|
+
[:array,
|
76
|
+
[:and,
|
77
|
+
[:call, nil, :d, [:arglist]],
|
78
|
+
[:call, nil, :e, [:arglist]]]],
|
79
|
+
[:call, nil, :f, [:arglist]]],
|
80
|
+
nil]],
|
81
|
+
nil]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
relates <<-ruby do
|
86
|
+
var1 = 1
|
87
|
+
var2 = 2
|
88
|
+
result = nil
|
89
|
+
case var1
|
90
|
+
when 1 then
|
91
|
+
case var2
|
92
|
+
when 1 then
|
93
|
+
result = 1
|
94
|
+
when 2 then
|
95
|
+
result = 2
|
96
|
+
else
|
97
|
+
result = 3
|
98
|
+
end
|
99
|
+
when 2 then
|
100
|
+
case var2
|
101
|
+
when 1 then
|
102
|
+
result = 4
|
103
|
+
when 2 then
|
104
|
+
result = 5
|
105
|
+
else
|
106
|
+
result = 6
|
107
|
+
end
|
108
|
+
else
|
109
|
+
result = 7
|
110
|
+
end
|
111
|
+
ruby
|
112
|
+
|
113
|
+
parse do
|
114
|
+
[:block,
|
115
|
+
[:lasgn, :var1, [:lit, 1]],
|
116
|
+
[:lasgn, :var2, [:lit, 2]],
|
117
|
+
[:lasgn, :result, [:nil]],
|
118
|
+
[:case,
|
119
|
+
[:lvar, :var1],
|
120
|
+
[:when,
|
121
|
+
[:array, [:lit, 1]],
|
122
|
+
[:case,
|
123
|
+
[:lvar, :var2],
|
124
|
+
[:when, [:array, [:lit, 1]], [:lasgn, :result, [:lit, 1]]],
|
125
|
+
[:when, [:array, [:lit, 2]], [:lasgn, :result, [:lit, 2]]],
|
126
|
+
[:lasgn, :result, [:lit, 3]]]],
|
127
|
+
[:when,
|
128
|
+
[:array, [:lit, 2]],
|
129
|
+
[:case,
|
130
|
+
[:lvar, :var2],
|
131
|
+
[:when, [:array, [:lit, 1]], [:lasgn, :result, [:lit, 4]]],
|
132
|
+
[:when, [:array, [:lit, 2]], [:lasgn, :result, [:lit, 5]]],
|
133
|
+
[:lasgn, :result, [:lit, 6]]]],
|
134
|
+
[:lasgn, :result, [:lit, 7]]]]
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
relates <<-ruby do
|
139
|
+
case
|
140
|
+
when (a == 1) then
|
141
|
+
:a
|
142
|
+
when (a == 2) then
|
143
|
+
:b
|
144
|
+
else
|
145
|
+
:c
|
146
|
+
end
|
147
|
+
ruby
|
148
|
+
|
149
|
+
parse do
|
150
|
+
[:case,
|
151
|
+
nil,
|
152
|
+
[:when,
|
153
|
+
[:array,
|
154
|
+
[:call, [:call, nil, :a, [:arglist]], :==, [:arglist, [:lit, 1]]]],
|
155
|
+
[:lit, :a]],
|
156
|
+
[:when,
|
157
|
+
[:array,
|
158
|
+
[:call, [:call, nil, :a, [:arglist]], :==, [:arglist, [:lit, 2]]]],
|
159
|
+
[:lit, :b]],
|
160
|
+
[:lit, :c]]
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
relates <<-ruby do
|
165
|
+
case a
|
166
|
+
when :b, *c then
|
167
|
+
d
|
168
|
+
else
|
169
|
+
e
|
170
|
+
end
|
171
|
+
ruby
|
172
|
+
|
173
|
+
parse do
|
174
|
+
[:case,
|
175
|
+
[:call, nil, :a, [:arglist]],
|
176
|
+
[:when,
|
177
|
+
[:array, [:lit, :b], [:when, [:call, nil, :c, [:arglist]], nil]],
|
178
|
+
[:call, nil, :d, [:arglist]]],
|
179
|
+
[:call, nil, :e, [:arglist]]]
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
relates <<-ruby do
|
184
|
+
case true
|
185
|
+
when String, *%w(foo bar baz) then
|
186
|
+
12
|
187
|
+
end
|
188
|
+
ruby
|
189
|
+
|
190
|
+
parse do
|
191
|
+
[:case,
|
192
|
+
[:true],
|
193
|
+
[:when,
|
194
|
+
[:array,
|
195
|
+
[:const, :String],
|
196
|
+
[:when, [:array, [:str, "foo"], [:str, "bar"], [:str, "baz"]], nil]],
|
197
|
+
[:lit, 12]],
|
198
|
+
nil]
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
relates <<-ruby do
|
203
|
+
case ()
|
204
|
+
when a
|
205
|
+
1
|
206
|
+
end
|
207
|
+
ruby
|
208
|
+
|
209
|
+
parse do
|
210
|
+
[:case,
|
211
|
+
[:nil],
|
212
|
+
[:when, [:array, [:call, nil, :a, [:arglist]]], [:lit, 1]],
|
213
|
+
nil]
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
relates <<-ruby do
|
218
|
+
x = 1
|
219
|
+
case a
|
220
|
+
when x
|
221
|
+
2
|
222
|
+
end
|
223
|
+
ruby
|
224
|
+
|
225
|
+
parse do
|
226
|
+
[:block,
|
227
|
+
[:lasgn, :x, [:lit, 1]],
|
228
|
+
[:case,
|
229
|
+
[:call, nil, :a, [:arglist]],
|
230
|
+
[:when, [:array, [:lvar, :x]], [:lit, 2]],
|
231
|
+
nil]]
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
data/spec/cdecl_spec.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
describe "A Cdecl node" do
|
2
|
+
relates "X = 42" do
|
3
|
+
parse do
|
4
|
+
[:cdecl, :X, [:lit, 42]]
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
relates "::X = 1" do
|
9
|
+
parse do
|
10
|
+
[:cdecl, [:colon3, :X], [:lit, 1]]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
relates "X::Y = 1" do
|
15
|
+
parse do
|
16
|
+
[:cdecl, [:colon2, [:const, :X], :Y], [:lit, 1]]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
relates "X::Y::Z = a" do
|
21
|
+
parse do
|
22
|
+
[:cdecl,
|
23
|
+
[:colon2, [:colon2, [:const, :X], :Y], :Z],
|
24
|
+
[:call, nil, :a, [:arglist]]]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
relates "a::A = 1" do
|
29
|
+
parse do
|
30
|
+
[:cdecl, [:colon2, [:call, nil, :a, [:arglist]], :A], [:lit, 1]]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
relates <<-ruby do
|
35
|
+
a = Object
|
36
|
+
a::B = b
|
37
|
+
ruby
|
38
|
+
|
39
|
+
parse do
|
40
|
+
[:block,
|
41
|
+
[:lasgn, :a, [:const, :Object]],
|
42
|
+
[:cdecl, [:colon2, [:lvar, :a], :B], [:call, nil, :b, [:arglist]]]]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/spec/class_spec.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
describe "A Class node" do
|
2
|
+
relates <<-ruby do
|
3
|
+
class X
|
4
|
+
puts((1 + 1))
|
5
|
+
def blah
|
6
|
+
puts("hello")
|
7
|
+
end
|
8
|
+
end
|
9
|
+
ruby
|
10
|
+
|
11
|
+
parse do
|
12
|
+
[:class,
|
13
|
+
:X,
|
14
|
+
nil,
|
15
|
+
[:scope,
|
16
|
+
[:block,
|
17
|
+
[:call,
|
18
|
+
nil,
|
19
|
+
:puts,
|
20
|
+
[:arglist, [:call, [:lit, 1], :+, [:arglist, [:lit, 1]]]]],
|
21
|
+
[:defn,
|
22
|
+
:blah,
|
23
|
+
[:args],
|
24
|
+
[:scope,
|
25
|
+
[:block, [:call, nil, :puts, [:arglist, [:str, "hello"]]]]]]]]]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
relates <<-ruby do
|
30
|
+
class ::Y
|
31
|
+
c
|
32
|
+
end
|
33
|
+
ruby
|
34
|
+
|
35
|
+
parse do
|
36
|
+
[:class, [:colon3, :Y], nil, [:scope, [:call, nil, :c, [:arglist]]]]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
relates <<-ruby do
|
41
|
+
class X::Y
|
42
|
+
c
|
43
|
+
end
|
44
|
+
ruby
|
45
|
+
|
46
|
+
parse do
|
47
|
+
[:class,
|
48
|
+
[:colon2, [:const, :X], :Y],
|
49
|
+
nil,
|
50
|
+
[:scope, [:call, nil, :c, [:arglist]]]]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
relates <<-ruby do
|
55
|
+
class X < Array
|
56
|
+
end
|
57
|
+
ruby
|
58
|
+
|
59
|
+
parse do
|
60
|
+
[:class, :X, [:const, :Array], [:scope]]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
relates <<-ruby do
|
65
|
+
class X < expr
|
66
|
+
end
|
67
|
+
ruby
|
68
|
+
|
69
|
+
parse do
|
70
|
+
[:class, :X, [:call, nil, :expr, [:arglist]], [:scope]]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
relates <<-ruby do
|
75
|
+
class X < Object
|
76
|
+
end
|
77
|
+
ruby
|
78
|
+
|
79
|
+
parse do
|
80
|
+
[:class, :X, [:const, :Object], [:scope]]
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
data/spec/colon2_spec.rb
ADDED
data/spec/colon3_spec.rb
ADDED
data/spec/const_spec.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# The ParseAsMatcher wraps the logic for checking that a string of Ruby code
|
2
|
+
# is converted to the expected s-expression. It is combined with the #parse_as
|
3
|
+
# spec helper and enables specs of the form:
|
4
|
+
#
|
5
|
+
# "a = 1".should parse_as([:lasgn, :a, [:lit, 1]])
|
6
|
+
#
|
7
|
+
class ParseAsMatcher
|
8
|
+
def initialize(expected)
|
9
|
+
@expected = expected
|
10
|
+
end
|
11
|
+
|
12
|
+
def matches?(actual)
|
13
|
+
@actual = actual.to_sexp.to_a
|
14
|
+
@actual == @expected
|
15
|
+
end
|
16
|
+
|
17
|
+
def failure_message
|
18
|
+
["Expected:\n#{@actual.pretty_inspect}\n",
|
19
|
+
"to equal:\n#{@expected.pretty_inspect}"]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class Object
|
24
|
+
def parse_as(sexp)
|
25
|
+
ParseAsMatcher.new sexp
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# SpecDataRelation enables concise specs that involve several different forms
|
2
|
+
# of the same data. This is specifically useful for the parser and compiler
|
3
|
+
# specs where the output of each stage is essentially related to the input
|
4
|
+
# Ruby source. Together with the #relates spec method, it enables specs like:
|
5
|
+
#
|
6
|
+
# describe "An If node" do
|
7
|
+
# relates "a if b" do
|
8
|
+
# parse do
|
9
|
+
# # return the expected sexp
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
# compile do |g|
|
13
|
+
# # return the expected bytecode
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# jit do |as|
|
17
|
+
# # return the expected asm/machine code
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# relates "if a; b; end" do
|
22
|
+
# # ...
|
23
|
+
# end
|
24
|
+
# end
|
25
|
+
|
26
|
+
class SpecDataRelation
|
27
|
+
# Provides a simple configurability so that any one or more of the possible
|
28
|
+
# processes can be run. See the custom options in custom/utils/options.rb.
|
29
|
+
def self.enable(process)
|
30
|
+
@processors ||= []
|
31
|
+
@processors << process
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns true if no process is specifically set or if +process+ is in the
|
35
|
+
# list of enabled processes. In other words, all processes are enabled by
|
36
|
+
# default, or any combination of them may be enabled.
|
37
|
+
def self.enabled?(process)
|
38
|
+
@processors.nil? or @processors.include?(process)
|
39
|
+
end
|
40
|
+
|
41
|
+
def initialize(ruby)
|
42
|
+
@ruby = ruby
|
43
|
+
end
|
44
|
+
|
45
|
+
# Formats the Ruby source code for reabable output in the -fs formatter
|
46
|
+
# option. If the source contains no newline characters, wraps the source in
|
47
|
+
# single quotes to set if off from the rest of the description string. If
|
48
|
+
# the source does contain newline characters, sets the indent level to four
|
49
|
+
# characters.
|
50
|
+
def format(ruby)
|
51
|
+
if /\n/ =~ ruby
|
52
|
+
lines = ruby.rstrip.lines
|
53
|
+
if /( *)/ =~ lines.first
|
54
|
+
if $1.size > 4
|
55
|
+
dedent = $1.size - 4
|
56
|
+
ruby = lines.map { |l| l[dedent..-1] }.join
|
57
|
+
else
|
58
|
+
indent = " " * (4 - $1.size)
|
59
|
+
ruby = lines.map { |l| "#{indent}#{l}" }.join
|
60
|
+
end
|
61
|
+
end
|
62
|
+
"\n#{ruby}"
|
63
|
+
else
|
64
|
+
"'#{ruby}'"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Creates spec example blocks if the parse process is enabled.
|
69
|
+
def parse(&block)
|
70
|
+
return unless self.class.enabled? :parser
|
71
|
+
|
72
|
+
ruby = @ruby
|
73
|
+
it "is parsed from #{format ruby}" do
|
74
|
+
ruby.should parse_as(block.call)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class Object
|
80
|
+
def relates(str, &block)
|
81
|
+
SpecDataRelation.new(str).instance_eval(&block)
|
82
|
+
end
|
83
|
+
end
|