adsl 0.0.3 → 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/Gemfile +2 -20
- data/README.md +14 -21
- data/bin/adsl-verify +8 -8
- data/lib/adsl.rb +3 -0
- data/lib/adsl/adsl.rb +3 -0
- data/lib/adsl/ds/data_store_spec.rb +339 -0
- data/lib/adsl/extract/instrumenter.rb +206 -0
- data/lib/adsl/extract/meta.rb +33 -0
- data/lib/adsl/extract/rails/action_block_builder.rb +233 -0
- data/lib/adsl/extract/rails/action_instrumenter.rb +400 -0
- data/lib/adsl/extract/rails/action_runner.rb +57 -0
- data/lib/adsl/extract/rails/active_record_metaclass_generator.rb +555 -0
- data/lib/adsl/extract/rails/callback_chain_simulator.rb +135 -0
- data/lib/adsl/extract/rails/invariant_extractor.rb +48 -0
- data/lib/adsl/extract/rails/invariant_instrumenter.rb +70 -0
- data/lib/adsl/extract/rails/other_meta.rb +57 -0
- data/lib/adsl/extract/rails/rails_extractor.rb +211 -0
- data/lib/adsl/extract/rails/rails_instrumentation_test_case.rb +34 -0
- data/lib/adsl/extract/rails/rails_special_gem_instrumentation.rb +120 -0
- data/lib/adsl/extract/rails/rails_test_helper.rb +140 -0
- data/lib/adsl/extract/sexp_utils.rb +54 -0
- data/lib/adsl/fol/first_order_logic.rb +261 -0
- data/lib/adsl/parser/adsl_parser.racc +159 -0
- data/lib/{parser → adsl/parser}/adsl_parser.rex +4 -4
- data/lib/{parser → adsl/parser}/adsl_parser.rex.rb +6 -6
- data/lib/adsl/parser/adsl_parser.tab.rb +1031 -0
- data/lib/adsl/parser/ast_nodes.rb +1410 -0
- data/lib/adsl/railtie.rb +67 -0
- data/lib/adsl/spass/bin.rb +230 -0
- data/lib/{spass → adsl/spass}/ruby_extensions.rb +0 -0
- data/lib/adsl/spass/spass_ds_extensions.rb +931 -0
- data/lib/adsl/spass/spass_translator.rb +393 -0
- data/lib/adsl/spass/util.rb +13 -0
- data/lib/adsl/util/csv_hash_formatter.rb +94 -0
- data/lib/adsl/util/general.rb +228 -0
- data/lib/adsl/util/test_helper.rb +71 -0
- data/lib/adsl/verification/formula_generators.rb +231 -0
- data/lib/adsl/verification/instrumentation_filter.rb +50 -0
- data/lib/adsl/verification/invariant.rb +19 -0
- data/lib/adsl/verification/rails_verification.rb +33 -0
- data/lib/adsl/verification/utils.rb +20 -0
- data/lib/adsl/verification/verification_case.rb +13 -0
- data/test/integration/rails/rails_branch_verification_test.rb +112 -0
- data/test/integration/rails/rails_verification_test.rb +253 -0
- data/test/integration/spass/basic_translation_test.rb +563 -0
- data/test/integration/spass/control_flow_translation_test.rb +421 -0
- data/test/unit/adsl/ds/data_store_spec_test.rb +54 -0
- data/test/unit/adsl/extract/instrumenter_test.rb +103 -0
- data/test/unit/adsl/extract/meta_test.rb +142 -0
- data/test/unit/adsl/extract/rails/action_block_builder_test.rb +178 -0
- data/test/unit/adsl/extract/rails/action_instrumenter_test.rb +68 -0
- data/test/unit/adsl/extract/rails/active_record_metaclass_generator_test.rb +336 -0
- data/test/unit/adsl/extract/rails/callback_chain_simulator_test.rb +76 -0
- data/test/unit/adsl/extract/rails/invariant_extractor_test.rb +92 -0
- data/test/unit/adsl/extract/rails/rails_extractor_test.rb +1380 -0
- data/test/unit/adsl/extract/rails/rails_test_helper_test.rb +25 -0
- data/test/unit/adsl/extract/sexp_utils_test.rb +100 -0
- data/test/unit/adsl/fol/first_order_logic_test.rb +227 -0
- data/test/unit/adsl/parser/action_parser_test.rb +1040 -0
- data/test/unit/adsl/parser/ast_nodes_test.rb +359 -0
- data/test/unit/adsl/parser/class_parser_test.rb +288 -0
- data/test/unit/adsl/parser/general_parser_test.rb +67 -0
- data/test/unit/adsl/parser/invariant_parser_test.rb +432 -0
- data/test/unit/adsl/parser/parser_util_test.rb +126 -0
- data/test/unit/adsl/spass/bin_test.rb +65 -0
- data/test/unit/adsl/spass/ruby_extensions_test.rb +39 -0
- data/test/unit/adsl/spass/spass_ds_extensions_test.rb +7 -0
- data/test/unit/adsl/spass/spass_translator_test.rb +342 -0
- data/test/unit/adsl/util/csv_hash_formatter_test.rb +68 -0
- data/test/unit/adsl/util/general_test.rb +303 -0
- data/test/unit/adsl/util/test_helper_test.rb +120 -0
- data/test/unit/adsl/verification/formula_generators_test.rb +200 -0
- data/test/unit/adsl/verification/instrumentation_filter_test.rb +39 -0
- data/test/unit/adsl/verification/utils_test.rb +39 -0
- data/test/unit/adsl/verification/verification_case_test.rb +8 -0
- metadata +229 -29
- data/lib/ds/data_store_spec.rb +0 -292
- data/lib/fol/first_order_logic.rb +0 -260
- data/lib/parser/adsl_ast.rb +0 -779
- data/lib/parser/adsl_parser.racc +0 -151
- data/lib/parser/adsl_parser.tab.rb +0 -976
- data/lib/parser/dsdl_parser.rex.rb +0 -196
- data/lib/parser/dsdl_parser.tab.rb +0 -976
- data/lib/spass/bin.rb +0 -164
- data/lib/spass/spass_ds_extensions.rb +0 -870
- data/lib/spass/spass_translator.rb +0 -388
- data/lib/spass/util.rb +0 -11
- data/lib/util/csv_hash_formatter.rb +0 -47
- data/lib/util/test_helper.rb +0 -33
- data/lib/util/util.rb +0 -114
|
@@ -0,0 +1,1380 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'adsl/util/test_helper'
|
|
3
|
+
require 'adsl/parser/ast_nodes'
|
|
4
|
+
require 'adsl/extract/rails/rails_extractor'
|
|
5
|
+
require 'adsl/extract/rails/rails_test_helper'
|
|
6
|
+
require 'adsl/extract/rails/rails_instrumentation_test_case'
|
|
7
|
+
|
|
8
|
+
class ADSL::Extract::Rails::RailsExtractorTest < ADSL::Extract::Rails::RailsInstrumentationTestCase
|
|
9
|
+
include ::ADSL::Parser
|
|
10
|
+
|
|
11
|
+
def test_setup__routes
|
|
12
|
+
route_set = ADSLRailsTestApplication.routes.routes
|
|
13
|
+
|
|
14
|
+
assert route_set.map{ |route| route.ast.to_s }.include? '/asds/nothing(.:format)'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_setup__active_record
|
|
18
|
+
assert_false self.class.lookup_const(:Asd).nil?
|
|
19
|
+
assert_false self.class.lookup_const(:Kme).nil?
|
|
20
|
+
assert_false self.class.lookup_const('Mod::Blah').nil?
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_setup__urls_visible
|
|
24
|
+
session = ActionDispatch::Integration::Session.new(Rails.application)
|
|
25
|
+
session.get('/asds/nothing')
|
|
26
|
+
assert_equal 200, session.response.status
|
|
27
|
+
assert session.response.body.strip.empty?
|
|
28
|
+
|
|
29
|
+
session = ActionDispatch::Integration::Session.new(Rails.application)
|
|
30
|
+
assert_raise ActionController::RoutingError do
|
|
31
|
+
session.get('thisdoesntexist')
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_setup__rails_crashes_actually_crash_tests
|
|
36
|
+
assert_raise do
|
|
37
|
+
session = ActionDispatch::Integration::Session.new(Rails.application)
|
|
38
|
+
session.get('no_route')
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_action_extraction__empty_action
|
|
43
|
+
extractor = create_rails_extractor
|
|
44
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
45
|
+
assert ast.block.statements.empty?
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_action_extraction__create_action
|
|
49
|
+
AsdsController.class_exec do
|
|
50
|
+
def create
|
|
51
|
+
Asd.new
|
|
52
|
+
respond_to
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
extractor = create_rails_extractor
|
|
57
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :create)
|
|
58
|
+
statements = ast.block.statements
|
|
59
|
+
|
|
60
|
+
assert_equal 1, statements.length
|
|
61
|
+
assert_equal ASTObjsetStmt, statements.first.class
|
|
62
|
+
assert_equal ASTCreateObjset, statements.first.objset.class
|
|
63
|
+
assert_equal 'Asd', statements.first.objset.class_name.text
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_action_extraction__create_within_expression_action
|
|
67
|
+
AsdsController.class_exec do
|
|
68
|
+
def create
|
|
69
|
+
Asd.build
|
|
70
|
+
respond_to
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
extractor = create_rails_extractor
|
|
75
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :create)
|
|
76
|
+
statements = ast.block.statements
|
|
77
|
+
|
|
78
|
+
assert_equal 1, statements.length
|
|
79
|
+
assert_equal ASTObjsetStmt, statements.first.class
|
|
80
|
+
assert_equal ASTCreateObjset, statements.first.objset.class
|
|
81
|
+
assert_equal 'Asd', statements.first.objset.class_name.text
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def test_action_extraction__variable_assignment
|
|
85
|
+
AsdsController.class_exec do
|
|
86
|
+
def create
|
|
87
|
+
a = Asd.new
|
|
88
|
+
a.delete!
|
|
89
|
+
respond_to
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
extractor = create_rails_extractor
|
|
94
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :create)
|
|
95
|
+
statements = ast.block.statements
|
|
96
|
+
|
|
97
|
+
assert_equal 2, statements.length
|
|
98
|
+
assert_equal ASTAssignment, statements.first.class
|
|
99
|
+
assert_equal 'a', statements.first.var_name.text
|
|
100
|
+
assert_equal ASTCreateObjset, statements.first.objset.class
|
|
101
|
+
assert_equal 'Asd', statements.first.objset.class_name.text
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def test_action_extraction__nil_assignment
|
|
105
|
+
AsdsController.class_exec do
|
|
106
|
+
def nothing
|
|
107
|
+
a = nil
|
|
108
|
+
a = Asd.new
|
|
109
|
+
a.delete!
|
|
110
|
+
respond_to
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
extractor = create_rails_extractor
|
|
115
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
116
|
+
statements = ast.block.statements
|
|
117
|
+
|
|
118
|
+
assert_equal 3, statements.length
|
|
119
|
+
|
|
120
|
+
assert_equal ASTAssignment, statements[0].class
|
|
121
|
+
assert_equal 'a', statements[0].var_name.text
|
|
122
|
+
assert_equal ASTEmptyObjset, statements[0].objset.class
|
|
123
|
+
|
|
124
|
+
assert_equal ASTAssignment, statements[1].class
|
|
125
|
+
assert_equal 'a', statements[1].var_name.text
|
|
126
|
+
assert_equal ASTCreateObjset, statements[1].objset.class
|
|
127
|
+
assert_equal 'Asd', statements[1].objset.class_name.text
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def test_action_extraction__instance_variable_assignment
|
|
131
|
+
AsdsController.class_exec do
|
|
132
|
+
def create
|
|
133
|
+
@a = Asd.new
|
|
134
|
+
@a.save!
|
|
135
|
+
a = nil
|
|
136
|
+
@a.delete! # will throw an exception if a == @a
|
|
137
|
+
respond_to
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
extractor = create_rails_extractor
|
|
142
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :create)
|
|
143
|
+
statements = ast.block.statements
|
|
144
|
+
|
|
145
|
+
assert_equal 3, statements.length
|
|
146
|
+
|
|
147
|
+
# all instance variables are initialized to empty
|
|
148
|
+
assert_equal ASTAssignment, statements[0].class
|
|
149
|
+
assert_equal 'at__a', statements[0].var_name.text
|
|
150
|
+
assert_equal ASTEmptyObjset, statements[0].objset.class
|
|
151
|
+
|
|
152
|
+
assert_equal ASTAssignment, statements[1].class
|
|
153
|
+
assert_equal 'at__a', statements[1].var_name.text
|
|
154
|
+
assert_equal ASTCreateObjset, statements[1].objset.class
|
|
155
|
+
assert_equal 'Asd', statements[1].objset.class_name.text
|
|
156
|
+
|
|
157
|
+
assert_equal ASTDeleteObj, statements[2].class
|
|
158
|
+
assert_equal 'at__a', statements[2].objset.var_name.text
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def test_action_extraction__class_variable_assignment
|
|
162
|
+
AsdsController.class_exec do
|
|
163
|
+
def create
|
|
164
|
+
@@a = Asd.new
|
|
165
|
+
@@a.save!
|
|
166
|
+
a = nil
|
|
167
|
+
@a = nil
|
|
168
|
+
@@a.delete! # will throw an exception if @@a == @a or @@ == a
|
|
169
|
+
respond_to
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
extractor = create_rails_extractor
|
|
174
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :create)
|
|
175
|
+
statements = ast.block.statements
|
|
176
|
+
|
|
177
|
+
assert_false statements.empty?
|
|
178
|
+
assert_equal 3, statements.length
|
|
179
|
+
|
|
180
|
+
assert_equal ASTAssignment, statements[0].class
|
|
181
|
+
assert_equal 'atat__a', statements[0].var_name.text
|
|
182
|
+
assert_equal ASTEmptyObjset, statements[0].objset.class
|
|
183
|
+
|
|
184
|
+
assert_equal ASTAssignment, statements[1].class
|
|
185
|
+
assert_equal 'atat__a', statements[1].var_name.text
|
|
186
|
+
assert_equal ASTCreateObjset, statements[1].objset.class
|
|
187
|
+
assert_equal 'Asd', statements[1].objset.class_name.text
|
|
188
|
+
|
|
189
|
+
assert_equal ASTDeleteObj, statements[2].class
|
|
190
|
+
assert_equal ASTVariable, statements[2].objset.class
|
|
191
|
+
assert_equal 'atat__a', statements[2].objset.var_name.text
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def test_action_extraction__assignments_dont_make_values_nil
|
|
195
|
+
AsdsController.class_exec do
|
|
196
|
+
def nothing
|
|
197
|
+
a = Mod::Blah.new
|
|
198
|
+
a.asd.delete
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
extractor = create_rails_extractor
|
|
203
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
204
|
+
statements = ast.block.statements
|
|
205
|
+
|
|
206
|
+
assert_equal 2, statements.length
|
|
207
|
+
|
|
208
|
+
assert_equal ASTAssignment, statements[0].class
|
|
209
|
+
assert_equal ASTCreateObjset, statements[0].objset.class
|
|
210
|
+
assert_equal 'Mod_Blah', statements[0].objset.class_name.text
|
|
211
|
+
assert_equal 'a', statements[0].var_name.text
|
|
212
|
+
|
|
213
|
+
assert_equal ASTDeleteObj, statements[1].class
|
|
214
|
+
assert_equal ASTDereference, statements[1].objset.class
|
|
215
|
+
assert_equal 'asd', statements[1].objset.rel_name.text
|
|
216
|
+
assert_equal ASTVariable, statements[1].objset.objset.class
|
|
217
|
+
assert_equal 'a', statements[1].objset.objset.var_name.text
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def test_invariant_extraction__works
|
|
221
|
+
extractor = create_rails_extractor <<-invariants
|
|
222
|
+
invariant 'what', true
|
|
223
|
+
invariants
|
|
224
|
+
|
|
225
|
+
invariants = extractor.invariants
|
|
226
|
+
assert_equal 1, invariants.length
|
|
227
|
+
assert_equal 'what', invariants.first.name.text
|
|
228
|
+
assert_equal true, invariants.first.formula.bool_value
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def test_action_extraction__nonreturning_branches
|
|
232
|
+
AsdsController.class_exec do
|
|
233
|
+
def nothing
|
|
234
|
+
if true
|
|
235
|
+
Asd.new
|
|
236
|
+
else
|
|
237
|
+
Asd.find.delete!
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
extractor = create_rails_extractor
|
|
243
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
244
|
+
statements = ast.block.statements
|
|
245
|
+
|
|
246
|
+
assert_equal 1, statements.length
|
|
247
|
+
assert_equal ASTEither, statements.first.class
|
|
248
|
+
|
|
249
|
+
either = statements.first
|
|
250
|
+
|
|
251
|
+
assert_equal 2, either.blocks.length
|
|
252
|
+
assert_equal 1, either.blocks.first.statements.length
|
|
253
|
+
assert_equal ASTCreateObjset, either.blocks.first.statements.first.objset.class
|
|
254
|
+
assert_equal 1, either.blocks.second.statements.length
|
|
255
|
+
assert_equal ASTDeleteObj, either.blocks.second.statements.first.class
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def test_action_extraction__one_returning_branch
|
|
259
|
+
AsdsController.class_exec do
|
|
260
|
+
def nothing
|
|
261
|
+
if true
|
|
262
|
+
return Asd.new
|
|
263
|
+
else
|
|
264
|
+
Asd.build
|
|
265
|
+
end
|
|
266
|
+
Asd.find.delete!
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
extractor = create_rails_extractor
|
|
271
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
272
|
+
statements = ast.block.statements
|
|
273
|
+
|
|
274
|
+
assert_equal 1, statements.length
|
|
275
|
+
assert_equal ASTEither, statements.first.class
|
|
276
|
+
|
|
277
|
+
either = statements.first
|
|
278
|
+
|
|
279
|
+
assert_equal 2, either.blocks.length
|
|
280
|
+
assert_equal 1, either.blocks.first.statements.length
|
|
281
|
+
assert_equal ASTCreateObjset, either.blocks.first.statements.first.objset.class
|
|
282
|
+
assert_equal 2, either.blocks.second.statements.length
|
|
283
|
+
assert_equal ASTCreateObjset, either.blocks.second.statements.first.objset.class
|
|
284
|
+
assert_equal ASTDeleteObj, either.blocks.second.statements.second.class
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def test_action_extraction__one_returning_branch_other_empty
|
|
288
|
+
AsdsController.class_exec do
|
|
289
|
+
def nothing
|
|
290
|
+
if true
|
|
291
|
+
return Asd.new
|
|
292
|
+
else
|
|
293
|
+
end
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
extractor = create_rails_extractor
|
|
298
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
299
|
+
statements = ast.block.statements
|
|
300
|
+
|
|
301
|
+
assert_equal 1, statements.length
|
|
302
|
+
assert_equal ASTObjsetStmt, statements.first.class
|
|
303
|
+
assert_equal ASTCreateObjset, statements.first.objset.class
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
def test_action_extraction__statements_after_return_are_ignored
|
|
307
|
+
AsdsController.class_exec do
|
|
308
|
+
def nothing
|
|
309
|
+
Asd.new
|
|
310
|
+
return
|
|
311
|
+
Asd.new
|
|
312
|
+
end
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
extractor = create_rails_extractor
|
|
316
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
317
|
+
statements = ast.block.statements
|
|
318
|
+
|
|
319
|
+
assert_equal 1, statements.length
|
|
320
|
+
assert_equal ASTObjsetStmt, statements.first.class
|
|
321
|
+
assert_equal ASTCreateObjset, statements.first.objset.class
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
def test_action_extraction__statements_after_return_in_branches_are_ignored
|
|
325
|
+
AsdsController.class_exec do
|
|
326
|
+
def nothing
|
|
327
|
+
if true
|
|
328
|
+
return Asd.new
|
|
329
|
+
else
|
|
330
|
+
return Kme.new
|
|
331
|
+
end
|
|
332
|
+
Asd.new
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
extractor = create_rails_extractor
|
|
337
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
338
|
+
statements = ast.block.statements
|
|
339
|
+
|
|
340
|
+
assert_equal 1, statements.length
|
|
341
|
+
assert_equal ASTEither, statements.first.class
|
|
342
|
+
assert_equal 1, statements.first.blocks[0].statements.length
|
|
343
|
+
assert_equal ASTCreateObjset, statements.first.blocks[0].statements.first.objset.class
|
|
344
|
+
assert_equal 'Asd', statements.first.blocks[0].statements.first.objset.class_name.text
|
|
345
|
+
assert_equal 1, statements.first.blocks[1].statements.length
|
|
346
|
+
assert_equal ASTCreateObjset, statements.first.blocks[1].statements.first.objset.class
|
|
347
|
+
assert_equal 'Kme', statements.first.blocks[1].statements.first.objset.class_name.text
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
def test_action_extraction__calls_of_method_with_multiple_paths
|
|
351
|
+
AsdsController.class_exec do
|
|
352
|
+
def something
|
|
353
|
+
if true
|
|
354
|
+
return Asd.new
|
|
355
|
+
else
|
|
356
|
+
Asd.find.delete!
|
|
357
|
+
end
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
def nothing
|
|
361
|
+
something
|
|
362
|
+
return Asd.new
|
|
363
|
+
end
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
extractor = create_rails_extractor
|
|
367
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
368
|
+
statements = ast.block.statements
|
|
369
|
+
|
|
370
|
+
assert_equal 2, statements.length
|
|
371
|
+
assert_equal ASTEither, statements.first.class
|
|
372
|
+
assert_equal ASTCreateObjset, statements.second.objset.class
|
|
373
|
+
|
|
374
|
+
either = statements.first
|
|
375
|
+
|
|
376
|
+
assert_equal 2, either.blocks.length
|
|
377
|
+
assert_equal 1, either.blocks.first.statements.length
|
|
378
|
+
assert_equal ASTCreateObjset, either.blocks.first.statements.first.objset.class
|
|
379
|
+
assert_equal 1, either.blocks.second.statements.length
|
|
380
|
+
assert_equal ASTDeleteObj, either.blocks.second.statements.first.class
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
def test_action_extraction__calls_of_method_with_compatible_return_values_but_sideeffects
|
|
384
|
+
AsdsController.class_exec do
|
|
385
|
+
def something
|
|
386
|
+
if true
|
|
387
|
+
Asd.new
|
|
388
|
+
else
|
|
389
|
+
Asd.find
|
|
390
|
+
end
|
|
391
|
+
end
|
|
392
|
+
|
|
393
|
+
def nothing
|
|
394
|
+
something
|
|
395
|
+
Kme.new
|
|
396
|
+
end
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
extractor = create_rails_extractor
|
|
400
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
401
|
+
statements = ast.block.statements
|
|
402
|
+
|
|
403
|
+
assert_equal 2, statements.length
|
|
404
|
+
|
|
405
|
+
assert_equal ASTEither, statements.first.class
|
|
406
|
+
assert_equal 1, statements.first.blocks[0].statements.length
|
|
407
|
+
assert_equal ASTCreateObjset, statements.first.blocks[0].statements.first.objset.class
|
|
408
|
+
assert_equal 0, statements.first.blocks[1].statements.length
|
|
409
|
+
|
|
410
|
+
assert_equal ASTObjsetStmt, statements.second.class
|
|
411
|
+
assert_equal ASTCreateObjset, statements.second.objset.class
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
def test_action_extraction__deep_call_chain
|
|
415
|
+
AsdsController.class_exec do
|
|
416
|
+
def some3
|
|
417
|
+
Asd.new
|
|
418
|
+
Asd.find
|
|
419
|
+
end
|
|
420
|
+
def some2; some3; end
|
|
421
|
+
def some1; some2; end
|
|
422
|
+
def nothing
|
|
423
|
+
some1.destroy!
|
|
424
|
+
end
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
extractor = create_rails_extractor
|
|
428
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
429
|
+
statements = ast.block.statements
|
|
430
|
+
|
|
431
|
+
# 4 because of the destroy dependency
|
|
432
|
+
assert_equal 4, statements.length
|
|
433
|
+
|
|
434
|
+
assert_equal ASTObjsetStmt, statements[0].class
|
|
435
|
+
assert_equal ASTCreateObjset, statements[0].objset.class
|
|
436
|
+
assert_equal 'Asd', statements[0].objset.class_name.text
|
|
437
|
+
|
|
438
|
+
assert_equal ASTDeleteObj, statements.last.class
|
|
439
|
+
assert_equal ASTOneOf, statements.last.objset.class
|
|
440
|
+
assert_equal ASTAllOf, statements.last.objset.objset.class
|
|
441
|
+
assert_equal 'Asd', statements.last.objset.objset.class_name.text
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
def test_action_extraction__multiple_return
|
|
445
|
+
AsdsController.class_exec do
|
|
446
|
+
def blah
|
|
447
|
+
return Asd.new, Kme.new
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
def nothing
|
|
451
|
+
blah
|
|
452
|
+
end
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
extractor = create_rails_extractor
|
|
456
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
457
|
+
statements = ast.block.statements
|
|
458
|
+
|
|
459
|
+
assert_equal 2, statements.length
|
|
460
|
+
|
|
461
|
+
assert_equal ASTCreateObjset, statements.first.objset.class
|
|
462
|
+
assert_equal 'Asd', statements.first.objset.class_name.text
|
|
463
|
+
|
|
464
|
+
assert_equal ASTCreateObjset, statements.second.objset.class
|
|
465
|
+
assert_equal 'Kme', statements.second.objset.class_name.text
|
|
466
|
+
end
|
|
467
|
+
|
|
468
|
+
def test_action_extraction__multiple_assignment
|
|
469
|
+
AsdsController.class_exec do
|
|
470
|
+
def nothing
|
|
471
|
+
a, b = Asd.new, Kme.new
|
|
472
|
+
a.delete!
|
|
473
|
+
b.delete!
|
|
474
|
+
end
|
|
475
|
+
end
|
|
476
|
+
extractor = create_rails_extractor
|
|
477
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
478
|
+
statements = ast.block.statements
|
|
479
|
+
|
|
480
|
+
assert_equal 4, statements.length
|
|
481
|
+
|
|
482
|
+
assert_equal ASTAssignment, statements[0].class
|
|
483
|
+
assert_equal 'a', statements[0].var_name.text
|
|
484
|
+
assert_equal ASTCreateObjset, statements[0].objset.class
|
|
485
|
+
assert_equal 'Asd', statements[0].objset.class_name.text
|
|
486
|
+
|
|
487
|
+
assert_equal ASTAssignment, statements[1].class
|
|
488
|
+
assert_equal 'b', statements[1].var_name.text
|
|
489
|
+
assert_equal ASTCreateObjset, statements[1].objset.class
|
|
490
|
+
assert_equal 'Kme', statements[1].objset.class_name.text
|
|
491
|
+
|
|
492
|
+
assert_equal ASTDeleteObj, statements[2].class
|
|
493
|
+
assert_equal 'a', statements[2].objset.var_name.text
|
|
494
|
+
|
|
495
|
+
assert_equal ASTDeleteObj, statements[3].class
|
|
496
|
+
assert_equal 'b', statements[3].objset.var_name.text
|
|
497
|
+
end
|
|
498
|
+
|
|
499
|
+
def test_action_extraction__optional_assignment_of_known_nil_variable
|
|
500
|
+
AsdsController.class_exec do
|
|
501
|
+
def nothing
|
|
502
|
+
a ||= Asd.new
|
|
503
|
+
a = Asd.find
|
|
504
|
+
a.delete!
|
|
505
|
+
end
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
extractor = create_rails_extractor
|
|
509
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
510
|
+
statements = ast.block.statements
|
|
511
|
+
|
|
512
|
+
assert_equal 4, statements.length
|
|
513
|
+
|
|
514
|
+
assert_equal ASTDeclareVar, statements[0].class
|
|
515
|
+
assert_equal 'a', statements[0].var_name.text
|
|
516
|
+
assert_equal ASTEither, statements[1].class
|
|
517
|
+
assert_equal 2, statements[1].blocks.length
|
|
518
|
+
assert statements[1].blocks[0].statements.empty?
|
|
519
|
+
assert_equal 1, statements[1].blocks[1].statements.length
|
|
520
|
+
assert_equal ASTAssignment, statements[1].blocks[1].statements[0].class
|
|
521
|
+
assert_equal 'a', statements[1].blocks[1].statements[0].var_name.text
|
|
522
|
+
assert_equal ASTCreateObjset, statements[1].blocks[1].statements[0].objset.class
|
|
523
|
+
assert_equal 'Asd', statements[1].blocks[1].statements[0].objset.class_name.text
|
|
524
|
+
|
|
525
|
+
assert_equal ASTAssignment, statements[2].class
|
|
526
|
+
assert_equal 'a', statements[2].var_name.text
|
|
527
|
+
assert_equal ASTOneOf, statements[2].objset.class
|
|
528
|
+
assert_equal ASTAllOf, statements[2].objset.objset.class
|
|
529
|
+
assert_equal 'Asd', statements[2].objset.objset.class_name.text
|
|
530
|
+
end
|
|
531
|
+
|
|
532
|
+
def test_action_extraction__optional_assignment_of_nonnil_variable
|
|
533
|
+
AsdsController.class_exec do
|
|
534
|
+
def nothing
|
|
535
|
+
a = Asd.new
|
|
536
|
+
a ||= Asd.find
|
|
537
|
+
a.delete!
|
|
538
|
+
end
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
extractor = create_rails_extractor
|
|
542
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
543
|
+
statements = ast.block.statements
|
|
544
|
+
|
|
545
|
+
assert_equal 4, statements.length
|
|
546
|
+
|
|
547
|
+
assert_equal ASTAssignment, statements[0].class
|
|
548
|
+
assert_equal 'a', statements[0].var_name.text
|
|
549
|
+
assert_equal ASTCreateObjset, statements[0].objset.class
|
|
550
|
+
assert_equal 'Asd', statements[0].objset.class_name.text
|
|
551
|
+
|
|
552
|
+
assert_equal ASTDeclareVar, statements[1].class
|
|
553
|
+
assert_equal 'a', statements[1].var_name.text
|
|
554
|
+
assert_equal ASTEither, statements[2].class
|
|
555
|
+
assert_equal 2, statements[2].blocks.length
|
|
556
|
+
assert statements[2].blocks[0].statements.empty?
|
|
557
|
+
assert_equal 1, statements[2].blocks[1].statements.length
|
|
558
|
+
assert_equal ASTAssignment, statements[2].blocks[1].statements[0].class
|
|
559
|
+
assert_equal 'a', statements[2].blocks[1].statements[0].var_name.text
|
|
560
|
+
assert_equal ASTOneOf, statements[2].blocks[1].statements[0].objset.class
|
|
561
|
+
assert_equal ASTAllOf, statements[2].blocks[1].statements[0].objset.objset.class
|
|
562
|
+
assert_equal 'Asd', statements[2].blocks[1].statements[0].objset.objset.class_name.text
|
|
563
|
+
end
|
|
564
|
+
|
|
565
|
+
def test_action_extraction__multiple_assignment_of_return
|
|
566
|
+
AsdsController.class_exec do
|
|
567
|
+
def blah
|
|
568
|
+
return Asd.new, Kme.new
|
|
569
|
+
end
|
|
570
|
+
|
|
571
|
+
def nothing
|
|
572
|
+
a, b = blah
|
|
573
|
+
a.delete!
|
|
574
|
+
b.delete!
|
|
575
|
+
end
|
|
576
|
+
end
|
|
577
|
+
|
|
578
|
+
extractor = create_rails_extractor
|
|
579
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
580
|
+
statements = ast.block.statements
|
|
581
|
+
|
|
582
|
+
assert_equal 4, statements.length
|
|
583
|
+
|
|
584
|
+
assert_equal ASTAssignment, statements[0].class
|
|
585
|
+
assert_equal 'a', statements[0].var_name.text
|
|
586
|
+
assert_equal ASTCreateObjset, statements[0].objset.class
|
|
587
|
+
assert_equal 'Asd', statements[0].objset.class_name.text
|
|
588
|
+
|
|
589
|
+
assert_equal ASTAssignment, statements[1].class
|
|
590
|
+
assert_equal 'b', statements[1].var_name.text
|
|
591
|
+
assert_equal ASTCreateObjset, statements[1].objset.class
|
|
592
|
+
assert_equal 'Kme', statements[1].objset.class_name.text
|
|
593
|
+
|
|
594
|
+
assert_equal ASTDeleteObj, statements[2].class
|
|
595
|
+
assert_equal 'a', statements[2].objset.var_name.text
|
|
596
|
+
|
|
597
|
+
assert_equal ASTDeleteObj, statements[3].class
|
|
598
|
+
assert_equal 'b', statements[3].objset.var_name.text
|
|
599
|
+
end
|
|
600
|
+
|
|
601
|
+
def test_action_extraction__variable_assignment_in_branch
|
|
602
|
+
AsdsController.class_exec do
|
|
603
|
+
def nothing
|
|
604
|
+
if true
|
|
605
|
+
a = "asd"
|
|
606
|
+
else
|
|
607
|
+
a = "blah"
|
|
608
|
+
end
|
|
609
|
+
return a
|
|
610
|
+
end
|
|
611
|
+
end
|
|
612
|
+
|
|
613
|
+
assert_nothing_raised do
|
|
614
|
+
extractor = create_rails_extractor
|
|
615
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
616
|
+
end
|
|
617
|
+
end
|
|
618
|
+
|
|
619
|
+
def test_callback_lookup
|
|
620
|
+
extractor = create_rails_extractor
|
|
621
|
+
assert_set_equal(
|
|
622
|
+
[:before, :after, :before2, :before_nothing, :after_nothing],
|
|
623
|
+
extractor.callbacks(AsdsController).map(&:filter)
|
|
624
|
+
)
|
|
625
|
+
end
|
|
626
|
+
|
|
627
|
+
def test_before_callbacks__instrumented
|
|
628
|
+
AsdsController.class_exec do
|
|
629
|
+
def before
|
|
630
|
+
Asd.new
|
|
631
|
+
end
|
|
632
|
+
|
|
633
|
+
def before_filter_action
|
|
634
|
+
Kme.new
|
|
635
|
+
end
|
|
636
|
+
end
|
|
637
|
+
|
|
638
|
+
extractor = create_rails_extractor
|
|
639
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :before_filter_action)
|
|
640
|
+
statements = ast.block.statements
|
|
641
|
+
|
|
642
|
+
assert_equal 2, statements.length
|
|
643
|
+
assert_equal 'Asd', statements[0].objset.class_name.text
|
|
644
|
+
assert_equal 'Kme', statements[1].objset.class_name.text
|
|
645
|
+
end
|
|
646
|
+
|
|
647
|
+
def test_after_callbacks__instrumented
|
|
648
|
+
AsdsController.class_exec do
|
|
649
|
+
def after_filter_action
|
|
650
|
+
Kme.new
|
|
651
|
+
end
|
|
652
|
+
|
|
653
|
+
def after
|
|
654
|
+
Asd.new
|
|
655
|
+
end
|
|
656
|
+
end
|
|
657
|
+
|
|
658
|
+
extractor = create_rails_extractor
|
|
659
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :after_filter_action)
|
|
660
|
+
statements = ast.block.statements
|
|
661
|
+
|
|
662
|
+
assert_equal 2, statements.length
|
|
663
|
+
assert_equal 'Kme', statements[0].objset.class_name.text
|
|
664
|
+
assert_equal 'Asd', statements[1].objset.class_name.text
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
def test_before_callbacks__can_have_branches_normally
|
|
668
|
+
AsdsController.class_exec do
|
|
669
|
+
def before
|
|
670
|
+
if true
|
|
671
|
+
return Kme.new
|
|
672
|
+
else
|
|
673
|
+
Asd.new
|
|
674
|
+
end
|
|
675
|
+
end
|
|
676
|
+
|
|
677
|
+
def before2
|
|
678
|
+
if true
|
|
679
|
+
Kme.new
|
|
680
|
+
else
|
|
681
|
+
end
|
|
682
|
+
end
|
|
683
|
+
|
|
684
|
+
def before_filter_action
|
|
685
|
+
Mod::Blah.new
|
|
686
|
+
end
|
|
687
|
+
end
|
|
688
|
+
|
|
689
|
+
extractor = create_rails_extractor
|
|
690
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :before_filter_action)
|
|
691
|
+
statements = ast.block.statements
|
|
692
|
+
|
|
693
|
+
assert_equal 3, statements.length
|
|
694
|
+
|
|
695
|
+
assert_equal ASTEither, statements[0].class
|
|
696
|
+
assert_equal 2, statements[0].blocks.length
|
|
697
|
+
blocks = statements[0].blocks
|
|
698
|
+
assert_equal 1, blocks[0].statements.length
|
|
699
|
+
assert_equal ASTObjsetStmt, blocks[0].statements[0].class
|
|
700
|
+
assert_equal 'Kme', blocks[0].statements[0].objset.class_name.text
|
|
701
|
+
assert_equal 1, blocks[1].statements.length
|
|
702
|
+
assert_equal ASTObjsetStmt, blocks[1].statements[0].class
|
|
703
|
+
assert_equal 'Asd', blocks[1].statements[0].objset.class_name.text
|
|
704
|
+
|
|
705
|
+
assert_equal ASTEither, statements[1].class
|
|
706
|
+
assert_equal 2, statements[1].blocks.length
|
|
707
|
+
blocks = statements[1].blocks
|
|
708
|
+
assert_equal 1, blocks[0].statements.length
|
|
709
|
+
assert_equal ASTObjsetStmt, blocks[0].statements[0].class
|
|
710
|
+
assert_equal 'Kme', blocks[0].statements[0].objset.class_name.text
|
|
711
|
+
assert_equal 0, blocks[1].statements.length
|
|
712
|
+
|
|
713
|
+
assert_equal ASTObjsetStmt, statements[2].class
|
|
714
|
+
assert_equal 'Mod_Blah', statements[2].objset.class_name.text
|
|
715
|
+
end
|
|
716
|
+
|
|
717
|
+
def test_after_callbacks__can_have_branches_normally
|
|
718
|
+
AsdsController.class_exec do
|
|
719
|
+
def after_filter_action
|
|
720
|
+
Mod::Blah.new
|
|
721
|
+
end
|
|
722
|
+
|
|
723
|
+
def after
|
|
724
|
+
if true
|
|
725
|
+
Kme.new
|
|
726
|
+
else
|
|
727
|
+
return Asd.new
|
|
728
|
+
end
|
|
729
|
+
end
|
|
730
|
+
end
|
|
731
|
+
|
|
732
|
+
extractor = create_rails_extractor
|
|
733
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :after_filter_action)
|
|
734
|
+
statements = ast.block.statements
|
|
735
|
+
|
|
736
|
+
assert_equal 2, statements.length
|
|
737
|
+
|
|
738
|
+
assert_equal ASTObjsetStmt, statements[0].class
|
|
739
|
+
assert_equal 'Mod_Blah', statements[0].objset.class_name.text
|
|
740
|
+
|
|
741
|
+
assert_equal ASTEither, statements[1].class
|
|
742
|
+
assert_equal 2, statements[1].blocks.length
|
|
743
|
+
blocks = statements[1].blocks
|
|
744
|
+
assert_equal 1, blocks[0].statements.length
|
|
745
|
+
assert_equal ASTObjsetStmt, blocks[0].statements[0].class
|
|
746
|
+
assert_equal 'Kme', blocks[0].statements[0].objset.class_name.text
|
|
747
|
+
assert_equal 1, blocks[1].statements.length
|
|
748
|
+
assert_equal ASTObjsetStmt, blocks[1].statements[0].class
|
|
749
|
+
assert_equal 'Asd', blocks[1].statements[0].objset.class_name.text
|
|
750
|
+
end
|
|
751
|
+
|
|
752
|
+
def test_callbacks__multiple_branched_callbacks
|
|
753
|
+
AsdsController.class_exec do
|
|
754
|
+
def before_nothing
|
|
755
|
+
if true
|
|
756
|
+
return Kme.new
|
|
757
|
+
else
|
|
758
|
+
Asd.new
|
|
759
|
+
end
|
|
760
|
+
end
|
|
761
|
+
|
|
762
|
+
def nothing
|
|
763
|
+
if true
|
|
764
|
+
Kme.new
|
|
765
|
+
else
|
|
766
|
+
return Mod::Blah.new
|
|
767
|
+
end
|
|
768
|
+
end
|
|
769
|
+
|
|
770
|
+
def after_nothing
|
|
771
|
+
if true
|
|
772
|
+
return Kme.new
|
|
773
|
+
else
|
|
774
|
+
Mod::Blah.new
|
|
775
|
+
end
|
|
776
|
+
end
|
|
777
|
+
end
|
|
778
|
+
|
|
779
|
+
extractor = create_rails_extractor
|
|
780
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
781
|
+
statements = ast.block.statements
|
|
782
|
+
|
|
783
|
+
assert_equal 3, statements.length
|
|
784
|
+
|
|
785
|
+
expected_classnames = ['Asd', 'Mod_Blah', 'Mod_Blah']
|
|
786
|
+
3.times do |index|
|
|
787
|
+
assert_equal ASTEither, statements[index].class
|
|
788
|
+
blocks = statements[index].blocks
|
|
789
|
+
assert_equal 2, blocks.length
|
|
790
|
+
assert_equal 1, blocks[0].statements.length
|
|
791
|
+
assert_equal ASTObjsetStmt, blocks[0].statements[0].class
|
|
792
|
+
assert_equal 'Kme', blocks[0].statements[0].objset.class_name.text
|
|
793
|
+
assert_equal 1, blocks[1].statements.length
|
|
794
|
+
assert_equal ASTObjsetStmt, blocks[1].statements[0].class
|
|
795
|
+
assert_equal expected_classnames[index], blocks[1].statements[0].objset.class_name.text
|
|
796
|
+
end
|
|
797
|
+
end
|
|
798
|
+
|
|
799
|
+
def test_before_callbacks__halt_callback_chain_when_rendering_always
|
|
800
|
+
AsdsController.class_exec do
|
|
801
|
+
def before
|
|
802
|
+
render :text => 'blah'
|
|
803
|
+
end
|
|
804
|
+
|
|
805
|
+
def before2
|
|
806
|
+
Mod::Blah.new
|
|
807
|
+
end
|
|
808
|
+
|
|
809
|
+
def before_filter_action
|
|
810
|
+
Mod::Blah.new
|
|
811
|
+
end
|
|
812
|
+
end
|
|
813
|
+
|
|
814
|
+
extractor = create_rails_extractor
|
|
815
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :before_filter_action)
|
|
816
|
+
statements = ast.block.statements
|
|
817
|
+
|
|
818
|
+
assert_equal 0, statements.length
|
|
819
|
+
end
|
|
820
|
+
|
|
821
|
+
def test_before_callbacks__halt_callback_chain_when_rendering_sometimes
|
|
822
|
+
AsdsController.class_exec do
|
|
823
|
+
def before
|
|
824
|
+
if true
|
|
825
|
+
render :text => 'blah'
|
|
826
|
+
end
|
|
827
|
+
Asd.new
|
|
828
|
+
end
|
|
829
|
+
|
|
830
|
+
def before2
|
|
831
|
+
Kme.new
|
|
832
|
+
end
|
|
833
|
+
|
|
834
|
+
def before_filter_action
|
|
835
|
+
Mod::Blah.new
|
|
836
|
+
end
|
|
837
|
+
end
|
|
838
|
+
|
|
839
|
+
extractor = create_rails_extractor
|
|
840
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :before_filter_action)
|
|
841
|
+
statements = ast.block.statements
|
|
842
|
+
|
|
843
|
+
assert_equal 1, statements.length
|
|
844
|
+
assert_equal ASTEither, statements[0].class
|
|
845
|
+
|
|
846
|
+
blocks = statements[0].blocks
|
|
847
|
+
assert_equal 2, blocks.length
|
|
848
|
+
|
|
849
|
+
assert_equal 3, blocks[1].statements.length
|
|
850
|
+
types = ['Asd', 'Kme', 'Mod_Blah']
|
|
851
|
+
3.times do |i|
|
|
852
|
+
assert_equal ASTObjsetStmt, blocks[1].statements[i].class
|
|
853
|
+
assert_equal types[i], blocks[1].statements[i].objset.class_name.text
|
|
854
|
+
end
|
|
855
|
+
|
|
856
|
+
assert_equal 1, blocks[0].statements.length
|
|
857
|
+
assert_equal 'Asd', blocks[0].statements[0].objset.class_name.text
|
|
858
|
+
end
|
|
859
|
+
|
|
860
|
+
def test_before_callbacks__affect_after
|
|
861
|
+
AsdsController.class_exec do
|
|
862
|
+
def before_nothing
|
|
863
|
+
if true
|
|
864
|
+
render
|
|
865
|
+
end
|
|
866
|
+
Asd.new
|
|
867
|
+
end
|
|
868
|
+
|
|
869
|
+
def nothing
|
|
870
|
+
Kme.new
|
|
871
|
+
end
|
|
872
|
+
|
|
873
|
+
def after_nothing
|
|
874
|
+
Mod::Blah.new
|
|
875
|
+
end
|
|
876
|
+
end
|
|
877
|
+
|
|
878
|
+
extractor = create_rails_extractor
|
|
879
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
880
|
+
statements = ast.block.statements
|
|
881
|
+
|
|
882
|
+
assert_equal 1, statements.length
|
|
883
|
+
assert_equal ASTEither, statements[0].class
|
|
884
|
+
|
|
885
|
+
blocks = statements[0].blocks
|
|
886
|
+
assert_equal 2, blocks.length
|
|
887
|
+
|
|
888
|
+
assert_equal 3, blocks[1].statements.length
|
|
889
|
+
types = ['Asd', 'Kme', 'Mod_Blah']
|
|
890
|
+
3.times do |i|
|
|
891
|
+
assert_equal ASTObjsetStmt, blocks[1].statements[i].class
|
|
892
|
+
assert_equal types[i], blocks[1].statements[i].objset.class_name.text
|
|
893
|
+
end
|
|
894
|
+
|
|
895
|
+
assert_equal 1, blocks[0].statements.length
|
|
896
|
+
assert_equal 'Asd', blocks[0].statements[0].objset.class_name.text
|
|
897
|
+
end
|
|
898
|
+
|
|
899
|
+
def test_before_callbacks__render_in_action_does_not_halt_after
|
|
900
|
+
AsdsController.class_exec do
|
|
901
|
+
def before_nothing
|
|
902
|
+
if true
|
|
903
|
+
render
|
|
904
|
+
end
|
|
905
|
+
Asd.new
|
|
906
|
+
end
|
|
907
|
+
|
|
908
|
+
def nothing
|
|
909
|
+
Kme.new
|
|
910
|
+
instance_eval "render :text => 'blah'"
|
|
911
|
+
end
|
|
912
|
+
|
|
913
|
+
def after_nothing
|
|
914
|
+
Mod::Blah.new
|
|
915
|
+
end
|
|
916
|
+
end
|
|
917
|
+
|
|
918
|
+
extractor = create_rails_extractor
|
|
919
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
920
|
+
statements = ast.block.statements
|
|
921
|
+
|
|
922
|
+
assert_equal 1, statements.length
|
|
923
|
+
assert_equal ASTEither, statements[0].class
|
|
924
|
+
|
|
925
|
+
blocks = statements[0].blocks
|
|
926
|
+
assert_equal 2, blocks.length
|
|
927
|
+
|
|
928
|
+
assert_equal 3, blocks[1].statements.length
|
|
929
|
+
types = ['Asd', 'Kme', 'Mod_Blah']
|
|
930
|
+
3.times do |i|
|
|
931
|
+
assert_equal ASTObjsetStmt, blocks[1].statements[i].class
|
|
932
|
+
assert_equal types[i], blocks[1].statements[i].objset.class_name.text
|
|
933
|
+
end
|
|
934
|
+
|
|
935
|
+
assert_equal 1, blocks[0].statements.length
|
|
936
|
+
assert_equal 'Asd', blocks[0].statements[0].objset.class_name.text
|
|
937
|
+
end
|
|
938
|
+
|
|
939
|
+
def test_extract_action__instrumentation_filters_work
|
|
940
|
+
AsdsController.class_exec do
|
|
941
|
+
def before_nothing
|
|
942
|
+
Asd.new
|
|
943
|
+
end
|
|
944
|
+
|
|
945
|
+
def nothing
|
|
946
|
+
Asd.new
|
|
947
|
+
end
|
|
948
|
+
end
|
|
949
|
+
|
|
950
|
+
extractor = create_rails_extractor <<-filters
|
|
951
|
+
blacklist :before_nothing
|
|
952
|
+
filters
|
|
953
|
+
|
|
954
|
+
assert_equal 1, extractor.instrumentation_filters.length
|
|
955
|
+
|
|
956
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
957
|
+
statements = ast.block.statements
|
|
958
|
+
assert_equal 1, statements.length
|
|
959
|
+
end
|
|
960
|
+
|
|
961
|
+
def test_extract_action__raise_ignores_the_root_path
|
|
962
|
+
AsdsController.class_exec do
|
|
963
|
+
def nothing
|
|
964
|
+
Kme.new
|
|
965
|
+
raise
|
|
966
|
+
end
|
|
967
|
+
end
|
|
968
|
+
|
|
969
|
+
extractor = create_rails_extractor
|
|
970
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
971
|
+
statements = ast.block.statements
|
|
972
|
+
|
|
973
|
+
assert_equal 0, statements.length
|
|
974
|
+
end
|
|
975
|
+
|
|
976
|
+
def test_extract_action__raise_ignores_the_root_path_in_branch
|
|
977
|
+
AsdsController.class_exec do
|
|
978
|
+
def nothing
|
|
979
|
+
if true
|
|
980
|
+
Asd.new
|
|
981
|
+
else
|
|
982
|
+
Kme.new
|
|
983
|
+
raise
|
|
984
|
+
end
|
|
985
|
+
end
|
|
986
|
+
end
|
|
987
|
+
|
|
988
|
+
extractor = create_rails_extractor
|
|
989
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
990
|
+
statements = ast.block.statements
|
|
991
|
+
|
|
992
|
+
assert_equal 1, statements.length
|
|
993
|
+
assert_equal ASTObjsetStmt, statements[0].class
|
|
994
|
+
assert_equal ASTCreateObjset, statements[0].objset.class
|
|
995
|
+
assert_equal 'Asd', statements[0].objset.class_name.text
|
|
996
|
+
end
|
|
997
|
+
|
|
998
|
+
def test_extract_action__exceptions_in_callbacks_stop_the_chain
|
|
999
|
+
AsdsController.class_exec do
|
|
1000
|
+
def before_nothing
|
|
1001
|
+
raise
|
|
1002
|
+
end
|
|
1003
|
+
|
|
1004
|
+
def nothing
|
|
1005
|
+
Asd.new
|
|
1006
|
+
end
|
|
1007
|
+
end
|
|
1008
|
+
|
|
1009
|
+
extractor = create_rails_extractor
|
|
1010
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
1011
|
+
statements = ast.block.statements
|
|
1012
|
+
|
|
1013
|
+
assert_equal 0, statements.length
|
|
1014
|
+
end
|
|
1015
|
+
|
|
1016
|
+
def test_extract_action__foreach_basic
|
|
1017
|
+
AsdsController.class_exec do
|
|
1018
|
+
def nothing
|
|
1019
|
+
Kme.all.each do |asd|
|
|
1020
|
+
a = asd
|
|
1021
|
+
a.delete!
|
|
1022
|
+
end
|
|
1023
|
+
end
|
|
1024
|
+
end
|
|
1025
|
+
|
|
1026
|
+
extractor = create_rails_extractor
|
|
1027
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
1028
|
+
statements = ast.block.statements
|
|
1029
|
+
|
|
1030
|
+
assert_equal 1, statements.length
|
|
1031
|
+
|
|
1032
|
+
foreach = statements.first
|
|
1033
|
+
assert_equal ASTForEach, foreach.class
|
|
1034
|
+
assert_equal 'asd', foreach.var_name.text
|
|
1035
|
+
assert_equal ASTAllOf, foreach.objset.class
|
|
1036
|
+
assert_equal 'Kme', foreach.objset.class_name.text
|
|
1037
|
+
assert_equal ASTBlock, foreach.block.class
|
|
1038
|
+
|
|
1039
|
+
block_stmts = foreach.block.statements
|
|
1040
|
+
assert_equal 2, block_stmts.length
|
|
1041
|
+
assert_equal ASTAssignment, block_stmts[0].class
|
|
1042
|
+
assert_equal ASTVariable, block_stmts[0].objset.class
|
|
1043
|
+
assert_equal 'asd', block_stmts[0].objset.var_name.text
|
|
1044
|
+
assert_equal 'a', block_stmts[0].var_name.text
|
|
1045
|
+
assert_equal ASTDeleteObj, block_stmts[1].class
|
|
1046
|
+
assert_equal 'a', block_stmts[1].objset.var_name.text
|
|
1047
|
+
end
|
|
1048
|
+
|
|
1049
|
+
def test_extract_action__association_setter_direct
|
|
1050
|
+
AsdsController.class_exec do
|
|
1051
|
+
def nothing
|
|
1052
|
+
Kme.new.blah = Mod::Blah.new
|
|
1053
|
+
end
|
|
1054
|
+
end
|
|
1055
|
+
|
|
1056
|
+
extractor = create_rails_extractor
|
|
1057
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
1058
|
+
statements = ast.block.statements
|
|
1059
|
+
|
|
1060
|
+
assert_equal 1, statements.length
|
|
1061
|
+
|
|
1062
|
+
assert_equal ASTSetTup, statements[0].class
|
|
1063
|
+
assert_equal ASTCreateObjset, statements[0].objset1.class
|
|
1064
|
+
assert_equal 'Kme', statements[0].objset1.class_name.text
|
|
1065
|
+
assert_equal 'blah', statements[0].rel_name.text
|
|
1066
|
+
assert_equal ASTSetTup, statements[0].class
|
|
1067
|
+
assert_equal ASTCreateObjset, statements[0].objset2.class
|
|
1068
|
+
assert_equal 'Mod_Blah', statements[0].objset2.class_name.text
|
|
1069
|
+
end
|
|
1070
|
+
|
|
1071
|
+
def test_extract_action__association_setter_through
|
|
1072
|
+
AsdsController.class_exec do
|
|
1073
|
+
def nothing
|
|
1074
|
+
Asd.find.kmes = Kme.new
|
|
1075
|
+
end
|
|
1076
|
+
end
|
|
1077
|
+
|
|
1078
|
+
extractor = create_rails_extractor
|
|
1079
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
1080
|
+
statements = ast.block.statements
|
|
1081
|
+
|
|
1082
|
+
assert_equal 4, statements.length
|
|
1083
|
+
|
|
1084
|
+
assert_equal ASTAssignment, statements[0].class
|
|
1085
|
+
origin_name = statements[0].var_name.text
|
|
1086
|
+
assert_equal ASTOneOf, statements[0].objset.class
|
|
1087
|
+
assert_equal ASTAllOf, statements[0].objset.objset.class
|
|
1088
|
+
assert_equal 'Asd', statements[0].objset.objset.class_name.text
|
|
1089
|
+
|
|
1090
|
+
assert_equal ASTAssignment, statements[1].class
|
|
1091
|
+
target_name = statements[1].var_name.text
|
|
1092
|
+
assert_equal ASTCreateObjset, statements[1].objset.class
|
|
1093
|
+
assert_equal 'Kme', statements[1].objset.class_name.text
|
|
1094
|
+
|
|
1095
|
+
assert_equal ASTDeleteObj, statements[2].class
|
|
1096
|
+
assert_equal ASTDereference, statements[2].objset.class
|
|
1097
|
+
assert_equal ASTVariable, statements[2].objset.objset.class
|
|
1098
|
+
assert_equal origin_name, statements[2].objset.objset.var_name.text
|
|
1099
|
+
assert_equal 'blahs', statements[2].objset.rel_name.text
|
|
1100
|
+
|
|
1101
|
+
assert_equal ASTForEach, statements[3].class
|
|
1102
|
+
iter_name = statements[3].var_name.text
|
|
1103
|
+
assert_equal ASTVariable, statements[3].objset.class
|
|
1104
|
+
assert_equal target_name, statements[3].objset.var_name.text
|
|
1105
|
+
block = statements[3].block
|
|
1106
|
+
|
|
1107
|
+
assert_equal 3, block.statements.length
|
|
1108
|
+
|
|
1109
|
+
assert_equal ASTAssignment, block.statements[0].class
|
|
1110
|
+
temp_name = block.statements[0].var_name.text
|
|
1111
|
+
assert_equal ASTCreateObjset, block.statements[0].objset.class
|
|
1112
|
+
assert_equal 'Mod_Blah', block.statements[0].objset.class_name.text
|
|
1113
|
+
|
|
1114
|
+
assert_equal ASTCreateTup, block.statements[1].class
|
|
1115
|
+
assert_equal ASTVariable, block.statements[1].objset1.class
|
|
1116
|
+
assert_equal origin_name, block.statements[1].objset1.var_name.text
|
|
1117
|
+
assert_equal 'blahs', block.statements[1].rel_name.text
|
|
1118
|
+
assert_equal ASTVariable, block.statements[1].objset2.class
|
|
1119
|
+
assert_equal temp_name, block.statements[1].objset2.var_name.text
|
|
1120
|
+
|
|
1121
|
+
assert_equal ASTCreateTup, block.statements[2].class
|
|
1122
|
+
assert_equal ASTVariable, block.statements[2].objset1.class
|
|
1123
|
+
assert_equal temp_name, block.statements[2].objset1.var_name.text
|
|
1124
|
+
assert_equal 'kme12', block.statements[2].rel_name.text
|
|
1125
|
+
assert_equal ASTVariable, block.statements[2].objset2.class
|
|
1126
|
+
assert_equal iter_name, block.statements[2].objset2.var_name.text
|
|
1127
|
+
|
|
1128
|
+
assert_equal 4, [origin_name, target_name, temp_name, iter_name].uniq.length
|
|
1129
|
+
assert origin_name.is_a? String
|
|
1130
|
+
assert target_name.is_a? String
|
|
1131
|
+
assert temp_name.is_a? String
|
|
1132
|
+
assert iter_name.is_a? String
|
|
1133
|
+
end
|
|
1134
|
+
|
|
1135
|
+
def test_extract_action__nested_foreachs
|
|
1136
|
+
AsdsController.class_exec do
|
|
1137
|
+
def nothing
|
|
1138
|
+
Asd.all.each do |asd|
|
|
1139
|
+
asd.blahs.each do |blah|
|
|
1140
|
+
blah.delete
|
|
1141
|
+
end
|
|
1142
|
+
end
|
|
1143
|
+
end
|
|
1144
|
+
end
|
|
1145
|
+
|
|
1146
|
+
extractor = create_rails_extractor
|
|
1147
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
1148
|
+
statements = ast.block.statements
|
|
1149
|
+
|
|
1150
|
+
assert_equal 1, statements.length
|
|
1151
|
+
|
|
1152
|
+
assert_equal ASTForEach, statements.first.class
|
|
1153
|
+
assert_equal ASTAllOf, statements.first.objset.class
|
|
1154
|
+
assert_equal 'Asd', statements.first.objset.class_name.text
|
|
1155
|
+
assert_equal 'asd', statements.first.var_name.text
|
|
1156
|
+
|
|
1157
|
+
block_stmts = statements.first.block.statements
|
|
1158
|
+
|
|
1159
|
+
assert_equal 1, block_stmts.length
|
|
1160
|
+
assert_equal ASTForEach, block_stmts.first.class
|
|
1161
|
+
assert_equal ASTDereference, block_stmts.first.objset.class
|
|
1162
|
+
assert_equal ASTVariable, block_stmts.first.objset.objset.class
|
|
1163
|
+
assert_equal 'asd', block_stmts.first.objset.objset.var_name.text
|
|
1164
|
+
assert_equal 'blahs', block_stmts.first.objset.rel_name.text
|
|
1165
|
+
assert_equal 'blah', block_stmts.first.var_name.text
|
|
1166
|
+
|
|
1167
|
+
final_block_stmts = block_stmts.first.block.statements
|
|
1168
|
+
|
|
1169
|
+
assert_equal 1, final_block_stmts.length
|
|
1170
|
+
assert_equal ASTDeleteObj, final_block_stmts.first.class
|
|
1171
|
+
assert_equal ASTVariable, final_block_stmts.first.objset.class
|
|
1172
|
+
assert_equal 'blah', final_block_stmts.first.objset.var_name.text
|
|
1173
|
+
end
|
|
1174
|
+
|
|
1175
|
+
def test_extract_action__assignment_in_branch_condition
|
|
1176
|
+
AsdsController.class_exec do
|
|
1177
|
+
def nothing
|
|
1178
|
+
if asd = Asd.new
|
|
1179
|
+
asd.delete
|
|
1180
|
+
end
|
|
1181
|
+
asd.delete
|
|
1182
|
+
end
|
|
1183
|
+
end
|
|
1184
|
+
|
|
1185
|
+
extractor = create_rails_extractor
|
|
1186
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
1187
|
+
statements = ast.block.statements
|
|
1188
|
+
|
|
1189
|
+
assert_equal 3, statements.length
|
|
1190
|
+
|
|
1191
|
+
assert_equal ASTAssignment, statements[0].class
|
|
1192
|
+
assert_equal 'asd', statements[0].var_name.text
|
|
1193
|
+
assert_equal ASTCreateObjset, statements[0].objset.class
|
|
1194
|
+
assert_equal 'Asd', statements[0].objset.class_name.text
|
|
1195
|
+
|
|
1196
|
+
assert_equal ASTEither, statements[1].class
|
|
1197
|
+
assert_equal 2, statements[1].blocks.length
|
|
1198
|
+
assert_equal 1, statements[1].blocks[0].statements.length
|
|
1199
|
+
assert_equal ASTDeleteObj, statements[1].blocks[0].statements[0].class
|
|
1200
|
+
assert_equal ASTVariable, statements[1].blocks[0].statements[0].objset.class
|
|
1201
|
+
assert_equal 'asd', statements[1].blocks[0].statements[0].objset.var_name.text
|
|
1202
|
+
assert_equal 0, statements[1].blocks[1].statements.length
|
|
1203
|
+
|
|
1204
|
+
assert_equal ASTDeleteObj, statements[2].class
|
|
1205
|
+
assert_equal ASTVariable, statements[2].objset.class
|
|
1206
|
+
assert_equal 'asd', statements[2].objset.var_name.text
|
|
1207
|
+
end
|
|
1208
|
+
|
|
1209
|
+
def test_extract_action__assignment_of_branch
|
|
1210
|
+
AsdsController.class_exec do
|
|
1211
|
+
def nothing
|
|
1212
|
+
a = if true; Asd.all; else; nil; end
|
|
1213
|
+
a.delete
|
|
1214
|
+
end
|
|
1215
|
+
end
|
|
1216
|
+
|
|
1217
|
+
extractor = create_rails_extractor
|
|
1218
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
1219
|
+
statements = ast.block.statements
|
|
1220
|
+
|
|
1221
|
+
assert_equal 2, statements.length
|
|
1222
|
+
|
|
1223
|
+
assert_equal ASTAssignment, statements[0].class
|
|
1224
|
+
assert_equal 'a', statements[0].var_name.text
|
|
1225
|
+
assert_equal ASTOneOfObjset, statements[0].objset.class
|
|
1226
|
+
assert_equal ASTAllOf, statements[0].objset.objsets[0].class
|
|
1227
|
+
assert_equal ASTEmptyObjset, statements[0].objset.objsets[1].class
|
|
1228
|
+
|
|
1229
|
+
assert_equal ASTDeleteObj, statements[1].class
|
|
1230
|
+
assert_equal ASTVariable, statements[1].objset.class
|
|
1231
|
+
assert_equal 'a', statements[1].objset.var_name.text
|
|
1232
|
+
end
|
|
1233
|
+
|
|
1234
|
+
def test_extract_action__assignment_of_trinary
|
|
1235
|
+
AsdsController.class_exec do
|
|
1236
|
+
def nothing
|
|
1237
|
+
a = true ? Asd.all : nil
|
|
1238
|
+
a.delete
|
|
1239
|
+
end
|
|
1240
|
+
end
|
|
1241
|
+
|
|
1242
|
+
extractor = create_rails_extractor
|
|
1243
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
1244
|
+
statements = ast.block.statements
|
|
1245
|
+
|
|
1246
|
+
assert_equal 2, statements.length
|
|
1247
|
+
|
|
1248
|
+
assert_equal ASTAssignment, statements[0].class
|
|
1249
|
+
assert_equal 'a', statements[0].var_name.text
|
|
1250
|
+
assert_equal ASTOneOfObjset, statements[0].objset.class
|
|
1251
|
+
assert_equal ASTAllOf, statements[0].objset.objsets[0].class
|
|
1252
|
+
assert_equal ASTEmptyObjset, statements[0].objset.objsets[1].class
|
|
1253
|
+
|
|
1254
|
+
assert_equal ASTDeleteObj, statements[1].class
|
|
1255
|
+
assert_equal ASTVariable, statements[1].objset.class
|
|
1256
|
+
assert_equal 'a', statements[1].objset.var_name.text
|
|
1257
|
+
end
|
|
1258
|
+
|
|
1259
|
+
def test_extract_action__rescue_stmt_modifier
|
|
1260
|
+
AsdsController.class_exec do
|
|
1261
|
+
def nothing
|
|
1262
|
+
a = Asd.all rescue nil
|
|
1263
|
+
a.delete
|
|
1264
|
+
end
|
|
1265
|
+
end
|
|
1266
|
+
|
|
1267
|
+
extractor = create_rails_extractor
|
|
1268
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
1269
|
+
statements = ast.block.statements
|
|
1270
|
+
|
|
1271
|
+
assert_equal 2, statements.length
|
|
1272
|
+
|
|
1273
|
+
assert_equal ASTAssignment, statements[0].class
|
|
1274
|
+
assert_equal 'a', statements[0].var_name.text
|
|
1275
|
+
assert_equal ASTOneOfObjset, statements[0].objset.class
|
|
1276
|
+
assert_equal ASTEmptyObjset, statements[0].objset.objsets[0].class
|
|
1277
|
+
assert_equal ASTAllOf, statements[0].objset.objsets[1].class
|
|
1278
|
+
|
|
1279
|
+
assert_equal ASTDeleteObj, statements[1].class
|
|
1280
|
+
assert_equal ASTVariable, statements[1].objset.class
|
|
1281
|
+
assert_equal 'a', statements[1].objset.var_name.text
|
|
1282
|
+
end
|
|
1283
|
+
|
|
1284
|
+
def test_extract_action__action_may_call_action
|
|
1285
|
+
AsdsController.class_exec do
|
|
1286
|
+
def nothing
|
|
1287
|
+
Asd.new
|
|
1288
|
+
end
|
|
1289
|
+
|
|
1290
|
+
def create
|
|
1291
|
+
Kme.new
|
|
1292
|
+
nothing
|
|
1293
|
+
Mod::Blah.new
|
|
1294
|
+
end
|
|
1295
|
+
end
|
|
1296
|
+
|
|
1297
|
+
extractor = create_rails_extractor
|
|
1298
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
1299
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :create)
|
|
1300
|
+
statements = ast.block.statements
|
|
1301
|
+
|
|
1302
|
+
assert_equal 3, statements.length
|
|
1303
|
+
|
|
1304
|
+
assert_equal ASTObjsetStmt, statements[0].class
|
|
1305
|
+
assert_equal ASTCreateObjset, statements[0].objset.class
|
|
1306
|
+
assert_equal 'Kme', statements[0].objset.class_name.text
|
|
1307
|
+
assert_equal ASTObjsetStmt, statements[1].class
|
|
1308
|
+
assert_equal ASTCreateObjset, statements[1].objset.class
|
|
1309
|
+
assert_equal 'Asd', statements[1].objset.class_name.text
|
|
1310
|
+
assert_equal ASTObjsetStmt, statements[2].class
|
|
1311
|
+
assert_equal ASTCreateObjset, statements[2].objset.class
|
|
1312
|
+
assert_equal 'Mod_Blah', statements[2].objset.class_name.text
|
|
1313
|
+
end
|
|
1314
|
+
|
|
1315
|
+
def test_extract_action__foreign_key_reads_and_writes_propagate_kinda
|
|
1316
|
+
AsdsController.class_exec do
|
|
1317
|
+
def nothing
|
|
1318
|
+
blah = Mod::Blah.find
|
|
1319
|
+
asd = Asd.find
|
|
1320
|
+
|
|
1321
|
+
blah.asd_id = asd.id
|
|
1322
|
+
end
|
|
1323
|
+
end
|
|
1324
|
+
|
|
1325
|
+
extractor = create_rails_extractor
|
|
1326
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
1327
|
+
statements = ast.block.statements
|
|
1328
|
+
|
|
1329
|
+
assert_equal 3, statements.length
|
|
1330
|
+
|
|
1331
|
+
assert_equal ASTAssignment, statements[0].class
|
|
1332
|
+
assert_equal 'blah', statements[0].var_name.text
|
|
1333
|
+
assert_equal ASTOneOf, statements[0].objset.class
|
|
1334
|
+
assert_equal ASTAllOf, statements[0].objset.objset.class
|
|
1335
|
+
assert_equal 'Mod_Blah', statements[0].objset.objset.class_name.text
|
|
1336
|
+
|
|
1337
|
+
assert_equal ASTAssignment, statements[1].class
|
|
1338
|
+
assert_equal 'asd', statements[1].var_name.text
|
|
1339
|
+
assert_equal ASTOneOf, statements[1].objset.class
|
|
1340
|
+
assert_equal ASTAllOf, statements[1].objset.objset.class
|
|
1341
|
+
assert_equal 'Asd', statements[1].objset.objset.class_name.text
|
|
1342
|
+
|
|
1343
|
+
assert_equal ASTSetTup, statements[2].class
|
|
1344
|
+
assert_equal ASTVariable, statements[2].objset1.class
|
|
1345
|
+
assert_equal 'blah', statements[2].objset1.var_name.text
|
|
1346
|
+
assert_equal 'asd', statements[2].rel_name.text
|
|
1347
|
+
assert_equal ASTVariable, statements[2].objset2.class
|
|
1348
|
+
assert_equal 'asd', statements[2].objset2.var_name.text
|
|
1349
|
+
end
|
|
1350
|
+
|
|
1351
|
+
def test_extract_action__has_many_delete_removes_one
|
|
1352
|
+
AsdsController.class_exec do
|
|
1353
|
+
def nothing
|
|
1354
|
+
a = Asd.new
|
|
1355
|
+
a.blahs.delete(1)
|
|
1356
|
+
end
|
|
1357
|
+
end
|
|
1358
|
+
|
|
1359
|
+
extractor = create_rails_extractor
|
|
1360
|
+
ast = extractor.action_to_adsl_ast(extractor.route_for AsdsController, :nothing)
|
|
1361
|
+
statements = ast.block.statements
|
|
1362
|
+
|
|
1363
|
+
assert_equal 2, statements.length
|
|
1364
|
+
|
|
1365
|
+
assert_equal ASTAssignment, statements[0].class
|
|
1366
|
+
assert_equal 'a', statements[0].var_name.text
|
|
1367
|
+
assert_equal ASTCreateObjset, statements[0].objset.class
|
|
1368
|
+
assert_equal 'Asd', statements[0].objset.class_name.text
|
|
1369
|
+
|
|
1370
|
+
assert_equal ASTDeleteTup, statements[1].class
|
|
1371
|
+
assert_equal ASTVariable, statements[1].objset1.class
|
|
1372
|
+
assert_equal 'a', statements[1].objset1.var_name.text
|
|
1373
|
+
assert_equal 'blahs', statements[1].rel_name.text
|
|
1374
|
+
assert_equal ASTOneOf, statements[1].objset2.class
|
|
1375
|
+
assert_equal ASTDereference, statements[1].objset2.objset.class
|
|
1376
|
+
assert_equal ASTVariable, statements[1].objset2.objset.objset.class
|
|
1377
|
+
assert_equal 'a', statements[1].objset2.objset.objset.var_name.text
|
|
1378
|
+
assert_equal 'blahs', statements[1].objset2.objset.rel_name.text
|
|
1379
|
+
end
|
|
1380
|
+
end
|