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.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -20
  3. data/README.md +14 -21
  4. data/bin/adsl-verify +8 -8
  5. data/lib/adsl.rb +3 -0
  6. data/lib/adsl/adsl.rb +3 -0
  7. data/lib/adsl/ds/data_store_spec.rb +339 -0
  8. data/lib/adsl/extract/instrumenter.rb +206 -0
  9. data/lib/adsl/extract/meta.rb +33 -0
  10. data/lib/adsl/extract/rails/action_block_builder.rb +233 -0
  11. data/lib/adsl/extract/rails/action_instrumenter.rb +400 -0
  12. data/lib/adsl/extract/rails/action_runner.rb +57 -0
  13. data/lib/adsl/extract/rails/active_record_metaclass_generator.rb +555 -0
  14. data/lib/adsl/extract/rails/callback_chain_simulator.rb +135 -0
  15. data/lib/adsl/extract/rails/invariant_extractor.rb +48 -0
  16. data/lib/adsl/extract/rails/invariant_instrumenter.rb +70 -0
  17. data/lib/adsl/extract/rails/other_meta.rb +57 -0
  18. data/lib/adsl/extract/rails/rails_extractor.rb +211 -0
  19. data/lib/adsl/extract/rails/rails_instrumentation_test_case.rb +34 -0
  20. data/lib/adsl/extract/rails/rails_special_gem_instrumentation.rb +120 -0
  21. data/lib/adsl/extract/rails/rails_test_helper.rb +140 -0
  22. data/lib/adsl/extract/sexp_utils.rb +54 -0
  23. data/lib/adsl/fol/first_order_logic.rb +261 -0
  24. data/lib/adsl/parser/adsl_parser.racc +159 -0
  25. data/lib/{parser → adsl/parser}/adsl_parser.rex +4 -4
  26. data/lib/{parser → adsl/parser}/adsl_parser.rex.rb +6 -6
  27. data/lib/adsl/parser/adsl_parser.tab.rb +1031 -0
  28. data/lib/adsl/parser/ast_nodes.rb +1410 -0
  29. data/lib/adsl/railtie.rb +67 -0
  30. data/lib/adsl/spass/bin.rb +230 -0
  31. data/lib/{spass → adsl/spass}/ruby_extensions.rb +0 -0
  32. data/lib/adsl/spass/spass_ds_extensions.rb +931 -0
  33. data/lib/adsl/spass/spass_translator.rb +393 -0
  34. data/lib/adsl/spass/util.rb +13 -0
  35. data/lib/adsl/util/csv_hash_formatter.rb +94 -0
  36. data/lib/adsl/util/general.rb +228 -0
  37. data/lib/adsl/util/test_helper.rb +71 -0
  38. data/lib/adsl/verification/formula_generators.rb +231 -0
  39. data/lib/adsl/verification/instrumentation_filter.rb +50 -0
  40. data/lib/adsl/verification/invariant.rb +19 -0
  41. data/lib/adsl/verification/rails_verification.rb +33 -0
  42. data/lib/adsl/verification/utils.rb +20 -0
  43. data/lib/adsl/verification/verification_case.rb +13 -0
  44. data/test/integration/rails/rails_branch_verification_test.rb +112 -0
  45. data/test/integration/rails/rails_verification_test.rb +253 -0
  46. data/test/integration/spass/basic_translation_test.rb +563 -0
  47. data/test/integration/spass/control_flow_translation_test.rb +421 -0
  48. data/test/unit/adsl/ds/data_store_spec_test.rb +54 -0
  49. data/test/unit/adsl/extract/instrumenter_test.rb +103 -0
  50. data/test/unit/adsl/extract/meta_test.rb +142 -0
  51. data/test/unit/adsl/extract/rails/action_block_builder_test.rb +178 -0
  52. data/test/unit/adsl/extract/rails/action_instrumenter_test.rb +68 -0
  53. data/test/unit/adsl/extract/rails/active_record_metaclass_generator_test.rb +336 -0
  54. data/test/unit/adsl/extract/rails/callback_chain_simulator_test.rb +76 -0
  55. data/test/unit/adsl/extract/rails/invariant_extractor_test.rb +92 -0
  56. data/test/unit/adsl/extract/rails/rails_extractor_test.rb +1380 -0
  57. data/test/unit/adsl/extract/rails/rails_test_helper_test.rb +25 -0
  58. data/test/unit/adsl/extract/sexp_utils_test.rb +100 -0
  59. data/test/unit/adsl/fol/first_order_logic_test.rb +227 -0
  60. data/test/unit/adsl/parser/action_parser_test.rb +1040 -0
  61. data/test/unit/adsl/parser/ast_nodes_test.rb +359 -0
  62. data/test/unit/adsl/parser/class_parser_test.rb +288 -0
  63. data/test/unit/adsl/parser/general_parser_test.rb +67 -0
  64. data/test/unit/adsl/parser/invariant_parser_test.rb +432 -0
  65. data/test/unit/adsl/parser/parser_util_test.rb +126 -0
  66. data/test/unit/adsl/spass/bin_test.rb +65 -0
  67. data/test/unit/adsl/spass/ruby_extensions_test.rb +39 -0
  68. data/test/unit/adsl/spass/spass_ds_extensions_test.rb +7 -0
  69. data/test/unit/adsl/spass/spass_translator_test.rb +342 -0
  70. data/test/unit/adsl/util/csv_hash_formatter_test.rb +68 -0
  71. data/test/unit/adsl/util/general_test.rb +303 -0
  72. data/test/unit/adsl/util/test_helper_test.rb +120 -0
  73. data/test/unit/adsl/verification/formula_generators_test.rb +200 -0
  74. data/test/unit/adsl/verification/instrumentation_filter_test.rb +39 -0
  75. data/test/unit/adsl/verification/utils_test.rb +39 -0
  76. data/test/unit/adsl/verification/verification_case_test.rb +8 -0
  77. metadata +229 -29
  78. data/lib/ds/data_store_spec.rb +0 -292
  79. data/lib/fol/first_order_logic.rb +0 -260
  80. data/lib/parser/adsl_ast.rb +0 -779
  81. data/lib/parser/adsl_parser.racc +0 -151
  82. data/lib/parser/adsl_parser.tab.rb +0 -976
  83. data/lib/parser/dsdl_parser.rex.rb +0 -196
  84. data/lib/parser/dsdl_parser.tab.rb +0 -976
  85. data/lib/spass/bin.rb +0 -164
  86. data/lib/spass/spass_ds_extensions.rb +0 -870
  87. data/lib/spass/spass_translator.rb +0 -388
  88. data/lib/spass/util.rb +0 -11
  89. data/lib/util/csv_hash_formatter.rb +0 -47
  90. data/lib/util/test_helper.rb +0 -33
  91. data/lib/util/util.rb +0 -114
