impress/vendor/gems/RocketAMF-1.0.0/spec/fast_class_mapping_spec.rb
Emi Matchu b1f06029f8 Moderize RocketAMF C types to fix build error
I'm not sure if this is a Mac-only problem or what, but we were getting incompatible-function-pointer errors when trying to build the RocketAMF C extensions. This fixes that! (Maybe it's like, Mac-only but as of Ruby 3.4 in specific? We're running RocketAMF in production on Ruby 3.4 right now without this. Shrug.)
2025-10-30 02:45:56 +00:00

144 lines
No EOL
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