mirror of
https://github.com/rubyjs/therubyrhino
synced 2023-03-27 23:21:34 -04:00
721c8a4355
AccessBase as a base class for different implementations change DefaultAccess and RubyAccess to use AccessBase (but keep backwards compatibility with the "module" way)
119 lines
3.4 KiB
Ruby
119 lines
3.4 KiB
Ruby
require File.expand_path('../spec_helper', File.dirname(__FILE__))
|
|
|
|
describe Rhino::Ruby::AttributeAccess do
|
|
|
|
before(:all) do
|
|
Rhino::Ruby::Scriptable.access = Rhino::Ruby::AttributeAccess.new
|
|
end
|
|
|
|
after(:all) do
|
|
Rhino::Ruby::Scriptable.access = nil
|
|
end
|
|
|
|
class Meh
|
|
|
|
attr_reader :anAttr0
|
|
attr_accessor :the_attr_1
|
|
|
|
def initialize
|
|
@anAttr0 = nil
|
|
@the_attr_1 = 'attr_1'
|
|
@an_attr_2 = 'attr_2'
|
|
end
|
|
|
|
def theMethod0; @theMethod0; end
|
|
|
|
def a_method1; 1; end
|
|
|
|
def the_method_2; '2'; end
|
|
|
|
end
|
|
|
|
it "gets methods and instance variables" do
|
|
rb_object = Rhino::Ruby::Object.wrap Meh.new
|
|
|
|
rb_object.get('anAttr0', nil).should be_nil
|
|
rb_object.get('the_attr_1', nil).should == 'attr_1'
|
|
rb_object.get('an_attr_2', nil).should be(Rhino::JS::Scriptable::NOT_FOUND) # no reader
|
|
|
|
[ 'theMethod0', 'a_method1', 'the_method_2' ].each do |name|
|
|
rb_object.get(name, nil).should be_a(Rhino::Ruby::Function)
|
|
end
|
|
|
|
rb_object.get('non-existent-method', nil).should be(Rhino::JS::Scriptable::NOT_FOUND)
|
|
end
|
|
|
|
it "has methods and instance variables" do
|
|
rb_object = Rhino::Ruby::Object.wrap Meh.new
|
|
|
|
rb_object.has('anAttr0', nil).should be_true
|
|
rb_object.has('the_attr_1', nil).should be_true
|
|
rb_object.has('an_attr_2', nil).should be_false # no reader nor writer
|
|
|
|
[ 'theMethod0', 'a_method1', 'the_method_2' ].each do |name|
|
|
rb_object.has(name, nil).should be_true
|
|
end
|
|
|
|
rb_object.has('non-existent-method', nil).should be_false
|
|
end
|
|
|
|
it "puts using attr writer" do
|
|
start = mock('start')
|
|
start.expects(:put).never
|
|
rb_object = Rhino::Ruby::Object.wrap Meh.new
|
|
|
|
rb_object.put('the_attr_1', start, 42)
|
|
rb_object.the_attr_1.should == 42
|
|
end
|
|
|
|
it "might set access as a symbol" do
|
|
prev_access = Rhino::Ruby::Scriptable.access
|
|
module FooAccess; end # backward compatibility
|
|
class Foo2Access; end
|
|
|
|
begin
|
|
|
|
Rhino::Ruby::Scriptable.access = nil
|
|
lambda {
|
|
Rhino::Ruby::Scriptable.access = :attribute
|
|
}.should_not raise_error
|
|
Rhino::Ruby::Scriptable.access.should be_a Rhino::Ruby::AttributeAccess
|
|
|
|
Rhino::Ruby::Scriptable.access = nil
|
|
lambda {
|
|
Rhino::Ruby::Scriptable.access = :attribute_access
|
|
}.should_not raise_error
|
|
Rhino::Ruby::Scriptable.access.should be_a Rhino::Ruby::AttributeAccess
|
|
|
|
lambda {
|
|
Rhino::Ruby::Scriptable.access = :foo
|
|
}.should_not raise_error
|
|
Rhino::Ruby::Scriptable.access.should == FooAccess
|
|
|
|
lambda {
|
|
Rhino::Ruby::Scriptable.access = :foo2
|
|
}.should_not raise_error
|
|
Rhino::Ruby::Scriptable.access.should be_a Foo2Access
|
|
|
|
lambda {
|
|
Rhino::Ruby::Scriptable.access = :bar
|
|
}.should raise_error
|
|
|
|
ensure
|
|
Rhino::Ruby::Scriptable.access = prev_access
|
|
end
|
|
end
|
|
|
|
it "is backward compatibile with the 'module' way" do
|
|
Rhino::Ruby::AttributeAccess.respond_to?(:has).should be true
|
|
Rhino::Ruby::AttributeAccess.respond_to?(:get).should be true
|
|
Rhino::Ruby::AttributeAccess.respond_to?(:put).should be true
|
|
|
|
Rhino::Ruby::Scriptable.access = Rhino::Ruby::AttributeAccess
|
|
|
|
rb_object = Rhino::Ruby::Object.wrap Meh.new
|
|
rb_object.get('theMethod0', nil).should be_a(Rhino::Ruby::Function)
|
|
rb_object.has('non-existent-method', nil).should be false
|
|
end
|
|
|
|
end
|