@@ -0,0 +1,336 @@
1
+ require 'test/unit'
2
+ require 'pp'
3
+ require 'active_record'
4
+ require 'adsl/util/test_helper'
5
+ require 'adsl/parser/ast_nodes'
6
+ require 'adsl/extract/rails/active_record_metaclass_generator'
7
+ require 'adsl/extract/rails/rails_test_helper'
8
+ require 'adsl/extract/rails/rails_instrumentation_test_case'
9
+
10
+ module ADSL::Extract::Rails
11
+ class ActiveRecordMetaclassGeneratorTest < RailsInstrumentationTestCase
12
+
13
+ include ADSL::Parser
14
+
15
+ def test_adsl_ast_class_name
16
+ initialize_metaclasses
17
+
18
+ assert_equal 'Asd', Asd.adsl_ast_class_name
19
+ assert_equal 'Kme', Kme.adsl_ast_class_name
20
+ assert_equal 'Mod_Blah', Mod::Blah.adsl_ast_class_name
21
+ end
22
+
23
+ def test_generate__class_method_defined__all
24
+ initialize_metaclasses
25
+
26
+ assert Asd.respond_to? :all
27
+ assert_equal Asd, Asd.all.class
28
+ assert_equal ASTAllOf, Asd.all.adsl_ast.class
29
+ end
30
+
31
+ def test_generate__metaclasses_create_instances_with_association_accessors
32
+ initialize_metaclasses
33
+
34
+ asd = Asd.new :adsl_ast => nil
35
+ assert asd.respond_to? :blahs
36
+ assert_equal Mod::Blah, asd.blahs.class
37
+
38
+ blah = Mod::Blah.new :adsl_ast => nil
39
+ assert blah.respond_to? :asd
40
+ assert_equal Asd, blah.asd.class
41
+ end
42
+
43
+ def test_generate__associations_adsl_ast
44
+ initialize_metaclasses
45
+
46
+ asd = Asd.adsl_ast
47
+ assert_equal 1, asd.relations.length
48
+ assert_equal [0, 1.0/0.0], asd.relations.first.cardinality
49
+ assert_equal 'Mod_Blah', asd.relations.first.to_class_name.text
50
+ assert_equal 'blahs', asd.relations.first.name.text
51
+ assert_equal 'asd', asd.relations.first.inverse_of_name.text
52
+
53
+ kme = Kme.adsl_ast
54
+ assert_equal 1, kme.relations.length
55
+ assert_equal [0, 1], kme.relations.last.cardinality
56
+ assert_equal 'Mod_Blah', kme.relations.last.to_class_name.text
57
+ assert_equal 'blah', kme.relations.last.name.text
58
+ assert_nil kme.relations.last.inverse_of_name
59
+
60
+ blah = Mod::Blah.adsl_ast
61
+ assert_equal 2, blah.relations.length
62
+
63
+ assert_equal [0, 1], blah.relations.first.cardinality
64
+ assert_equal 'Asd', blah.relations.first.to_class_name.text
65
+ assert_equal 'asd', blah.relations.first.name.text
66
+ assert_nil blah.relations.first.inverse_of_name
67
+
68
+ assert_equal [0, 1], blah.relations.second.cardinality
69
+ assert_equal 'Kme', blah.relations.second.to_class_name.text
70
+ assert_equal 'kme12', blah.relations.second.name.text
71
+ assert_equal 'blah', blah.relations.second.inverse_of_name.text
72
+ end
73
+
74
+ def test_generate__associations_through
75
+ initialize_metaclasses
76
+
77
+ assert Asd.adsl_ast.relations.select{ |rel| rel.name.text == 'kmes' }.empty?
78
+ objset = Asd.new :adsl_ast => :something_unique
79
+ through = objset.kmes
80
+ assert_equal Kme, through.class
81
+
82
+ assert_equal ASTDereference, through.adsl_ast.class
83
+ assert_equal 'kme12', through.adsl_ast.rel_name.text
84
+ assert_equal ASTDereference, through.adsl_ast.objset.class
85
+ assert_equal 'blahs', through.adsl_ast.objset.rel_name.text
86
+ assert_equal :something_unique, through.adsl_ast.objset.objset
87
+ end
88
+
89
+ def test_generate__delete_single_statements
90
+ initialize_metaclasses
91
+
92
+ asd_delete = Asd.new.delete
93
+ assert_equal 1, asd_delete.length
94
+ assert_equal ASTDeleteObj, asd_delete.first.class
95
+
96
+ kme_delete = Kme.new.delete
97
+ assert_equal 1, kme_delete.length
98
+ assert_equal ASTDeleteObj, kme_delete.first.class
99
+
100
+ blah_delete = Mod::Blah.new.delete
101
+ assert_equal 1, blah_delete.length
102
+ assert_equal ASTDeleteObj, blah_delete.first.class
103
+ end
104
+
105
+ def test_generate__destroy_propagates_to_delete_but_not_further
106
+ initialize_metaclasses
107
+
108
+ asd_delete = Mod::Blah.new(:adsl_ast => ASTDummyObjset.new(:type => :blah)).destroy
109
+ assert_equal 2, asd_delete.length
110
+
111
+ assert_equal ASTDeleteObj, asd_delete.first.class
112
+ assert_equal ASTDereference, asd_delete.first.objset.class
113
+ assert_equal 'kme12', asd_delete.first.objset.rel_name.text
114
+ assert_equal ASTDummyObjset, asd_delete.first.objset.objset.class
115
+ assert_equal :blah, asd_delete.first.objset.objset.type
116
+
117
+ assert_equal ASTDeleteObj, asd_delete.last.class
118
+ assert_equal ASTDummyObjset, asd_delete.last.objset.class
119
+ assert_equal :blah, asd_delete.last.objset.type
120
+ end
121
+
122
+ def test_generate__destroy_through_destroys_the_join_object
123
+ initialize_metaclasses
124
+
125
+ asd_delete = Asd.new(:adsl_ast => ASTDummyObjset.new(:type => :blah)).destroy
126
+ assert_equal 3, asd_delete.length
127
+
128
+ assert_equal ASTDeleteObj, asd_delete[0].class
129
+ assert_equal ASTDereference, asd_delete[0].objset.class
130
+ assert_equal ASTDereference, asd_delete[0].objset.objset.class
131
+ assert_equal 'kme12', asd_delete[0].objset.rel_name.text
132
+ assert_equal 'blahs', asd_delete[0].objset.objset.rel_name.text
133
+ assert_equal ASTDummyObjset, asd_delete[0].objset.objset.objset.class
134
+ assert_equal :blah, asd_delete[0].objset.objset.objset.type
135
+
136
+ assert_equal ASTDeleteObj, asd_delete[1].class
137
+ assert_equal ASTDereference, asd_delete[1].objset.class
138
+ assert_equal 'blahs', asd_delete[1].objset.rel_name.text
139
+ assert_equal ASTDummyObjset, asd_delete[1].objset.objset.class
140
+ assert_equal :blah, asd_delete[1].objset.objset.type
141
+
142
+ assert_equal ASTDeleteObj, asd_delete[2].class
143
+ assert_equal ASTDummyObjset, asd_delete[2].objset.class
144
+ assert_equal :blah, asd_delete[2].objset.type
145
+ end
146
+
147
+ def test_generate__include_subset_ops
148
+ initialize_metaclasses
149
+
150
+ asd = Asd.new :adsl_ast => ASTDummyObjset.new(:type => :blah)
151
+ assert asd.respond_to? :include?
152
+ assert asd.respond_to? :<=
153
+ assert asd.respond_to? :>=
154
+
155
+ kme = Kme.new :adsl_ast => ASTDummyObjset.new(:type => :blah2)
156
+
157
+ subset = asd.include? kme
158
+ assert_equal ASTIn, subset.class
159
+ assert_equal :blah, subset.objset2.type
160
+ assert_equal :blah2, subset.objset1.type
161
+
162
+ subset = asd >= kme
163
+ assert_equal ASTIn, subset.class
164
+ assert_equal :blah, subset.objset2.type
165
+ assert_equal :blah2, subset.objset1.type
166
+
167
+ subset = asd <= kme
168
+ assert_equal ASTIn, subset.class
169
+ assert_equal :blah2, subset.objset2.type
170
+ assert_equal :blah, subset.objset1.type
171
+ end
172
+
173
+ def test_generate__scopes_work_on_classes
174
+ Asd.class_exec do
175
+ scope :something_special, lambda{ where('id = ?', 4).order('id') }
176
+ end
177
+ assert Asd.respond_to? :something_special
178
+
179
+ initialize_metaclasses
180
+
181
+ assert Asd.respond_to? :something_special
182
+ ss = Asd.something_special
183
+ assert ss.respond_to? :adsl_ast
184
+
185
+ assert_equal ASTSubset, ss.adsl_ast.class
186
+ assert_equal ASTAllOf, ss.adsl_ast.objset.class
187
+ assert_equal 'Asd', ss.adsl_ast.objset.class_name.text
188
+ end
189
+
190
+ def test_generate__scopes_work_on_relations
191
+ Asd.class_exec do
192
+ scope :something_special, lambda{ order('id') }
193
+ end
194
+ assert Asd.where('id < ?', 5).respond_to? :something_special
195
+
196
+ initialize_metaclasses
197
+
198
+ # make sure the scope does not do subset
199
+ assert Asd.respond_to? :something_special
200
+ assert_equal ASTAllOf, Asd.something_special.adsl_ast.class
201
+
202
+
203
+ assert Asd.where('id = ?', 4).respond_to? :something_special
204
+ ss = Asd.where('id = ?', 4).something_special
205
+
206
+ assert_equal ASTSubset, ss.adsl_ast.class
207
+ assert_equal ASTAllOf, ss.adsl_ast.objset.class
208
+ assert_equal 'Asd', ss.adsl_ast.objset.class_name.text
209
+ end
210
+
211
+ def test_generate__conditions_scopes_work_on_classes
212
+ Asd.class_exec do
213
+ scope :something_special, :conditions => ["id < ?", 5]
214
+ end
215
+ assert Asd.respond_to? :something_special
216
+
217
+ initialize_metaclasses
218
+
219
+ assert Asd.respond_to? :something_special
220
+ ss = Asd.something_special
221
+ assert ss.respond_to? :adsl_ast
222
+
223
+ assert_equal ASTSubset, ss.adsl_ast.class
224
+ assert_equal ASTAllOf, ss.adsl_ast.objset.class
225
+ assert_equal 'Asd', ss.adsl_ast.objset.class_name.text
226
+ end
227
+
228
+ def test_generate__scopes_through_associations
229
+ Asd.class_exec do
230
+ scope :asd_scope, lambda{ order('id') }
231
+ end
232
+ Mod::Blah.class_exec do
233
+ scope :blah_scope, :conditions => ["id < ?", 5]
234
+ end
235
+
236
+ initialize_metaclasses
237
+
238
+ assert_equal Mod::Blah, Asd.all.blahs.class
239
+ assert_equal ASTDereference, Asd.all.blahs.adsl_ast.class
240
+
241
+ ss = Asd.all.blahs.blah_scope.adsl_ast
242
+
243
+ assert_equal ASTSubset, ss.class
244
+ assert_equal ASTDereference, ss.objset.class
245
+ end
246
+
247
+ def test_generate__conditions_scopes_work_on_relations
248
+ Asd.class_exec do
249
+ scope :asd_scope, lambda{ order('id') }
250
+ end
251
+ Mod::Blah.class_exec do
252
+ scope :blah_scope, :conditions => ["id < ?", 5]
253
+ end
254
+
255
+ initialize_metaclasses
256
+
257
+ assert_equal ASTSubset, Mod::Blah.new.blah_scope.adsl_ast.class
258
+
259
+ assert_equal ASTAllOf, Asd.asd_scope.adsl_ast.class
260
+ assert_equal ASTDereference, Asd.asd_scope.blahs.adsl_ast.class
261
+ assert_equal ASTSubset, Asd.asd_scope.blahs.blah_scope.adsl_ast.class
262
+ end
263
+
264
+ def test_generate__association_scope_count_by_group_is_unknown
265
+ Mod::Blah.class_exec do
266
+ scope :some_scope, :conditions => ["id < ?", 5]
267
+ end
268
+
269
+ initialize_metaclasses
270
+
271
+ assert_equal Mod::Blah, Asd.new.blahs.class
272
+ assert_equal Mod::Blah, Asd.new.blahs.some_scope.class
273
+ assert_equal MetaUnknown, Asd.new.blahs.some_scope.count_by_group('id').class
274
+ end
275
+
276
+ def test_generate__association_build_direct
277
+ initialize_metaclasses
278
+
279
+ new = Asd.find.blahs.build
280
+
281
+ assert_equal Mod::Blah, new.class
282
+ assert_equal ASTDereferenceCreate, new.adsl_ast.class
283
+ assert_equal ASTOneOf, new.adsl_ast.objset.class
284
+ assert_equal ASTAllOf, new.adsl_ast.objset.objset.class
285
+ assert_equal 'Asd', new.adsl_ast.objset.objset.class_name.text
286
+ assert_equal 'blahs', new.adsl_ast.rel_name.text
287
+ end
288
+
289
+ def test_generate__association_build_through
290
+ initialize_metaclasses
291
+
292
+ new = Asd.find.kmes.build
293
+
294
+ assert_equal Kme, new.class
295
+ assert_equal ASTDereferenceCreate, new.adsl_ast.class
296
+ assert_equal 'kme12', new.adsl_ast.rel_name.text
297
+ assert_equal ASTDereferenceCreate, new.adsl_ast.objset.class
298
+ assert_equal 'blahs', new.adsl_ast.objset.rel_name.text
299
+ assert_equal ASTOneOf, new.adsl_ast.objset.objset.class
300
+ assert_equal ASTAllOf, new.adsl_ast.objset.objset.objset.class
301
+ assert_equal 'Asd', new.adsl_ast.objset.objset.objset.class_name.text
302
+ end
303
+
304
+ def test_generate__add_direct
305
+ initialize_metaclasses
306
+
307
+ new = (Asd.find.blahs.add(Mod::Blah.find))
308
+
309
+ assert_equal ASTCreateTup, new.class
310
+ assert_equal ASTOneOf, new.objset1.class
311
+ assert_equal ASTAllOf, new.objset1.objset.class
312
+ assert_equal 'Asd', new.objset1.objset.class_name.text
313
+ assert_equal 'blahs', new.rel_name.text
314
+ assert_equal ASTOneOf, new.objset2.class
315
+ assert_equal ASTAllOf, new.objset2.objset.class
316
+ assert_equal 'Mod_Blah', new.objset2.objset.class_name.text
317
+ end
318
+
319
+ def test_generate__add_through
320
+ initialize_metaclasses
321
+
322
+ new = (Asd.find.kmes.add(Kme.find))
323
+
324
+ assert_equal ASTCreateTup, new.class
325
+ assert_equal ASTDereferenceCreate, new.objset1.class
326
+ assert_equal ASTOneOf, new.objset1.objset.class
327
+ assert_equal ASTAllOf, new.objset1.objset.objset.class
328
+ assert_equal 'Asd', new.objset1.objset.objset.class_name.text
329
+ assert_equal 'blahs', new.objset1.rel_name.text
330
+ assert_equal 'kme12', new.rel_name.text
331
+ assert_equal ASTOneOf, new.objset2.class
332
+ assert_equal ASTAllOf, new.objset2.objset.class
333
+ assert_equal 'Kme', new.objset2.objset.class_name.text
334
+ end
335
+ end
336
+ end
@@ -0,0 +1,76 @@
1
+ require 'test/unit'
2
+ require 'adsl/util/test_helper'
3
+ require 'adsl/parser/ast_nodes'
4
+ require 'adsl/extract/rails/callback_chain_simulator'
5
+
6
+ module ADSL::Extract::Rails
7
+ class CallbackChainSimulatorTest < Test::Unit::TestCase
8
+ include ADSL::Parser
9
+ include ADSL::Extract::Rails::CallbackChainSimulator
10
+
11
+ def dummy(flag = nil)
12
+ ASTDummyStmt.new :type => flag
13
+ end
14
+
15
+ def render
16
+ ASTDummyStmt.new :type => :render
17
+ end
18
+
19
+ def block(*stmts)
20
+ ASTBlock.new :statements => stmts
21
+ end
22
+
23
+ def either(*blocks)
24
+ ASTEither.new :blocks => blocks
25
+ end
26
+
27
+ def test_special_status_of__plain_blocks
28
+ assert_equal false, halting_status_of(block(dummy, dummy))
29
+ assert_equal true, halting_status_of(block(dummy, render, dummy))
30
+ end
31
+
32
+ def test_special_status_of__plain_either
33
+ assert_equal nil, halting_status_of(either(
34
+ block,
35
+ block(render)
36
+ ))
37
+
38
+ assert_equal true, halting_status_of(either(
39
+ block(render),
40
+ block(render)
41
+ ))
42
+
43
+ assert_equal false, halting_status_of(either(block, block))
44
+ end
45
+
46
+ def test_split_paths__plain
47
+ paths = split_into_paths_that_will_or_will_not_halt(block(
48
+ dummy(0),
49
+ either(
50
+ block(dummy 1),
51
+ block(dummy 2),
52
+ block(dummy(3), render)
53
+ ),
54
+ dummy(4)
55
+ ))
56
+
57
+ # rendering: 0, 3, 4
58
+ stmts = paths[:will_halt].statements
59
+ assert_equal 3, stmts.length
60
+ assert_equal 0, stmts[0].type
61
+ assert_equal [3, :render], stmts[1].statements.map(&:type)
62
+ assert_equal 4, stmts[2].type
63
+
64
+ # non-rendering: 0, 1, 4 or 0, 2, 4
65
+ stmts = paths[:will_not_halt].statements
66
+ assert_equal 3, stmts.length
67
+
68
+ assert_equal 0, stmts[0].type
69
+ assert_equal ASTEither, stmts[1].class
70
+ assert_equal 2, stmts[1].blocks.length
71
+ assert_equal [1, 2], stmts[1].blocks.map(&:statements).map(&:first).map(&:type)
72
+ assert_equal 4, stmts[2].type
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,92 @@
1
+ require 'test/unit'
2
+ require 'adsl/util/test_helper'
3
+ require 'adsl/extract/rails/invariant_extractor'
4
+ require 'adsl/extract/rails/rails_instrumentation_test_case'
5
+ require 'adsl/parser/ast_nodes'
6
+
7
+ module ADSL::Extract::Rails
8
+ class InvariantExtractorTest < ADSL::Extract::Rails::RailsInstrumentationTestCase
9
+
10
+ include ADSL::Parser
11
+
12
+ def test_load_in_context__basic
13
+ invariant_string = <<-invariants
14
+ invariant "blah", true
15
+ invariant true
16
+ invariants
17
+
18
+ ie = InvariantExtractor.new ar_class_names
19
+ ie.extract invariant_string
20
+ assert_equal 2, ie.invariants.length
21
+
22
+ assert_equal 'blah', ie.invariants[0].description
23
+ assert_equal true, ie.invariants[0].formula.bool_value
24
+
25
+ assert_equal nil, ie.invariants[1].description
26
+ assert_equal true, ie.invariants[1].formula.bool_value
27
+ end
28
+
29
+ def test_load_in_context__do_end_moved_to_parameter
30
+ invariant_string = <<-invariants
31
+ invariant 'first', forall{ |asd|
32
+ asd.empty?
33
+ }
34
+ invariant 'second', forall do |asd|
35
+ asd.empty?
36
+ end
37
+ invariants
38
+ initialize_metaclasses
39
+
40
+ ie = InvariantExtractor.new ar_class_names
41
+ ie.extract invariant_string
42
+ assert_equal 2, ie.invariants.length
43
+
44
+ assert_equal 'first', ie.invariants[0].description
45
+ assert_equal ASTForAll, ie.invariants[0].formula.class
46
+ assert_equal ASTEmpty, ie.invariants[0].formula.subformula.class
47
+
48
+ assert_equal 'second', ie.invariants[1].description
49
+ assert_equal ASTForAll, ie.invariants[1].formula.class
50
+ assert_equal ASTEmpty, ie.invariants[1].formula.subformula.class
51
+ end
52
+
53
+ def test_load_in_context__instrumented_ar_classes
54
+ initialize_metaclasses
55
+
56
+ invariant_string = <<-invariants
57
+ invariant Asd.all.kmes.empty?
58
+ invariants
59
+
60
+ ie = InvariantExtractor.new ar_class_names
61
+ ie.extract invariant_string
62
+ assert_equal 1, ie.invariants.length
63
+
64
+ inv = ie.invariants.first.formula
65
+
66
+ assert_equal ASTEmpty, inv.class
67
+ assert_equal ASTDereference, inv.objset.class
68
+ assert_equal 'kme12', inv.objset.rel_name.text
69
+ assert_equal ASTDereference, inv.objset.objset.class
70
+ assert_equal 'blahs', inv.objset.objset.rel_name.text
71
+ assert_equal ASTAllOf, inv.objset.objset.objset.class
72
+ end
73
+
74
+ def test_load_in_context__instrumented_boolean_operators
75
+ invariant_string = <<-invariants
76
+ invariant((!true) && false)
77
+ invariants
78
+
79
+ ie = InvariantExtractor.new ar_class_names
80
+ ie.extract invariant_string
81
+ assert_equal 1, ie.invariants.length
82
+
83
+ assert_equal ASTAnd, ie.invariants[0].formula.class
84
+ assert_equal ASTNot, ie.invariants[0].formula.subformulae[0].class
85
+ assert_equal ASTBoolean, ie.invariants[0].formula.subformulae[0].subformula.class
86
+ assert_equal true, ie.invariants[0].formula.subformulae[0].subformula.bool_value
87
+
88
+ assert_equal ASTBoolean, ie.invariants[0].formula.subformulae[1].class
89
+ assert_equal false, ie.invariants[0].formula.subformulae[1].bool_value
90
+ end
91
+ end
92
+ end