def test_print_ref__link__complex_closure(api_mock): ref = TypeRef("lang") ref.name = "std::function" ref.nested = [TypeRef("lang")] ref.nested[0].returns = TypeRef("lang") ref.nested[0].returns.name = "void" ref.nested[0].args = [Parameter()] ref.nested[0].args[0].type = TypeRef("lang") ref.nested[0].args[0].type.name = "std::shared_ptr" ref.nested[0].args[0].type.prefix = "const " ref.nested[0].args[0].type.suffix = "&" ref.nested[0].args[0].type.nested = [TypeRef("lang")] ref.nested[0].args[0].type.nested[0].name = "detail::SuccessDescriptor" ref.nested[0].args[0].type.nested[0].id = "lang-successdescriptor" helper = TemplateHelper(api_mock) assert ( helper.print_ref(ref) == "std::function<void(const std::shared_ptr<xref:lang-successdescriptor" "[++detail::SuccessDescriptor++]>&)>") api_mock.link_to_element.assert_has_calls([ call(ref.nested[0].args[0].type.nested[0].id, ref.nested[0].args[0].type.nested[0].name) ])
def test_print_ref__link__closure(api_mock): arg1_type = TypeRef("lang") arg1_type.name = "ArgType1" arg1_type.id = "lang-argtype1" arg1 = Parameter() arg1.type = arg1_type arg2_type = TypeRef("lang") arg2_type.name = "ArgType2" arg2 = Parameter() arg2.name = "value" arg2.type = arg2_type return_type = TypeRef("lang") return_type.name = "MyType" return_type.id = "lang-tomtom_1_MyType" ref = TypeRef("lang") ref.args = [arg1, arg2] ref.returns = return_type helper = TemplateHelper(api_mock) assert ( helper.print_ref(ref) == "xref:lang-tomtom_1_MyType[++MyType++](xref:lang-argtype1[++ArgType1++], ArgType2 " "value)") api_mock.link_to_element.assert_has_calls([ call(arg1_type.id, arg1_type.name), call(return_type.id, return_type.name) ])
def test_typeref__init__keywords(): ref = TypeRef(language="lang", name="name", id="id", namespace="namespace", kind="kind", prefix="prefix", suffix="suffix", nested=[TypeRef(name="nested")], args=[Parameter(name="parameter")], returns=TypeRef(name="returns"), prot="public") assert ref.id == "id" assert ref.name == "name" assert ref.language == "lang" assert ref.namespace == "namespace" assert ref.kind == "kind" assert ref.prefix == "prefix" assert ref.suffix == "suffix" assert ref.prot == "public" assert len(ref.nested) == 1 assert ref.nested[0].name == "nested" assert len(ref.args) == 1 assert ref.args[0].name == "parameter" assert ref.returns is not None assert ref.returns.name == "returns"
def test_objc_method_signature__multiple_params_linked_return(helper): method = Compound("objc") method.name = "setValue:withUnit:andALongerParam:" method.returns = ReturnValue() method.returns.type = TypeRef("objc", name="Value") method.returns.type.id = "objc-value" param1 = Parameter() param1.name = "arg1" param1.type = TypeRef("objc", "Type1") param2 = Parameter() param2.name = "arg2" param2.type = TypeRef("objc", "Type2") param2.type.id = "objc-type2" param3 = Parameter() param3.name = "arg3" param3.type = TypeRef("objc", "Type3") method.params = [param1, param2, param3] assert (helper.method_signature(method) == """\ - (xref:objc-value[++Value++])setValue:(Type1)arg1 withUnit:(xref:objc-type2[++Type2++])arg2 andALongerParam:(Type3)arg3""")
def test_objc_method_signature__multiple_params_linked_return(context): method = Member("objc") method.name = "setValue:withUnit:andALongerParam:" method.returns = ReturnValue() method.returns.type = TypeRef("objc", name="Value") method.returns.type.id = "objc-value" param1 = Parameter() param1.name = "arg1" param1.type = TypeRef("objc", "Type1") param2 = Parameter() param2.name = "arg2" param2.type = TypeRef("objc", "Type2") param2.type.id = "objc-type2" param3 = Parameter() param3.name = "arg3" param3.type = TypeRef("objc", "Type3") method.params = [param1, param2, param3] assert (objc_method_signature( method, context) == "- (xref:objc-value[Value])setValue:(Type1)arg1\n" " withUnit:(xref:objc-type2[Type2])arg2\n" " andALongerParam:(Type3)arg3")
def test_parameter__eq__full(): first = Parameter(type=TypeRef(name="type"), name="name", description="description", default_value="default_value", prefix="prefix") second = Parameter(type=TypeRef(name="type"), name="name", description="description", default_value="default_value", prefix="prefix") assert first == second assert second == first for attr_name in ("name", "description", "default_value", "prefix"): setattr(second, attr_name, "other") assert first != second assert second != first setattr(second, attr_name, getattr(first, attr_name)) second.type.name = "other" assert first != second assert second != first second.type.name = first.type.name
def test_argument_list(empty_context): type1 = TypeRef("lang") type1.prefix = "const " type1.name = "Type1" type2 = TypeRef("lang") type2.name = "Type2" type2.suffix = " &" type2.id = "lang-type2" type3 = TypeRef("lang") type3.name = "Type3" type3.nested = [type1, type2] param1 = Parameter() param1.type = type1 param2 = Parameter() param2.type = type2 param2.name = "arg2" param3 = Parameter() param3.type = type3 param3.name = "arg3" assert (argument_list([param1, param2, param3], empty_context) == "(const Type1, xref:lang-type2[Type2] & arg2, " "Type3<const Type1, xref:lang-type2[Type2] &> arg3)")
def test_argument_list__with_types(empty_context): type1 = TypeRef("lang") type1.name = "Type1" type2 = TypeRef("lang") type2.name = "Type2" type2.id = "lang-type2" type3 = TypeRef("lang") type3.name = "Type3" type3.nested = [type1, type2] param1 = Parameter() param1.type = type1 param1.name = "arg1" param2 = Parameter() param2.type = type2 param2.name = "arg2" param3 = Parameter() param3.type = type3 param3.name = "arg3" assert (argument_list([param1, param2, param3], empty_context) == "(arg1: Type1, arg2: xref:lang-type2[Type2], " "arg3: Type3[Type1, xref:lang-type2[Type2]])")
def test_type_ref_to_str(): assert str(TypeRef("cpp")) == "" assert str(TypeRef("cpp", "Type")) == "Type" type_ref = TypeRef("cpp", "Type") type_ref.id = "12345" assert str(type_ref) == "Type" type_ref.kind = "class" assert str(type_ref) == "Type" type_ref.prefix = "const " assert str(type_ref) == "const Type" type_ref.suffix = " &" assert str(type_ref) == "const Type &" nested_type_1 = TypeRef("cpp", "Nested1") type_ref.nested = [nested_type_1] assert str(type_ref) == "const Type< Nested1 > &" nested_type_2 = TypeRef("cpp", "Nested2") nested_type_2.prefix = "const " nested_type_2.suffix = "*" type_ref.nested.append(nested_type_2) assert str(type_ref) == "const Type< Nested1, const Nested2* > &" nested_type_2.nested = [nested_type_1] assert str( type_ref) == "const Type< Nested1, const Nested2< Nested1 >* > &"
def test_type_list(): type1 = TypeRef("lang") type1.prefix = "const " type1.name = "Type1" type2 = TypeRef("lang") type2.name = "Type2" type2.suffix = " &" type2.id = "lang-type2" type3 = TypeRef("lang") type3.name = "Type3" type3.nested = [type1, type2] param1 = Parameter() param1.type = type1 param1.name = "arg1" param2 = Parameter() param2.type = type2 param2.name = "arg2" param3 = Parameter() param3.type = type3 param3.name = "arg3" assert (type_list([param1, param2, param3]) == "(const Type1, Type2 &, Type3<const Type1, Type2 &>)")
def test_type_list(empty_generating_api): type1 = TypeRef("lang") type1.prefix = "const " type1.name = "Type1" type2 = TypeRef("lang") type2.name = "Type2" type2.suffix = " &" type2.id = "lang-type2" type3 = TypeRef("lang") type3.name = "Type3" type3.nested = [type1, type2] param1 = Parameter() param1.type = type1 param1.name = "arg1" param2 = Parameter() param2.type = type2 param2.name = "arg2" param3 = Parameter() param3.type = type3 param3.name = "arg3" helper = TemplateHelper(empty_generating_api) assert (helper.type_list( [param1, param2, param3]) == "(const Type1, Type2 &, Type3<const Type1, Type2 &>)")
def test_print_ref__no_link__closure_prefix_suffix(api_mock): arg1_type = TypeRef("lang") arg1_type.name = "ArgType1" arg1_type.id = "lang-argtype1" arg1 = Parameter() arg1.type = arg1_type arg2_type = TypeRef("lang") arg2_type.name = "ArgType2" arg2 = Parameter() arg2.name = "value" arg2.type = arg2_type return_type = TypeRef("lang") return_type.name = "MyType" return_type.id = "lang-tomtom_1_MyType" return_type.prefix = "const " return_type.suffix = "&" ref = TypeRef("lang") ref.returns = return_type ref.args = [arg1, arg2] ref.prefix = "final " ref.suffix = "*" helper = TemplateHelper(api_mock) assert helper.print_ref( ref, link=False) == "final (const MyType&(ArgType1, ArgType2 value))*"
def test_print_ref__no_link__closure_with_nested_type__custom_start_and_end( api_mock): nested_type = TypeRef("lang") nested_type.name = "Nested1" arg_type = TypeRef("lang") arg_type.name = "ArgType" arg_type.id = "lang-argtype" arg = Parameter() arg.type = arg_type return_type = TypeRef("lang") return_type.name = "MyType" return_type.prefix = "const " return_type.suffix = " &" return_type.id = "lang-tomtom_1_MyType" return_type.nested = [nested_type] ref = TypeRef("lang") ref.args = [arg] ref.returns = return_type class TestHelper(TemplateHelper): NESTED_START: str = "{" NESTED_END: str = ";" ARGS_START: str = "@" ARGS_END: str = "#" helper = TestHelper(api_mock) assert (helper.print_ref(ref, link=False) == "const MyType{Nested1; &@ArgType#")
def test_method_signature__single_param(empty_generating_api): method = Compound("lang") method.name = "ShortMethod" method.returns = ReturnValue() method.returns.type = TypeRef("lang", "void") method.params = [Parameter()] method.params[0].name = "value" method.params[0].type = TypeRef("lang", "int") helper = TemplateHelper(empty_generating_api) assert helper.method_signature(method) == "void ShortMethod(int value)"
def test_closure_definition__multiple_params_type_only__void_return(helper): closure = Compound("swift") closure.name = "SuccessClosure" closure.returns = ReturnValue() closure.returns.type = TypeRef("swift", name="Void") closure.returns.type.args = [Parameter(), Parameter()] closure.returns.type.args[0].type = TypeRef("swift", "int") closure.returns.type.args[1].type = TypeRef("swift", "Data") closure.returns.type.args[1].type.id = "swift-data" assert ( helper.closure_definition(closure) == "typealias SuccessClosure = (int, xref:swift-data[++Data++]) -> Void")
def test_method_signature__single_param(helper): method = Compound("python") method.name = "ShortMethod" method.returns = ReturnValue() method.returns.type = TypeRef("python", "int") method.params = [Parameter()] method.params[0].name = "value" method.params[0].type = TypeRef("python", "int") assert helper.method_signature( method) == "def ShortMethod(value: int) -> int"
def test_print_ref__no_link__empty_closure(api_mock): return_type = TypeRef("lang") return_type.name = "MyType" return_type.prefix = "const " return_type.suffix = " &" return_type.id = "lang-tomtom_1_MyType" ref = TypeRef("lang") ref.args = [] ref.returns = return_type helper = TemplateHelper(api_mock) assert helper.print_ref(ref, link=False) == "const MyType &()"
def test_method_signature__one_param(helper): method = Compound("swift") method.name = "setValue" method.returns = ReturnValue() method.returns.type = TypeRef("swift", name="Value") param1 = Parameter() param1.name = "arg1" param1.type = TypeRef("objc", "Type1") method.params = [param1] assert helper.method_signature( method) == "func setValue(arg1: Type1) -> Value"
def test_argument_list__empty_type(empty_context): type1 = TypeRef("lang") type2 = TypeRef("lang") param1 = Parameter() param1.type = type1 param1.name = "arg1" param2 = Parameter() param2.type = type2 param2.name = "arg2" assert (argument_list([param1, param2], empty_context) == "(arg1, arg2)")
def test_method_signature__single_param__too_wide(helper): method = Compound("python") method.name = "ShortMethod" method.returns = ReturnValue() method.returns.type = TypeRef("python", "str") method.params = [Parameter()] method.params[0].name = "value" method.params[0].type = TypeRef("python", "int") assert (helper.method_signature(method, max_width=20) == """\ def ShortMethod( value: int) -> str""")
def test_method_signature__ignore_param_type_xref_length(helper): method = Compound("python") method.name = "ShortMethod" method.returns = ReturnValue() method.returns.type = TypeRef("python", "None") method.params = [Parameter()] method.params[0].name = "value" method.params[0].type = TypeRef("python", "int") method.params[0].type.id = "ab" * 80 assert (helper.method_signature(method) == f"def ShortMethod(value: xref:{'ab' * 80}[++int++]) -> None")
def test_objc_method_signature__one_param(context): method = Member("objc") method.name = "setValue:" method.returns = ReturnValue() method.returns.type = TypeRef("objc", name="Value") method.returns.type.id = "objc-value" param1 = Parameter() param1.name = "arg1" param1.type = TypeRef("objc", "Type1") method.params = [param1] assert objc_method_signature( method, context) == "- (xref:objc-value[Value])setValue:(Type1)arg1"
def test_objc_method_signature__one_param(helper): method = Compound("objc") method.name = "setValue:" method.returns = ReturnValue() method.returns.type = TypeRef("objc", name="Value") method.returns.type.id = "objc-value" param1 = Parameter() param1.name = "arg1" param1.type = TypeRef("objc", "Type1") method.params = [param1] assert helper.method_signature( method) == "- (xref:objc-value[++Value++])setValue:(Type1)arg1"
def test_link_from_ref__name_prefix_suffix_no_id(context_mock): ref = TypeRef("lang") ref.name = "MyType" ref.prefix = "const " ref.suffix = " &" assert link_from_ref(ref, context_mock) == "const MyType &" context_mock.assert_not_called()
def test_print_ref__nested_types(): nested_type_with_id = TypeRef("lang") nested_type_with_id.name = "Nested1" nested_type_with_id.id = "lang-nested1" nested_type_without_id = TypeRef("lang") nested_type_without_id.name = "Nested2" ref = TypeRef("lang") ref.name = "MyType" ref.prefix = "const " ref.suffix = " &" ref.id = "lang-tomtom_1_MyType" ref.nested = [nested_type_with_id, nested_type_without_id] assert print_ref(ref) == "const MyType<Nested1, Nested2> &"
def test_print_ref__strip_surrounding_whitespace(): ref = TypeRef("lang") ref.name = "MyType" ref.id = "lang-mytype" ref.prefix = "\tconst " ref.suffix = " & " assert print_ref(ref) == "const MyType &"
def test_print_ref__name_prefix_suffix_no_id(): ref = TypeRef("lang") ref.name = "MyType" ref.id = "lang-mytype" ref.prefix = "const " ref.suffix = " &" assert print_ref(ref) == "const MyType &"
def generate_member_variable(name: str) -> Member: member_variable = Member("python") member_variable.kind = "variable" member_variable.name = name member_variable.returns = ReturnValue() member_variable.returns.type = TypeRef("python") return member_variable
def test_argument_list__cls(empty_context): type1 = TypeRef("lang") type1.name = "cls" type2 = TypeRef("lang") type2.name = "Type2" type2.id = "lang-type2" param1 = Parameter() param1.type = type1 param2 = Parameter() param2.type = type2 param2.name = "arg2" assert (argument_list([param1, param2], empty_context) == "(cls, arg2: xref:lang-type2[Type2])")
def test_throws_clause__eq__full(): first = ThrowsClause(type=TypeRef(name="type"), description="description") second = ThrowsClause(type=TypeRef(name="type"), description="description") assert first == second assert second == first second.type.name = "other" assert first != second assert second != first second.type.name = first.type.name second.description = "other" assert first != second assert second != first second.description = first.description