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,103 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'pp'
|
|
3
|
+
require 'adsl/extract/instrumenter'
|
|
4
|
+
require 'adsl/util/test_helper'
|
|
5
|
+
|
|
6
|
+
class ADSL::Extract::InstrumenterTest < Test::Unit::TestCase
|
|
7
|
+
class Foo
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def setup
|
|
11
|
+
Foo.class_exec do
|
|
12
|
+
def blah
|
|
13
|
+
[1, 2, 3]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def call_blah
|
|
17
|
+
blah
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def repeat_blah(arg)
|
|
21
|
+
arg.times.map do
|
|
22
|
+
blah
|
|
23
|
+
end.to_a
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def empty_method
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.blah
|
|
30
|
+
[3, 2, 1]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def self.call_blah
|
|
34
|
+
self.blah
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
assert_equal [1, 2, 3], Foo.new.blah
|
|
39
|
+
assert_equal nil, Foo.new.empty_method
|
|
40
|
+
assert_equal [1, 2, 3], Foo.new.call_blah
|
|
41
|
+
assert_equal [[1, 2, 3], [1, 2, 3]], Foo.new.repeat_blah(2)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def teardown
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_execute_instrumented__blank
|
|
48
|
+
instrumenter = ADSL::Extract::Instrumenter.new
|
|
49
|
+
assert_equal [1, 2, 3], instrumenter.execute_instrumented(Foo.new, :blah)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def test_execute_instrumented__plain_replace
|
|
53
|
+
instrumenter = ADSL::Extract::Instrumenter.new
|
|
54
|
+
|
|
55
|
+
instrumenter.replace :lit do |sexp|
|
|
56
|
+
s(:lit, sexp[1]*2)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
assert_equal [2, 4, 6], instrumenter.execute_instrumented(Foo.new, :blah)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def test_execute_instrumented__instrumentation_does_not_wreck_empty_methods
|
|
63
|
+
instrumenter = ADSL::Extract::Instrumenter.new
|
|
64
|
+
assert_equal nil, instrumenter.execute_instrumented(Foo.new, :empty_method)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def test_execute_instrumented__calls_work
|
|
68
|
+
instrumenter = ADSL::Extract::Instrumenter.new
|
|
69
|
+
assert_equal [1, 2, 3], instrumenter.execute_instrumented(Foo.new, :call_blah)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def test_execute_instrumented__instrumentation_propagates_through_calls
|
|
73
|
+
instrumenter = ADSL::Extract::Instrumenter.new
|
|
74
|
+
|
|
75
|
+
instrumenter.replace :lit do |sexp|
|
|
76
|
+
s(:lit, sexp[1]*2)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
assert_equal [2, 4, 6], instrumenter.execute_instrumented(Foo.new, :call_blah)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_execute_instrumented__instrumentation_happens_once
|
|
83
|
+
instrumenter = ADSL::Extract::Instrumenter.new
|
|
84
|
+
|
|
85
|
+
instrumenter.replace :lit do |sexp|
|
|
86
|
+
s(:lit, sexp[1]*2)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
assert_equal [[2, 4, 6]], instrumenter.execute_instrumented(Foo.new, :repeat_blah, 1)
|
|
90
|
+
assert_equal [[2, 4, 6], [2, 4, 6]], instrumenter.execute_instrumented(Foo.new, :repeat_blah, 2)
|
|
91
|
+
assert_equal [2, 4, 6], instrumenter.execute_instrumented(Foo.new, :blah)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def test_execute_instrumented__instrumentation_propagates_through_class_level_calls
|
|
95
|
+
instrumenter = ADSL::Extract::Instrumenter.new
|
|
96
|
+
|
|
97
|
+
instrumenter.replace :lit do |sexp|
|
|
98
|
+
s(:lit, sexp[1]*2)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
assert_equal [6, 4, 2], instrumenter.execute_instrumented(Foo, :call_blah)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'adsl/extract/meta'
|
|
3
|
+
require 'pp'
|
|
4
|
+
require 'adsl/util/test_helper'
|
|
5
|
+
|
|
6
|
+
class ADSL::Util::MetaTest < Test::Unit::TestCase
|
|
7
|
+
def setup
|
|
8
|
+
assert !class_defined?(:Foo, :Bar)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def teardown
|
|
12
|
+
unload_class :Foo, :Bar
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_object__replace_method__crashes_when_no_method_exists
|
|
16
|
+
eval <<-ruby
|
|
17
|
+
class Foo; end
|
|
18
|
+
ruby
|
|
19
|
+
assert_raise do
|
|
20
|
+
Foo.new.replace_method :a, "def a; end"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_object__replace_method__simple
|
|
25
|
+
eval <<-ruby
|
|
26
|
+
class Foo
|
|
27
|
+
def a; :old; end
|
|
28
|
+
end
|
|
29
|
+
ruby
|
|
30
|
+
assert_equal :old, Foo.new.a
|
|
31
|
+
|
|
32
|
+
Foo.new.replace_method :a, "def a; :new; end"
|
|
33
|
+
|
|
34
|
+
assert_equal :new, Foo.new.a
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_object__replace_method__eigenclass
|
|
38
|
+
eval <<-ruby
|
|
39
|
+
class Foo
|
|
40
|
+
def a; :old; end
|
|
41
|
+
end
|
|
42
|
+
ruby
|
|
43
|
+
|
|
44
|
+
foo = Foo.new
|
|
45
|
+
def foo.a; :overridden; end
|
|
46
|
+
|
|
47
|
+
assert_equal :old, Foo.new.a
|
|
48
|
+
assert_equal :overridden, foo.a
|
|
49
|
+
|
|
50
|
+
foo.replace_method :a, "def a; :new; end"
|
|
51
|
+
|
|
52
|
+
assert_equal :old, Foo.new.a
|
|
53
|
+
assert_equal :new, foo.a
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_object__replace_method__works_on_aliases
|
|
57
|
+
eval <<-ruby
|
|
58
|
+
class Foo
|
|
59
|
+
def a; :blah; end
|
|
60
|
+
alias_method :a_copy, :a
|
|
61
|
+
end
|
|
62
|
+
ruby
|
|
63
|
+
|
|
64
|
+
foo = Foo.new
|
|
65
|
+
|
|
66
|
+
assert_equal :blah, foo.a
|
|
67
|
+
assert_equal :blah, foo.a_copy
|
|
68
|
+
|
|
69
|
+
foo.replace_method :a, "def a; :kme; end"
|
|
70
|
+
|
|
71
|
+
assert_equal :kme, foo.a
|
|
72
|
+
assert_equal :kme, foo.a_copy
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def test_object__replace_method__leaves_super_class_alone_if_overridden
|
|
76
|
+
eval <<-ruby
|
|
77
|
+
class Foo
|
|
78
|
+
def a; :old; end
|
|
79
|
+
end
|
|
80
|
+
class Bar < Foo
|
|
81
|
+
def a; :old; end
|
|
82
|
+
end
|
|
83
|
+
ruby
|
|
84
|
+
assert_equal :old, Foo.new.a
|
|
85
|
+
assert_equal :old, Bar.new.a
|
|
86
|
+
|
|
87
|
+
Bar.new.replace_method :a, "def a; :new; end"
|
|
88
|
+
|
|
89
|
+
assert_equal :old, Foo.new.a
|
|
90
|
+
assert_equal :new, Bar.new.a
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def test_object__replace_method__targets_superclass
|
|
94
|
+
eval <<-ruby
|
|
95
|
+
class Foo
|
|
96
|
+
def a; :old; end
|
|
97
|
+
end
|
|
98
|
+
class Bar < Foo
|
|
99
|
+
end
|
|
100
|
+
ruby
|
|
101
|
+
assert_equal :old, Foo.new.a
|
|
102
|
+
assert_equal :old, Bar.new.a
|
|
103
|
+
|
|
104
|
+
Bar.new.replace_method :a, "def a; :new; end"
|
|
105
|
+
|
|
106
|
+
assert_equal :new, Foo.new.a
|
|
107
|
+
assert_equal :new, Bar.new.a
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def test_object__replace_method__targets_module
|
|
111
|
+
eval <<-ruby
|
|
112
|
+
module Foo
|
|
113
|
+
def a; :old; end
|
|
114
|
+
end
|
|
115
|
+
class Bar
|
|
116
|
+
include Foo
|
|
117
|
+
end
|
|
118
|
+
ruby
|
|
119
|
+
assert_equal :old, Bar.new.a
|
|
120
|
+
|
|
121
|
+
Bar.new.replace_method :a, "def a; :new; end"
|
|
122
|
+
|
|
123
|
+
assert_equal :new, Bar.new.a
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def test_objset__replace_method__block
|
|
127
|
+
eval <<-ruby
|
|
128
|
+
class Foo
|
|
129
|
+
def a; :old; end
|
|
130
|
+
end
|
|
131
|
+
ruby
|
|
132
|
+
|
|
133
|
+
assert_equal :old, Foo.new.a
|
|
134
|
+
|
|
135
|
+
Foo.new.replace_method :a do
|
|
136
|
+
:new
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
assert_equal :new, Foo.new.a
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
end
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
require 'adsl/extract/rails/action_block_builder'
|
|
2
|
+
require 'adsl/extract/rails/other_meta'
|
|
3
|
+
require 'adsl/parser/ast_nodes'
|
|
4
|
+
|
|
5
|
+
module ADSL::Extract::Rails
|
|
6
|
+
class ActionBlockBuilderTest < Test::Unit::TestCase
|
|
7
|
+
include ADSL::Parser
|
|
8
|
+
|
|
9
|
+
def test__in_stmt_frame
|
|
10
|
+
abb = ActionBlockBuilder.new
|
|
11
|
+
|
|
12
|
+
assert_equal([:a, :b, :d], abb.in_stmt_frame do
|
|
13
|
+
abb << :a
|
|
14
|
+
abb << :b
|
|
15
|
+
assert_equal([:c], abb.in_stmt_frame do
|
|
16
|
+
abb << :c
|
|
17
|
+
end)
|
|
18
|
+
abb << :d
|
|
19
|
+
end)
|
|
20
|
+
|
|
21
|
+
assert_equal([:a, :b, :d], abb.in_stmt_frame do
|
|
22
|
+
abb << :a
|
|
23
|
+
abb << :b
|
|
24
|
+
assert_equal([:c], abb.in_stmt_frame do
|
|
25
|
+
abb << :c
|
|
26
|
+
end)
|
|
27
|
+
abb << :d
|
|
28
|
+
end)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def test__all_stmts_so_far
|
|
32
|
+
abb = ActionBlockBuilder.new
|
|
33
|
+
|
|
34
|
+
abb.in_stmt_frame do
|
|
35
|
+
abb << :a
|
|
36
|
+
abb << :b
|
|
37
|
+
abb.in_stmt_frame do
|
|
38
|
+
abb << :c
|
|
39
|
+
assert_equal [:a, :b, :c], abb.all_stmts_so_far
|
|
40
|
+
end
|
|
41
|
+
abb << :d
|
|
42
|
+
assert_equal [:a, :b, :d], abb.all_stmts_so_far
|
|
43
|
+
end
|
|
44
|
+
assert abb.all_stmts_so_far.empty?
|
|
45
|
+
|
|
46
|
+
abb.in_stmt_frame do
|
|
47
|
+
abb << :a
|
|
48
|
+
abb << :b
|
|
49
|
+
abb.in_stmt_frame do
|
|
50
|
+
abb << :c
|
|
51
|
+
assert_equal [:a, :b, :c], abb.all_stmts_so_far
|
|
52
|
+
end
|
|
53
|
+
abb << :d
|
|
54
|
+
assert_equal [:a, :b, :d], abb.all_stmts_so_far
|
|
55
|
+
end
|
|
56
|
+
assert abb.all_stmts_so_far.empty?
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def test__branch_choice__no_branches
|
|
60
|
+
abb = ActionBlockBuilder.new
|
|
61
|
+
abb.explore_all_choices do
|
|
62
|
+
abb << :a
|
|
63
|
+
end
|
|
64
|
+
assert_equal [[:a]], abb.root_paths
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def test__branch_choice
|
|
68
|
+
abb = ActionBlockBuilder.new
|
|
69
|
+
|
|
70
|
+
abb.explore_all_choices do
|
|
71
|
+
abb << :a
|
|
72
|
+
abb << :b
|
|
73
|
+
if abb.branch_choice 1
|
|
74
|
+
abb << :c
|
|
75
|
+
if abb.branch_choice 2
|
|
76
|
+
abb << :d
|
|
77
|
+
abb.do_return :nil
|
|
78
|
+
abb << :e
|
|
79
|
+
else
|
|
80
|
+
abb << :f
|
|
81
|
+
end
|
|
82
|
+
else
|
|
83
|
+
abb << :g
|
|
84
|
+
abb.do_return :nil
|
|
85
|
+
abb << :h
|
|
86
|
+
end
|
|
87
|
+
abb << :i
|
|
88
|
+
if abb.branch_choice 3
|
|
89
|
+
abb << :j
|
|
90
|
+
else
|
|
91
|
+
abb << :k
|
|
92
|
+
end
|
|
93
|
+
abb << :l
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
expected_choices = [
|
|
97
|
+
[:a, :b, :c, :d],
|
|
98
|
+
[:a, :b, :c, :f, :i, :j, :l],
|
|
99
|
+
[:a, :b, :c, :f, :i, :k, :l],
|
|
100
|
+
[:a, :b, :g]
|
|
101
|
+
]
|
|
102
|
+
|
|
103
|
+
assert_set_equal expected_choices, abb.root_paths
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def test__common_return_value
|
|
107
|
+
abb = ActionBlockBuilder.new
|
|
108
|
+
|
|
109
|
+
assert_equal(:a, abb.explore_all_choices do
|
|
110
|
+
abb.do_return :a
|
|
111
|
+
end)
|
|
112
|
+
|
|
113
|
+
ret_value = abb.explore_all_choices do
|
|
114
|
+
if abb.branch_choice 1
|
|
115
|
+
abb.do_return :a
|
|
116
|
+
else
|
|
117
|
+
abb.do_return :b
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
assert_equal ::ADSL::Extract::Rails::MetaUnknown, ret_value.class
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def test__common_return_value__ignores_duplicate_nils
|
|
125
|
+
abb = ActionBlockBuilder.new
|
|
126
|
+
|
|
127
|
+
assert_equal(nil, abb.explore_all_choices do
|
|
128
|
+
if abb.branch_choice 1
|
|
129
|
+
abb.do_return nil
|
|
130
|
+
else
|
|
131
|
+
abb.do_return nil
|
|
132
|
+
end
|
|
133
|
+
end)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def test__common_return_value__implicit
|
|
137
|
+
abb = ActionBlockBuilder.new
|
|
138
|
+
|
|
139
|
+
assert_equal(:c, abb.explore_all_choices do
|
|
140
|
+
abb << :b
|
|
141
|
+
abb << :c
|
|
142
|
+
end)
|
|
143
|
+
|
|
144
|
+
ret_value = abb.explore_all_choices do
|
|
145
|
+
abb << :c
|
|
146
|
+
if abb.branch_choice 1
|
|
147
|
+
abb << :a
|
|
148
|
+
else
|
|
149
|
+
abb << :c
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
assert_equal ::ADSL::Extract::Rails::MetaUnknown, ret_value.class
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def test__common_return_value__looks_at_do_return_at_not_the_actual_return_value
|
|
157
|
+
abb = ActionBlockBuilder.new
|
|
158
|
+
|
|
159
|
+
assert_equal(:a, abb.explore_all_choices do
|
|
160
|
+
abb.do_return :a
|
|
161
|
+
abb << :b
|
|
162
|
+
end)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def test__adsl_ast__simple
|
|
166
|
+
abb = ActionBlockBuilder.new
|
|
167
|
+
abb.explore_all_choices do
|
|
168
|
+
abb << :a
|
|
169
|
+
abb << :b
|
|
170
|
+
abb << :c
|
|
171
|
+
end
|
|
172
|
+
adsl_ast = abb.adsl_ast
|
|
173
|
+
assert_equal ASTBlock, adsl_ast.class
|
|
174
|
+
assert_equal [:a, :b, :c], adsl_ast.statements
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
end
|
|
178
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'active_record'
|
|
3
|
+
require 'ruby_parser'
|
|
4
|
+
require 'ruby2ruby'
|
|
5
|
+
require 'adsl/util/test_helper'
|
|
6
|
+
require 'adsl/extract/rails/action_instrumenter'
|
|
7
|
+
require 'adsl/extract/rails/rails_test_helper'
|
|
8
|
+
require 'adsl/extract/rails/rails_instrumentation_test_case'
|
|
9
|
+
|
|
10
|
+
class ADSL::Extract::ActionInstrumenterTest < ADSL::Extract::Rails::RailsInstrumentationTestCase
|
|
11
|
+
|
|
12
|
+
def test__local_instance_class_variables_differ
|
|
13
|
+
instrumenter = ADSL::Extract::Rails::ActionInstrumenter.new ar_class_names, File.join(Dir.pwd, '/test/unit').to_s
|
|
14
|
+
input_code = <<-rails
|
|
15
|
+
def blah
|
|
16
|
+
a = 1
|
|
17
|
+
@a = 2
|
|
18
|
+
@@a = 3
|
|
19
|
+
return a, @a, @@a
|
|
20
|
+
end
|
|
21
|
+
rails
|
|
22
|
+
|
|
23
|
+
Asd.class_eval input_code
|
|
24
|
+
Kme.class_eval input_code
|
|
25
|
+
|
|
26
|
+
asd, kme = Asd.new, Kme.new
|
|
27
|
+
asd_values = asd.blah
|
|
28
|
+
kme_values = instrumenter.execute_instrumented kme, :blah
|
|
29
|
+
|
|
30
|
+
assert_equal [1, 2, 3], asd_values
|
|
31
|
+
assert_equal [1, 2, 3], kme_values
|
|
32
|
+
|
|
33
|
+
assert_equal 2, asd.instance_variable_get(:@a)
|
|
34
|
+
assert_equal 3, Asd.class_variable_get(:@@a)
|
|
35
|
+
|
|
36
|
+
assert_equal 2, kme.instance_variable_get(:@a)
|
|
37
|
+
assert_equal 3, Kme.class_variable_get(:@@a)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test__multiassign_simple
|
|
41
|
+
instrumenter = ADSL::Extract::Rails::ActionInstrumenter.new ar_class_names, File.join(Dir.pwd, '/test/unit').to_s
|
|
42
|
+
input_codes = {
|
|
43
|
+
"def blah; @a, @b, @c = 1, 2, 3; end" => [1, 2, 3],
|
|
44
|
+
"def blah; @a, @b, @c = 4, 5; end" => [4, 5, nil],
|
|
45
|
+
"def blah; @a, @b = 6, 7, 8; end" => [6, 7, nil],
|
|
46
|
+
"def call3; [8, 9, 10]; end; def blah; @a, @b, @c = call3; end" => [8, 9, 10],
|
|
47
|
+
"def call2; [11, 12]; end; def blah; @a, @b, @c = call2; end" => [11, 12, nil],
|
|
48
|
+
"def blah; @a, @b = [13, 14]; end" => [13, 14, nil],
|
|
49
|
+
"def blah; @a, @b = [[15, 16], 17]; end" => [[15, 16], 17, nil]
|
|
50
|
+
}
|
|
51
|
+
input_codes.each do |code, expected_results|
|
|
52
|
+
Asd.class_eval code
|
|
53
|
+
Kme.class_eval code
|
|
54
|
+
|
|
55
|
+
asd, kme = Asd.new, Kme.new
|
|
56
|
+
asd.blah
|
|
57
|
+
instrumenter.execute_instrumented kme, :blah
|
|
58
|
+
|
|
59
|
+
assert_equal expected_results[0], asd.instance_variable_get(:@a), code
|
|
60
|
+
assert_equal expected_results[1], asd.instance_variable_get(:@b), code
|
|
61
|
+
assert_equal expected_results[2], asd.instance_variable_get(:@c), code
|
|
62
|
+
|
|
63
|
+
assert_equal expected_results[0], kme.instance_variable_get(:@a), code
|
|
64
|
+
assert_equal expected_results[1], kme.instance_variable_get(:@b), code
|
|
65
|
+
assert_equal expected_results[2], kme.instance_variable_get(:@c), code
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|