diff options
Diffstat (limited to 'tools/InterfaceGenerator/test/generator/generators')
8 files changed, 2488 insertions, 0 deletions
diff --git a/tools/InterfaceGenerator/test/generator/generators/__init__.py b/tools/InterfaceGenerator/test/generator/generators/__init__.py new file mode 100755 index 000000000..e69de29bb --- /dev/null +++ b/tools/InterfaceGenerator/test/generator/generators/__init__.py diff --git a/tools/InterfaceGenerator/test/generator/generators/test_SmartFactoryBase.py b/tools/InterfaceGenerator/test/generator/generators/test_SmartFactoryBase.py new file mode 100755 index 000000000..aea91f4a4 --- /dev/null +++ b/tools/InterfaceGenerator/test/generator/generators/test_SmartFactoryBase.py @@ -0,0 +1,283 @@ +"""Test for SmartFactory generator base. + +Verifies common helper functions and produced source code. + +""" +import collections +import unittest + +from generator.generators import SmartFactoryBase +from generator import Model + + +EXPECTED_RESULT_FULL_COMMENT = u"""/** + * @brief Enumeration Test Name. + * + * Description Line1 + * Description Line2 + * + * Design Line1 + * + * @note Issue1 + * @note Issue2 + * @note Issue3 + * + * @todo Do1 + * @todo Do2 + */""" + +EXPECTED_RESULT_ENUM_ELEMENT1 = u"""/** + * @brief InternalName. + */ +InternalName = 10""" + +EXPECTED_RESULT_ENUM_ELEMENT2 = u"""/** + * @brief NO_VALUE_ELEMENT. + * + * Description Line1 + * Description Line2 + * + * Design Line1 + */ +NO_VALUE_ELEMENT""" + +EXPECTED_RESULT_ENUM_ELEMENTS1 = u"""/** + * @brief name1. + * + * Design Line1 + * + * @todo Do1 + * @todo Do2 + */ +name1 = 1, + +/** + * @brief internal_name2. + * + * Description Line1 + * Description Line2 + * + * @note Issue1 + * @note Issue2 + * @note Issue3 + */ +internal_name2""" + +EXPECTED_RESULT_ENUM1 = u"""namespace Enum1 { +/** + * @brief Enumeration Enum1. + * + * @todo Do1 + * @todo Do2 + */ +enum eType { + /** + * @brief INVALID_ENUM. + */ + INVALID_ENUM = -1, + + /** + * @brief name1. + * + * Design Line1 + * + * @todo Do1 + * @todo Do2 + */ + name1 = 1, + + /** + * @brief internal_name2. + * + * Description Line1 + * Description Line2 + * + * @note Issue1 + * @note Issue2 + * @note Issue3 + */ + internal_name2 +}; +} // Enum1 +""" + +EXPECTED_RESULT_ENUM2 = u"""namespace E2 { +/** + * @brief Enumeration E2. + */ +enum eType { + /** + * @brief INVALID_ENUM. + */ + INVALID_ENUM = -1, + + /** + * @brief val_1. + */ + val_1, + + /** + * @brief val_2. + */ + val_2 = 100, + + /** + * @brief val_3. + */ + val_3 +}; +} // E2 +""" + +DESCRIPTION = [u"Description Line1", u"Description Line2"] + +DESIGN_DESCRIPTION = [u"Design Line1"] + +ISSUES = [Model.Issue(value=u"Issue1"), + Model.Issue(value=u"Issue2"), + Model.Issue(value=u"Issue3")] + +TODOS = [u"Do1", u"Do2"] + + +class Test(unittest.TestCase): + + """Test for SmartFactory base generator. + + This class holds set of test cases for the SmartFactory base generator. + + """ + + def test_gen_comment(self): + """Test generation of the source code comments. + + Verifies correct generation of the code comments. + + """ + generator = SmartFactoryBase.CodeGenerator() + + enum = Model.Enum(name=u"Test Name", + description=DESCRIPTION, + design_description=DESIGN_DESCRIPTION, + issues=ISSUES, + todos=TODOS) + self.assertEqual(generator._gen_comment(enum), + EXPECTED_RESULT_FULL_COMMENT, + "Full comment for enum is invalid") + + def test_gen_enum_element(self): + """Test generation of the single enum element. + + Verifies correct generation of the single enum element. + + """ + generator = SmartFactoryBase.CodeGenerator() + + enum_element1 = Model.EnumElement(name=u"Element1", + internal_name=u"InternalName", + value=u"10") + + self.assertEqual( + generator._gen_enum_element(enum_element1), + EXPECTED_RESULT_ENUM_ELEMENT1, + "Short commented enum element with internal name is invalid") + + enum_element2 = Model.EnumElement( + name=u"NO_VALUE_ELEMENT", + description=DESCRIPTION, + design_description=DESIGN_DESCRIPTION) + self.assertEqual(generator._gen_enum_element(enum_element2), + EXPECTED_RESULT_ENUM_ELEMENT2, + "Enum element with no value is invalid") + + def test_gen_enum_elements(self): + """Test generation of the enum elements. + + Verifies correct generation of the enum elements. + + """ + generator = SmartFactoryBase.CodeGenerator() + + elements = [Model.EnumElement(name=u"name1", + design_description=DESIGN_DESCRIPTION, + todos=TODOS, + value=u"1"), + Model.EnumElement(name=u"name2", + description=DESCRIPTION, + issues=ISSUES, + internal_name=u"internal_name2")] + self.assertEqual(generator._gen_enum_elements(elements), + EXPECTED_RESULT_ENUM_ELEMENTS1, + "Simple enum elements are invalid") + + def test_gen_enum(self): + """Test generation of the enum. + + Verifies correct generation of the enum. + + """ + generator = SmartFactoryBase.CodeGenerator() + + elements1 = collections.OrderedDict() + elements1[u"name1"] = Model.EnumElement( + name=u"name1", + design_description=DESIGN_DESCRIPTION, + todos=TODOS, + value=u"1") + elements1[u"name2"] = Model.EnumElement( + name=u"name2", + description=DESCRIPTION, + issues=ISSUES, + internal_name=u"internal_name2") + + enum1 = Model.Enum(name=u"Enum1", + todos=TODOS, + elements=elements1) + + self.assertEqual(generator._gen_enum(enum1), + EXPECTED_RESULT_ENUM1, + "Simple enum is invalid") + + elements2 = collections.OrderedDict() + elements2[u"xxx"] = Model.EnumElement(name=u"xxx", + internal_name=u"val_1") + elements2[u"yyy"] = Model.EnumElement(name=u"yyy", + internal_name=u"val_2", + value=u"100") + elements2[u"zzz"] = Model.EnumElement(name=u"val_3") + + enum2 = Model.Enum(name=u"E2", + elements=elements2) + self.assertEqual(generator._gen_enum(enum2), + EXPECTED_RESULT_ENUM2, + "Long enum is invalid") + + self.assertEqual(generator._gen_enums([enum1, enum2], + collections.OrderedDict()), + u"{0}\n{1}".format(EXPECTED_RESULT_ENUM1, + EXPECTED_RESULT_ENUM2), + "Generated enums are invalid") + + def test_normalize_multiline_comments(self): + """Test normalization of the multiline comments. + + Verifies correct normalization of the multiline comments. + + """ + generator = SmartFactoryBase.CodeGenerator() + + self.assertEqual(generator._normalize_multiline_comments([]), []) + + self.assertEqual(generator._normalize_multiline_comments(["aaa", + "bbb", + "ccc ccc", + "ddd\tddd"]), + ["aaa", "bbb", "ccc ccc", "ddd\tddd"]) + self.assertEqual(generator._normalize_multiline_comments(["aaa\n1", + "bbb\r\n2", + "ccc\r3", + "aaa aaa"]), + ["aaa", "1", "bbb", "2", "ccc", "3", "aaa aaa"]) + +if __name__ == '__main__': + unittest.main() diff --git a/tools/InterfaceGenerator/test/generator/generators/test_SmartFactoryJSONRPC.py b/tools/InterfaceGenerator/test/generator/generators/test_SmartFactoryJSONRPC.py new file mode 100755 index 000000000..b21e32003 --- /dev/null +++ b/tools/InterfaceGenerator/test/generator/generators/test_SmartFactoryJSONRPC.py @@ -0,0 +1,482 @@ +"""Test for JSONRPC SmartFactory generator. + +Verifies format specific functions and produced source code. + +""" +import collections +import codecs +import os +import unittest +import uuid + +from mock import MagicMock +from mock import call + +from generator.generators import SmartFactoryJSONRPC +from generator import Model + + +EXPECTED_RESULT_REQUEST = ( + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_FUNCTION_ID] = CObjectSchemaItem::SMember(""" + u"""TEnumSchemaItem<FunctionID::eType>::create(""" + u"""function_id_items), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(""" + u"""TEnumSchemaItem<messageType::eType>::create(""" + u"""message_type_items), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_CORRELATION_ID] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""" +) + +EXPECTED_RESULT_RESPONSE = ( + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_FUNCTION_ID] = CObjectSchemaItem::SMember(""" + u"""TEnumSchemaItem<FunctionID::eType>::create(""" + u"""function_id_items), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(""" + u"""TEnumSchemaItem<messageType::eType>::create(""" + u"""message_type_items), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_CORRELATION_ID] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::kCode] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""" +) + +EXPECTED_RESULT_NOTIFICATION = ( + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_FUNCTION_ID] = CObjectSchemaItem::SMember(""" + u"""TEnumSchemaItem<FunctionID::eType>::create(""" + u"""function_id_items), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(""" + u"""TEnumSchemaItem<messageType::eType>::create(""" + u"""message_type_items), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""" +) + +EXPECTED_PRE_FUNCTION_CODE = ( + u""" std::map<std::string, CObjectSchemaItem::SMember> """ + u"""params_members;\n""" + u""" params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_FUNCTION_ID] = CObjectSchemaItem::SMember(""" + u"""TEnumSchemaItem<FunctionID::eType>::create(""" + u"""function_id_items), true);\n""" + u""" params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(""" + u"""TEnumSchemaItem<messageType::eType>::create(""" + u"""message_type_items), true);\n""" + u""" params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""" + u""" params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""" + u""" params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_CORRELATION_ID] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""" + u""" params_members[NsSmartDeviceLink::NsJSONHandler""" + u"""::strings::kCode] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""" + u""" params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::kMessage] = CObjectSchemaItem::SMember(""" + u"""CStringSchemaItem::create(), true);\n""" + u"""\n""" + u""" std::map<std::string, CObjectSchemaItem::SMember> """ + u"""root_members_map;\n""" + u""" root_members_map[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_PARAMS] = CObjectSchemaItem::SMember(""" + u"""CObjectSchemaItem::create(params_members), true);\n""" + u"""\n""" + u""" CSmartSchema error_response_schema(CObjectSchemaItem::create(""" + u"""root_members_map));\n""" + u"""\n""" + u""" functions_schemes_.insert(std::make_pair(""" + u"""NsSmartDeviceLink::NsJSONHandler::SmartSchemaKey<""" + u"""FunctionID::eType, messageType::eType>(""" + u"""FunctionID::request, messageType::error_response)""" + u""", error_response_schema));\n""" + u"""\n""" +) + +DESCRIPTION = [u"Description Line1", u"Description Line2"] + +DESIGN_DESCRIPTION = [u"Design Line1"] + +ISSUES = [Model.Issue(value=u"Issue1"), + Model.Issue(value=u"Issue2"), + Model.Issue(value=u"Issue3")] + +TODOS = [u"Do1", u"Do2"] + + +class Test(unittest.TestCase): + + """Test for JSONRPC SmartFactory generator. + + This class holds set of test cases for the JSONRPC SmartFactory generator. + + """ + + def test_gen_schema_params_fill(self): + """Test feature that allows to create format specific PARAMS. + + Verifies JSONRPC implementation of the _gen_schema_params_fill + method. + + """ + generator = SmartFactoryJSONRPC.CodeGenerator() + + self.assertEqual(generator._gen_schema_params_fill("request"), + EXPECTED_RESULT_REQUEST, + "Invalid code generation for request") + + self.assertEqual(generator._gen_schema_params_fill(u"request"), + EXPECTED_RESULT_REQUEST, + "Invalid code generation for request") + + self.assertEqual(generator._gen_schema_params_fill("response"), + EXPECTED_RESULT_RESPONSE, + "Invalid code generation for response") + + self.assertEqual(generator._gen_schema_params_fill(u"response"), + EXPECTED_RESULT_RESPONSE, + "Invalid code generation for response") + + self.assertEqual(generator._gen_schema_params_fill("notification"), + EXPECTED_RESULT_NOTIFICATION, + "Invalid code generation for notification") + + self.assertEqual(generator._gen_schema_params_fill(u"notification"), + EXPECTED_RESULT_NOTIFICATION, + "Invalid code generation for notification") + + def test_preprocess_message_type(self): + """Test preprocessing of the message_type enum. + + Verifies JSONPRC implementation of the _preprocess_message_type + function. + + """ + + generator = SmartFactoryJSONRPC.CodeGenerator() + + message_type_elements = collections.OrderedDict() + message_type_elements[u"request"] = Model.EnumElement(name=u"request") + message_type_elements[u"response"] = Model.EnumElement( + name=u"response") + message_type_elements[u"notification"] = Model.EnumElement( + name=u"notification") + + message_type = Model.Enum(name=u"messageType", + elements=message_type_elements) + + result_enum = generator._preprocess_message_type(message_type) + + self.assertIn("error_response", result_enum.elements) + self.assertEqual("error_response", + result_enum.elements["error_response"].primary_name) + + message_type_elements = collections.OrderedDict() + message_type_elements[u"request"] = Model.EnumElement(name=u"request") + message_type_elements[u"notification"] = Model.EnumElement( + name=u"notification") + + message_type = Model.Enum(name=u"messageType", + elements=message_type_elements) + + result_enum = generator._preprocess_message_type(message_type) + + self.assertNotIn("error_response", result_enum.elements) + + def test_gen_pre_function_schemas(self): + """Test code that goes before schema initialization. + + Verifies JSONPRC implementation of the _gen_pre_function_schemas + function. + + """ + + generator = SmartFactoryJSONRPC.CodeGenerator() + + self.assertEqual(u"", + generator._gen_pre_function_schemas([]), + "Invalid code for empty functions list") + + message_type_elements = collections.OrderedDict() + message_type_elements[u"request"] = Model.EnumElement(name=u"request") + message_type_elements[u"response"] = Model.EnumElement( + name=u"response") + message_type_elements[u"notification"] = Model.EnumElement( + name=u"notification") + + message_type = Model.Enum(name=u"messageType", + elements=message_type_elements) + + function1 = Model.Function( + "func1", function_id=message_type.elements[u"request"], + message_type=message_type.elements[u"request"]) + + self.assertEqual(u"", + generator._gen_pre_function_schemas([function1]), + "Invalid code for empty functions list") + + function2 = Model.Function( + "func2", function_id=message_type.elements[u"request"], + message_type=message_type.elements[u"response"]) + + self.assertEqual(EXPECTED_PRE_FUNCTION_CODE, + generator._gen_pre_function_schemas([function2]), + "Invalid code for single response function") + + self.assertEqual(EXPECTED_PRE_FUNCTION_CODE, + generator._gen_pre_function_schemas([function1, + function2]), + "Invalid code for mixed function list") + + def test_full_generation(self): + """Test full generation using JSONRPC SmartSchema generator. + + Creates output files which is captured by the mock and compare them + with sample files with correct code. This test requires valid + test_expected_jsonrpc.h and test_expected_jsonrpc.cc in the same + directory as this module. + + """ + + expected_h_file_content = open("test_expected_jsonrpc.h", "r").read() + expected_cc_file_content = open("test_expected_jsonrpc.cc", "r").read() + + generator = SmartFactoryJSONRPC.CodeGenerator() + + message_type_elements = collections.OrderedDict() + message_type_elements[u"request"] = Model.EnumElement(name=u"request") + message_type_elements[u"response"] = Model.EnumElement( + name=u"response") + message_type_elements[u"notification"] = Model.EnumElement( + name=u"notification") + + message_type = Model.Enum(name=u"messageType", + elements=message_type_elements) + + elements1 = collections.OrderedDict() + elements1[u"name1"] = Model.EnumElement( + name=u"name1", + design_description=DESIGN_DESCRIPTION, + todos=TODOS, + value=u"1") + elements1[u"name2"] = Model.EnumElement( + name="name2", + description=DESCRIPTION, + issues=ISSUES, + internal_name=u"internal_name2") + + enum1 = Model.Enum(name=u"Enum1", + todos=TODOS, + elements=elements1) + + elements2 = collections.OrderedDict() + elements2[u"xxx"] = Model.EnumElement(name=u"xxx", + internal_name=u"val_1") + elements2[u"yyy"] = Model.EnumElement(name=u"yyy", + internal_name=u"val_2", + value=u"100") + elements2[u"zzz"] = Model.EnumElement(name=u"val_3") + + enum2 = Model.Enum(name=u"E2", + elements=elements2) + + elements3 = collections.OrderedDict() + elements3["1"] = Model.EnumElement(name="xxx", + internal_name="_1") + elements3["2"] = Model.EnumElement(name="xxx", + internal_name="_2") + elements3["3"] = Model.EnumElement(name="xxx", + internal_name="_3") + enum3 = Model.Enum(name="Enum_new2", + elements=elements3) + + elements4 = collections.OrderedDict() + elements4["name1"] = Model.EnumElement(name="xxx", + internal_name="_11") + elements4["name2"] = Model.EnumElement(name="xxx", + internal_name="_22") + enum4 = Model.Enum(name="Enum_new4", + elements=elements4) + + enums = collections.OrderedDict() + enums["Enum1"] = enum1 + enums["Enum2"] = enum2 + enums["Enum3"] = enum3 + enums["Enum4"] = enum4 + enums["messageType"] = message_type + + params1 = collections.OrderedDict() + params1["1"] = Model.FunctionParam( + name="param1", + design_description=DESIGN_DESCRIPTION, + description=DESCRIPTION, + issues=ISSUES, + todos=TODOS, + param_type=enum4, + default_value=elements4["name1"]) + params1["2"] = Model.FunctionParam( + name="param2", + param_type=Model.EnumSubset( + name="sub1", + enum=enum1, + allowed_elements={"e1": elements1["name1"]}), + default_value=elements1["name1"]) + + functions = collections.OrderedDict() + functions["Function1"] = Model.Function( + name="Function1", + function_id=elements1["name1"], + message_type=message_type_elements["request"], + params=params1) + functions["Function2"] = Model.Function( + name="Function2", + function_id=elements2["xxx"], + message_type=message_type_elements["response"]) + functions["Function3"] = Model.Function( + name="Function2", + function_id=elements2["yyy"], + message_type=message_type_elements["notification"]) + + members1 = collections.OrderedDict() + members1["m1"] = Model.Param(name="intParam", + param_type=Model.Integer(max_value=2)) + members1["m11"] = Model.Param(name="doubleParam", + param_type=Model.Double(min_value=0.333), + is_mandatory=False) + members1["m222"] = Model.Param(name="boolParam", + param_type=Model.Boolean()) + members1["m2"] = Model.Param(name="structParam", + param_type=Model.Struct(name="Struct2")) + members1["aaa"] = Model.Param(name="enumParam", + param_type=enum1) + members1["bbb"] = Model.Param(name="enumParam1", + param_type=enum1) + members1["xxx"] = Model.Param( + name="enumSubset1", + param_type=Model.EnumSubset( + name="sub", + enum=enum1, + allowed_elements={"e1": elements1["name1"]}), + is_mandatory=False) + members1["1"] = Model.Param( + name="arrayOfInt", + param_type=Model.Array(min_size=0, + max_size=20, + element_type=Model.Boolean()), + is_mandatory=False) + members1["2"] = Model.Param( + name="arrayOfEnum1", + param_type=Model.Array(min_size=0, + max_size=20, + element_type=enum1), + is_mandatory=False) + members1["3"] = Model.Param( + name="arrayOfEnum3", + param_type=Model.Array(min_size=10, + max_size=40, + element_type=enum3), + is_mandatory=True) + members1["4"] = Model.Param( + name="arrayOfEnum4", + param_type=Model.Array( + min_size=10, + max_size=41, + element_type=Model.EnumSubset( + name="sub1", + enum=enum1, + allowed_elements={"e1": elements1["name1"]}))) + members1["5"] = Model.Param( + name="arrayOfEnum5", + param_type=Model.Array( + min_size=10, + max_size=42, + element_type=Model.EnumSubset( + name="sub2", + enum=enum1, + allowed_elements={"e1": elements1["name2"]}))) + members1["6"] = Model.Param( + name="arrayOfEnum6", + param_type=Model.Array( + min_size=10, + max_size=43, + element_type=Model.EnumSubset( + name="sub3", + enum=enum4, + allowed_elements={"e1": elements4["name2"]}))) + + structs = collections.OrderedDict() + structs["Struct1"] = Model.Struct( + name="Struct1", + design_description=DESIGN_DESCRIPTION, + issues=ISSUES, + members=members1) + structs["Struct2"] = Model.Struct(name="Struct2", + issues=ISSUES) + + interface = Model.Interface(enums=enums, + structs=structs, + functions=functions, + params={"param1": "value1", + "param2": "value2"}) + + os.path.exists = MagicMock(return_value=True) + uuid.uuid1 = MagicMock( + return_value=uuid.UUID("12345678123456781234567812345678")) + codecs.open = MagicMock() + + generator.generate(interface=interface, + filename="Test.xml", + namespace="XXX::YYY::ZZZ", + destination_dir="/some/test/dir") + + os.path.exists.assert_has_calls([call('/some/test/dir')]) + + open_result = codecs.open + mock_calls = open_result.mock_calls + + self.assertEqual(mock_calls[0], + call('/some/test/dir/Test.h', + mode='w', + encoding='utf-8'), + "Invalid header file creation") + + self.assertEqual(mock_calls[4], + call('/some/test/dir/Test.cc', + mode='w', + encoding='utf-8'), + "Invalid source file creation") + + self.assertEqual(str(mock_calls[2])[27:-2].replace("\\n", "\n"), + expected_h_file_content, + "Invalid header file content") + + self.assertEqual(str(mock_calls[6])[27:-2].replace("\\n", "\n"), + expected_cc_file_content, + "Invalid source file content") diff --git a/tools/InterfaceGenerator/test/generator/generators/test_SmartFactorySDLRPC.py b/tools/InterfaceGenerator/test/generator/generators/test_SmartFactorySDLRPC.py new file mode 100755 index 000000000..111ffb3cb --- /dev/null +++ b/tools/InterfaceGenerator/test/generator/generators/test_SmartFactorySDLRPC.py @@ -0,0 +1,325 @@ +"""Test for SDLRPC SmartFactory generator. + +Verifies format specific functions and produced source code. + +""" +import collections +import codecs +import os +import unittest +import uuid + +from mock import MagicMock +from mock import call + +from generator.generators import SmartFactorySDLRPC +from generator import Model + + +EXPECTED_NOTIFICATION_RESULT = ( + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_FUNCTION_ID] = CObjectSchemaItem::SMember(""" + u"""TEnumSchemaItem<FunctionID::eType>::create(""" + u"""function_id_items), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(""" + u"""TEnumSchemaItem<messageType::eType>::create(""" + u"""message_type_items), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""" + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""") + +EXPECTED_REQ_RESP_RESULT = "".join([EXPECTED_NOTIFICATION_RESULT, ( + u"""params_members[NsSmartDeviceLink::NsJSONHandler::""" + u"""strings::S_CORRELATION_ID] = CObjectSchemaItem::SMember(""" + u"""TNumberSchemaItem<int>::create(), true);\n""")]) + +DESCRIPTION = [u"Description Line1", u"Description Line2"] + +DESIGN_DESCRIPTION = [u"Design Line1"] + +ISSUES = [Model.Issue(value=u"Issue1"), + Model.Issue(value=u"Issue2"), + Model.Issue(value=u"Issue3")] + +TODOS = [u"Do1", u"Do2"] + + +class Test(unittest.TestCase): + + """Test for SLDRPC SmartFactory generator. + + This class holds set of test cases for the SDLRPC SmartFactory generator. + + """ + + def test_gen_schema_params_fill(self): + """Test feature that allows to create format specific PARAMS. + + Verifies SDLRPC implementation of the _gen_schema_params_fill + method. + + """ + + generator = SmartFactorySDLRPC.CodeGenerator() + + self.assertEqual(generator._gen_schema_params_fill("request"), + EXPECTED_REQ_RESP_RESULT, + "Invalid code generation for request") + + self.assertEqual(generator._gen_schema_params_fill(u"request"), + EXPECTED_REQ_RESP_RESULT, + "Invalid code generation for request") + + self.assertEqual(generator._gen_schema_params_fill("response"), + EXPECTED_REQ_RESP_RESULT, + "Invalid code generation for response") + + self.assertEqual(generator._gen_schema_params_fill(u"response"), + EXPECTED_REQ_RESP_RESULT, + "Invalid code generation for response") + + self.assertEqual(generator._gen_schema_params_fill("notification"), + EXPECTED_NOTIFICATION_RESULT, + "Invalid code generation for notification") + + self.assertEqual(generator._gen_schema_params_fill(u"notification"), + EXPECTED_NOTIFICATION_RESULT, + "Invalid code generation for notification") + + self.assertEqual(generator._gen_schema_params_fill("some text"), + EXPECTED_REQ_RESP_RESULT, + "Invalid code generation") + + self.assertEqual(generator._gen_schema_params_fill(u"some text"), + EXPECTED_REQ_RESP_RESULT, + "Invalid code generation") + + def test_full_generation(self): + """Test full generation using SDLPRC SmartSchema generator. + + Creates output files which is captured by the mock and compare them + with sample files with correct code. This test requires valid + test_expected_sdlrpc.h and test_expected_sdlrpc.cc in the same as + this module. + + """ + + expected_h_file_content = open("test_expected_sdlrpc.h", "r").read() + expected_cc_file_content = open("test_expected_sdlrpc.cc", "r").read() + + generator = SmartFactorySDLRPC.CodeGenerator() + + message_type_elements = collections.OrderedDict() + message_type_elements[u"request"] = Model.EnumElement(name=u"request") + message_type_elements[u"response"] = Model.EnumElement( + name=u"response") + message_type_elements[u"notification"] = Model.EnumElement( + name=u"notification") + + message_type = Model.Enum(name=u"messageType", + elements=message_type_elements) + + elements1 = collections.OrderedDict() + elements1[u"name1"] = Model.EnumElement( + name=u"name1", + design_description=DESIGN_DESCRIPTION, + todos=TODOS, + value=u"1") + elements1[u"name2"] = Model.EnumElement( + name="name2", + description=DESCRIPTION, + issues=ISSUES, + internal_name=u"internal_name2") + + enum1 = Model.Enum(name=u"Enum1", + todos=TODOS, + elements=elements1) + + elements2 = collections.OrderedDict() + elements2[u"xxx"] = Model.EnumElement(name=u"xxx", + internal_name=u"val_1") + elements2[u"yyy"] = Model.EnumElement(name=u"yyy", + internal_name=u"val_2", + value=u"100") + elements2[u"zzz"] = Model.EnumElement(name=u"val_3") + + enum2 = Model.Enum(name=u"E2", + elements=elements2) + + elements3 = collections.OrderedDict() + elements3["1"] = Model.EnumElement(name="xxx", + internal_name="_1") + elements3["2"] = Model.EnumElement(name="xxx", + internal_name="_2") + elements3["3"] = Model.EnumElement(name="xxx", + internal_name="_3") + enum3 = Model.Enum(name="Enum_new2", + elements=elements3) + + elements4 = collections.OrderedDict() + elements4["name1"] = Model.EnumElement(name="xxx", + internal_name="_11") + elements4["name2"] = Model.EnumElement(name="xxx", + internal_name="_22") + enum4 = Model.Enum(name="Enum_new4", + elements=elements4) + + enums = collections.OrderedDict() + enums["Enum1"] = enum1 + enums["Enum2"] = enum2 + enums["Enum3"] = enum3 + enums["Enum4"] = enum4 + enums["messageType"] = message_type + + params1 = collections.OrderedDict() + params1["1"] = Model.FunctionParam( + name="param1", + design_description=DESIGN_DESCRIPTION, + description=DESCRIPTION, + issues=ISSUES, + todos=TODOS, + param_type=enum4, + default_value=elements4["name1"]) + params1["2"] = Model.FunctionParam( + name="param2", + param_type=Model.EnumSubset( + name="sub1", + enum=enum1, + allowed_elements={"e1": elements1["name1"]}), + default_value=elements1["name1"]) + + functions = collections.OrderedDict() + functions["Function1"] = Model.Function( + name="Function1", + function_id=elements1["name1"], + message_type=message_type_elements["request"], + params=params1) + functions["Function2"] = Model.Function( + name="Function2", + function_id=elements2["xxx"], + message_type=message_type_elements["response"]) + functions["Function3"] = Model.Function( + name="Function2", + function_id=elements2["yyy"], + message_type=message_type_elements["notification"]) + + members1 = collections.OrderedDict() + members1["m1"] = Model.Param(name="intParam", + param_type=Model.Integer(max_value=2)) + members1["m11"] = Model.Param(name="doubleParam", + param_type=Model.Double(min_value=0.333), + is_mandatory=False) + members1["m222"] = Model.Param(name="boolParam", + param_type=Model.Boolean()) + members1["m2"] = Model.Param(name="structParam", + param_type=Model.Struct(name="Struct2")) + members1["aaa"] = Model.Param(name="enumParam", + param_type=enum1) + members1["bbb"] = Model.Param(name="enumParam1", + param_type=enum1) + members1["xxx"] = Model.Param( + name="enumSubset1", + param_type=Model.EnumSubset( + name="sub", + enum=enum1, + allowed_elements={"e1": elements1["name1"]}), + is_mandatory=False) + members1["1"] = Model.Param( + name="arrayOfInt", + param_type=Model.Array(min_size=0, + max_size=20, + element_type=Model.Boolean()), + is_mandatory=False) + members1["2"] = Model.Param( + name="arrayOfEnum1", + param_type=Model.Array(min_size=0, + max_size=20, + element_type=enum1), + is_mandatory=False) + members1["3"] = Model.Param( + name="arrayOfEnum3", + param_type=Model.Array(min_size=10, + max_size=40, + element_type=enum3), + is_mandatory=True) + members1["4"] = Model.Param( + name="arrayOfEnum4", + param_type=Model.Array( + min_size=10, + max_size=41, + element_type=Model.EnumSubset( + name="sub1", + enum=enum1, + allowed_elements={"e1": elements1["name1"]}))) + members1["5"] = Model.Param( + name="arrayOfEnum5", + param_type=Model.Array( + min_size=10, + max_size=42, + element_type=Model.EnumSubset( + name="sub2", + enum=enum1, + allowed_elements={"e1": elements1["name2"]}))) + members1["6"] = Model.Param( + name="arrayOfEnum6", + param_type=Model.Array( + min_size=10, + max_size=43, + element_type=Model.EnumSubset( + name="sub3", + enum=enum4, + allowed_elements={"e1": elements4["name2"]}))) + + structs = collections.OrderedDict() + structs["Struct1"] = Model.Struct( + name="Struct1", + design_description=DESIGN_DESCRIPTION, + issues=ISSUES, + members=members1) + structs["Struct2"] = Model.Struct(name="Struct2", + issues=ISSUES) + + interface = Model.Interface(enums=enums, + structs=structs, + functions=functions, + params={"param1": "value1", + "param2": "value2"}) + + os.path.exists = MagicMock(return_value=True) + uuid.uuid1 = MagicMock( + return_value=uuid.UUID("12345678123456781234567812345678")) + codecs.open = MagicMock() + + generator.generate(interface=interface, + filename="Test.xml", + namespace="XXX::YYY::ZZZ", + destination_dir="/some/test/dir") + + os.path.exists.assert_has_calls([call('/some/test/dir')]) + + open_result = codecs.open + mock_calls = open_result.mock_calls + + self.assertEqual(mock_calls[0], + call('/some/test/dir/Test.h', + mode='w', + encoding='utf-8'), + "Invalid header file creation") + + self.assertEqual(mock_calls[4], + call('/some/test/dir/Test.cc', + mode='w', + encoding='utf-8'), + "Invalid source file creation") + + self.assertEqual(str(mock_calls[2])[27:-2].replace("\\n", "\n"), + expected_h_file_content, + "Invalid header file content") + + self.assertEqual(str(mock_calls[6])[27:-2].replace("\\n", "\n"), + expected_cc_file_content, + "Invalid source file content") diff --git a/tools/InterfaceGenerator/test/generator/generators/test_expected_jsonrpc.cc b/tools/InterfaceGenerator/test/generator/generators/test_expected_jsonrpc.cc new file mode 100644 index 000000000..458c27543 --- /dev/null +++ b/tools/InterfaceGenerator/test/generator/generators/test_expected_jsonrpc.cc @@ -0,0 +1,385 @@ +/** + * @file Test.cc + * @brief Generated class Test source file. + * + * This class is a part of SmartObjects solution. It provides + * factory functionallity which allows client to use SmartSchemas + * in accordance with definitions from Test.xml file + */ +// Copyright (c) 2013, Ford Motor Company +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following +// disclaimer in the documentation and/or other materials provided with the +// distribution. +// +// Neither the name of the Ford Motor Company nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +#include <map> +#include <set> + +#include "Test.h" +#include "SmartObjects/CAlwaysTrueSchemaItem.hpp" +#include "SmartObjects/CAlwaysFalseSchemaItem.hpp" +#include "SmartObjects/CArraySchemaItem.hpp" +#include "SmartObjects/CBoolSchemaItem.hpp" +#include "SmartObjects/CObjectSchemaItem.hpp" +#include "SmartObjects/CStringSchemaItem.hpp" +#include "SmartObjects/TEnumSchemaItem.hpp" +#include "SmartObjects/TNumberSchemaItem.hpp" +#include "SmartObjects/TSchemaItemParameter.hpp" + +using namespace NsSmartDeviceLink::NsSmartObjects; + +XXX::YYY::ZZZ::Test::Test() + : CSmartFactory<FunctionID::eType, messageType::eType, StructIdentifiers::eType>() { + TStructsSchemaItems struct_schema_items; + InitStructSchemes(struct_schema_items); + + std::set<FunctionID::eType> function_id_items; + + + std::set<messageType::eType> message_type_items; + message_type_items.insert(messageType::request); + message_type_items.insert(messageType::response); + message_type_items.insert(messageType::notification); + message_type_items.insert(messageType::error_response); + + InitFunctionSchemes(struct_schema_items, function_id_items, message_type_items); +} + +TSharedPtr<ISchemaItem> XXX::YYY::ZZZ::Test::ProvideObjectSchemaItemForStruct( + const TStructsSchemaItems &struct_schema_items, + const StructIdentifiers::eType struct_id) { + const TStructsSchemaItems::const_iterator it = struct_schema_items.find(struct_id); + if (it != struct_schema_items.end()) { + return it->second; + } + + return NsSmartDeviceLink::NsSmartObjects::CAlwaysFalseSchemaItem::create(); +} + +void XXX::YYY::ZZZ::Test::InitStructSchemes( + TStructsSchemaItems &struct_schema_items) { + TSharedPtr<ISchemaItem> struct_schema_item_Struct2 = InitStructSchemaItem_Struct2(struct_schema_items); + struct_schema_items.insert(std::make_pair(StructIdentifiers::Struct2, struct_schema_item_Struct2)); + structs_schemes_.insert(std::make_pair(StructIdentifiers::Struct2, CSmartSchema(struct_schema_item_Struct2))); + + TSharedPtr<ISchemaItem> struct_schema_item_Struct1 = InitStructSchemaItem_Struct1(struct_schema_items); + struct_schema_items.insert(std::make_pair(StructIdentifiers::Struct1, struct_schema_item_Struct1)); + structs_schemes_.insert(std::make_pair(StructIdentifiers::Struct1, CSmartSchema(struct_schema_item_Struct1))); +} + +void XXX::YYY::ZZZ::Test::InitFunctionSchemes( + const TStructsSchemaItems &struct_schema_items, + const std::set<FunctionID::eType> &function_id_items, + const std::set<messageType::eType> &message_type_items) { + std::map<std::string, CObjectSchemaItem::SMember> params_members; + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_FUNCTION_ID] = CObjectSchemaItem::SMember(TEnumSchemaItem<FunctionID::eType>::create(function_id_items), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(TEnumSchemaItem<messageType::eType>::create(message_type_items), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_CORRELATION_ID] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::kCode] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::kMessage] = CObjectSchemaItem::SMember(CStringSchemaItem::create(), true); + + std::map<std::string, CObjectSchemaItem::SMember> root_members_map; + root_members_map[NsSmartDeviceLink::NsJSONHandler::strings::S_PARAMS] = CObjectSchemaItem::SMember(CObjectSchemaItem::create(params_members), true); + + CSmartSchema error_response_schema(CObjectSchemaItem::create(root_members_map)); + + functions_schemes_.insert(std::make_pair(NsSmartDeviceLink::NsJSONHandler::SmartSchemaKey<FunctionID::eType, messageType::eType>(FunctionID::val_1, messageType::error_response), error_response_schema)); + + functions_schemes_.insert(std::make_pair(NsSmartDeviceLink::NsJSONHandler::SmartSchemaKey<FunctionID::eType, messageType::eType>(FunctionID::name1, messageType::request), InitFunction_name1_request(struct_schema_items, function_id_items, message_type_items))); + functions_schemes_.insert(std::make_pair(NsSmartDeviceLink::NsJSONHandler::SmartSchemaKey<FunctionID::eType, messageType::eType>(FunctionID::val_1, messageType::response), InitFunction_val_1_response(struct_schema_items, function_id_items, message_type_items))); + functions_schemes_.insert(std::make_pair(NsSmartDeviceLink::NsJSONHandler::SmartSchemaKey<FunctionID::eType, messageType::eType>(FunctionID::val_2, messageType::notification), InitFunction_val_2_notification(struct_schema_items, function_id_items, message_type_items))); +} + +//------------- Functions schemes initialization ------------- + +CSmartSchema XXX::YYY::ZZZ::Test::InitFunction_name1_request( + const TStructsSchemaItems &struct_schema_items, + const std::set<FunctionID::eType> &function_id_items, + const std::set<messageType::eType> &message_type_items) { + std::set<Enum_new4::eType> Enum_new4_all_enum_values; + Enum_new4_all_enum_values.insert(Enum_new4::_11); + Enum_new4_all_enum_values.insert(Enum_new4::_22); + + std::set<Enum1::eType> param2_allowed_enum_subset_values; + param2_allowed_enum_subset_values.insert(Enum1::name1); + + // Function parameter param1. + // + // Description Line1 + // Description Line2 + // + // Design Line1 + // + // Note: Issue1 + // Note: Issue2 + // Note: Issue3 + // + // ToDo: Do1 + // ToDo: Do2 + TSharedPtr<ISchemaItem> param1_SchemaItem = TEnumSchemaItem<Enum_new4::eType>::create(Enum_new4_all_enum_values, TSchemaItemParameter<Enum_new4::eType>(Enum_new4::_11)); + + // Function parameter param2. + TSharedPtr<ISchemaItem> param2_SchemaItem = TEnumSchemaItem<Enum1::eType>::create(param2_allowed_enum_subset_values, TSchemaItemParameter<Enum1::eType>(name1)); + + std::map<std::string, CObjectSchemaItem::SMember> schema_members; + + schema_members["param1"] = CObjectSchemaItem::SMember(param1_SchemaItem, true); + schema_members["param2"] = CObjectSchemaItem::SMember(param2_SchemaItem, true); + + std::map<std::string, CObjectSchemaItem::SMember> params_members; + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_FUNCTION_ID] = CObjectSchemaItem::SMember(TEnumSchemaItem<FunctionID::eType>::create(function_id_items), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(TEnumSchemaItem<messageType::eType>::create(message_type_items), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_CORRELATION_ID] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + + std::map<std::string, CObjectSchemaItem::SMember> root_members_map; + root_members_map[NsSmartDeviceLink::NsJSONHandler::strings::S_MSG_PARAMS] = CObjectSchemaItem::SMember(CObjectSchemaItem::create(schema_members), true); + root_members_map[NsSmartDeviceLink::NsJSONHandler::strings::S_PARAMS] = CObjectSchemaItem::SMember(CObjectSchemaItem::create(params_members), true); + + return CSmartSchema(CObjectSchemaItem::create(root_members_map)); +} + +CSmartSchema XXX::YYY::ZZZ::Test::InitFunction_val_1_response( + const TStructsSchemaItems &struct_schema_items, + const std::set<FunctionID::eType> &function_id_items, + const std::set<messageType::eType> &message_type_items) { + std::map<std::string, CObjectSchemaItem::SMember> schema_members; + + std::map<std::string, CObjectSchemaItem::SMember> params_members; + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_FUNCTION_ID] = CObjectSchemaItem::SMember(TEnumSchemaItem<FunctionID::eType>::create(function_id_items), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(TEnumSchemaItem<messageType::eType>::create(message_type_items), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_CORRELATION_ID] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::kCode] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + + std::map<std::string, CObjectSchemaItem::SMember> root_members_map; + root_members_map[NsSmartDeviceLink::NsJSONHandler::strings::S_MSG_PARAMS] = CObjectSchemaItem::SMember(CObjectSchemaItem::create(schema_members), true); + root_members_map[NsSmartDeviceLink::NsJSONHandler::strings::S_PARAMS] = CObjectSchemaItem::SMember(CObjectSchemaItem::create(params_members), true); + + return CSmartSchema(CObjectSchemaItem::create(root_members_map)); +} + +CSmartSchema XXX::YYY::ZZZ::Test::InitFunction_val_2_notification( + const TStructsSchemaItems &struct_schema_items, + const std::set<FunctionID::eType> &function_id_items, + const std::set<messageType::eType> &message_type_items) { + std::map<std::string, CObjectSchemaItem::SMember> schema_members; + + std::map<std::string, CObjectSchemaItem::SMember> params_members; + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_FUNCTION_ID] = CObjectSchemaItem::SMember(TEnumSchemaItem<FunctionID::eType>::create(function_id_items), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(TEnumSchemaItem<messageType::eType>::create(message_type_items), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + + std::map<std::string, CObjectSchemaItem::SMember> root_members_map; + root_members_map[NsSmartDeviceLink::NsJSONHandler::strings::S_MSG_PARAMS] = CObjectSchemaItem::SMember(CObjectSchemaItem::create(schema_members), true); + root_members_map[NsSmartDeviceLink::NsJSONHandler::strings::S_PARAMS] = CObjectSchemaItem::SMember(CObjectSchemaItem::create(params_members), true); + + return CSmartSchema(CObjectSchemaItem::create(root_members_map)); +} + +//----------- Structs schema items initialization ------------ + +TSharedPtr<ISchemaItem> XXX::YYY::ZZZ::Test::InitStructSchemaItem_Struct1( + const TStructsSchemaItems &struct_schema_items) { + std::set<Enum1::eType> Enum1_all_enum_values; + Enum1_all_enum_values.insert(Enum1::name1); + Enum1_all_enum_values.insert(Enum1::internal_name2); + + std::set<Enum1::eType> enumSubset1_allowed_enum_subset_values; + enumSubset1_allowed_enum_subset_values.insert(Enum1::name1); + + std::set<Enum_new2::eType> Enum_new2_all_enum_values; + Enum_new2_all_enum_values.insert(Enum_new2::_1); + Enum_new2_all_enum_values.insert(Enum_new2::_2); + Enum_new2_all_enum_values.insert(Enum_new2::_3); + + std::set<Enum1::eType> sub1_allowed_enum_subset_values; + sub1_allowed_enum_subset_values.insert(Enum1::name1); + + std::set<Enum1::eType> sub2_allowed_enum_subset_values; + sub2_allowed_enum_subset_values.insert(Enum1::internal_name2); + + std::set<Enum_new4::eType> sub3_allowed_enum_subset_values; + sub3_allowed_enum_subset_values.insert(Enum_new4::_22); + + // Struct member intParam. + TSharedPtr<ISchemaItem> intParam_SchemaItem = TNumberSchemaItem<int>::create(TSchemaItemParameter<int>(), TSchemaItemParameter<int>(2), TSchemaItemParameter<int>()); + + // Struct member doubleParam. + TSharedPtr<ISchemaItem> doubleParam_SchemaItem = TNumberSchemaItem<double>::create(TSchemaItemParameter<double>(0.333), TSchemaItemParameter<double>(), TSchemaItemParameter<double>()); + + // Struct member boolParam. + TSharedPtr<ISchemaItem> boolParam_SchemaItem = CBoolSchemaItem::create(TSchemaItemParameter<bool>()); + + // Struct member structParam. + TSharedPtr<ISchemaItem> structParam_SchemaItem = ProvideObjectSchemaItemForStruct(struct_schema_items, StructIdentifiers::Struct2); + + // Struct member enumParam. + TSharedPtr<ISchemaItem> enumParam_SchemaItem = TEnumSchemaItem<Enum1::eType>::create(Enum1_all_enum_values, TSchemaItemParameter<Enum1::eType>()); + + // Struct member enumParam1. + TSharedPtr<ISchemaItem> enumParam1_SchemaItem = TEnumSchemaItem<Enum1::eType>::create(Enum1_all_enum_values, TSchemaItemParameter<Enum1::eType>()); + + // Struct member enumSubset1. + TSharedPtr<ISchemaItem> enumSubset1_SchemaItem = TEnumSchemaItem<Enum1::eType>::create(enumSubset1_allowed_enum_subset_values, TSchemaItemParameter<Enum1::eType>()); + + // Struct member arrayOfInt. + TSharedPtr<ISchemaItem> arrayOfInt_SchemaItem = CArraySchemaItem::create(CBoolSchemaItem::create(TSchemaItemParameter<bool>()), TSchemaItemParameter<size_t>(0), TSchemaItemParameter<size_t>(20)); + + // Struct member arrayOfEnum1. + TSharedPtr<ISchemaItem> arrayOfEnum1_SchemaItem = CArraySchemaItem::create(TEnumSchemaItem<Enum1::eType>::create(Enum1_all_enum_values, TSchemaItemParameter<Enum1::eType>()), TSchemaItemParameter<size_t>(0), TSchemaItemParameter<size_t>(20)); + + // Struct member arrayOfEnum3. + TSharedPtr<ISchemaItem> arrayOfEnum3_SchemaItem = CArraySchemaItem::create(TEnumSchemaItem<Enum_new2::eType>::create(Enum_new2_all_enum_values, TSchemaItemParameter<Enum_new2::eType>()), TSchemaItemParameter<size_t>(10), TSchemaItemParameter<size_t>(40)); + + // Struct member arrayOfEnum4. + TSharedPtr<ISchemaItem> arrayOfEnum4_SchemaItem = CArraySchemaItem::create(TEnumSchemaItem<Enum1::eType>::create(sub1_allowed_enum_subset_values, TSchemaItemParameter<Enum1::eType>()), TSchemaItemParameter<size_t>(10), TSchemaItemParameter<size_t>(41)); + + // Struct member arrayOfEnum5. + TSharedPtr<ISchemaItem> arrayOfEnum5_SchemaItem = CArraySchemaItem::create(TEnumSchemaItem<Enum1::eType>::create(sub2_allowed_enum_subset_values, TSchemaItemParameter<Enum1::eType>()), TSchemaItemParameter<size_t>(10), TSchemaItemParameter<size_t>(42)); + + // Struct member arrayOfEnum6. + TSharedPtr<ISchemaItem> arrayOfEnum6_SchemaItem = CArraySchemaItem::create(TEnumSchemaItem<Enum_new4::eType>::create(sub3_allowed_enum_subset_values, TSchemaItemParameter<Enum_new4::eType>()), TSchemaItemParameter<size_t>(10), TSchemaItemParameter<size_t>(43)); + + std::map<std::string, CObjectSchemaItem::SMember> schema_members; + + schema_members["intParam"] = CObjectSchemaItem::SMember(intParam_SchemaItem, true); + schema_members["doubleParam"] = CObjectSchemaItem::SMember(doubleParam_SchemaItem, false); + schema_members["boolParam"] = CObjectSchemaItem::SMember(boolParam_SchemaItem, true); + schema_members["structParam"] = CObjectSchemaItem::SMember(structParam_SchemaItem, true); + schema_members["enumParam"] = CObjectSchemaItem::SMember(enumParam_SchemaItem, true); + schema_members["enumParam1"] = CObjectSchemaItem::SMember(enumParam1_SchemaItem, true); + schema_members["enumSubset1"] = CObjectSchemaItem::SMember(enumSubset1_SchemaItem, false); + schema_members["arrayOfInt"] = CObjectSchemaItem::SMember(arrayOfInt_SchemaItem, false); + schema_members["arrayOfEnum1"] = CObjectSchemaItem::SMember(arrayOfEnum1_SchemaItem, false); + schema_members["arrayOfEnum3"] = CObjectSchemaItem::SMember(arrayOfEnum3_SchemaItem, true); + schema_members["arrayOfEnum4"] = CObjectSchemaItem::SMember(arrayOfEnum4_SchemaItem, true); + schema_members["arrayOfEnum5"] = CObjectSchemaItem::SMember(arrayOfEnum5_SchemaItem, true); + schema_members["arrayOfEnum6"] = CObjectSchemaItem::SMember(arrayOfEnum6_SchemaItem, true); + + return CObjectSchemaItem::create(schema_members); +} + +TSharedPtr<ISchemaItem> XXX::YYY::ZZZ::Test::InitStructSchemaItem_Struct2( + const TStructsSchemaItems &struct_schema_items) { + std::map<std::string, CObjectSchemaItem::SMember> schema_members; + + return CObjectSchemaItem::create(schema_members); +} + +//-------------- String to value enum mapping ---------------- + +namespace NsSmartDeviceLink { +namespace NsSmartObjects { + +template <> +const std::map<XXX::YYY::ZZZ::Enum1::eType, std::string> &TEnumSchemaItem<XXX::YYY::ZZZ::Enum1::eType>::getEnumElementsStringRepresentation() { + static bool is_initialized = false; + static std::map<XXX::YYY::ZZZ::Enum1::eType, std::string> enum_string_representation; + + if (false == is_initialized) { + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::Enum1::name1, "name1")); + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::Enum1::internal_name2, "name2")); + + is_initialized = true; + } + + return enum_string_representation; +} + +template <> +const std::map<XXX::YYY::ZZZ::E2::eType, std::string> &TEnumSchemaItem<XXX::YYY::ZZZ::E2::eType>::getEnumElementsStringRepresentation() { + static bool is_initialized = false; + static std::map<XXX::YYY::ZZZ::E2::eType, std::string> enum_string_representation; + + if (false == is_initialized) { + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::E2::val_1, "xxx")); + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::E2::val_2, "yyy")); + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::E2::val_3, "val_3")); + + is_initialized = true; + } + + return enum_string_representation; +} + +template <> +const std::map<XXX::YYY::ZZZ::Enum_new2::eType, std::string> &TEnumSchemaItem<XXX::YYY::ZZZ::Enum_new2::eType>::getEnumElementsStringRepresentation() { + static bool is_initialized = false; + static std::map<XXX::YYY::ZZZ::Enum_new2::eType, std::string> enum_string_representation; + + if (false == is_initialized) { + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::Enum_new2::_1, "xxx")); + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::Enum_new2::_2, "xxx")); + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::Enum_new2::_3, "xxx")); + + is_initialized = true; + } + + return enum_string_representation; +} + +template <> +const std::map<XXX::YYY::ZZZ::Enum_new4::eType, std::string> &TEnumSchemaItem<XXX::YYY::ZZZ::Enum_new4::eType>::getEnumElementsStringRepresentation() { + static bool is_initialized = false; + static std::map<XXX::YYY::ZZZ::Enum_new4::eType, std::string> enum_string_representation; + + if (false == is_initialized) { + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::Enum_new4::_11, "xxx")); + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::Enum_new4::_22, "xxx")); + + is_initialized = true; + } + + return enum_string_representation; +} + +template <> +const std::map<XXX::YYY::ZZZ::messageType::eType, std::string> &TEnumSchemaItem<XXX::YYY::ZZZ::messageType::eType>::getEnumElementsStringRepresentation() { + static bool is_initialized = false; + static std::map<XXX::YYY::ZZZ::messageType::eType, std::string> enum_string_representation; + + if (false == is_initialized) { + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::messageType::request, "request")); + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::messageType::response, "response")); + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::messageType::notification, "notification")); + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::messageType::error_response, "error_response")); + + is_initialized = true; + } + + return enum_string_representation; +} + +} // NsSmartObjects +} // NsSmartDeviceLink + diff --git a/tools/InterfaceGenerator/test/generator/generators/test_expected_jsonrpc.h b/tools/InterfaceGenerator/test/generator/generators/test_expected_jsonrpc.h new file mode 100644 index 000000000..b26560348 --- /dev/null +++ b/tools/InterfaceGenerator/test/generator/generators/test_expected_jsonrpc.h @@ -0,0 +1,326 @@ +/** + * @file Test.h + * @brief Generated class Test header file. + * + * This class is a part of SmartObjects solution. It provides + * factory functionallity which allows client to use SmartSchemas + * in accordance with definitions from Test.xml file + */ +// Copyright (c) 2013, Ford Motor Company +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following +// disclaimer in the documentation and/or other materials provided with the +// distribution. +// +// Neither the name of the Ford Motor Company nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +#ifndef __CSMARTFACTORY_TEST_12345678123456781234567812345678_H__ +#define __CSMARTFACTORY_TEST_12345678123456781234567812345678_H__ + +#include "JSONHandler/CSmartFactory.hpp" +#include "SmartObjects/CSmartSchema.hpp" +#include "SmartObjects/ISchemaItem.hpp" +#include "SmartObjects/TSharedPtr.hpp" + +namespace XXX { +namespace YYY { +namespace ZZZ { + +namespace StructIdentifiers { +/** + * @brief Enumeration StructIdentifiers. + */ +enum eType { + /** + * @brief INVALID_ENUM. + */ + INVALID_ENUM = -1, + + /** + * @brief Struct1. + */ + Struct1, + + /** + * @brief Struct2. + */ + Struct2 +}; +} // StructIdentifiers + +namespace Enum1 { +/** + * @brief Enumeration Enum1. + * + * @todo Do1 + * @todo Do2 + */ +enum eType { + /** + * @brief INVALID_ENUM. + */ + INVALID_ENUM = -1, + + /** + * @brief name1. + * + * Design Line1 + * + * @todo Do1 + * @todo Do2 + */ + name1 = 1, + + /** + * @brief internal_name2. + * + * Description Line1 + * Description Line2 + * + * @note Issue1 + * @note Issue2 + * @note Issue3 + */ + internal_name2 +}; +} // Enum1 + +namespace E2 { +/** + * @brief Enumeration E2. + */ +enum eType { + /** + * @brief INVALID_ENUM. + */ + INVALID_ENUM = -1, + + /** + * @brief val_1. + */ + val_1, + + /** + * @brief val_2. + */ + val_2 = 100, + + /** + * @brief val_3. + */ + val_3 +}; +} // E2 + +namespace Enum_new2 { +/** + * @brief Enumeration Enum_new2. + */ +enum eType { + /** + * @brief INVALID_ENUM. + */ + INVALID_ENUM = -1, + + /** + * @brief _1. + */ + _1, + + /** + * @brief _2. + */ + _2, + + /** + * @brief _3. + */ + _3 +}; +} // Enum_new2 + +namespace Enum_new4 { +/** + * @brief Enumeration Enum_new4. + */ +enum eType { + /** + * @brief INVALID_ENUM. + */ + INVALID_ENUM = -1, + + /** + * @brief _11. + */ + _11, + + /** + * @brief _22. + */ + _22 +}; +} // Enum_new4 + +namespace messageType { +/** + * @brief Enumeration messageType. + */ +enum eType { + /** + * @brief INVALID_ENUM. + */ + INVALID_ENUM = -1, + + /** + * @brief request. + */ + request, + + /** + * @brief response. + */ + response, + + /** + * @brief notification. + */ + notification, + + /** + * @brief error_response. + */ + error_response +}; +} // messageType + + +/** + * @brief Class Test. + * + * Params: + * param2 - value2 + * param1 - value1 + */ +class Test : public NsSmartDeviceLink::NsJSONHandler::CSmartFactory<FunctionID::eType, messageType::eType, StructIdentifiers::eType> { + public: + /** + * @brief Constructor. + */ + Test(); + + protected: + /** + * @brief Type that maps of struct IDs to schema items. + */ + typedef std::map<const StructIdentifiers::eType, NsSmartDeviceLink::NsSmartObjects::TSharedPtr<NsSmartDeviceLink::NsSmartObjects::ISchemaItem> > TStructsSchemaItems; + + /** + * @brief Helper that allows to make reference to struct + * + * @param struct_schema_items Struct schema items. + * @param struct_id ID of structure to provide. + * + * @return TSharedPtr of strucute + */ + static NsSmartDeviceLink::NsSmartObjects::TSharedPtr<NsSmartDeviceLink::NsSmartObjects::ISchemaItem> ProvideObjectSchemaItemForStruct( + const TStructsSchemaItems &struct_schema_items, + const StructIdentifiers::eType struct_id); + + /** + * @brief Initializes all struct schemes. + */ + void InitStructSchemes(TStructsSchemaItems &struct_schema_items); + + /** + * @brief Initializes all function schemes. + * + * @param struct_schema_items Struct schema items. + * @param function_id_items Set of all elements of FunctionID enum. + * @param message_type_items Set of all elements of messageType enum. + */ + void InitFunctionSchemes( + const TStructsSchemaItems &struct_schema_items, + const std::set<FunctionID::eType> &function_id_items, + const std::set<messageType::eType> &message_type_items); + + /** + * @brief Method that generates schema for function Function1. + * + * @return NsSmartDeviceLink::NsSmartObjects::CSmartSchema + */ + static NsSmartDeviceLink::NsSmartObjects::CSmartSchema InitFunction_name1_request( + const TStructsSchemaItems &struct_schema_items, + const std::set<FunctionID::eType> &function_id_items, + const std::set<messageType::eType> &message_type_items); + + /** + * @brief Method that generates schema for function Function2. + * + * @return NsSmartDeviceLink::NsSmartObjects::CSmartSchema + */ + static NsSmartDeviceLink::NsSmartObjects::CSmartSchema InitFunction_val_1_response( + const TStructsSchemaItems &struct_schema_items, + const std::set<FunctionID::eType> &function_id_items, + const std::set<messageType::eType> &message_type_items); + + /** + * @brief Method that generates schema for function Function2. + * + * @return NsSmartDeviceLink::NsSmartObjects::CSmartSchema + */ + static NsSmartDeviceLink::NsSmartObjects::CSmartSchema InitFunction_val_2_notification( + const TStructsSchemaItems &struct_schema_items, + const std::set<FunctionID::eType> &function_id_items, + const std::set<messageType::eType> &message_type_items); + + /** + * @brief Method that generates schema item for structure Struct1. + * + * Design Line1 + * + * @note Issue1 + * @note Issue2 + * @note Issue3 + */ + static NsSmartDeviceLink::NsSmartObjects::TSharedPtr<NsSmartDeviceLink::NsSmartObjects::ISchemaItem> InitStructSchemaItem_Struct1( + const TStructsSchemaItems &struct_schema_items); + + /** + * @brief Method that generates schema item for structure Struct2. + * + * @note Issue1 + * @note Issue2 + * @note Issue3 + */ + static NsSmartDeviceLink::NsSmartObjects::TSharedPtr<NsSmartDeviceLink::NsSmartObjects::ISchemaItem> InitStructSchemaItem_Struct2( + const TStructsSchemaItems &struct_schema_items); +}; + +} // XXX +} // YYY +} // ZZZ + +#endif //__CSMARTFACTORY_TEST_12345678123456781234567812345678_H__ + diff --git a/tools/InterfaceGenerator/test/generator/generators/test_expected_sdlrpc.cc b/tools/InterfaceGenerator/test/generator/generators/test_expected_sdlrpc.cc new file mode 100644 index 000000000..53e5b7f78 --- /dev/null +++ b/tools/InterfaceGenerator/test/generator/generators/test_expected_sdlrpc.cc @@ -0,0 +1,366 @@ +/** + * @file Test.cc + * @brief Generated class Test source file. + * + * This class is a part of SmartObjects solution. It provides + * factory functionallity which allows client to use SmartSchemas + * in accordance with definitions from Test.xml file + */ +// Copyright (c) 2013, Ford Motor Company +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following +// disclaimer in the documentation and/or other materials provided with the +// distribution. +// +// Neither the name of the Ford Motor Company nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +#include <map> +#include <set> + +#include "Test.h" +#include "SmartObjects/CAlwaysTrueSchemaItem.hpp" +#include "SmartObjects/CAlwaysFalseSchemaItem.hpp" +#include "SmartObjects/CArraySchemaItem.hpp" +#include "SmartObjects/CBoolSchemaItem.hpp" +#include "SmartObjects/CObjectSchemaItem.hpp" +#include "SmartObjects/CStringSchemaItem.hpp" +#include "SmartObjects/TEnumSchemaItem.hpp" +#include "SmartObjects/TNumberSchemaItem.hpp" +#include "SmartObjects/TSchemaItemParameter.hpp" + +using namespace NsSmartDeviceLink::NsSmartObjects; + +XXX::YYY::ZZZ::Test::Test() + : CSmartFactory<FunctionID::eType, messageType::eType, StructIdentifiers::eType>() { + TStructsSchemaItems struct_schema_items; + InitStructSchemes(struct_schema_items); + + std::set<FunctionID::eType> function_id_items; + + + std::set<messageType::eType> message_type_items; + message_type_items.insert(messageType::request); + message_type_items.insert(messageType::response); + message_type_items.insert(messageType::notification); + + InitFunctionSchemes(struct_schema_items, function_id_items, message_type_items); +} + +TSharedPtr<ISchemaItem> XXX::YYY::ZZZ::Test::ProvideObjectSchemaItemForStruct( + const TStructsSchemaItems &struct_schema_items, + const StructIdentifiers::eType struct_id) { + const TStructsSchemaItems::const_iterator it = struct_schema_items.find(struct_id); + if (it != struct_schema_items.end()) { + return it->second; + } + + return NsSmartDeviceLink::NsSmartObjects::CAlwaysFalseSchemaItem::create(); +} + +void XXX::YYY::ZZZ::Test::InitStructSchemes( + TStructsSchemaItems &struct_schema_items) { + TSharedPtr<ISchemaItem> struct_schema_item_Struct2 = InitStructSchemaItem_Struct2(struct_schema_items); + struct_schema_items.insert(std::make_pair(StructIdentifiers::Struct2, struct_schema_item_Struct2)); + structs_schemes_.insert(std::make_pair(StructIdentifiers::Struct2, CSmartSchema(struct_schema_item_Struct2))); + + TSharedPtr<ISchemaItem> struct_schema_item_Struct1 = InitStructSchemaItem_Struct1(struct_schema_items); + struct_schema_items.insert(std::make_pair(StructIdentifiers::Struct1, struct_schema_item_Struct1)); + structs_schemes_.insert(std::make_pair(StructIdentifiers::Struct1, CSmartSchema(struct_schema_item_Struct1))); +} + +void XXX::YYY::ZZZ::Test::InitFunctionSchemes( + const TStructsSchemaItems &struct_schema_items, + const std::set<FunctionID::eType> &function_id_items, + const std::set<messageType::eType> &message_type_items) { + functions_schemes_.insert(std::make_pair(NsSmartDeviceLink::NsJSONHandler::SmartSchemaKey<FunctionID::eType, messageType::eType>(FunctionID::name1, messageType::request), InitFunction_name1_request(struct_schema_items, function_id_items, message_type_items))); + functions_schemes_.insert(std::make_pair(NsSmartDeviceLink::NsJSONHandler::SmartSchemaKey<FunctionID::eType, messageType::eType>(FunctionID::val_1, messageType::response), InitFunction_val_1_response(struct_schema_items, function_id_items, message_type_items))); + functions_schemes_.insert(std::make_pair(NsSmartDeviceLink::NsJSONHandler::SmartSchemaKey<FunctionID::eType, messageType::eType>(FunctionID::val_2, messageType::notification), InitFunction_val_2_notification(struct_schema_items, function_id_items, message_type_items))); +} + +//------------- Functions schemes initialization ------------- + +CSmartSchema XXX::YYY::ZZZ::Test::InitFunction_name1_request( + const TStructsSchemaItems &struct_schema_items, + const std::set<FunctionID::eType> &function_id_items, + const std::set<messageType::eType> &message_type_items) { + std::set<Enum_new4::eType> Enum_new4_all_enum_values; + Enum_new4_all_enum_values.insert(Enum_new4::_11); + Enum_new4_all_enum_values.insert(Enum_new4::_22); + + std::set<Enum1::eType> param2_allowed_enum_subset_values; + param2_allowed_enum_subset_values.insert(Enum1::name1); + + // Function parameter param1. + // + // Description Line1 + // Description Line2 + // + // Design Line1 + // + // Note: Issue1 + // Note: Issue2 + // Note: Issue3 + // + // ToDo: Do1 + // ToDo: Do2 + TSharedPtr<ISchemaItem> param1_SchemaItem = TEnumSchemaItem<Enum_new4::eType>::create(Enum_new4_all_enum_values, TSchemaItemParameter<Enum_new4::eType>(Enum_new4::_11)); + + // Function parameter param2. + TSharedPtr<ISchemaItem> param2_SchemaItem = TEnumSchemaItem<Enum1::eType>::create(param2_allowed_enum_subset_values, TSchemaItemParameter<Enum1::eType>(name1)); + + std::map<std::string, CObjectSchemaItem::SMember> schema_members; + + schema_members["param1"] = CObjectSchemaItem::SMember(param1_SchemaItem, true); + schema_members["param2"] = CObjectSchemaItem::SMember(param2_SchemaItem, true); + + std::map<std::string, CObjectSchemaItem::SMember> params_members; + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_FUNCTION_ID] = CObjectSchemaItem::SMember(TEnumSchemaItem<FunctionID::eType>::create(function_id_items), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(TEnumSchemaItem<messageType::eType>::create(message_type_items), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_CORRELATION_ID] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + + std::map<std::string, CObjectSchemaItem::SMember> root_members_map; + root_members_map[NsSmartDeviceLink::NsJSONHandler::strings::S_MSG_PARAMS] = CObjectSchemaItem::SMember(CObjectSchemaItem::create(schema_members), true); + root_members_map[NsSmartDeviceLink::NsJSONHandler::strings::S_PARAMS] = CObjectSchemaItem::SMember(CObjectSchemaItem::create(params_members), true); + + return CSmartSchema(CObjectSchemaItem::create(root_members_map)); +} + +CSmartSchema XXX::YYY::ZZZ::Test::InitFunction_val_1_response( + const TStructsSchemaItems &struct_schema_items, + const std::set<FunctionID::eType> &function_id_items, + const std::set<messageType::eType> &message_type_items) { + std::map<std::string, CObjectSchemaItem::SMember> schema_members; + + std::map<std::string, CObjectSchemaItem::SMember> params_members; + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_FUNCTION_ID] = CObjectSchemaItem::SMember(TEnumSchemaItem<FunctionID::eType>::create(function_id_items), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(TEnumSchemaItem<messageType::eType>::create(message_type_items), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_CORRELATION_ID] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + + std::map<std::string, CObjectSchemaItem::SMember> root_members_map; + root_members_map[NsSmartDeviceLink::NsJSONHandler::strings::S_MSG_PARAMS] = CObjectSchemaItem::SMember(CObjectSchemaItem::create(schema_members), true); + root_members_map[NsSmartDeviceLink::NsJSONHandler::strings::S_PARAMS] = CObjectSchemaItem::SMember(CObjectSchemaItem::create(params_members), true); + + return CSmartSchema(CObjectSchemaItem::create(root_members_map)); +} + +CSmartSchema XXX::YYY::ZZZ::Test::InitFunction_val_2_notification( + const TStructsSchemaItems &struct_schema_items, + const std::set<FunctionID::eType> &function_id_items, + const std::set<messageType::eType> &message_type_items) { + std::map<std::string, CObjectSchemaItem::SMember> schema_members; + + std::map<std::string, CObjectSchemaItem::SMember> params_members; + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_FUNCTION_ID] = CObjectSchemaItem::SMember(TEnumSchemaItem<FunctionID::eType>::create(function_id_items), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(TEnumSchemaItem<messageType::eType>::create(message_type_items), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + params_members[NsSmartDeviceLink::NsJSONHandler::strings::S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + + std::map<std::string, CObjectSchemaItem::SMember> root_members_map; + root_members_map[NsSmartDeviceLink::NsJSONHandler::strings::S_MSG_PARAMS] = CObjectSchemaItem::SMember(CObjectSchemaItem::create(schema_members), true); + root_members_map[NsSmartDeviceLink::NsJSONHandler::strings::S_PARAMS] = CObjectSchemaItem::SMember(CObjectSchemaItem::create(params_members), true); + + return CSmartSchema(CObjectSchemaItem::create(root_members_map)); +} + +//----------- Structs schema items initialization ------------ + +TSharedPtr<ISchemaItem> XXX::YYY::ZZZ::Test::InitStructSchemaItem_Struct1( + const TStructsSchemaItems &struct_schema_items) { + std::set<Enum1::eType> Enum1_all_enum_values; + Enum1_all_enum_values.insert(Enum1::name1); + Enum1_all_enum_values.insert(Enum1::internal_name2); + + std::set<Enum1::eType> enumSubset1_allowed_enum_subset_values; + enumSubset1_allowed_enum_subset_values.insert(Enum1::name1); + + std::set<Enum_new2::eType> Enum_new2_all_enum_values; + Enum_new2_all_enum_values.insert(Enum_new2::_1); + Enum_new2_all_enum_values.insert(Enum_new2::_2); + Enum_new2_all_enum_values.insert(Enum_new2::_3); + + std::set<Enum1::eType> sub1_allowed_enum_subset_values; + sub1_allowed_enum_subset_values.insert(Enum1::name1); + + std::set<Enum1::eType> sub2_allowed_enum_subset_values; + sub2_allowed_enum_subset_values.insert(Enum1::internal_name2); + + std::set<Enum_new4::eType> sub3_allowed_enum_subset_values; + sub3_allowed_enum_subset_values.insert(Enum_new4::_22); + + // Struct member intParam. + TSharedPtr<ISchemaItem> intParam_SchemaItem = TNumberSchemaItem<int>::create(TSchemaItemParameter<int>(), TSchemaItemParameter<int>(2), TSchemaItemParameter<int>()); + + // Struct member doubleParam. + TSharedPtr<ISchemaItem> doubleParam_SchemaItem = TNumberSchemaItem<double>::create(TSchemaItemParameter<double>(0.333), TSchemaItemParameter<double>(), TSchemaItemParameter<double>()); + + // Struct member boolParam. + TSharedPtr<ISchemaItem> boolParam_SchemaItem = CBoolSchemaItem::create(TSchemaItemParameter<bool>()); + + // Struct member structParam. + TSharedPtr<ISchemaItem> structParam_SchemaItem = ProvideObjectSchemaItemForStruct(struct_schema_items, StructIdentifiers::Struct2); + + // Struct member enumParam. + TSharedPtr<ISchemaItem> enumParam_SchemaItem = TEnumSchemaItem<Enum1::eType>::create(Enum1_all_enum_values, TSchemaItemParameter<Enum1::eType>()); + + // Struct member enumParam1. + TSharedPtr<ISchemaItem> enumParam1_SchemaItem = TEnumSchemaItem<Enum1::eType>::create(Enum1_all_enum_values, TSchemaItemParameter<Enum1::eType>()); + + // Struct member enumSubset1. + TSharedPtr<ISchemaItem> enumSubset1_SchemaItem = TEnumSchemaItem<Enum1::eType>::create(enumSubset1_allowed_enum_subset_values, TSchemaItemParameter<Enum1::eType>()); + + // Struct member arrayOfInt. + TSharedPtr<ISchemaItem> arrayOfInt_SchemaItem = CArraySchemaItem::create(CBoolSchemaItem::create(TSchemaItemParameter<bool>()), TSchemaItemParameter<size_t>(0), TSchemaItemParameter<size_t>(20)); + + // Struct member arrayOfEnum1. + TSharedPtr<ISchemaItem> arrayOfEnum1_SchemaItem = CArraySchemaItem::create(TEnumSchemaItem<Enum1::eType>::create(Enum1_all_enum_values, TSchemaItemParameter<Enum1::eType>()), TSchemaItemParameter<size_t>(0), TSchemaItemParameter<size_t>(20)); + + // Struct member arrayOfEnum3. + TSharedPtr<ISchemaItem> arrayOfEnum3_SchemaItem = CArraySchemaItem::create(TEnumSchemaItem<Enum_new2::eType>::create(Enum_new2_all_enum_values, TSchemaItemParameter<Enum_new2::eType>()), TSchemaItemParameter<size_t>(10), TSchemaItemParameter<size_t>(40)); + + // Struct member arrayOfEnum4. + TSharedPtr<ISchemaItem> arrayOfEnum4_SchemaItem = CArraySchemaItem::create(TEnumSchemaItem<Enum1::eType>::create(sub1_allowed_enum_subset_values, TSchemaItemParameter<Enum1::eType>()), TSchemaItemParameter<size_t>(10), TSchemaItemParameter<size_t>(41)); + + // Struct member arrayOfEnum5. + TSharedPtr<ISchemaItem> arrayOfEnum5_SchemaItem = CArraySchemaItem::create(TEnumSchemaItem<Enum1::eType>::create(sub2_allowed_enum_subset_values, TSchemaItemParameter<Enum1::eType>()), TSchemaItemParameter<size_t>(10), TSchemaItemParameter<size_t>(42)); + + // Struct member arrayOfEnum6. + TSharedPtr<ISchemaItem> arrayOfEnum6_SchemaItem = CArraySchemaItem::create(TEnumSchemaItem<Enum_new4::eType>::create(sub3_allowed_enum_subset_values, TSchemaItemParameter<Enum_new4::eType>()), TSchemaItemParameter<size_t>(10), TSchemaItemParameter<size_t>(43)); + + std::map<std::string, CObjectSchemaItem::SMember> schema_members; + + schema_members["intParam"] = CObjectSchemaItem::SMember(intParam_SchemaItem, true); + schema_members["doubleParam"] = CObjectSchemaItem::SMember(doubleParam_SchemaItem, false); + schema_members["boolParam"] = CObjectSchemaItem::SMember(boolParam_SchemaItem, true); + schema_members["structParam"] = CObjectSchemaItem::SMember(structParam_SchemaItem, true); + schema_members["enumParam"] = CObjectSchemaItem::SMember(enumParam_SchemaItem, true); + schema_members["enumParam1"] = CObjectSchemaItem::SMember(enumParam1_SchemaItem, true); + schema_members["enumSubset1"] = CObjectSchemaItem::SMember(enumSubset1_SchemaItem, false); + schema_members["arrayOfInt"] = CObjectSchemaItem::SMember(arrayOfInt_SchemaItem, false); + schema_members["arrayOfEnum1"] = CObjectSchemaItem::SMember(arrayOfEnum1_SchemaItem, false); + schema_members["arrayOfEnum3"] = CObjectSchemaItem::SMember(arrayOfEnum3_SchemaItem, true); + schema_members["arrayOfEnum4"] = CObjectSchemaItem::SMember(arrayOfEnum4_SchemaItem, true); + schema_members["arrayOfEnum5"] = CObjectSchemaItem::SMember(arrayOfEnum5_SchemaItem, true); + schema_members["arrayOfEnum6"] = CObjectSchemaItem::SMember(arrayOfEnum6_SchemaItem, true); + + return CObjectSchemaItem::create(schema_members); +} + +TSharedPtr<ISchemaItem> XXX::YYY::ZZZ::Test::InitStructSchemaItem_Struct2( + const TStructsSchemaItems &struct_schema_items) { + std::map<std::string, CObjectSchemaItem::SMember> schema_members; + + return CObjectSchemaItem::create(schema_members); +} + +//-------------- String to value enum mapping ---------------- + +namespace NsSmartDeviceLink { +namespace NsSmartObjects { + +template <> +const std::map<XXX::YYY::ZZZ::Enum1::eType, std::string> &TEnumSchemaItem<XXX::YYY::ZZZ::Enum1::eType>::getEnumElementsStringRepresentation() { + static bool is_initialized = false; + static std::map<XXX::YYY::ZZZ::Enum1::eType, std::string> enum_string_representation; + + if (false == is_initialized) { + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::Enum1::name1, "name1")); + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::Enum1::internal_name2, "name2")); + + is_initialized = true; + } + + return enum_string_representation; +} + +template <> +const std::map<XXX::YYY::ZZZ::E2::eType, std::string> &TEnumSchemaItem<XXX::YYY::ZZZ::E2::eType>::getEnumElementsStringRepresentation() { + static bool is_initialized = false; + static std::map<XXX::YYY::ZZZ::E2::eType, std::string> enum_string_representation; + + if (false == is_initialized) { + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::E2::val_1, "xxx")); + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::E2::val_2, "yyy")); + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::E2::val_3, "val_3")); + + is_initialized = true; + } + + return enum_string_representation; +} + +template <> +const std::map<XXX::YYY::ZZZ::Enum_new2::eType, std::string> &TEnumSchemaItem<XXX::YYY::ZZZ::Enum_new2::eType>::getEnumElementsStringRepresentation() { + static bool is_initialized = false; + static std::map<XXX::YYY::ZZZ::Enum_new2::eType, std::string> enum_string_representation; + + if (false == is_initialized) { + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::Enum_new2::_1, "xxx")); + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::Enum_new2::_2, "xxx")); + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::Enum_new2::_3, "xxx")); + + is_initialized = true; + } + + return enum_string_representation; +} + +template <> +const std::map<XXX::YYY::ZZZ::Enum_new4::eType, std::string> &TEnumSchemaItem<XXX::YYY::ZZZ::Enum_new4::eType>::getEnumElementsStringRepresentation() { + static bool is_initialized = false; + static std::map<XXX::YYY::ZZZ::Enum_new4::eType, std::string> enum_string_representation; + + if (false == is_initialized) { + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::Enum_new4::_11, "xxx")); + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::Enum_new4::_22, "xxx")); + + is_initialized = true; + } + + return enum_string_representation; +} + +template <> +const std::map<XXX::YYY::ZZZ::messageType::eType, std::string> &TEnumSchemaItem<XXX::YYY::ZZZ::messageType::eType>::getEnumElementsStringRepresentation() { + static bool is_initialized = false; + static std::map<XXX::YYY::ZZZ::messageType::eType, std::string> enum_string_representation; + + if (false == is_initialized) { + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::messageType::request, "request")); + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::messageType::response, "response")); + enum_string_representation.insert(std::make_pair(XXX::YYY::ZZZ::messageType::notification, "notification")); + + is_initialized = true; + } + + return enum_string_representation; +} + +} // NsSmartObjects +} // NsSmartDeviceLink + diff --git a/tools/InterfaceGenerator/test/generator/generators/test_expected_sdlrpc.h b/tools/InterfaceGenerator/test/generator/generators/test_expected_sdlrpc.h new file mode 100644 index 000000000..826ea55ce --- /dev/null +++ b/tools/InterfaceGenerator/test/generator/generators/test_expected_sdlrpc.h @@ -0,0 +1,321 @@ +/** + * @file Test.h + * @brief Generated class Test header file. + * + * This class is a part of SmartObjects solution. It provides + * factory functionallity which allows client to use SmartSchemas + * in accordance with definitions from Test.xml file + */ +// Copyright (c) 2013, Ford Motor Company +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following +// disclaimer in the documentation and/or other materials provided with the +// distribution. +// +// Neither the name of the Ford Motor Company nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +#ifndef __CSMARTFACTORY_TEST_12345678123456781234567812345678_H__ +#define __CSMARTFACTORY_TEST_12345678123456781234567812345678_H__ + +#include "JSONHandler/CSmartFactory.hpp" +#include "SmartObjects/CSmartSchema.hpp" +#include "SmartObjects/ISchemaItem.hpp" +#include "SmartObjects/TSharedPtr.hpp" + +namespace XXX { +namespace YYY { +namespace ZZZ { + +namespace StructIdentifiers { +/** + * @brief Enumeration StructIdentifiers. + */ +enum eType { + /** + * @brief INVALID_ENUM. + */ + INVALID_ENUM = -1, + + /** + * @brief Struct1. + */ + Struct1, + + /** + * @brief Struct2. + */ + Struct2 +}; +} // StructIdentifiers + +namespace Enum1 { +/** + * @brief Enumeration Enum1. + * + * @todo Do1 + * @todo Do2 + */ +enum eType { + /** + * @brief INVALID_ENUM. + */ + INVALID_ENUM = -1, + + /** + * @brief name1. + * + * Design Line1 + * + * @todo Do1 + * @todo Do2 + */ + name1 = 1, + + /** + * @brief internal_name2. + * + * Description Line1 + * Description Line2 + * + * @note Issue1 + * @note Issue2 + * @note Issue3 + */ + internal_name2 +}; +} // Enum1 + +namespace E2 { +/** + * @brief Enumeration E2. + */ +enum eType { + /** + * @brief INVALID_ENUM. + */ + INVALID_ENUM = -1, + + /** + * @brief val_1. + */ + val_1, + + /** + * @brief val_2. + */ + val_2 = 100, + + /** + * @brief val_3. + */ + val_3 +}; +} // E2 + +namespace Enum_new2 { +/** + * @brief Enumeration Enum_new2. + */ +enum eType { + /** + * @brief INVALID_ENUM. + */ + INVALID_ENUM = -1, + + /** + * @brief _1. + */ + _1, + + /** + * @brief _2. + */ + _2, + + /** + * @brief _3. + */ + _3 +}; +} // Enum_new2 + +namespace Enum_new4 { +/** + * @brief Enumeration Enum_new4. + */ +enum eType { + /** + * @brief INVALID_ENUM. + */ + INVALID_ENUM = -1, + + /** + * @brief _11. + */ + _11, + + /** + * @brief _22. + */ + _22 +}; +} // Enum_new4 + +namespace messageType { +/** + * @brief Enumeration messageType. + */ +enum eType { + /** + * @brief INVALID_ENUM. + */ + INVALID_ENUM = -1, + + /** + * @brief request. + */ + request, + + /** + * @brief response. + */ + response, + + /** + * @brief notification. + */ + notification +}; +} // messageType + + +/** + * @brief Class Test. + * + * Params: + * param2 - value2 + * param1 - value1 + */ +class Test : public NsSmartDeviceLink::NsJSONHandler::CSmartFactory<FunctionID::eType, messageType::eType, StructIdentifiers::eType> { + public: + /** + * @brief Constructor. + */ + Test(); + + protected: + /** + * @brief Type that maps of struct IDs to schema items. + */ + typedef std::map<const StructIdentifiers::eType, NsSmartDeviceLink::NsSmartObjects::TSharedPtr<NsSmartDeviceLink::NsSmartObjects::ISchemaItem> > TStructsSchemaItems; + + /** + * @brief Helper that allows to make reference to struct + * + * @param struct_schema_items Struct schema items. + * @param struct_id ID of structure to provide. + * + * @return TSharedPtr of strucute + */ + static NsSmartDeviceLink::NsSmartObjects::TSharedPtr<NsSmartDeviceLink::NsSmartObjects::ISchemaItem> ProvideObjectSchemaItemForStruct( + const TStructsSchemaItems &struct_schema_items, + const StructIdentifiers::eType struct_id); + + /** + * @brief Initializes all struct schemes. + */ + void InitStructSchemes(TStructsSchemaItems &struct_schema_items); + + /** + * @brief Initializes all function schemes. + * + * @param struct_schema_items Struct schema items. + * @param function_id_items Set of all elements of FunctionID enum. + * @param message_type_items Set of all elements of messageType enum. + */ + void InitFunctionSchemes( + const TStructsSchemaItems &struct_schema_items, + const std::set<FunctionID::eType> &function_id_items, + const std::set<messageType::eType> &message_type_items); + + /** + * @brief Method that generates schema for function Function1. + * + * @return NsSmartDeviceLink::NsSmartObjects::CSmartSchema + */ + static NsSmartDeviceLink::NsSmartObjects::CSmartSchema InitFunction_name1_request( + const TStructsSchemaItems &struct_schema_items, + const std::set<FunctionID::eType> &function_id_items, + const std::set<messageType::eType> &message_type_items); + + /** + * @brief Method that generates schema for function Function2. + * + * @return NsSmartDeviceLink::NsSmartObjects::CSmartSchema + */ + static NsSmartDeviceLink::NsSmartObjects::CSmartSchema InitFunction_val_1_response( + const TStructsSchemaItems &struct_schema_items, + const std::set<FunctionID::eType> &function_id_items, + const std::set<messageType::eType> &message_type_items); + + /** + * @brief Method that generates schema for function Function2. + * + * @return NsSmartDeviceLink::NsSmartObjects::CSmartSchema + */ + static NsSmartDeviceLink::NsSmartObjects::CSmartSchema InitFunction_val_2_notification( + const TStructsSchemaItems &struct_schema_items, + const std::set<FunctionID::eType> &function_id_items, + const std::set<messageType::eType> &message_type_items); + + /** + * @brief Method that generates schema item for structure Struct1. + * + * Design Line1 + * + * @note Issue1 + * @note Issue2 + * @note Issue3 + */ + static NsSmartDeviceLink::NsSmartObjects::TSharedPtr<NsSmartDeviceLink::NsSmartObjects::ISchemaItem> InitStructSchemaItem_Struct1( + const TStructsSchemaItems &struct_schema_items); + + /** + * @brief Method that generates schema item for structure Struct2. + * + * @note Issue1 + * @note Issue2 + * @note Issue3 + */ + static NsSmartDeviceLink::NsSmartObjects::TSharedPtr<NsSmartDeviceLink::NsSmartObjects::ISchemaItem> InitStructSchemaItem_Struct2( + const TStructsSchemaItems &struct_schema_items); +}; + +} // XXX +} // YYY +} // ZZZ + +#endif //__CSMARTFACTORY_TEST_12345678123456781234567812345678_H__ + |