mirror of
https://github.com/rubyjs/therubyracer
synced 2023-03-27 23:21:42 -04:00
106 lines
4.1 KiB
Ruby
106 lines
4.1 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe V8::Portal::Proxies do
|
|
include V8::ExtSpec
|
|
|
|
|
|
context "for Ruby objects which are embedded into javascript" do
|
|
|
|
it "allows you to resolve the Ruby object's JavaScript proxy" do
|
|
js_proxy = c::Object::New()
|
|
rb_object = Object.new
|
|
subject.register_javascript_proxy js_proxy, :for => rb_object
|
|
subject.rb_object_2_js_proxy(rb_object).should be(js_proxy)
|
|
subject.js_proxy_2_rb_object(js_proxy).should be(rb_object)
|
|
end
|
|
|
|
it "requires a Ruby object which is the actual object that is proxied" do
|
|
expect {subject.register_javascript_proxy c::Object::New()}.should raise_error(ArgumentError)
|
|
end
|
|
|
|
it "can only register proxies which are low-level JavaScript objects" do
|
|
expect {subject.register_javascript_proxy Object.new, :for => Object.new}.should raise_error(ArgumentError)
|
|
end
|
|
|
|
it "is only allowed to have a single JavaScript proxy" do
|
|
rb_object = Object.new
|
|
subject.register_javascript_proxy c::Object::New(), :for => rb_object
|
|
expect {subject.register_javascript_proxy c::Object::New(), :for => rb_object}.should raise_error(V8::Portal::Proxies::DoubleProxyError)
|
|
end
|
|
end
|
|
|
|
context "for a JavaScript objects which are embedded into Ruby" do
|
|
|
|
it "allows you to resolve the JavaScript object's Ruby proxy" do
|
|
rb_proxy = Object.new
|
|
js_object = c::Object::New()
|
|
subject.register_ruby_proxy rb_proxy, :for => js_object
|
|
subject.js_object_2_rb_proxy(js_object).should be(rb_proxy)
|
|
subject.rb_proxy_2_js_object(rb_proxy).should be(js_object)
|
|
end
|
|
|
|
it "requires a JavaScript low level javascript object as the actual object that is proxied" do
|
|
expect {subject.register_javascript_proxy Object.new, :for => c::Object::New()}.should raise_error(ArgumentError)
|
|
end
|
|
|
|
it "will not a proxy twice if the proxy creator block actually registers the proxy inside it" do
|
|
target = Object.new
|
|
proxy = c::Object::New()
|
|
expect {subject.rb2js(target) do |object|
|
|
subject.register_javascript_proxy(proxy, :for => object)
|
|
c::Object::New()
|
|
end}.should_not raise_error
|
|
subject.rb2js(target).should be(proxy)
|
|
end
|
|
|
|
context "looking up a Ruby object from a random JavaScript object" do
|
|
it "checks first if it's a native Ruby object with a javascript proxy" do
|
|
target = Object.new
|
|
proxy = c::Object::New()
|
|
subject.register_javascript_proxy proxy, :for => target
|
|
subject.js2rb(proxy).should be(target)
|
|
end
|
|
it "then sees if maybe it's a native JavaScript that has a Ruby proxy" do
|
|
target = c::Object::New()
|
|
proxy = Object.new
|
|
subject.register_ruby_proxy proxy, :for => target
|
|
subject.js2rb(target).should be(proxy)
|
|
end
|
|
it "will assume that it is a native JavaScript object that needs a Ruby proxy if no corresponding Ruby object can be found" do
|
|
js = c::Object::New()
|
|
proxy = subject.js2rb(js) do |target|
|
|
{:target => target}
|
|
end
|
|
subject.js2rb(js).should be(proxy)
|
|
end
|
|
end
|
|
|
|
context "looking up a JavaScript object from a random Ruby object" do
|
|
it "checks first if it's a native JavaScript object with a Ruby proxy" do
|
|
target = c::Object::New()
|
|
proxy = Object.new
|
|
subject.register_ruby_proxy proxy, :for => target
|
|
subject.rb2js(proxy).should be(target)
|
|
end
|
|
|
|
it "then sees if maybe it's a native Ruby object that has a JavaScript proxy" do
|
|
target = Object.new
|
|
proxy = c::Object::New()
|
|
subject.register_javascript_proxy proxy, :for => target
|
|
subject.rb2js(target).should be(proxy)
|
|
end
|
|
|
|
it "assumes that it is a native Ruby object that needs a JavaScript proxy if no corresponding JavaScript object can be found" do
|
|
rb = Object.new
|
|
proxy = nil
|
|
js = subject.rb2js(rb) do |target|
|
|
target.should be(rb)
|
|
proxy = c::Object::New()
|
|
end
|
|
proxy.should_not be_nil
|
|
js.should be(proxy)
|
|
subject.rb2js(rb).should be(proxy)
|
|
end
|
|
end
|
|
end
|
|
end
|