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,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
|