144 lines
4.9 KiB
Ruby
144 lines
4.9 KiB
Ruby
|
|
require "spec_helper.rb"
|
||
|
|
|
||
|
|
describe RocketAMF::Ext::FastClassMapping do
|
||
|
|
before :each do
|
||
|
|
RocketAMF::Ext::FastClassMapping.reset
|
||
|
|
RocketAMF::Ext::FastClassMapping.define do |m|
|
||
|
|
m.map :as => 'ASClass', :ruby => 'ClassMappingTest'
|
||
|
|
end
|
||
|
|
@mapper = RocketAMF::Ext::FastClassMapping.new
|
||
|
|
end
|
||
|
|
|
||
|
|
describe "class name mapping" do
|
||
|
|
it "should allow resetting of mappings back to defaults" do
|
||
|
|
@mapper.get_as_class_name('ClassMappingTest').should_not be_nil
|
||
|
|
RocketAMF::Ext::FastClassMapping.reset
|
||
|
|
@mapper = RocketAMF::Ext::FastClassMapping.new
|
||
|
|
@mapper.get_as_class_name('ClassMappingTest').should be_nil
|
||
|
|
@mapper.get_as_class_name('RocketAMF::Values::AcknowledgeMessage').should_not be_nil
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should return AS class name for ruby objects" do
|
||
|
|
@mapper.get_as_class_name(ClassMappingTest.new).should == 'ASClass'
|
||
|
|
@mapper.get_as_class_name('ClassMappingTest').should == 'ASClass'
|
||
|
|
@mapper.get_as_class_name(RocketAMF::Values::TypedHash.new('ClassMappingTest')).should == 'ASClass'
|
||
|
|
@mapper.get_as_class_name('BadClass').should be_nil
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should instantiate a ruby class" do
|
||
|
|
@mapper.get_ruby_obj('ASClass').should be_a(ClassMappingTest)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should properly instantiate namespaced classes" do
|
||
|
|
RocketAMF::Ext::FastClassMapping.mappings.map :as => 'ASClass', :ruby => 'ANamespace::TestRubyClass'
|
||
|
|
@mapper = RocketAMF::Ext::FastClassMapping.new
|
||
|
|
@mapper.get_ruby_obj('ASClass').should be_a(ANamespace::TestRubyClass)
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should return a hash with original type if not mapped" do
|
||
|
|
obj = @mapper.get_ruby_obj('UnmappedClass')
|
||
|
|
obj.should be_a(RocketAMF::Values::TypedHash)
|
||
|
|
obj.type.should == 'UnmappedClass'
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should map special classes from AS by default" do
|
||
|
|
as_classes = [
|
||
|
|
'flex.messaging.messages.AcknowledgeMessage',
|
||
|
|
'flex.messaging.messages.CommandMessage',
|
||
|
|
'flex.messaging.messages.RemotingMessage'
|
||
|
|
]
|
||
|
|
|
||
|
|
as_classes.each do |as_class|
|
||
|
|
@mapper.get_ruby_obj(as_class).should_not be_a(RocketAMF::Values::TypedHash)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should map special classes from ruby by default" do
|
||
|
|
ruby_classes = [
|
||
|
|
'RocketAMF::Values::AcknowledgeMessage',
|
||
|
|
'RocketAMF::Values::ErrorMessage'
|
||
|
|
]
|
||
|
|
|
||
|
|
ruby_classes.each do |obj|
|
||
|
|
@mapper.get_as_class_name(obj).should_not be_nil
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should allow config modification" do
|
||
|
|
RocketAMF::Ext::FastClassMapping.mappings.map :as => 'SecondClass', :ruby => 'ClassMappingTest'
|
||
|
|
@mapper = RocketAMF::Ext::FastClassMapping.new
|
||
|
|
@mapper.get_as_class_name(ClassMappingTest.new).should == 'SecondClass'
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
describe "ruby object populator" do
|
||
|
|
it "should populate a ruby class" do
|
||
|
|
obj = @mapper.populate_ruby_obj ClassMappingTest.new, {:prop_a => 'Data'}
|
||
|
|
obj.prop_a.should == 'Data'
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should populate a typed hash" do
|
||
|
|
obj = @mapper.populate_ruby_obj RocketAMF::Values::TypedHash.new('UnmappedClass'), {'prop_a' => 'Data'}
|
||
|
|
obj['prop_a'].should == 'Data'
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
describe "property extractor" do
|
||
|
|
# Use symbol keys for properties in Ruby >1.9
|
||
|
|
def prop_hash hash
|
||
|
|
out = {}
|
||
|
|
if RUBY_VERSION =~ /^1\.8/
|
||
|
|
hash.each {|k,v| out[k.to_s] = v}
|
||
|
|
else
|
||
|
|
hash.each {|k,v| out[k.to_sym] = v}
|
||
|
|
end
|
||
|
|
out
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should return hash without modification" do
|
||
|
|
hash = {:a => 'test1', 'b' => 'test2'}
|
||
|
|
props = @mapper.props_for_serialization(hash)
|
||
|
|
props.should === hash
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should extract object properties" do
|
||
|
|
obj = ClassMappingTest.new
|
||
|
|
obj.prop_a = 'Test A'
|
||
|
|
|
||
|
|
hash = @mapper.props_for_serialization obj
|
||
|
|
hash.should == prop_hash({'prop_a' => 'Test A', 'prop_b' => nil})
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should extract inherited object properties" do
|
||
|
|
obj = ClassMappingTest2.new
|
||
|
|
obj.prop_a = 'Test A'
|
||
|
|
obj.prop_c = 'Test C'
|
||
|
|
|
||
|
|
hash = @mapper.props_for_serialization obj
|
||
|
|
hash.should == prop_hash({'prop_a' => 'Test A', 'prop_b' => nil, 'prop_c' => 'Test C'})
|
||
|
|
end
|
||
|
|
|
||
|
|
it "should cache property lookups by instance" do
|
||
|
|
class ClassMappingTest3; attr_accessor :prop_a; end;
|
||
|
|
|
||
|
|
# Cache properties
|
||
|
|
obj = ClassMappingTest3.new
|
||
|
|
hash = @mapper.props_for_serialization obj
|
||
|
|
|
||
|
|
# Add a method to ClassMappingTest3
|
||
|
|
class ClassMappingTest3; attr_accessor :prop_b; end;
|
||
|
|
|
||
|
|
# Test property list does not have new property
|
||
|
|
obj = ClassMappingTest3.new
|
||
|
|
obj.prop_a = 'Test A'
|
||
|
|
obj.prop_b = 'Test B'
|
||
|
|
hash = @mapper.props_for_serialization obj
|
||
|
|
hash.should == prop_hash({'prop_a' => 'Test A'})
|
||
|
|
|
||
|
|
# Test that new class mapper *does* have new property (cache per instance)
|
||
|
|
@mapper = RocketAMF::Ext::FastClassMapping.new
|
||
|
|
hash = @mapper.props_for_serialization obj
|
||
|
|
hash.should == prop_hash({'prop_a' => 'Test A', 'prop_b' => 'Test B'})
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|