test/reference_resolver_test.rb in rgen-0.5.4 vs test/reference_resolver_test.rb in rgen-0.6.0
- old
+ new
@@ -10,35 +10,102 @@
has_attr 'name', String
has_one 'other', TestNode
has_many 'others', TestNode
end
- class TestResolver
- include RGen::Instantiator::ReferenceResolver
- def initialize(nodeA, nodeB, nodeC)
- @nodeA, @nodeB, @nodeC = nodeA, nodeB, nodeC
- end
- def resolveIdentifier(ident)
- {:a => @nodeA, :b => @nodeB, :c => @nodeC}[ident]
- end
+ class TestNode2 < RGen::MetamodelBuilder::MMBase
+ has_attr 'name', String
end
- def test_simple
+ def test_identifier_resolver
+ nodeA, nodeB, nodeC, unresolved_refs = create_model
+ resolver = RGen::Instantiator::ReferenceResolver.new(
+ :identifier_resolver => proc do |ident|
+ {:a => nodeA, :b => nodeB, :c => nodeC}[ident]
+ end)
+ urefs = resolver.resolve(unresolved_refs)
+ check_model(nodeA, nodeB, nodeC)
+ assert urefs.empty?
+ end
+
+ def test_add_identifier
+ nodeA, nodeB, nodeC, unresolved_refs = create_model
+ resolver = RGen::Instantiator::ReferenceResolver.new
+ resolver.add_identifier(:a, nodeA)
+ resolver.add_identifier(:b, nodeB)
+ resolver.add_identifier(:c, nodeC)
+ urefs = resolver.resolve(unresolved_refs)
+ check_model(nodeA, nodeB, nodeC)
+ assert urefs.empty?
+ end
+
+ def test_problems
+ nodeA, nodeB, nodeC, unresolved_refs = create_model
+ resolver = RGen::Instantiator::ReferenceResolver.new(
+ :identifier_resolver => proc do |ident|
+ {:a => [nodeA, nodeB], :c => nodeC}[ident]
+ end)
+ problems = []
+ urefs = resolver.resolve(unresolved_refs, :problems => problems)
+ assert_equal ["identifier b not found", "identifier a not uniq"], problems
+ assert_equal 2, urefs.size
+ assert urefs.all?{|ur| !ur.target_type_error}
+ end
+
+ def test_on_resolve_proc
+ nodeA, nodeB, nodeC, unresolved_refs = create_model
+ resolver = RGen::Instantiator::ReferenceResolver.new
+ resolver.add_identifier(:a, nodeA)
+ resolver.add_identifier(:b, nodeB)
+ resolver.add_identifier(:c, nodeC)
+ data = []
+ resolver.resolve(unresolved_refs,
+ :on_resolve => proc {|ur, e| data << [ ur, e ]})
+ assert data[0][0].is_a?(RGen::Instantiator::ReferenceResolver::UnresolvedReference)
+ assert_equal nodeA, data[0][0].element
+ assert_equal "other", data[0][0].feature_name
+ assert_equal :b, data[0][0].proxy.targetIdentifier
+ assert_equal nodeB, data[0][1]
+ end
+
+ def test_target_type_error
+ nodeA, nodeB, nodeC, unresolved_refs = create_model
+ resolver = RGen::Instantiator::ReferenceResolver.new(
+ :identifier_resolver => proc do |ident|
+ {:a => TestNode2.new, :b => TestNode2.new, :c => nodeC}[ident]
+ end)
+ problems = []
+ urefs = resolver.resolve(unresolved_refs, :problems => problems)
+ assert_equal 2, problems.size
+ assert problems[0] =~ /invalid target type .*TestNode2/
+ assert problems[1] =~ /invalid target type .*TestNode2/
+ assert_equal 2, urefs.uniq.size
+ assert urefs[0].target_type_error
+ assert urefs[1].target_type_error
+ assert urefs.any?{|ur| ur.proxy.object_id == nodeA.other.object_id}
+ assert urefs.any?{|ur| ur.proxy.object_id == nodeB.others[0].object_id}
+ end
+
+ private
+
+ def create_model
nodeA = TestNode.new(:name => "NodeA")
nodeB = TestNode.new(:name => "NodeB")
nodeC = TestNode.new(:name => "NodeC")
bProxy = RGen::MetamodelBuilder::MMProxy.new(:b)
nodeA.other = bProxy
aProxy = RGen::MetamodelBuilder::MMProxy.new(:a)
cProxy = RGen::MetamodelBuilder::MMProxy.new(:c)
nodeB.others = [aProxy, cProxy]
- unresolvedReferences = [
+ unresolved_refs = [
RGen::Instantiator::ReferenceResolver::UnresolvedReference.new(nodeA, "other", bProxy),
RGen::Instantiator::ReferenceResolver::UnresolvedReference.new(nodeB, "others", aProxy),
RGen::Instantiator::ReferenceResolver::UnresolvedReference.new(nodeB, "others", cProxy)
]
- resolver = TestResolver.new(nodeA, nodeB, nodeC)
- resolver.resolveReferences(unresolvedReferences)
+ return nodeA, nodeB, nodeC, unresolved_refs
+ end
+
+ def check_model(nodeA, nodeB, nodeC)
assert_equal nodeB, nodeA.other
assert_equal [], nodeA.others
assert_equal nil, nodeB.other
assert_equal [nodeA, nodeC], nodeB.others
assert_equal nil, nodeC.other