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,421 @@
|
|
|
1
|
+
require 'adsl/util/test_helper'
|
|
2
|
+
require 'test/unit'
|
|
3
|
+
|
|
4
|
+
class ControlFlowTranslationTest < Test::Unit::TestCase
|
|
5
|
+
def test_either__blank
|
|
6
|
+
adsl_assert :correct, <<-ADSL
|
|
7
|
+
class Class{}
|
|
8
|
+
action blah() {
|
|
9
|
+
either {} or {}
|
|
10
|
+
}
|
|
11
|
+
invariant exists(Class o)
|
|
12
|
+
ADSL
|
|
13
|
+
adsl_assert :correct, <<-ADSL
|
|
14
|
+
class Class{}
|
|
15
|
+
action blah() {
|
|
16
|
+
either {} or {}
|
|
17
|
+
}
|
|
18
|
+
invariant not exists(Class o)
|
|
19
|
+
ADSL
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_either__doesnt_break_others
|
|
23
|
+
adsl_assert :correct, <<-ADSL
|
|
24
|
+
class Class{}
|
|
25
|
+
action blah() {
|
|
26
|
+
create(Class)
|
|
27
|
+
either {} or {}
|
|
28
|
+
}
|
|
29
|
+
invariant exists(Class o)
|
|
30
|
+
ADSL
|
|
31
|
+
adsl_assert :correct, <<-ADSL
|
|
32
|
+
class Class{}
|
|
33
|
+
action blah() {
|
|
34
|
+
either {} or {}
|
|
35
|
+
create(Class)
|
|
36
|
+
}
|
|
37
|
+
invariant exists(Class o)
|
|
38
|
+
ADSL
|
|
39
|
+
adsl_assert :incorrect, <<-ADSL
|
|
40
|
+
class Class{}
|
|
41
|
+
action blah() {
|
|
42
|
+
either {} or {}
|
|
43
|
+
create(Class)
|
|
44
|
+
}
|
|
45
|
+
invariant not exists(Class o)
|
|
46
|
+
ADSL
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def test_either__may_delete_an_object
|
|
50
|
+
adsl_assert :incorrect, <<-ADSL
|
|
51
|
+
class Class{}
|
|
52
|
+
action blah() {
|
|
53
|
+
either {
|
|
54
|
+
delete allof(Class)
|
|
55
|
+
} or {}
|
|
56
|
+
}
|
|
57
|
+
invariant exists(Class o)
|
|
58
|
+
ADSL
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_either__blank_is_noop
|
|
62
|
+
adsl_assert :incorrect, <<-ADSL
|
|
63
|
+
class Class{}
|
|
64
|
+
action blah() {
|
|
65
|
+
create(Class)
|
|
66
|
+
either {} or {} or {} or {}
|
|
67
|
+
}
|
|
68
|
+
invariant not exists(Class c)
|
|
69
|
+
ADSL
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def test_either__may_delete_and_create_an_object
|
|
73
|
+
adsl_assert :incorrect, <<-ADSL
|
|
74
|
+
class Class{}
|
|
75
|
+
action blah() {
|
|
76
|
+
either {
|
|
77
|
+
delete allof(Class)
|
|
78
|
+
create(Class)
|
|
79
|
+
} or {}
|
|
80
|
+
}
|
|
81
|
+
invariant not exists(Class o)
|
|
82
|
+
ADSL
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def test_either__branches_symmetrical
|
|
86
|
+
adsl_assert :incorrect, <<-ADSL
|
|
87
|
+
class Class{}
|
|
88
|
+
action blah() {
|
|
89
|
+
either {
|
|
90
|
+
delete allof(Class)
|
|
91
|
+
create(Class)
|
|
92
|
+
} or {}
|
|
93
|
+
}
|
|
94
|
+
invariant not exists(Class o)
|
|
95
|
+
ADSL
|
|
96
|
+
adsl_assert :incorrect, <<-ADSL
|
|
97
|
+
class Class{}
|
|
98
|
+
action blah() {
|
|
99
|
+
either {} or {
|
|
100
|
+
delete allof(Class)
|
|
101
|
+
create(Class)
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
invariant not exists(Class o)
|
|
105
|
+
ADSL
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def test_either__false_dichotomy
|
|
109
|
+
adsl_assert :incorrect, <<-ADSL
|
|
110
|
+
class Class{}
|
|
111
|
+
action blah() {
|
|
112
|
+
either {
|
|
113
|
+
create(Class)
|
|
114
|
+
} or {
|
|
115
|
+
create(Class)
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
invariant not exists(Class o)
|
|
119
|
+
ADSL
|
|
120
|
+
adsl_assert :correct, <<-ADSL
|
|
121
|
+
class Class{}
|
|
122
|
+
action blah() {
|
|
123
|
+
either {
|
|
124
|
+
create(Class)
|
|
125
|
+
} or {
|
|
126
|
+
create(Class)
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
invariant exists(Class o)
|
|
130
|
+
ADSL
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def test_either__multiple_options
|
|
134
|
+
adsl_assert :correct, <<-ADSL
|
|
135
|
+
class Class {}
|
|
136
|
+
action blah() {
|
|
137
|
+
either {} or {
|
|
138
|
+
delete allof(Class)
|
|
139
|
+
create(Class)
|
|
140
|
+
} or {
|
|
141
|
+
create(Class)
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
invariant exists(Class o)
|
|
145
|
+
ADSL
|
|
146
|
+
adsl_assert :incorrect, <<-ADSL
|
|
147
|
+
class Class {}
|
|
148
|
+
action blah() {
|
|
149
|
+
either {
|
|
150
|
+
create(Class)
|
|
151
|
+
} or {
|
|
152
|
+
delete allof(Class)
|
|
153
|
+
create(Class)
|
|
154
|
+
} or {
|
|
155
|
+
delete allof(Class)
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
invariant exists(Class o)
|
|
159
|
+
ADSL
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def test_either__delete_and_create_an_object
|
|
163
|
+
adsl_assert :correct, <<-ADSL
|
|
164
|
+
class Class{}
|
|
165
|
+
action blah() {
|
|
166
|
+
either {
|
|
167
|
+
delete allof(Class)
|
|
168
|
+
create(Class)
|
|
169
|
+
} or {
|
|
170
|
+
delete allof(Class)
|
|
171
|
+
create(Class)
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
invariant forall(Class a, Class b: a == b)
|
|
175
|
+
ADSL
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def test_either__variables
|
|
179
|
+
adsl_assert :incorrect, <<-ADSL
|
|
180
|
+
class Class{}
|
|
181
|
+
action blah() {
|
|
182
|
+
either {
|
|
183
|
+
a = create(Class)
|
|
184
|
+
delete a
|
|
185
|
+
} or {
|
|
186
|
+
create(Class)
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
invariant forall(Class a, Class b: a == b)
|
|
190
|
+
ADSL
|
|
191
|
+
adsl_assert :incorrect, <<-ADSL
|
|
192
|
+
class Class{}
|
|
193
|
+
action blah() {
|
|
194
|
+
a = create(Class)
|
|
195
|
+
either {
|
|
196
|
+
delete a
|
|
197
|
+
} or {
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
invariant not exists(Class a)
|
|
201
|
+
ADSL
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def test_either__lambda
|
|
205
|
+
adsl_assert :incorrect, <<-ADSL
|
|
206
|
+
class Class{}
|
|
207
|
+
action blah() {
|
|
208
|
+
a = create(Class)
|
|
209
|
+
either {
|
|
210
|
+
} or {
|
|
211
|
+
delete a
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
invariant forall(Class a, Class b: a == b)
|
|
215
|
+
ADSL
|
|
216
|
+
adsl_assert :incorrect, <<-ADSL
|
|
217
|
+
class Class{}
|
|
218
|
+
action blah() {
|
|
219
|
+
a = create(Class)
|
|
220
|
+
either {
|
|
221
|
+
delete a
|
|
222
|
+
} or {
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
invariant forall(Class a, Class b: a == b)
|
|
226
|
+
ADSL
|
|
227
|
+
adsl_assert :correct, <<-ADSL
|
|
228
|
+
class Class{}
|
|
229
|
+
action blah() {
|
|
230
|
+
a = create(Class)
|
|
231
|
+
either {
|
|
232
|
+
delete a
|
|
233
|
+
} or {
|
|
234
|
+
delete a
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
invariant not exists(Class a)
|
|
238
|
+
ADSL
|
|
239
|
+
adsl_assert :correct, <<-ADSL
|
|
240
|
+
class Class{}
|
|
241
|
+
action blah() {
|
|
242
|
+
a = create(Class)
|
|
243
|
+
either {
|
|
244
|
+
delete a
|
|
245
|
+
} or {
|
|
246
|
+
delete a
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
invariant forall(Class a, Class b: a == b)
|
|
250
|
+
ADSL
|
|
251
|
+
adsl_assert :correct, <<-ADSL
|
|
252
|
+
class Class{}
|
|
253
|
+
action blah() {
|
|
254
|
+
a = allof(Class)
|
|
255
|
+
either {
|
|
256
|
+
a = create(Class)
|
|
257
|
+
} or {
|
|
258
|
+
a = create(Class)
|
|
259
|
+
a = oneof(allof(Class))
|
|
260
|
+
} or {
|
|
261
|
+
a = create(Class)
|
|
262
|
+
}
|
|
263
|
+
delete a
|
|
264
|
+
}
|
|
265
|
+
invariant forall(Class a, Class b: a == b)
|
|
266
|
+
ADSL
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
def test_for_each__no_contradictions
|
|
270
|
+
adsl_assert :incorrect, <<-ADSL, :conjecture => false
|
|
271
|
+
class Class{}
|
|
272
|
+
action blah() {
|
|
273
|
+
foreach c: allof(Class) {
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
ADSL
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def test_for_each__no_contradictions_at_least_once
|
|
280
|
+
adsl_assert :incorrect, <<-ADSL, :conjecture => false
|
|
281
|
+
class Class{}
|
|
282
|
+
action blah() {
|
|
283
|
+
create(Class)
|
|
284
|
+
foreach c: allof(Class) {
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
ADSL
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
def test_for_each__no_iterations
|
|
291
|
+
adsl_assert :correct, <<-ADSL
|
|
292
|
+
class Class1{}
|
|
293
|
+
class Class2{}
|
|
294
|
+
action blah() {
|
|
295
|
+
create(Class1)
|
|
296
|
+
delete allof(Class2)
|
|
297
|
+
foreach i: allof(Class2) {
|
|
298
|
+
delete allof(Class1)
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
invariant exists(Class1 o)
|
|
302
|
+
ADSL
|
|
303
|
+
adsl_assert :correct, <<-ADSL
|
|
304
|
+
class Class1{}
|
|
305
|
+
class Class2{}
|
|
306
|
+
action blah() {
|
|
307
|
+
delete allof(Class2)
|
|
308
|
+
foreach i: allof(Class2) {
|
|
309
|
+
create(Class1)
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
invariant not exists(Class1 o)
|
|
313
|
+
ADSL
|
|
314
|
+
adsl_assert :incorrect, <<-ADSL
|
|
315
|
+
class Class1{}
|
|
316
|
+
class Class2{}
|
|
317
|
+
action blah() {
|
|
318
|
+
delete allof(Class1)
|
|
319
|
+
create(Class1)
|
|
320
|
+
delete allof(Class2)
|
|
321
|
+
foreach i: allof(Class2) {
|
|
322
|
+
delete allof(Class1)
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
invariant !exists(Class1 o)
|
|
326
|
+
ADSL
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
def test_for_each__single_iteration
|
|
330
|
+
adsl_assert :correct, <<-ADSL
|
|
331
|
+
class Class1{}
|
|
332
|
+
class Class2{}
|
|
333
|
+
action blah() {
|
|
334
|
+
delete allof(Class1)
|
|
335
|
+
delete allof(Class2)
|
|
336
|
+
|
|
337
|
+
create(Class1)
|
|
338
|
+
foreach c: allof(Class1) {
|
|
339
|
+
create(Class2)
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
invariant exists(Class1 a)
|
|
343
|
+
invariant exists(Class2 a)
|
|
344
|
+
invariant forall(Class2 a, Class2 b: a == b)
|
|
345
|
+
ADSL
|
|
346
|
+
adsl_assert :incorrect, <<-ADSL
|
|
347
|
+
class Class1 {}
|
|
348
|
+
class Class2 {}
|
|
349
|
+
action blah() {
|
|
350
|
+
delete allof(Class1)
|
|
351
|
+
delete allof(Class2)
|
|
352
|
+
|
|
353
|
+
create(Class1)
|
|
354
|
+
foreach c: allof(Class1) {
|
|
355
|
+
create(Class2)
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
invariant exists(Class2 a, Class2 b: not a == b)
|
|
359
|
+
ADSL
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
def test_for_each__two_iterations_parallelizable
|
|
363
|
+
adsl_assert :correct, <<-ADSL
|
|
364
|
+
class Class1{}
|
|
365
|
+
class Class2{}
|
|
366
|
+
action blah() {
|
|
367
|
+
delete allof(Class1)
|
|
368
|
+
delete allof(Class2)
|
|
369
|
+
|
|
370
|
+
create(Class1)
|
|
371
|
+
create(Class1)
|
|
372
|
+
foreach c: allof(Class1) {
|
|
373
|
+
create(Class2)
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
invariant exists(Class1 a)
|
|
377
|
+
invariant exists(Class2 a)
|
|
378
|
+
invariant forall(Class2 a, Class2 b, Class2 c: a == b or b == c or a == c)
|
|
379
|
+
ADSL
|
|
380
|
+
adsl_assert :incorrect, <<-ADSL
|
|
381
|
+
class Class1{}
|
|
382
|
+
class Class2{}
|
|
383
|
+
action blah() {
|
|
384
|
+
delete allof(Class1)
|
|
385
|
+
delete allof(Class2)
|
|
386
|
+
|
|
387
|
+
create(Class1)
|
|
388
|
+
create(Class1)
|
|
389
|
+
foreach c: allof(Class1) {
|
|
390
|
+
create(Class2)
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
invariant exists(Class2 a, Class2 b, Class2 c: !a == b and !b == c and !a == c)
|
|
394
|
+
ADSL
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
def test__single_ref
|
|
398
|
+
adsl_assert :correct, <<-ADSL
|
|
399
|
+
class Class { 0+ Class rel }
|
|
400
|
+
action blah() {
|
|
401
|
+
allof(Class).rel -= allof(Class)
|
|
402
|
+
foreach c: allof(Class) {
|
|
403
|
+
c2 = oneof(allof(Class))
|
|
404
|
+
c.rel += c2
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
invariant forall(Class o: not empty(o.rel))
|
|
408
|
+
ADSL
|
|
409
|
+
adsl_assert :correct, <<-ADSL
|
|
410
|
+
class Class { 0+ Class rel }
|
|
411
|
+
action blah() {
|
|
412
|
+
allof(Class).rel -= allof(Class)
|
|
413
|
+
foreach c: allof(Class) {
|
|
414
|
+
c2 = oneof(allof(Class))
|
|
415
|
+
c.rel += c2
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
invariant not exists(Class o, Class o2, Class o3: o2 in o.rel and o3 in o.rel and o2 != o3)
|
|
419
|
+
ADSL
|
|
420
|
+
end
|
|
421
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'adsl/ds/data_store_spec'
|
|
3
|
+
require 'pp'
|
|
4
|
+
|
|
5
|
+
class ADSL::DS::DataStoreSpecTest < Test::Unit::TestCase
|
|
6
|
+
def test_replace
|
|
7
|
+
assignment = ADSL::DS::DSAssignment.new :var => :kme, :objset => :objset
|
|
8
|
+
for_each = ADSL::DS::DSForEach.new :objset => :kme, :block => ADSL::DS::DSBlock.new
|
|
9
|
+
block = ADSL::DS::DSBlock.new :statements => [assignment, for_each]
|
|
10
|
+
|
|
11
|
+
assert block.replace(:kme, :replaced)
|
|
12
|
+
assert_false block.replace(:kme, :replaced)
|
|
13
|
+
|
|
14
|
+
assert_equal assignment, block.statements[0]
|
|
15
|
+
assert_equal for_each, block.statements[1]
|
|
16
|
+
|
|
17
|
+
assert_equal :replaced, assignment.var
|
|
18
|
+
assert_equal :replaced, for_each.objset
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_replace__safe_against_recursion
|
|
22
|
+
block = ADSL::DS::DSBlock.new :statements => []
|
|
23
|
+
block.statements << block
|
|
24
|
+
assert_false block.replace :kme, :kme
|
|
25
|
+
|
|
26
|
+
block.statements << :kme
|
|
27
|
+
|
|
28
|
+
assert block.replace :kme, :replaced
|
|
29
|
+
assert_equal :replaced, block.statements.last
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_class__superclass_of
|
|
33
|
+
parent = ADSL::DS::DSClass.new :name => 'parent'
|
|
34
|
+
child1 = ADSL::DS::DSClass.new :name => 'child1', :parent => parent
|
|
35
|
+
child2 = ADSL::DS::DSClass.new :name => 'child2', :parent => parent
|
|
36
|
+
grandchild = ADSL::DS::DSClass.new :name => 'grandchild', :parent => child1
|
|
37
|
+
|
|
38
|
+
assert parent.superclass_of? parent
|
|
39
|
+
assert parent.superclass_of? child1
|
|
40
|
+
assert parent.superclass_of? child2
|
|
41
|
+
assert parent.superclass_of? grandchild
|
|
42
|
+
|
|
43
|
+
assert !child1.superclass_of?(parent)
|
|
44
|
+
assert !child2.superclass_of?(parent)
|
|
45
|
+
assert !grandchild.superclass_of?(parent)
|
|
46
|
+
|
|
47
|
+
assert child1.superclass_of? child1
|
|
48
|
+
assert child1.superclass_of? grandchild
|
|
49
|
+
assert !child1.superclass_of?(child2)
|
|
50
|
+
|
|
51
|
+
assert !child2.superclass_of?(child1)
|
|
52
|
+
assert !child2.superclass_of?(grandchild)
|
|
53
|
+
end
|
|
54
|
+
end
|