Imported Upstream version 1.46.0
[platform/upstream/nghttp2.git] / third-party / mruby / mrbgems / mruby-eval / test / eval.rb
1 assert('Kernel.eval', '15.3.1.2.3') do
2   assert_equal(10) { Kernel.eval '1 * 10' }
3   assert_equal('aaa') { Kernel.eval "'a' * 3" }
4   assert_equal(10) {
5     a = 10
6     Kernel.eval "a"
7   }
8   assert_equal(20) {
9     a = 10
10     Kernel.eval "a = 20"
11     a
12   }
13   assert_equal(15) {
14     c = 5
15     lambda {
16       a = 10
17       Kernel.eval "c = a + c"
18     }.call
19     c
20   }
21   assert_equal(5) {
22     c = 5
23     lambda {
24       Kernel.eval 'lambda { c }.call'
25     }.call
26   }
27   assert_equal(15) {
28     c = 5
29     lambda {
30       a = 10
31       Kernel.eval 'lambda { c = a + c }.call'
32     }.call
33     c
34   }
35   assert_equal(2) {
36     a = 10
37     Kernel.eval 'def f(a); b=a+1; end'
38     f(1)
39   }
40 end
41
42 assert('Kernel#eval', '15.3.1.3.12') do
43   assert_equal(10) { eval '1 * 10' }
44 end
45
46 assert('rest arguments of eval') do
47   assert_raise(ArgumentError) { Kernel.eval('0', 0, 'test', 0) }
48   assert_equal ['test', 'test.rb', 10] do
49     Kernel.eval('[\'test\', __FILE__, __LINE__]', nil, 'test.rb', 10)
50   end
51 end
52
53 assert 'eval syntax error' do
54   assert_raise(SyntaxError) do
55     eval 'p "test'
56   end
57 end
58
59 assert('String instance_eval') do
60   obj = Object.new
61   obj.instance_eval{ @test = 'test' }
62   assert_raise(ArgumentError) { obj.instance_eval(0) { } }
63   assert_raise(ArgumentError) { obj.instance_eval('0', 'test', 0, 'test') }
64   assert_equal(['test.rb', 10]) { obj.instance_eval('[__FILE__, __LINE__]', 'test.rb', 10)}
65   assert_equal('test') { obj.instance_eval('@test') }
66   assert_equal('test') { obj.instance_eval { @test } }
67   o = Object.new
68   assert_equal ['', o, o], o.instance_eval("[''].each { |s| break [s, o, self] }")
69 end
70
71 assert('Kernel.#eval(string) context') do
72   class TestEvalConstScope
73     EVAL_CONST_CLASS = 'class'
74     def const_string
75       eval 'EVAL_CONST_CLASS'
76     end
77   end
78   obj = TestEvalConstScope.new
79   assert_raise(NameError) { eval 'EVAL_CONST_CLASS' }
80   assert_equal('class') { obj.const_string }
81 end
82
83 assert('BasicObject#instance_eval with begin-rescue-ensure execution order') do
84   class HellRaiser
85     def raise_hell
86       order = [:enter_raise_hell]
87       begin
88         order.push :begin
89         self.instance_eval("raise 'error'")
90       rescue
91         order.push :rescue
92       ensure
93         order.push :ensure
94       end
95       order
96     end
97   end
98
99   hell_raiser = HellRaiser.new
100   assert_equal([:enter_raise_hell, :begin, :rescue, :ensure], hell_raiser.raise_hell)
101 end
102
103 assert('BasicObject#instance_eval to define singleton methods Issue #3141') do
104   foo_class = Class.new do
105     def bar(x)
106       instance_eval "def baz; #{x}; end"
107     end
108   end
109
110   f1 = foo_class.new
111   f2 = foo_class.new
112   f1.bar 1
113   f2.bar 2
114   assert_equal(1){f1.baz}
115   assert_equal(2){f2.baz}
116 end
117
118 assert('Kernel.#eval(string) Issue #4021') do
119   assert_equal('FOO') { (eval <<'EOS').call }
120 foo = "FOO"
121 Proc.new { foo }
122 EOS
123   assert_equal('FOO') {
124     def do_eval(code)
125       eval(code)
126     end
127     do_eval(<<'EOS').call
128 foo = "FOO"
129 Proc.new { foo }
130 EOS
131   }
132 end
133
134 assert('Calling the same method as the variable name') do
135   hoge = Object.new
136   def hoge.fuga
137     "Hit!"
138   end
139   assert_equal("Hit!") { fuga = "Miss!"; eval "hoge.fuga" }
140   assert_equal("Hit!") { fuga = "Miss!"; -> { eval "hoge.fuga" }.call }
141   assert_equal("Hit!") { -> { fuga = "Miss!"; eval "hoge.fuga" }.call }
142   assert_equal("Hit!") { fuga = "Miss!"; eval("-> { hoge.fuga }").call }
143 end
144
145 assert('Access numbered parameter from eval') do
146   hoge = Object.new
147   def hoge.fuga(a, &b)
148     b.call(a)
149   end
150   assert_equal(6) {
151     hoge.fuga(3) { _1 + eval("_1") }
152   }
153 end