mvz-live_ast 1.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 (76) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES.rdoc +93 -0
  3. data/README.rdoc +419 -0
  4. data/Rakefile +21 -0
  5. data/devel/levitate.rb +853 -0
  6. data/devel/levitate_config.rb +4 -0
  7. data/lib/live_ast.rb +4 -0
  8. data/lib/live_ast/ast_eval.rb +11 -0
  9. data/lib/live_ast/ast_load.rb +15 -0
  10. data/lib/live_ast/base.rb +73 -0
  11. data/lib/live_ast/common.rb +48 -0
  12. data/lib/live_ast/error.rb +20 -0
  13. data/lib/live_ast/evaler.rb +32 -0
  14. data/lib/live_ast/full.rb +2 -0
  15. data/lib/live_ast/irb_spy.rb +43 -0
  16. data/lib/live_ast/linker.rb +122 -0
  17. data/lib/live_ast/loader.rb +60 -0
  18. data/lib/live_ast/reader.rb +26 -0
  19. data/lib/live_ast/replace_eval.rb +121 -0
  20. data/lib/live_ast/replace_load.rb +14 -0
  21. data/lib/live_ast/replace_raise.rb +18 -0
  22. data/lib/live_ast/ruby_parser.rb +36 -0
  23. data/lib/live_ast/ruby_parser/test.rb +197 -0
  24. data/lib/live_ast/ruby_parser/unparser.rb +13 -0
  25. data/lib/live_ast/to_ast.rb +26 -0
  26. data/lib/live_ast/to_ruby.rb +24 -0
  27. data/lib/live_ast/version.rb +3 -0
  28. data/test/ast_eval_feature_test.rb +11 -0
  29. data/test/ast_load_feature_test.rb +11 -0
  30. data/test/attr_test.rb +24 -0
  31. data/test/backtrace_test.rb +158 -0
  32. data/test/covert_define_method_test.rb +23 -0
  33. data/test/def_test.rb +35 -0
  34. data/test/define_method_test.rb +67 -0
  35. data/test/define_singleton_method_test.rb +15 -0
  36. data/test/encoding_test.rb +52 -0
  37. data/test/encoding_test/bad.rb +1 -0
  38. data/test/encoding_test/cp932.rb +6 -0
  39. data/test/encoding_test/default.rb +5 -0
  40. data/test/encoding_test/eucjp.rb +6 -0
  41. data/test/encoding_test/koi8.rb +6 -0
  42. data/test/encoding_test/koi8_shebang.rb +7 -0
  43. data/test/encoding_test/koi8_with_utf8bom.rb +6 -0
  44. data/test/encoding_test/usascii.rb +6 -0
  45. data/test/encoding_test/usascii_with_utf8bom.rb +6 -0
  46. data/test/encoding_test/utf8.rb +6 -0
  47. data/test/encoding_test/utf8bom.rb +6 -0
  48. data/test/encoding_test/utf8bom_only.rb +5 -0
  49. data/test/encoding_test/utf8dos.rb +6 -0
  50. data/test/encoding_test/utf8mac.rb +6 -0
  51. data/test/encoding_test/utf8mac_alt.rb +6 -0
  52. data/test/encoding_test/utf8unix.rb +6 -0
  53. data/test/error_test.rb +116 -0
  54. data/test/eval_test.rb +269 -0
  55. data/test/flush_cache_test.rb +98 -0
  56. data/test/irb_test.rb +25 -0
  57. data/test/lambda_test.rb +56 -0
  58. data/test/load_path_test.rb +78 -0
  59. data/test/load_test.rb +123 -0
  60. data/test/main.rb +140 -0
  61. data/test/nested_test.rb +29 -0
  62. data/test/noninvasive_test.rb +51 -0
  63. data/test/readme_test.rb +16 -0
  64. data/test/recursive_eval_test.rb +52 -0
  65. data/test/redefine_method_test.rb +83 -0
  66. data/test/reload_test.rb +105 -0
  67. data/test/replace_eval_test.rb +405 -0
  68. data/test/rubygems_test.rb +25 -0
  69. data/test/rubyspec_test.rb +39 -0
  70. data/test/singleton_test.rb +25 -0
  71. data/test/stdlib_test.rb +13 -0
  72. data/test/thread_test.rb +44 -0
  73. data/test/to_ast_feature_test.rb +15 -0
  74. data/test/to_ruby_feature_test.rb +15 -0
  75. data/test/to_ruby_test.rb +87 -0
  76. metadata +275 -0
