diff --git a/Native/OpenDDSharp.IdlGenerator/csharp_cdr_generator.cpp b/Native/OpenDDSharp.IdlGenerator/csharp_cdr_generator.cpp index 8a9bed74..db0e7181 100644 --- a/Native/OpenDDSharp.IdlGenerator/csharp_cdr_generator.cpp +++ b/Native/OpenDDSharp.IdlGenerator/csharp_cdr_generator.cpp @@ -929,10 +929,27 @@ csharp_cdr_generator::implement_to_cdr_field(AST_Type *field_type, std::string f break; } case AST_Decl::NT_struct: { - ret.append(indent); - ret.append(" writer.WriteBytes("); - ret.append(field_name); - ret.append(".ToCDR());\n"); + ret.append(" if ("); + ret.append(field_name); + ret.append(" == null)\n"); + + ret.append(indent); + ret.append(" {\n"); + + ret.append(indent); + ret.append(" "); + ret.append(field_name); + ret.append(" = new "); + ret.append(replaceString(std::string(field_type->full_name()), std::string("::"), std::string("."))); + ret.append("();\n"); + + ret.append(indent); + ret.append(" }\n"); + + ret.append(indent); + ret.append(" "); + ret.append(field_name); + ret.append(".ToCDR(writer);\n"); break; } case AST_Decl::NT_string: { diff --git a/Tests/OpenDDSharp.UnitTest/CodeGeneratorCdrWrapperTest.cs b/Tests/OpenDDSharp.UnitTest/CodeGeneratorCdrWrapperTest.cs index 55477cda..883c5d66 100644 --- a/Tests/OpenDDSharp.UnitTest/CodeGeneratorCdrWrapperTest.cs +++ b/Tests/OpenDDSharp.UnitTest/CodeGeneratorCdrWrapperTest.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Threading; using CdrWrapper; +using CdrWrapperInclude; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenDDSharp.DDS; using OpenDDSharp.UnitTest.Helpers; @@ -74,6 +75,84 @@ public void TestCleanup() #endregion #region Test Methods + /// + /// Test include idl files. + /// + [TestMethod] + [TestCategory(TEST_CATEGORY)] + public void TestInclude() + { + using var evt = new ManualResetEventSlim(false); + + var test = new TestInclude(); + Assert.AreEqual(typeof(IncludeStruct), test.IncludeField.GetType()); + Assert.IsNotNull(test.IncludeField); + Assert.AreEqual(test.IncludeField.Message.GetType(), typeof(string)); + + var typeSupport = new TestIncludeTypeSupport(); + var typeName = typeSupport.GetTypeName(); + var ret = typeSupport.RegisterType(_participant, typeName); + Assert.AreEqual(ReturnCode.Ok, ret); + + var topic = _participant.CreateTopic("TestTopic", typeName); + Assert.IsNotNull(topic); + + var drQos = new DataReaderQos + { + Reliability = + { + Kind = ReliabilityQosPolicyKind.ReliableReliabilityQos, + }, + }; + var dr = _subscriber.CreateDataReader(topic, drQos); + Assert.IsNotNull(dr); + var dataReader = new TestIncludeDataReader(dr); + + var statusCondition = dr.StatusCondition; + Assert.IsNotNull(statusCondition); + statusCondition.EnabledStatuses = StatusKind.DataAvailableStatus; + TestHelper.CreateWaitSetThread(evt, statusCondition); + + var dw = _publisher.CreateDataWriter(topic); + Assert.IsNotNull(dw); + var dataWriter = new TestIncludeDataWriter(dw); + + Assert.IsTrue(dataWriter.WaitForSubscriptions(1, 5000)); + Assert.IsTrue(dataReader.WaitForPublications(1, 5000)); + + test = new TestInclude + { + Id = "1", + IncludeField = new IncludeStruct + { + Message = "Test", + }, + }; + ret = dataWriter.Write(test); + Assert.AreEqual(ReturnCode.Ok, ret); + + ret = dataWriter.WaitForAcknowledgments(new Duration { Seconds = 5 }); + Assert.AreEqual(ReturnCode.Ok, ret); + + Assert.IsTrue(evt.Wait(1_500)); + + var received = new TestInclude(); + var sampleInfo = new SampleInfo(); + ret = dataReader.ReadNextSample(received, sampleInfo); + Assert.AreEqual(ReturnCode.Ok, ret); + + Assert.AreEqual(test.Id, received.Id); + Assert.AreEqual(test.IncludeField.Message, received.IncludeField.Message); + + dr.DeleteContainedEntities(); + _subscriber.DeleteDataReader(dr); + _subscriber.DeleteContainedEntities(); + _publisher.DeleteDataWriter(dw); + _publisher.DeleteContainedEntities(); + _participant.DeleteTopic(topic); + _participant.DeleteContainedEntities(); + } + /// /// Test the code generated for the primitives types. /// diff --git a/Tests/OpenDDSharp.UnitTest/OpenDDSharp.UnitTest.csproj b/Tests/OpenDDSharp.UnitTest/OpenDDSharp.UnitTest.csproj index d1ac2ee2..ac15fbc7 100644 --- a/Tests/OpenDDSharp.UnitTest/OpenDDSharp.UnitTest.csproj +++ b/Tests/OpenDDSharp.UnitTest/OpenDDSharp.UnitTest.csproj @@ -62,8 +62,8 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/Tests/TestIdlCdr/IDL/Test.idl b/Tests/TestIdlCdr/IDL/Test.idl index e591f60b..017fcbea 100644 --- a/Tests/TestIdlCdr/IDL/Test.idl +++ b/Tests/TestIdlCdr/IDL/Test.idl @@ -1,3 +1,5 @@ +#include "TestInclude.idl" + module CdrWrapper { const short TEST_SHORT_CONST = -1; @@ -149,6 +151,12 @@ module CdrWrapper { StructMultiArrayType StructMultiArrayField; }; + @topic + struct TestInclude { + @key string Id; + CdrWrapperInclude::IncludeStruct IncludeField; + }; + @topic struct TestPrimitive { boolean BoolField; diff --git a/Tests/TestIdlCdr/IDL/TestInclude.idl b/Tests/TestIdlCdr/IDL/TestInclude.idl new file mode 100644 index 00000000..e276c221 --- /dev/null +++ b/Tests/TestIdlCdr/IDL/TestInclude.idl @@ -0,0 +1,8 @@ +module CdrWrapperInclude { + + @topic + struct IncludeStruct { + @key string Message; + }; + +}; \ No newline at end of file