def test_archive_schema_preserves_references(): root = _build_node_tree("""namespace foo{ /// T Comment struct T { /* fieldA comment*/ fieldA : u8 : 7; } /** * Archive comment */ archive A { /// resource comment resourceA : T; } } """) resolve_references(root) expected = """namespace foo { struct T { fieldA : u8 : 7; } } namespace foo { archive A { resourceA : .foo.T; } } """ assert_equal(SyntaxTree.schema(root.find(".foo.A")), expected)
def test_schemas_are_not_duplicated_if_several_type_references_occur(): root = _build_node_tree("""namespace foo{ /// T Comment struct T { /* fieldA comment*/ fieldA : u8 : 7; } /** * Archive comment */ archive A { resourceA : T; resourceB : T; } } """) resolve_references(root) expected = """namespace foo { struct T { fieldA : u8 : 7; } } namespace foo { archive A { resourceA : .foo.T; resourceB : .foo.T; } } """ actual = SyntaxTree.schema(root.find(".foo.A")) assert_equal(actual, expected)
def test_archive_schemas_include_constants(): root = build_ast("""namespace foo{ const u8 C = 42; struct T { f : u8 : 7; } archive A { resourceA : T; } } """) resolve_references(root) expected = """namespace foo { struct T { f : u8 : 7; } } namespace foo { const u8 C = 42; } namespace foo { archive A { resourceA : .foo.T; } } """ actual = SyntaxTree.schema(root.find(".foo.A")) assert_equal(actual, expected)
def _assert_missing_symbol_is_thrown(root, message): try: resolve_references(root) except errors.MissingSymbol as e: assert_equal(message, str(e)) else: assert_false(True, "MissingSymbol was not thrown")
def test_resource_to_struct_references_are_resolved_for_the_current_scope(): root = _create_tree_resource_to_struct(actual="Struct", reference="Struct") assert_is_instance(root.find('.ns.Archive.resource.@Struct'), refs.StructureReference) resolve_references(root) assert_is_instance(root.find('.ns.Archive.resource.@@ns@Struct'), refs.StructureReference)
def test_resource_to_field_references_are_resolved(): root = _create_tree_with_explicit_reference("Archive.resource2") assert_is_instance(root.find('.ns.Archive.resource.@Struct@Field'), refs.FieldReference) resolve_references(root) assert_is_instance(root.find('.ns.Archive.resource.@@ns@Struct@Field'), refs.FieldReference)
def test_resource_to_archive_references_are_resolved(): root = _create_tree_resource_to_archive() assert_is_instance(root.find('.ns.Archive.resource.@RefArchive'), refs.ArchiveReference) resolve_references(root) assert_is_instance(root.find('.ns.Archive.resource.@@ns@RefArchive'), refs.ArchiveReference)
def test_archive_member_schemas_references_dependent_types(): root = _build_node_tree("""namespace n{ struct T { t : u8 : 7; } struct U { u : u8 : 7; } struct V { v : u8 : 7; } archive A { a : T; b : vector< V >; c : multivector< 17, U, V >; } } """) resolve_references(root) assert_equal( SyntaxTree.schema(root.find(".n.A.a")), "namespace n { struct T { t : u8 : 7; } }\n" "namespace n { a : T; }") assert_equal( SyntaxTree.schema(root.find(".n.A.b")), "namespace n { struct V { v : u8 : 7; } }\n" "namespace n { b : vector< V >; }") assert_equal( SyntaxTree.schema(root.find(".n.A.c")), "namespace n { struct U { u : u8 : 7; } }\n" "namespace n { struct V { v : u8 : 7; } }\n" "namespace n { c : multivector< 17, U, V >; }")
def test_resource_to_resource_references_are_resolved_for_parent_scope(): root = _create_tree_with_explicit_reference("resource2") assert_is_instance(root.find('.ns.Archive.resource.@resource2'), refs.ResourceReference) resolve_references(root) assert_is_instance( root.find('.ns.Archive.resource.@@ns@Archive@resource2'), refs.ResourceReference)
def test_resource_to_struct_references_are_verified_if_global_path_is_specified( ): root = _create_tree_resource_to_struct_with_extra_folding( "Struct", ".ns.fold.Struct") assert_is_instance(root.find('.ns.Archive.resource.@@ns@fold@Struct'), refs.StructureReference) resolve_references(root) assert_is_instance(root.find('.ns.Archive.resource.@@ns@fold@Struct'), refs.StructureReference)
def test_implicit_references_structure_is_resolved(): root = Root().insert( nodes.Namespace("n").insert( Archive("A").insert( res.Vector("r1"), res.Vector("r2"), res.BoundResource("b").insert( refs.ResourceReference("A.r1"), refs.ResourceReference("A.r2"))))) resolve_references(root) assert_equal("@@n@A@r1", root.find('.n.A.b').children[0].name) assert_equal("@@n@A@r2", root.find('.n.A.b').children[1].name)
def test_resolved_references_appear_in_original_order(): root = _create_tree_with_two_struct_references() resolve_references(root) assert_equal("@@ns@S1", root.find('.ns.Archive.resource').children[0].name) assert_equal("@@ns@S2", root.find('.ns.Archive.resource').children[1].name)