summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-binding/test/binding.rb
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-02-25 21:15:24 +0900
committerGitHub <[email protected]>2021-02-25 21:15:24 +0900
commit192f3df9a1fca043801e42febcd4b105fa1d5733 (patch)
tree2e83f49a75fb581e522a7d388c5cc86f978cd1a7 /mrbgems/mruby-binding/test/binding.rb
parentf1c2096f8ed966cf055d1a32271748b5fad4ffe0 (diff)
parent927615e1f072d8fff3d9b84660cdce15a239e36c (diff)
downloadmruby-192f3df9a1fca043801e42febcd4b105fa1d5733.tar.gz
mruby-192f3df9a1fca043801e42febcd4b105fa1d5733.zip
Merge pull request #5362 from dearblue/binding
Binding
Diffstat (limited to 'mrbgems/mruby-binding/test/binding.rb')
-rw-r--r--mrbgems/mruby-binding/test/binding.rb70
1 files changed, 70 insertions, 0 deletions
diff --git a/mrbgems/mruby-binding/test/binding.rb b/mrbgems/mruby-binding/test/binding.rb
new file mode 100644
index 000000000..7dd3fd1dd
--- /dev/null
+++ b/mrbgems/mruby-binding/test/binding.rb
@@ -0,0 +1,70 @@
+assert("Binding#eval") do
+ b = nil
+ 1.times { x, y, z = 1, 2, 3; [x,y,z]; b = binding }
+ assert_equal([1, 2, 3], b.eval("[x, y, z]"))
+ here = self
+ assert_equal(here, b.eval("self"))
+end
+
+assert("Binding#local_variables") do
+ block = Proc.new do |a|
+ b = 1
+ binding
+ end
+ bind = block.call(0)
+ assert_equal [:a, :b, :bind, :block], bind.local_variables.sort
+ bind.eval("x = 2")
+ assert_equal [:a, :b, :bind, :block, :x], bind.local_variables.sort
+end
+
+assert("Binding#local_variable_set") do
+ bind = binding
+ 1.times {
+ assert_equal(9, bind.local_variable_set(:x, 9))
+ assert_equal(9, bind.eval("x"))
+ assert_equal([:bind, :x], bind.eval("local_variables.sort"))
+ }
+end
+
+assert("Binding#local_variable_get") do
+ bind = binding
+ x = 1
+ 1.times {
+ y = 2
+ assert_equal(1, bind.local_variable_get(:x))
+ x = 10
+ assert_equal(10, bind.local_variable_get(:x))
+ assert_raise(NameError) { bind.local_variable_get(:y) }
+ bind.eval("z = 3")
+ assert_equal(3, bind.local_variable_get(:z))
+ bind.eval("y = 5")
+ assert_equal(5, bind.local_variable_get(:y))
+ assert_equal(2, y)
+ }
+end
+
+assert("Binding#source_location") do
+ skip unless -> {}.source_location
+
+ bind, source_location = binding, [__FILE__, __LINE__]
+ assert_equal source_location, bind.source_location
+end
+
+assert "Kernel#binding and .eval from C" do
+ bind = binding_in_c
+ assert_equal 5, bind.eval("2 + 3")
+ assert_nothing_raised { bind.eval("self") }
+end
+
+assert "Binding#eval with Binding.new via UnboundMethod" do
+ assert_raise(NoMethodError) { Class.instance_method(:new).bind_call(Binding) }
+end
+
+assert "Binding#eval with Binding.new via Method" do
+ # The following test is OK if SIGSEGV does not occur
+ cx = Class.new(Binding)
+ cx.define_singleton_method(:allocate, &Object.method(:allocate))
+ Class.instance_method(:new).bind_call(cx).eval("")
+
+ assert_true true
+end