~ubuntu-branches/ubuntu/hardy/ruby1.8/hardy-updates

« back to all changes in this revision

Viewing changes to test/ruby/test_eval.rb

  • Committer: Bazaar Package Importer
  • Author(s): akira yamada
  • Date: 2007-03-13 22:11:58 UTC
  • mfrom: (1.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20070313221158-h3oql37brlaf2go2
Tags: 1.8.6-1
* new upstream version, 1.8.6.
* libruby1.8 conflicts with libopenssl-ruby1.8 (< 1.8.6) (closes: #410018)
* changed packaging style to cdbs from dbs.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
require 'test/unit'
 
2
 
 
3
class TestEval < Test::Unit::TestCase
 
4
  # eval with binding
 
5
  def test_ev
 
6
    local1 = "local1"
 
7
    lambda {
 
8
      local2 = "local2"
 
9
      return binding
 
10
    }.call
 
11
  end
 
12
 
 
13
  def test_eval
 
14
    assert_nil(eval(""))
 
15
    $bad=false
 
16
    eval 'while false; $bad = true; print "foo\n" end'
 
17
    assert(!$bad)
 
18
 
 
19
    assert(eval('TRUE'))
 
20
    assert(eval('true'))
 
21
    assert(!eval('NIL'))
 
22
    assert(!eval('nil'))
 
23
    assert(!eval('FALSE'))
 
24
    assert(!eval('false'))
 
25
 
 
26
    $foo = 'assert(true)'
 
27
    begin
 
28
      eval $foo
 
29
    rescue
 
30
      assert(false)
 
31
    end
 
32
 
 
33
    assert_equal('assert(true)', eval("$foo"))
 
34
    assert_equal(true, eval("true"))
 
35
    i = 5
 
36
    assert(eval("i == 5"))
 
37
    assert_equal(5, eval("i"))
 
38
    assert(eval("defined? i"))
 
39
 
 
40
    $x = test_ev
 
41
    assert_equal("local1", eval("local1", $x)) # normal local var
 
42
    assert_equal("local2", eval("local2", $x)) # nested local var
 
43
    $bad = true
 
44
    begin
 
45
      p eval("local1")
 
46
    rescue NameError            # must raise error
 
47
      $bad = false
 
48
    end
 
49
    assert(!$bad)
 
50
 
 
51
    # !! use class_eval to avoid nested definition
 
52
    self.class.class_eval %q(
 
53
      module EvTest
 
54
        EVTEST1 = 25
 
55
        evtest2 = 125
 
56
        $x = binding
 
57
      end
 
58
    )
 
59
    assert_equal(25, eval("EVTEST1", $x))       # constant in module
 
60
    assert_equal(125, eval("evtest2", $x))      # local var in module
 
61
    $bad = true
 
62
    begin
 
63
      eval("EVTEST1")
 
64
    rescue NameError            # must raise error
 
65
      $bad = false
 
66
    end
 
67
    assert(!$bad)
 
68
 
 
69
    x = proc{}
 
70
    eval "i4 = 1", x
 
71
    assert_equal(1, eval("i4", x))
 
72
    x = proc{proc{}}.call
 
73
    eval "i4 = 22", x
 
74
    assert_equal(22, eval("i4", x))
 
75
    $x = []
 
76
    x = proc{proc{}}.call
 
77
    eval "(0..9).each{|i5| $x[i5] = proc{i5*2}}", x
 
78
    assert_equal(8, $x[4].call)
 
79
 
 
80
    x = binding
 
81
    eval "i = 1", x
 
82
    assert_equal(1, eval("i", x))
 
83
    x = proc{binding}.call
 
84
    eval "i = 22", x
 
85
    assert_equal(22, eval("i", x))
 
86
    $x = []
 
87
    x = proc{binding}.call
 
88
    eval "(0..9).each{|i5| $x[i5] = proc{i5*2}}", x
 
89
    assert_equal(8, $x[4].call)
 
90
    x = proc{binding}.call
 
91
    eval "for i6 in 1..1; j6=i6; end", x
 
92
    assert(eval("defined? i6", x))
 
93
    assert(eval("defined? j6", x))
 
94
 
 
95
    proc {
 
96
      p = binding
 
97
      eval "foo11 = 1", p
 
98
      foo22 = 5
 
99
      proc{foo11=22}.call
 
100
      proc{foo22=55}.call
 
101
      assert_equal(eval("foo11"), eval("foo11", p))
 
102
      assert_equal(1, eval("foo11"))
 
103
      assert_equal(eval("foo22"), eval("foo22", p))
 
104
      assert_equal(55, eval("foo22"))
 
105
    }.call
 
106
 
 
107
    p1 = proc{i7 = 0; proc{i7}}.call
 
108
    assert_equal(0, p1.call)
 
109
    eval "i7=5", p1
 
110
    assert_equal(5, p1.call)
 
111
    assert(!defined?(i7))
 
112
 
 
113
    p1 = proc{i7 = 0; proc{i7}}.call
 
114
    i7 = nil
 
115
    assert_equal(0, p1.call)
 
116
    eval "i7=1", p1
 
117
    assert_equal(1, p1.call)
 
118
    eval "i7=5", p1
 
119
    assert_equal(5, p1.call)
 
120
    assert_nil(i7)
 
121
  end
 
122
 
 
123
  def test_nil_instance_eval_cvar # [ruby-dev:24103]
 
124
    def nil.test_binding
 
125
      binding
 
126
    end
 
127
    bb = eval("nil.instance_eval \"binding\"", nil.test_binding)
 
128
    assert_raise(NameError) { eval("@@a", bb) }
 
129
    class << nil
 
130
      remove_method :test_binding
 
131
    end
 
132
  end
 
133
 
 
134
  def test_fixnum_instance_eval_cvar # [ruby-dev:24213]
 
135
    assert_raise(NameError) { 1.instance_eval "@@a" }
 
136
  end
 
137
 
 
138
  def test_cvar_scope_with_instance_eval # [ruby-dev:24223]
 
139
    Fixnum.class_eval "@@test_cvar_scope_with_instance_eval = 1" # depends on [ruby-dev:24229]
 
140
    @@test_cvar_scope_with_instance_eval = 4
 
141
    assert_equal(4, 1.instance_eval("@@test_cvar_scope_with_instance_eval"))
 
142
    Fixnum.__send__(:remove_class_variable, :@@test_cvar_scope_with_instance_eval)
 
143
  end
 
144
 
 
145
  def test_eval_and_define_method # [ruby-dev:24228]
 
146
    assert_nothing_raised {
 
147
      def temporally_method_for_test_eval_and_define_method(&block)
 
148
        lambda {
 
149
          class << Object.new; self end.__send__(:define_method, :zzz, &block)
 
150
        }
 
151
      end
 
152
      v = eval("temporally_method_for_test_eval_and_define_method {}")
 
153
      {}[0] = {}
 
154
      v.call
 
155
    }
 
156
  end
 
157
end