@@ -0,0 +1,29 @@
1
+ require_relative 'main'
2
+
3
+ class NestedTest < RegularTest
4
+ def test_lambda
5
+ a = lambda {
6
+ lambda {
7
+ "33"
8
+ }
9
+ }
10
+
11
+ assert_equal nested_lambdas("33"), a.to_ast
12
+ assert_equal no_arg_block(:lambda, "33"), a.call.to_ast
13
+ end
14
+
15
+ class A
16
+ def f
17
+ Class.new do
18
+ def g
19
+ "44"
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ def test_defs
26
+ assert_equal nested_defs(:f, :g, "44"), A.instance_method(:f).to_ast
27
+ assert_equal no_arg_def(:g, "44"), A.new.f.instance_method(:g).to_ast
28
+ end
29
+ end
@@ -0,0 +1,51 @@
1
+ require_relative 'main'
2
+
3
+ class AAA_NoninvasiveTest < BaseTest
4
+ def test_no_clutter
5
+ [Method, UnboundMethod, Proc].each do |klass|
6
+ assert !klass.instance_methods.include?(:to_ast)
7
+ assert !klass.instance_methods.include?(:to_ruby)
8
+ end
9
+
10
+ assert !respond_to?(:ast_eval)
11
+ assert !Kernel.respond_to?(:ast_eval)
12
+ assert !respond_to?(:ast_load)
13
+ assert !Kernel.respond_to?(:ast_load)
14
+ end
15
+
16
+ DEFINE_A = lambda do
17
+ class A
18
+ def f
19
+ "A#f"
20
+ end
21
+ end
22
+ end
23
+
24
+ def test_method
25
+ DEFINE_A.call
26
+
27
+ expected = no_arg_def(:f, "A#f")
28
+ assert_equal expected, LiveAST.ast(A.instance_method(:f))
29
+ assert_equal expected, LiveAST.ast(A.new.method(:f))
30
+ end
31
+
32
+ def test_lambda
33
+ a = lambda { |x, y| x ** y }
34
+
35
+ assert_equal binop_block(:lambda, :**), LiveAST.ast(a)
36
+ end
37
+
38
+ def test_ast_eval
39
+ code = %{ lambda { |x, y| x / y } }
40
+
41
+ expected = binop_block(:lambda, :/)
42
+ result = LiveAST.ast(LiveAST.eval(code, binding))
43
+ assert_equal expected, result
44
+ end
45
+
46
+ def test_bogus
47
+ assert_raises TypeError do
48
+ LiveAST.ast(99)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,16 @@
1
+ require_relative 'main'
2
+ require_relative '../devel/levitate'
3
+
4
+ if LiveAST.parser::Test.respond_to?(:unified_sexp?) and
5
+ LiveAST.parser::Test.unified_sexp? and
6
+ RUBY_ENGINE != "jruby" then # jruby takes about a minute
7
+ sections = [
8
+ "Synopsis",
9
+ "+to_ruby+",
10
+ "Noninvasive Interface",
11
+ "Pure Ruby and +ast_eval+",
12
+ "Full Integration",
13
+ ]
14
+
15
+ Levitate.doc_to_test("README.rdoc", *sections)
16
+ end
@@ -0,0 +1,52 @@
1
+ require_relative 'main'
2
+
3
+ class RecursiveEvalTest < RegularTest
4
+ DEFINE = lambda do
5
+ ast_eval %{
6
+ class A
7
+ ast_eval %{
8
+ def f
9
+ "A#f"
10
+ end
11
+ }, binding
12
+
13
+ ast_eval %{
14
+ ast_eval %{
15
+ remove_method :f
16
+ def f(x, y)
17
+ x + y
18
+ end
19
+
20
+ def g
21
+ "A#g"
22
+ end
23
+ }, binding
24
+
25
+ LAMBDA = ast_eval %{
26
+ lambda { |x, y| x * y }
27
+ }, binding
28
+ }, binding
29
+ end
30
+ }, binding
31
+ end
32
+
33
+ def test_method
34
+ defined?(A) or DEFINE.call
35
+ assert_equal "#{self.class}::A", A.name
36
+
37
+ assert_equal binop_def(:f, :+),
38
+ A.instance_method(:f).to_ast
39
+
40
+ assert_equal no_arg_def(:g, "A#g"),
41
+ A.instance_method(:g).to_ast
42
+ end
43
+
44
+ def test_lambda
45
+ defined?(A) or DEFINE.call
46
+ assert_equal "#{self.class}::A", A.name
47
+
48
+ assert_equal binop_block(:lambda, :*),
49
+ A::LAMBDA.to_ast
50
+ end
51
+ end
52
+
@@ -0,0 +1,83 @@
1
+ require_relative 'main'
2
+
3
+ class RedefineMethodTest < RegularTest
4
+ DEFINE_A = lambda do
5
+ class A
6
+ def f
7
+ "old A#f"
8
+ end
9
+
10
+ PREVIOUS_Af = instance_method(:f)
11
+ remove_method :f
12
+
13
+ def f(x, y)
14
+ x * y
15
+ end
16
+ end
17
+ end
18
+
19
+ def test_inclass_redef
20
+ DEFINE_A.call
21
+
22
+ assert_equal binop_def(:f, :*),
23
+ A.instance_method(:f).to_ast
24
+
25
+ assert_equal no_arg_def(:f, "old A#f"),
26
+ A::PREVIOUS_Af.to_ast
27
+ end
28
+
29
+ DEFINE_B = lambda do
30
+ class B
31
+ def f
32
+ "old B#f"
33
+ end
34
+ end
35
+ end
36
+
37
+ def test_dynamic_redef
38
+ DEFINE_B.call
39
+
40
+ assert_equal "old B#f", B.new.f
41
+ assert_equal no_arg_def(:f, "old B#f"), B.instance_method(:f).to_ast
42
+
43
+ B.class_eval do
44
+ remove_method :f
45
+ define_method :f do |x, y|
46
+ x - y
47
+ end
48
+ end
49
+
50
+ assert_equal 11, B.new.f(44, 33)
51
+
52
+ assert_equal binop_define_method(:f, :-),
53
+ B.instance_method(:f).to_ast
54
+ end
55
+
56
+ DEFINE_C = lambda do
57
+ class C
58
+ def f
59
+ "old C#f"
60
+ end
61
+ end
62
+ end
63
+
64
+ def test_dynamic_redef_with_eval
65
+ DEFINE_C.call
66
+
67
+ assert_equal "old C#f", C.new.f
68
+
69
+ C.class_eval do
70
+ ast_eval %{
71
+ remove_method :f
72
+ define_method :f do |x, y|
73
+ x * y
74
+ end
75
+ }, binding
76
+ end
77
+
78
+ assert_equal 12, C.new.f(3, 4)
79
+
80
+ assert_equal binop_define_method(:f, :*),
81
+ C.instance_method(:f).to_ast
82
+ end
83
+ end
@@ -0,0 +1,105 @@
1
+ require_relative 'main'
2
+
3
+ class AAB_ReloadTest < BaseTest
4
+ include FileUtils
5
+
6
+ def test_reloading
7
+ raw_reload
8
+ require 'live_ast/ast_load'
9
+ noninvasive_ast_reload
10
+ require 'live_ast/replace_load'
11
+ ast_reload
12
+ end
13
+
14
+ def raw_reload
15
+ code_1 = %{
16
+ class AAB_ReloadTest::A
17
+ def f
18
+ "first A#f"
19
+ end
20
+ end
21
+ }
22
+
23
+ code_2 = %{
24
+ class AAB_ReloadTest::A
25
+ def f
26
+ "second A#f"
27
+ end
28
+ end
29
+ }
30
+
31
+ temp_file code_1 do |file|
32
+ load file
33
+
34
+ LiveAST.ast(A.instance_method(:f))
35
+
36
+ write_file file, code_2
37
+ load file
38
+
39
+ # forced a raw-reload inconsistency -- verify bogus
40
+
41
+ assert_equal no_arg_def(:f, "first A#f"),
42
+ LiveAST.ast(A.instance_method(:f))
43
+ end
44
+ end
45
+
46
+ def noninvasive_ast_reload
47
+ code_1 = %{
48
+ class AAB_ReloadTest::B
49
+ def f
50
+ "first B#f"
51
+ end
52
+ end
53
+ }
54
+
55
+ code_2 = %{
56
+ class AAB_ReloadTest::B
57
+ def f
58
+ "second B#f"
59
+ end
60
+ end
61
+ }
62
+
63
+ temp_file code_1 do |file|
64
+ load file
65
+
66
+ LiveAST.ast(B.instance_method(:f))
67
+
68
+ write_file file, code_2
69
+ ast_load file
70
+
71
+ assert_equal no_arg_def(:f, "second B#f"),
72
+ LiveAST.ast(B.instance_method(:f))
73
+ end
74
+ end
75
+
76
+ def ast_reload
77
+ code_1 = %{
78
+ class AAB_ReloadTest::C
79
+ def f
80
+ "first C#f"
81
+ end
82
+ end
83
+ }
84
+
85
+ code_2 = %{
86
+ class AAB_ReloadTest::C
87
+ def f
88
+ "second C#f"
89
+ end
90
+ end
91
+ }
92
+
93
+ temp_file code_1 do |file|
94
+ load file
95
+
96
+ LiveAST.ast(C.instance_method(:f))
97
+
98
+ write_file file, code_2
99
+ load file
100
+
101
+ assert_equal no_arg_def(:f, "second C#f"),
102
+ LiveAST.ast(C.instance_method(:f))
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,405 @@
1
+ require_relative 'main'
2
+
3
+ class ZZY_ReplaceEvalTest < ReplaceEvalTest
4
+ RESULT = {}
5
+
6
+ def setup
7
+ RESULT.clear
8
+ end
9
+
10
+ DEFINE_A = lambda do
11
+ class A
12
+ eval %{
13
+ def f(x, y)
14
+ x**y
15
+ end
16
+ }
17
+ end
18
+ end
19
+
20
+ def test_a_def_method
21
+ DEFINE_A.call
22
+ assert_equal binop_def(:f, :**), A.instance_method(:f).to_ast
23
+ end
24
+
25
+ DEFINE_B = lambda do
26
+ eval %{
27
+ class B
28
+ def f(x, y)
29
+ x / y
30
+ end
31
+ end
32
+ }
33
+ end
34
+
35
+ def test_def_class
36
+ DEFINE_B.call
37
+ assert_equal "ZZY_ReplaceEvalTest::B", B.name
38
+ assert_equal binop_def(:f, :/), B.instance_method(:f).to_ast
39
+ end
40
+
41
+ def moo
42
+ a = 22
43
+ ignore(a)
44
+ binding
45
+ end
46
+
47
+ def test_binding_eval
48
+ assert_equal 22, moo.eval("a")
49
+ assert_equal 22, moo.eval("lambda { a }").call
50
+ end
51
+
52
+ DEFINE_P = lambda do
53
+ class P
54
+ eval %{
55
+ def f
56
+ @x = 33
57
+ RESULT[:old] = live_ast_original_eval("@x")
58
+ RESULT[:new] = eval("@x")
59
+ end
60
+ }
61
+ end
62
+ end
63
+
64
+ def test_const_lookup
65
+ DEFINE_P.call
66
+ P.new.f
67
+
68
+ assert_equal 33, RESULT[:old]
69
+ assert_equal 33, RESULT[:new]
70
+ end
71
+
72
+ def test_const_lookup_2
73
+ Class.new do
74
+ eval %{
75
+ def f
76
+ @x = 44
77
+ RESULT[:old] = live_ast_original_eval("@x")
78
+ RESULT[:new] = eval("@x")
79
+ end
80
+ }
81
+ end.new.f
82
+
83
+ assert_equal 44, RESULT[:old]
84
+ assert_equal 44, RESULT[:new]
85
+ end
86
+
87
+ DEFINE_QS = lambda do
88
+ class Q
89
+ class R
90
+ eval %{
91
+ def f
92
+ RESULT[:qr] = 55
93
+ end
94
+ }
95
+ end
96
+ end
97
+
98
+ module S
99
+ class T
100
+ eval %{
101
+ def f
102
+ RESULT[:st] = 66
103
+ end
104
+ }
105
+ end
106
+ end
107
+ end
108
+
109
+ def test_const_lookup_3
110
+ DEFINE_QS.call
111
+ Q::R.new.f
112
+ S::T.new.f
113
+ assert_equal 55, RESULT[:qr]
114
+ assert_equal 66, RESULT[:st]
115
+ end
116
+
117
+ def test_eval_arg_error
118
+ [[], (1..5).to_a].each do |args|
119
+ orig = assert_raises ArgumentError do
120
+ live_ast_original_eval(*args)
121
+ end
122
+ live = assert_raises ArgumentError do
123
+ eval(*args)
124
+ end
125
+ assert_equal orig.message, live.message
126
+ end
127
+ end
128
+
129
+ def test_singleton_eval_arg_error
130
+ [[], (1..5).to_a].each do |args|
131
+ orig = assert_raises ArgumentError do
132
+ Kernel.live_ast_original_singleton_eval(*args)
133
+ end
134
+ live = assert_raises ArgumentError do
135
+ Kernel.eval(*args)
136
+ end
137
+ assert_equal orig.message, live.message
138
+ end
139
+ end
140
+
141
+ def test_instance_eval_arg_error_no_block
142
+ [[], ('a'..'z').to_a].each do |args|
143
+ orig = assert_raises ArgumentError do
144
+ Object.new.live_ast_original_instance_eval(*args)
145
+ end
146
+ live = assert_raises ArgumentError do
147
+ Object.new.instance_eval(*args)
148
+ end
149
+ assert_equal orig.message, live.message
150
+ end
151
+
152
+ orig = assert_raises TypeError do
153
+ Object.new.live_ast_original_instance_eval(nil)
154
+ end
155
+ live = assert_raises TypeError do
156
+ Object.new.instance_eval(nil)
157
+ end
158
+ assert_equal orig.message, live.message
159
+
160
+ [[nil], [Object.new], [3], [4,3,2], (1..10).to_a].each do |args|
161
+ orig = assert_raises TypeError do
162
+ Object.new.live_ast_original_instance_eval(*args)
163
+ end
164
+ live = assert_raises TypeError do
165
+ Object.new.instance_eval(*args)
166
+ end
167
+ assert_equal orig.message, live.message
168
+ end
169
+ end
170
+
171
+ def test_instance_eval_arg_error_with_block
172
+ orig = assert_raises ArgumentError do
173
+ Object.new.live_ast_original_instance_eval(3,4,5) { }
174
+ end
175
+ live = assert_raises ArgumentError do
176
+ Object.new.instance_eval(3,4,5) { }
177
+ end
178
+ assert_equal orig.message, live.message
179
+ end
180
+
181
+ def test_instance_eval_block
182
+ orig = {}
183
+ orig.live_ast_original_instance_eval do
184
+ self[:x] = 33
185
+ end
186
+ assert_equal 33, orig[:x]
187
+
188
+ live = {}
189
+ live.instance_eval do
190
+ self[:x] = 44
191
+ end
192
+ assert_equal 44, live[:x]
193
+ end
194
+
195
+ def test_instance_eval_string
196
+ orig = {}
197
+ orig.live_ast_original_instance_eval %{
198
+ self[:x] = 33
199
+ }
200
+ assert_equal 33, orig[:x]
201
+
202
+ live = {}
203
+ live.instance_eval %{
204
+ self[:x] = 44
205
+ }
206
+ assert_equal 44, live[:x]
207
+ end
208
+
209
+ def test_instance_eval_binding
210
+ x = 33
211
+ orig = {}
212
+ orig.live_ast_original_instance_eval %{
213
+ self[:x] = x
214
+ self[:f] = lambda { "f" }
215
+ }
216
+ assert_equal x, orig[:x]
217
+
218
+ y = 44
219
+ live = {}
220
+ live.instance_eval %{
221
+ self[:y] = y
222
+ self[:g] = lambda { "g" }
223
+ }
224
+ assert_equal y, live[:y]
225
+
226
+ assert_equal no_arg_block(:lambda, "g"), live[:g].to_ast
227
+ end
228
+
229
+ def test_module_eval_block
230
+ orig = Module.new
231
+ orig.live_ast_original_module_eval do
232
+ def f
233
+ "orig"
234
+ end
235
+ end
236
+ orig.instance_method(:f)
237
+
238
+ live = Module.new
239
+ live.module_eval do
240
+ def f
241
+ "live"
242
+ end
243
+ end
244
+ assert_equal no_arg_def(:f, "live"),
245
+ live.instance_method(:f).to_ast
246
+ end
247
+
248
+ def test_module_eval_string
249
+ orig = Module.new
250
+ orig.live_ast_original_module_eval %{
251
+ def f
252
+ "orig"
253
+ end
254
+ }
255
+ orig.instance_method(:f)
256
+
257
+ live = Module.new
258
+ live.module_eval %{
259
+ def h
260
+ "live h"
261
+ end
262
+ }
263
+ assert_equal no_arg_def(:h, "live h"),
264
+ live.instance_method(:h).to_ast
265
+ end
266
+
267
+ def test_module_eval_binding
268
+ x = 33
269
+ ignore(x)
270
+ orig = Class.new
271
+ orig.live_ast_original_module_eval %{
272
+ define_method :value do
273
+ x
274
+ end
275
+ define_method :f do
276
+ lambda { }
277
+ end
278
+ }
279
+ assert_equal 33, orig.new.value
280
+ assert orig.new.f.is_a?(Proc)
281
+
282
+ y = 44
283
+ ignore(y)
284
+ live = Class.new
285
+ live.module_eval %{
286
+ define_method :value do
287
+ y
288
+ end
289
+ define_method :g do
290
+ lambda { "g return" }
291
+ end
292
+ }
293
+ assert_equal 44, live.new.value
294
+ assert live.new.g.is_a?(Proc)
295
+
296
+ assert_equal no_arg_block(:lambda, "g return"),
297
+ live.new.g.to_ast
298
+ end
299
+
300
+ def test_module_eval_file_line
301
+ klass = Module.new
302
+
303
+ orig =
304
+ klass.live_ast_original_module_eval("[__FILE__, __LINE__]", "test", 102)
305
+ live =
306
+ klass.module_eval("[__FILE__, __LINE__]", "test", 102)
307
+
308
+ unfixable do
309
+ assert_equal orig, live
310
+ end
311
+
312
+ live.first.sub!(/#{Regexp.quote LiveAST::Linker::REVISION_TOKEN}.*\Z/, "")
313
+ assert_equal orig, live
314
+ assert_equal ["test", 102], live
315
+ end
316
+
317
+ def test_module_eval_to_str
318
+ file = MiniTest::Mock.new
319
+ file.expect(:to_str, "zebra.rb")
320
+ Class.new.module_eval("33 + 44", file)
321
+ file.verify
322
+ end
323
+
324
+ def test_eval_not_hosed
325
+ assert_equal 3, eval("1 + 2")
326
+ 1.times do
327
+ assert_equal 3, eval("1 + 2")
328
+ end
329
+
330
+ assert_equal(3, eval(%{ eval("1 + 2") }))
331
+ 1.times do
332
+ assert_equal(3, eval(%{ eval("1 + 2") }))
333
+ end
334
+
335
+ x = 5
336
+ eval %{
337
+ assert_equal(3, eval(%{ eval("1 + 2") }))
338
+ x = 6
339
+ }
340
+ assert_equal 6, x
341
+ end
342
+
343
+ def test_local_var_collision
344
+ args = 33
345
+ ignore(args)
346
+
347
+ assert_equal 33, live_ast_original_eval("args")
348
+ assert_equal 33, eval("args")
349
+
350
+ assert_equal 33, Kernel.live_ast_original_singleton_eval("args")
351
+ assert_equal 33, Kernel.eval("args")
352
+
353
+ assert_equal 33, binding.live_ast_original_binding_eval("args")
354
+ assert_equal 33, binding.eval("args")
355
+
356
+ assert_equal 33, Object.new.live_ast_original_instance_eval("args")
357
+ assert_equal 33, Object.new.instance_eval("args")
358
+
359
+ assert_equal 33, Class.new.live_ast_original_module_eval("args")
360
+ assert_equal 33, Class.new.module_eval("args")
361
+
362
+ assert_equal 33, Class.new.live_ast_original_instance_eval("args")
363
+ assert_equal 33, Class.new.instance_eval("args")
364
+ end
365
+
366
+ def test_location_without_binding
367
+ expected = ["(eval)", 2]
368
+
369
+ assert_equal expected, live_ast_original_eval("\n[__FILE__, __LINE__]")
370
+
371
+ unfixable do
372
+ assert_equal expected, eval("\n[__FILE__, __LINE__]")
373
+ end
374
+
375
+ file, line = eval("\n[__FILE__, __LINE__]")
376
+ file = LiveAST.strip_token file
377
+
378
+ assert_equal expected, [file, line]
379
+ end
380
+
381
+ DEFINE_BO_TEST = lambda do
382
+ class BasicObject
383
+ Kernel.eval("1 + 1")
384
+ end
385
+ end
386
+
387
+ def test_basic_object
388
+ ::BasicObject.new.instance_eval %{
389
+ t = 33
390
+ ::ZZY_ReplaceEvalTest::RESULT[:bo_test] = t + 44
391
+ }
392
+ assert_equal 77, RESULT[:bo_test]
393
+ end
394
+
395
+ class Z
396
+ def initialize
397
+ @t = 99
398
+ end
399
+ end
400
+
401
+ def test_instance_variables
402
+ assert_equal 99, Z.new.instance_eval{ @t }
403
+ assert_equal 99, Z.new.instance_eval("@t")
404
+ end
405
+ end