farleyknight-ionize 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.
- data/README.rdoc +59 -0
- data/Rakefile +5 -0
- data/bin/ionize +47 -0
- data/lib/ionize.rb +75 -0
- data/lib/ionize/environment.rb +56 -0
- data/lib/ionize/environment/application.rb +58 -0
- data/lib/ionize/environment/php_array.rb +95 -0
- data/lib/ionize/parser.rb +272 -0
- data/lib/ionize/tokenizer.rb +544 -0
- data/lib/ionize/translate.rb +34 -0
- data/lib/ionize/translate/composite_string_statements.rb +79 -0
- data/lib/ionize/translate/debug.rb +16 -0
- data/lib/ionize/translate/ext.rb +47 -0
- data/lib/ionize/translate/function_args.rb +132 -0
- data/lib/ionize/translate/if_statements.rb +42 -0
- data/lib/ionize/translate/multiple_statements.rb +22 -0
- data/lib/ionize/translate/php_to_ruby.rb +40 -0
- data/lib/ionize/translate/rails_for_php.rb +191 -0
- data/lib/ionize/translate/rewritable.rb +133 -0
- data/lib/ionize/translate/rewrites.rb +51 -0
- data/lib/ionize/translate/statements.rb +622 -0
- data/lib/ionize/translate/switch_case_statements.rb +52 -0
- data/lib/ionize/translate/term_statements.rb +76 -0
- data/lib/ionize/translate/translator.rb +52 -0
- data/lib/ionize/version.rb +9 -0
- data/spec/fixtures/array_lookup.php +10 -0
- data/spec/fixtures/boolean_operators.php +5 -0
- data/spec/fixtures/boolean_operators.rb +6 -0
- data/spec/fixtures/class_def.php +34 -0
- data/spec/fixtures/class_def.rb +34 -0
- data/spec/fixtures/dangling_else.php +8 -0
- data/spec/fixtures/dangling_else.rb +12 -0
- data/spec/fixtures/drupal_1.php +663 -0
- data/spec/fixtures/drupal_2.php +1152 -0
- data/spec/fixtures/empty_string.php +12 -0
- data/spec/fixtures/for_loop.php +17 -0
- data/spec/fixtures/for_loop2.php +13 -0
- data/spec/fixtures/for_loop3.php +16 -0
- data/spec/fixtures/for_loop3.rb +17 -0
- data/spec/fixtures/for_loop4.php +5 -0
- data/spec/fixtures/for_loop4.rb +6 -0
- data/spec/fixtures/foreach.php +9 -0
- data/spec/fixtures/foreach2.php +8 -0
- data/spec/fixtures/foreach3.php +7 -0
- data/spec/fixtures/foreach3.rb +7 -0
- data/spec/fixtures/fun_def.php +9 -0
- data/spec/fixtures/fun_def2.php +30 -0
- data/spec/fixtures/fun_def2.rb +30 -0
- data/spec/fixtures/fun_def3.php +33 -0
- data/spec/fixtures/fun_def4.php +43 -0
- data/spec/fixtures/fun_def4.rb +37 -0
- data/spec/fixtures/fun_def5.php +36 -0
- data/spec/fixtures/fun_with_if.php +6 -0
- data/spec/fixtures/fun_with_if.rb +6 -0
- data/spec/fixtures/fun_with_ifs.php +12 -0
- data/spec/fixtures/fun_with_ifs.rb +14 -0
- data/spec/fixtures/hello_world.php +6 -0
- data/spec/fixtures/heredoc.php +6 -0
- data/spec/fixtures/heredoc.rb +5 -0
- data/spec/fixtures/if.php +6 -0
- data/spec/fixtures/if.rb +7 -0
- data/spec/fixtures/if_boolean.php +5 -0
- data/spec/fixtures/if_boolean.rb +5 -0
- data/spec/fixtures/if_else.php +11 -0
- data/spec/fixtures/if_else1.php +17 -0
- data/spec/fixtures/if_else2.php +8 -0
- data/spec/fixtures/if_else3.php +15 -0
- data/spec/fixtures/if_else_nested.php +14 -0
- data/spec/fixtures/if_else_nested.rb +15 -0
- data/spec/fixtures/if_else_series.php +12 -0
- data/spec/fixtures/if_else_series.rb +12 -0
- data/spec/fixtures/if_not.php +5 -0
- data/spec/fixtures/if_not.rb +5 -0
- data/spec/fixtures/if_with_brackets.php +7 -0
- data/spec/fixtures/if_with_brackets.rb +7 -0
- data/spec/fixtures/long_if_else.php +10 -0
- data/spec/fixtures/long_if_else.rb +9 -0
- data/spec/fixtures/oo.php +16 -0
- data/spec/fixtures/php_nuke/sql_layer.php +527 -0
- data/spec/fixtures/postop.php +3 -0
- data/spec/fixtures/preop.php +7 -0
- data/spec/fixtures/simple_fun_def.php +4 -0
- data/spec/fixtures/switch_case.php +13 -0
- data/spec/fixtures/switch_case.rb +14 -0
- data/spec/fixtures/switch_case2.php +25 -0
- data/spec/fixtures/switch_case3.php +40 -0
- data/spec/fixtures/switch_case3.rb +42 -0
- data/spec/fixtures/switch_case4.php +56 -0
- data/spec/fixtures/switch_case5.php +71 -0
- data/spec/fixtures/switch_case_with_rescue_nil.php +43 -0
- data/spec/fixtures/switch_case_with_rescue_nil.rb +35 -0
- data/spec/fixtures/tertiary.php +3 -0
- data/spec/helper.rb +17 -0
- data/spec/php_environment_spec.rb +83 -0
- data/spec/php_parser_spec.rb +121 -0
- data/spec/php_translator_spec.rb +358 -0
- data/spec/rails_for_php_spec.rb +303 -0
- metadata +191 -0
@@ -0,0 +1,121 @@
|
|
1
|
+
|
2
|
+
require 'spec'
|
3
|
+
require 'lib/ionize'
|
4
|
+
|
5
|
+
Ionize::Php::CharacterLimit = 50000
|
6
|
+
|
7
|
+
Kernel.module_eval { alias :running :lambda }
|
8
|
+
|
9
|
+
describe "Parsing Php" do
|
10
|
+
def parsing(text)
|
11
|
+
lambda { Ionize::Php.to_ast(text) }
|
12
|
+
end
|
13
|
+
|
14
|
+
def parsing_file(filename)
|
15
|
+
parsing(File.read(filename))
|
16
|
+
end
|
17
|
+
|
18
|
+
def parsing_fixture(filename)
|
19
|
+
parsing_file("spec/fixtures/#{filename}")
|
20
|
+
end
|
21
|
+
|
22
|
+
it "parses hello world as" do
|
23
|
+
parsing(%q{ print("Hello World!"); }).should_not raise_error
|
24
|
+
end
|
25
|
+
|
26
|
+
it "parses a variable right next to a keyword" do
|
27
|
+
parsing(%q{ print$buffer; }).should_not raise_error
|
28
|
+
end
|
29
|
+
|
30
|
+
it "parses a preop and an op in one line" do
|
31
|
+
parsing(%q{!update($module) + $a;}).should_not raise_error
|
32
|
+
end
|
33
|
+
|
34
|
+
it "parses a trailing comma in the function args" do
|
35
|
+
parsing(%q{ array('#value' => "stuff",); }).should_not raise_error
|
36
|
+
end
|
37
|
+
|
38
|
+
it "parses a keyword touching a string" do
|
39
|
+
parsing(%q{ echo"<table border=\"0\" width=\"100%\" cellspacing=\"1\"><tr>"; }).should_not raise_error
|
40
|
+
end
|
41
|
+
|
42
|
+
it "parses a postop" do
|
43
|
+
parsing("$i++;").should_not raise_error
|
44
|
+
end
|
45
|
+
|
46
|
+
it "parses a braced lookup" do
|
47
|
+
parsing(%q{ $email{$i}; }).should_not raise_error
|
48
|
+
end
|
49
|
+
|
50
|
+
it "parses a class method call" do
|
51
|
+
parsing(%q{ MyClass::call($variable); }).should_not raise_error
|
52
|
+
end
|
53
|
+
|
54
|
+
it "parses a reference to an expression" do
|
55
|
+
parsing(%q{ $obj =& new $classname; }).should_not raise_error
|
56
|
+
end
|
57
|
+
|
58
|
+
it "parses an empty if else" do
|
59
|
+
parsing(%q{ if (true); else echo "whatever"; }).should_not raise_error
|
60
|
+
end
|
61
|
+
|
62
|
+
it "parses a backslash right after a variable, within a composite string" do
|
63
|
+
parsing(%q{ require_once "./profiles/$profile/$profile.profile"; }).should_not raise_error
|
64
|
+
end
|
65
|
+
|
66
|
+
it "parses a variable with an array, within a string" do
|
67
|
+
parsing(%q{ $default_val = "$attributes[default]"; }).should_not raise_error
|
68
|
+
end
|
69
|
+
|
70
|
+
it "parses an echo statement with a one line if statement" do
|
71
|
+
parsing(%q{ if($sql_debug) echo "SQL query: "; }).should_not raise_error
|
72
|
+
end
|
73
|
+
|
74
|
+
it "parses multi oo expr" do
|
75
|
+
parsing(%q{ $this->installer->config->getRegistry(); }).should_not raise_error
|
76
|
+
end
|
77
|
+
|
78
|
+
it "parses a complicated string" do
|
79
|
+
parsing(%q{ echo "<!-- tinyMCE -->
|
80
|
+
<script language=\"javascript\" type=\"text/javascript\" src=\"includes/tiny_mce/tiny_mce.js\"></script>";}).should_not raise_error
|
81
|
+
end
|
82
|
+
|
83
|
+
it "parses a variable within an array lookup within a string" do
|
84
|
+
parsing(%q{ $row = $db->sql_fetchrow($db->sql_query("SELECT mid from " . $prefix . "_modules where title='$modlist[$i]'")); }).should_not raise_error
|
85
|
+
end
|
86
|
+
|
87
|
+
it "parses two array lookups within a string" do
|
88
|
+
parsing(%q{ $db->sql_query("insert into " . $prefix . "_modules values (NULL, '$modlist[$i]', '$modlist[$i]', '0', '0', '1', '0', '')"); }).should_not raise_error
|
89
|
+
end
|
90
|
+
|
91
|
+
Dir['spec/fixtures/*.php'].each do |fixture|
|
92
|
+
it "parses #{fixture}" do
|
93
|
+
parsing_file(fixture).should_not raise_error
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
it "parses PHP-NUKE's SQL Layer" do
|
98
|
+
parsing_fixture("php_nuke/sql_layer.php").should_not raise_error
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
it "parses a heredoc" do
|
103
|
+
code = %q{
|
104
|
+
$something =<<<EOF
|
105
|
+
okay
|
106
|
+
EOF;
|
107
|
+
}
|
108
|
+
parsing(code).should_not raise_error
|
109
|
+
end
|
110
|
+
|
111
|
+
it "parses an empty if else within an empty if else" do
|
112
|
+
parsing(%q{
|
113
|
+
if ($cond1);
|
114
|
+
else
|
115
|
+
if ($cond2);
|
116
|
+
else
|
117
|
+
$regs[1] = "";
|
118
|
+
}).should_not raise_error
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
@@ -0,0 +1,358 @@
|
|
1
|
+
|
2
|
+
require 'spec'
|
3
|
+
require 'lib/ionize'
|
4
|
+
|
5
|
+
describe "Transforms Php" do
|
6
|
+
# teh php codez
|
7
|
+
def php_ast(text)
|
8
|
+
Ionize::Php.to_sexp(text)
|
9
|
+
end
|
10
|
+
|
11
|
+
# teh ruby codez
|
12
|
+
def ruby_ast(text)
|
13
|
+
ParseTree.translate(text)
|
14
|
+
end
|
15
|
+
|
16
|
+
def php_file(filename)
|
17
|
+
php_ast(File.read(filename))
|
18
|
+
end
|
19
|
+
|
20
|
+
def ruby_file(filename)
|
21
|
+
ruby_ast(File.read(filename))
|
22
|
+
end
|
23
|
+
|
24
|
+
def php_file_matches_ruby_file(filename)
|
25
|
+
php_file("spec/fixtures/#{filename}.php").should ==
|
26
|
+
ruby_file("spec/fixtures/#{filename}.rb")
|
27
|
+
end
|
28
|
+
|
29
|
+
it "transforms hello world" do
|
30
|
+
php_ast(%q{ print "hello world"; }).should ==
|
31
|
+
ruby_ast(%q{ print "hello world" })
|
32
|
+
end
|
33
|
+
|
34
|
+
it "transforms an assignment statement" do
|
35
|
+
php_ast(%q{ $something = true; }).should ==
|
36
|
+
ruby_ast(%q{ something = true })
|
37
|
+
end
|
38
|
+
|
39
|
+
it "transforms a one-line if statement" do
|
40
|
+
php_ast(%q{ $something = true; if ($something) { print "hey"; } }).should ==
|
41
|
+
ruby_ast(%q{ something = true; if something; print "hey"; end })
|
42
|
+
end
|
43
|
+
|
44
|
+
it "transforms a tertiary statement" do
|
45
|
+
php_ast(%q{ $something = (TRUE == TRUE) ? TRUE : FALSE; }).should ==
|
46
|
+
ruby_ast(%q{ something = (true == true) ? true : false })
|
47
|
+
end
|
48
|
+
|
49
|
+
it "tranforms a cast" do
|
50
|
+
php_ast(%q{ (double)microtime() * 100; }).should ==
|
51
|
+
ruby_ast(%q{ microtime().to_double * 100 })
|
52
|
+
end
|
53
|
+
|
54
|
+
it "transforms a simple function definition" do
|
55
|
+
php_ast(%q{ function hey() { print "there"; } }).should ==
|
56
|
+
ruby_ast(%q{ def hey; print "there"; end })
|
57
|
+
end
|
58
|
+
|
59
|
+
it "transforms a global variable" do |node|
|
60
|
+
php_ast(%q{ global $something; }).should ==
|
61
|
+
ruby_ast(%q{ $something })
|
62
|
+
end
|
63
|
+
|
64
|
+
it "transforms two global variables" do |node|
|
65
|
+
php_ast(%q{ global $something, $another; }).should ==
|
66
|
+
ruby_ast(%q{ global $something, $another })
|
67
|
+
end
|
68
|
+
|
69
|
+
it "transforms an echo statement" do |node|
|
70
|
+
php_ast(%q{ echo "something"; }).should ==
|
71
|
+
ruby_ast(%q{ echo "something" })
|
72
|
+
end
|
73
|
+
|
74
|
+
it "transforms a new Object to an Object.new" do |node|
|
75
|
+
php_ast(%q{ $result_set = new ResultSet; }).should ==
|
76
|
+
ruby_ast(%q{ result_set = ResultSet.new })
|
77
|
+
end
|
78
|
+
|
79
|
+
it "transforms a slightly more complicated function" do
|
80
|
+
php_ast(%q{ function something($a, $b, $c) { return $a + $b + $c; } }).should ==
|
81
|
+
ruby_ast(%q{ def something(a, b, c); return a + b + c; end })
|
82
|
+
end
|
83
|
+
|
84
|
+
it "tranforms a function call" do
|
85
|
+
# We will need to create an 'array' method to simulate Php's top-level function
|
86
|
+
php_ast(%q{ $something = array(); }).should ==
|
87
|
+
ruby_ast(%q{ something = array() })
|
88
|
+
end
|
89
|
+
|
90
|
+
it "transforms a complicated function header" do
|
91
|
+
php_ast(%q{ function add_column(&$ret, $attributes = array()) { print 'something'; } }).should ==
|
92
|
+
ruby_ast(%q{ def add_column(ret, attributes = array()); print 'something'; end })
|
93
|
+
end
|
94
|
+
|
95
|
+
it "transforms an error guard into a rescue nil" do
|
96
|
+
php_ast(%q{ $id = 0; $other = @mysql_close($id); }).should ==
|
97
|
+
ruby_ast(%q{ id = 0; other = mysql_close(id) rescue nil })
|
98
|
+
end
|
99
|
+
|
100
|
+
it "transforms a require_once into just a require" do
|
101
|
+
php_ast(%q{ require_once "PEAR.php"; }).should ==
|
102
|
+
ruby_ast(%q{ require "PEAR.php" })
|
103
|
+
end
|
104
|
+
|
105
|
+
it "transforms an include_once into a load" do
|
106
|
+
php_ast(%q{ include_once "PEAR.php"; }).should ==
|
107
|
+
ruby_ast(%q{ load "PEAR.php" })
|
108
|
+
end
|
109
|
+
|
110
|
+
it "transforms an include into a load" do
|
111
|
+
php_ast(%q{ include "PEAR.php"; }).should ==
|
112
|
+
ruby_ast(%q{ load "PEAR.php" })
|
113
|
+
end
|
114
|
+
|
115
|
+
it "transforms a class inheritance" do
|
116
|
+
php_ast(%q{ class Something extends Another { var $foo; } }).should ==
|
117
|
+
ruby_ast(%q{ class Something < Another; attr_accessor :foo; end })
|
118
|
+
end
|
119
|
+
|
120
|
+
it "transforms a class variable default into an attr_access_with_default" do
|
121
|
+
php_ast(%q{ class Something { var $foo = "string"; } }).should ==
|
122
|
+
ruby_ast(%q{ class Something; attr_accessor(:foo, "string"); end })
|
123
|
+
end
|
124
|
+
|
125
|
+
it "transforms a braced lookup into a regular array-style lookup" do
|
126
|
+
php_ast(%q{ $var = "string"; $var{0}; }).should ==
|
127
|
+
ruby_ast(%q{ var = "string"; var[0]; })
|
128
|
+
end
|
129
|
+
|
130
|
+
it "transforms an object attribute array assignment" do
|
131
|
+
php_ast(%q{ $method = 3; $classname = "Object"; $var = thing(); $var->attr[$method] = $classname; }).should ==
|
132
|
+
ruby_ast(%q{ method = 3; classname = "Object"; var = thing(); var.attr[method] = classname })
|
133
|
+
end
|
134
|
+
|
135
|
+
|
136
|
+
it "transforms an object dynamic variable assignment" do
|
137
|
+
# In php, you can do this:
|
138
|
+
#
|
139
|
+
# $var = "foo";
|
140
|
+
# $obj->$var = "bar";
|
141
|
+
#
|
142
|
+
# and this
|
143
|
+
#
|
144
|
+
# $obj->foo == "bar"
|
145
|
+
#
|
146
|
+
# would be true
|
147
|
+
#
|
148
|
+
#
|
149
|
+
|
150
|
+
php_ast(%q{ $var = "foo"; $obj = new Object; $obj->$var = "something"; }).should ==
|
151
|
+
ruby_ast(%q{ var = "foo"; obj = Object.new; obj.set(var, "something") })
|
152
|
+
end
|
153
|
+
|
154
|
+
it "transforms an object dynamic variable retrieve" do
|
155
|
+
php_ast(%q{ $var = "foo"; $obj = new Object; $obj->$var; }).should ==
|
156
|
+
ruby_ast(%q{ var = "foo"; obj = Object.new; obj.get(var) })
|
157
|
+
end
|
158
|
+
|
159
|
+
it "transforms an array lookup on an object" do
|
160
|
+
php_ast(%q{ $user = new User; $user->data['user_id']; }).should ==
|
161
|
+
ruby_ast(%q{ user = User.new; user.data["user_id"] })
|
162
|
+
end
|
163
|
+
|
164
|
+
it "transforms a while loop" do
|
165
|
+
php_ast(%q{ while (TRUE) { print "hahaha!1!"; } }).should ==
|
166
|
+
ruby_ast(%q{ while true; print "hahaha!1!"; end })
|
167
|
+
end
|
168
|
+
|
169
|
+
it "transforms an empty fun call" do
|
170
|
+
php_ast(%q{ something(); }).should ==
|
171
|
+
ruby_ast(%q{ something() })
|
172
|
+
end
|
173
|
+
|
174
|
+
it "tranforms an attribute assignment" do
|
175
|
+
php_ast(%q{ $a = array(); $a[1] = 2; }).should ==
|
176
|
+
ruby_ast(%q{ a = array(); a[1] = 2 })
|
177
|
+
end
|
178
|
+
|
179
|
+
it "transforms an oo assignment" do
|
180
|
+
php_ast(%q{ $some = yup(); $some->thing = "other"; }).should ==
|
181
|
+
ruby_ast(%q{ some = yup(); some.thing = "other" })
|
182
|
+
end
|
183
|
+
|
184
|
+
it "transforms a multiple oo function call" do
|
185
|
+
php_ast(%q{ $obj = new Object(); $obj->installer->something(1); }).should ==
|
186
|
+
ruby_ast(%q{ obj = Object.new; obj.installer.something(1) })
|
187
|
+
end
|
188
|
+
|
189
|
+
it "transforms a multiple oo attribute" do
|
190
|
+
php_ast(%q{ $obj = new Object(); $obj->installer->something->config; }).should ==
|
191
|
+
ruby_ast(%q{ obj = Object.new; obj.installer.something.config })
|
192
|
+
end
|
193
|
+
|
194
|
+
it "transforms a return" do
|
195
|
+
php_ast(%q{ return $this->result; }).should ==
|
196
|
+
ruby_ast(%q{ return self.result })
|
197
|
+
end
|
198
|
+
|
199
|
+
it "tranforms Php's destructuring bind" do
|
200
|
+
php_ast(%q{ list($hey, $whats, $up) = array("hey", "whats", "up"); }).should ==
|
201
|
+
ruby_ast(%q{ hey, whats, up = *array("hey", "whats", "up") })
|
202
|
+
end
|
203
|
+
|
204
|
+
it "transforms string concatenation" do
|
205
|
+
php_ast(%q{ $check = "test"; $check .= "test"; }).should ==
|
206
|
+
ruby_ast(%q{ check = "test"; check << "test" })
|
207
|
+
end
|
208
|
+
|
209
|
+
it "transforms Php's string concat to Ruby's string concat" do
|
210
|
+
php_ast(%q{$column = "something"; $type = "something"; $table = "something"; "ALTER TABLE {". $table . "} ADD $column $type";}).should ==
|
211
|
+
ruby_ast(%q{column = "something"; type = "something"; table = "something"; "ALTER TABLE {" + table + "} ADD #{column} #{type}"})
|
212
|
+
end
|
213
|
+
|
214
|
+
it "tranforms an array access within a string" do
|
215
|
+
php_ast(%q{ $something = array(); print "Things inside $something[okay]"; }).should ==
|
216
|
+
ruby_ast(%q{ something = array(); print "Things inside #{something['okay']}" })
|
217
|
+
end
|
218
|
+
|
219
|
+
it "transforms ++ into += 1" do
|
220
|
+
php_ast(%q{ $i++; }).should == ruby_ast(%q{ i += 1 })
|
221
|
+
end
|
222
|
+
|
223
|
+
it "transforms an array append" do
|
224
|
+
php_ast(%q{ $something = array(); $something[] = "other"; }).should ==
|
225
|
+
ruby_ast(%q{ something = array(); something << "other" })
|
226
|
+
end
|
227
|
+
|
228
|
+
it "transforms array lookup" do
|
229
|
+
php_ast(%q{ $attributes = array(); $attributes['default']; }).should ==
|
230
|
+
ruby_ast(%q{ attributes = array(); attributes['default'] })
|
231
|
+
end
|
232
|
+
|
233
|
+
it "transforms threequals" do
|
234
|
+
php_ast(%q{ $attributes = array(); $attributes['default'] === FALSE; }).should ==
|
235
|
+
ruby_ast(%q{ attributes = array(); attributes['default'] === false; })
|
236
|
+
end
|
237
|
+
|
238
|
+
it "transforms multiple args in the actual parameters" do
|
239
|
+
php_ast(%q{ $attributes = array(); array_key_exists('not null', $attributes); }).should ==
|
240
|
+
ruby_ast(%q{ attributes = array(); array_key_exists('not null', attributes) })
|
241
|
+
end
|
242
|
+
|
243
|
+
it "tranforms an array with hashed values" do
|
244
|
+
php_ast(%q{ array("something" => "er other", "with" => array("nested" => "values")); }).should ==
|
245
|
+
ruby_ast(%q{ array("something" => "er other", "with" => array("nested" => "values")) })
|
246
|
+
end
|
247
|
+
|
248
|
+
it "transforms an entire function" do
|
249
|
+
php_ast(%q{ function db_add_column(&$ret, $table, $column, $type, $attributes = array()) { print 'something'; } }).should ==
|
250
|
+
ruby_ast(%q{ def db_add_column(ret, table, column, type, attributes = array()); print 'something'; end })
|
251
|
+
end
|
252
|
+
|
253
|
+
it "transforms a class method call" do
|
254
|
+
php_ast(%q{ MyClass::foo(1, 'bar', 'baz'); }).should ==
|
255
|
+
ruby_ast(%Q{ MyClass.foo(1, 'bar', 'baz') })
|
256
|
+
end
|
257
|
+
|
258
|
+
it "transforms a variable class name to a const_get" do
|
259
|
+
php_ast(%q{ $classname = "Foo"; obj =& new $classname; }).should ==
|
260
|
+
ruby_ast(%q{ classname = "Foo"; obj = Object.const_get(classname).new })
|
261
|
+
end
|
262
|
+
|
263
|
+
it "transforms an if statement" do
|
264
|
+
php_file_matches_ruby_file("if")
|
265
|
+
end
|
266
|
+
|
267
|
+
it "transforms a class definition" do
|
268
|
+
php_file_matches_ruby_file("class_def")
|
269
|
+
end
|
270
|
+
|
271
|
+
|
272
|
+
it "transforms a function with an if statement" do
|
273
|
+
php_file_matches_ruby_file("fun_with_if")
|
274
|
+
end
|
275
|
+
|
276
|
+
it "transforms a foreach to an each loop" do
|
277
|
+
php_file_matches_ruby_file("foreach3")
|
278
|
+
end
|
279
|
+
|
280
|
+
it "transforms an even more complicated function" do
|
281
|
+
php_file_matches_ruby_file("fun_def2")
|
282
|
+
end
|
283
|
+
|
284
|
+
it "transforms a yet even more complicated function" do
|
285
|
+
php_file_matches_ruby_file("fun_def4")
|
286
|
+
end
|
287
|
+
|
288
|
+
it "unrolls a for loop into a while loop with setup and update operations" do
|
289
|
+
php_file_matches_ruby_file("for_loop4")
|
290
|
+
end
|
291
|
+
|
292
|
+
it "transforms another for loop" do
|
293
|
+
php_file_matches_ruby_file("for_loop3")
|
294
|
+
end
|
295
|
+
|
296
|
+
it "transforms a switch case" do
|
297
|
+
php_file_matches_ruby_file("switch_case3")
|
298
|
+
end
|
299
|
+
|
300
|
+
it "transforms a heredoc" do
|
301
|
+
php_file_matches_ruby_file("heredoc")
|
302
|
+
end
|
303
|
+
|
304
|
+
it "transforms a switch case within a function definition" do
|
305
|
+
php_file_matches_ruby_file("switch_case_with_rescue_nil")
|
306
|
+
end
|
307
|
+
|
308
|
+
it "transforms a switch-case" do
|
309
|
+
php_file_matches_ruby_file("switch_case")
|
310
|
+
end
|
311
|
+
|
312
|
+
it "transforms an if statement with brackets" do
|
313
|
+
php_file_matches_ruby_file("if_with_brackets")
|
314
|
+
end
|
315
|
+
|
316
|
+
it "transforms a dangling else" do
|
317
|
+
# http://en.wikipedia.org/wiki/Dangling_else
|
318
|
+
php_file_matches_ruby_file("dangling_else")
|
319
|
+
end
|
320
|
+
|
321
|
+
it "transforms a series of else if's" do
|
322
|
+
php_file_matches_ruby_file("if_else_series")
|
323
|
+
end
|
324
|
+
|
325
|
+
it "transforms boolean operators, and, not, and or" do
|
326
|
+
# The associativity on boolean operators is not being done
|
327
|
+
# correctly. Look into this again at some point
|
328
|
+
php_file_matches_ruby_file("boolean_operators")
|
329
|
+
end
|
330
|
+
|
331
|
+
it "transforms an if (not something) into if (something) nil.. " do
|
332
|
+
php_file_matches_ruby_file("if_not")
|
333
|
+
end
|
334
|
+
|
335
|
+
it "transforms an if statement with a boolean condition" do
|
336
|
+
php_file_matches_ruby_file("if_boolean")
|
337
|
+
end
|
338
|
+
|
339
|
+
it "transforms an if else nested within an if" do
|
340
|
+
php_file_matches_ruby_file("if_else_nested")
|
341
|
+
end
|
342
|
+
|
343
|
+
it "transforms another function with 3 if statements" do
|
344
|
+
php_file_matches_ruby_file("fun_with_ifs")
|
345
|
+
end
|
346
|
+
|
347
|
+
it "transforms a longer if-else" do
|
348
|
+
php_file_matches_ruby_file("long_if_else")
|
349
|
+
end
|
350
|
+
|
351
|
+
it "transforms a function definition without error" do
|
352
|
+
lambda do
|
353
|
+
php_file("spec/fixtures/fun_def4.php")
|
354
|
+
end.should_not raise_error
|
355
|
+
end
|
356
|
+
|
357
|
+
end
|
358
|
+
|