require 'spec_helper'
describe "Inherited terminology" do
describe "with basic terms" do
before(:all) do
class AbstractTerminology
include OM::XML::Document
set_terminology do |t|
t.root :path => 'root', :xmlns => "asdf"
t.foo
end
end
class ConcreteTerminology < AbstractTerminology
extend_terminology do |t|
t.bar
end
end
end
after(:all) do
Object.send(:remove_const, :ConcreteTerminology)
Object.send(:remove_const, :AbstractTerminology)
end
describe "the subclass" do
subject do
xml = 'foovalbarval'
ConcreteTerminology.from_xml(xml)
end
it "should inherit terminology" do
subject.foo = "Test value"
subject.foo.should == ["Test value"]
end
it "should have extended terminology" do
subject.bar = "Test value"
subject.bar.should == ["Test value"]
end
end
describe "the superclass" do
subject do
xml = 'foovalbarval'
AbstractTerminology.from_xml(xml)
end
it "should have terminology" do
subject.foo = "Test value"
subject.foo.should == ["Test value"]
end
it "should not have extended terminology" do
expect { subject.bar }.to raise_error NoMethodError
end
end
end
describe "with template terms" do
before(:all) do
class AbstractTerminology
include OM::XML::Document
set_terminology do |t|
t.root :path => 'root', :xmlns => "asdf"
end
define_template :creator do |xml, author, role|
xml.pbcoreCreator {
xml.creator(author)
xml.creatorRole(role, :source=>"PBCore creatorRole")
}
end
end
class ConcreteTerminology < AbstractTerminology
end
class OtherConcreteTerminology < AbstractTerminology
define_template :foo do |xml, *args|
args.each { |arg|
xml.foo(arg)
}
end
end
end
after(:all) do
Object.send(:remove_const, :OtherConcreteTerminology)
Object.send(:remove_const, :ConcreteTerminology)
Object.send(:remove_const, :AbstractTerminology)
end
describe "on the subclass" do
subject do
xml = ''
ConcreteTerminology.from_xml(xml)
end
it "should inherit templates" do
subject.add_child_node subject.ng_xml.root, :creator, 'Test author', 'Primary'
subject.ng_xml.xpath('//pbcoreCreator/creatorRole[@source="PBCore creatorRole"]').text.should == "Primary"
end
it "should inherit but not extend its parent's templates" do
OtherConcreteTerminology.template_registry.should have_node_type(:creator)
OtherConcreteTerminology.template_registry.should have_node_type(:foo)
AbstractTerminology.template_registry.should_not have_node_type(:foo)
ConcreteTerminology.template_registry.should_not have_node_type(:foo)
end
end
end
end