From f810594ac7d7bb7ccfb7bf0e20680681c85fe066 Mon Sep 17 00:00:00 2001 From: Uight Date: Thu, 1 Aug 2024 12:08:05 +0200 Subject: [PATCH] #14 Add Immutable dbc class which uses dictionary while keeping old dbc class for backward compatibility --- DbcParserLib.Tests/DbcBuilderTests.cs | 106 +++++++++--------- DbcParserLib.Tests/ParserTests.cs | 61 +++++----- .../PropertiesDefaultParsingFailuresTests.cs | 4 +- .../PropertiesLineParserTests.cs | 20 ++-- .../PropertiesParsingFailuresTests.cs | 4 +- DbcParserLib.Tests/SignalLineParserTests.cs | 2 +- DbcParserLib/Dbc.cs | 42 ++++++- DbcParserLib/DbcBuilder.cs | 29 ++--- DbcParserLib/Model/Message.cs | 7 +- DbcParserLib/Model/Node.cs | 2 +- DbcParserLib/Model/Signal.cs | 10 +- Demo/Form1.cs | 6 +- 12 files changed, 165 insertions(+), 128 deletions(-) diff --git a/DbcParserLib.Tests/DbcBuilderTests.cs b/DbcParserLib.Tests/DbcBuilderTests.cs index dc12bc2..62784c3 100644 --- a/DbcParserLib.Tests/DbcBuilderTests.cs +++ b/DbcParserLib.Tests/DbcBuilderTests.cs @@ -10,18 +10,18 @@ namespace DbcParserLib.Tests [TestFixture] public class DbcBuilderTests { - private MockRepository m_repository; + private MockRepository repository; [SetUp] public void Setup() { - m_repository = new MockRepository(MockBehavior.Strict); + repository = new MockRepository(MockBehavior.Strict); } [TearDown] public void Teardown() { - m_repository.VerifyAll(); + repository.VerifyAll(); } [Test] @@ -101,7 +101,7 @@ public void MessageIsAdded() var builder = new DbcBuilder(new SilentFailureObserver()); var message = new Message { ID = 1}; builder.AddMessage(message); - var dbc = builder.Build(); + var dbc = builder.BuildImmutable(); Assert.IsEmpty(dbc.Nodes); Assert.AreEqual(1, dbc.Messages.Count()); @@ -115,7 +115,7 @@ public void ExtendedMessageIsAdded() var builder = new DbcBuilder(new SilentFailureObserver()); var message = new Message { ID = 2147483649 }; builder.AddMessage(message); - var dbc = builder.Build(); + var dbc = builder.BuildImmutable(); Assert.IsEmpty(dbc.Nodes); Assert.AreEqual(1, dbc.Messages.Count()); @@ -130,7 +130,7 @@ public void CommentIsAddedToMessage() var message = new Message { ID = 234 }; builder.AddMessage(message); builder.AddMessageComment(234, "comment"); - var dbc = builder.Build(); + var dbc = builder.BuildImmutable(); Assert.IsEmpty(dbc.Nodes); Assert.AreEqual(1, dbc.Messages.Count()); @@ -145,7 +145,7 @@ public void CommentIsNotAddedToMissingMessage() var message = new Message { ID = 234 }; builder.AddMessage(message); builder.AddMessageComment(235, "comment"); - var dbc = builder.Build(); + var dbc = builder.BuildImmutable(); Assert.IsEmpty(dbc.Nodes); Assert.AreEqual(1, dbc.Messages.Count()); @@ -172,27 +172,27 @@ public void SignalIsAddedToCurrentMessage() var signal3 = new Signal { Name = "name3" }; builder.AddSignal(signal3); - var dbc = builder.Build(); + var dbc = builder.BuildImmutable(); Assert.IsEmpty(dbc.Nodes); Assert.AreEqual(2, dbc.Messages.Count()); var messagesToArray = dbc.Messages.ToArray(); Assert.AreEqual(234, messagesToArray[0].Value.ID); - Assert.AreEqual(1, messagesToArray[0].Value.Signals.Count()); - Assert.AreEqual("name1", messagesToArray[0].Value.Signals.First().Name); + Assert.AreEqual(1, messagesToArray[0].Value.Signals.Count); + Assert.AreEqual("name1", messagesToArray[0].Value.Signals.First().Value.Name); Assert.AreEqual(235, messagesToArray[1].Value.ID); - Assert.AreEqual(2, messagesToArray[1].Value.Signals.Count()); - Assert.AreEqual("name2", messagesToArray[1].Value.Signals.First().Name); - Assert.AreEqual("name3", messagesToArray[1].Value.Signals.Skip(1).First().Name); + Assert.AreEqual(2, messagesToArray[1].Value.Signals.Count); + Assert.AreEqual("name2", messagesToArray[1].Value.Signals.First().Value.Name); + Assert.AreEqual("name3", messagesToArray[1].Value.Signals.Skip(1).First().Value.Name); } [Test] public void SignalIsNotAddedIfNoMessageHasBeenProvidedFirst() { var builder = new DbcBuilder(new SilentFailureObserver()); - builder.AddSignal(new Signal { }); + builder.AddSignal(new Signal()); var dbc = builder.Build(); Assert.IsEmpty(dbc.Nodes); @@ -209,13 +209,13 @@ public void CommentIsAddedToSignal() builder.AddSignal(signal); builder.AddSignalComment(234, "name1", "comment"); - var dbc = builder.Build(); + var dbc = builder.BuildImmutable(); Assert.IsEmpty(dbc.Nodes); Assert.AreEqual(1, dbc.Messages.Count()); Assert.AreEqual(234, dbc.Messages.First().Value.ID); - Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Name); - Assert.AreEqual("comment", dbc.Messages.First().Value.Signals.First().Comment); + Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name); + Assert.AreEqual("comment", dbc.Messages.First().Value.Signals.First().Value.Comment); } [Test] @@ -228,13 +228,13 @@ public void CommentIsNotAddedToMissingSignalMessageId() builder.AddSignal(signal); builder.AddSignalComment(235, "name1", "comment"); - var dbc = builder.Build(); + var dbc = builder.BuildImmutable(); Assert.IsEmpty(dbc.Nodes); Assert.AreEqual(1, dbc.Messages.Count()); Assert.AreEqual(234, dbc.Messages.First().Value.ID); - Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Name); - Assert.IsNull(dbc.Messages.First().Value.Signals.First().Comment); + Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name); + Assert.IsNull(dbc.Messages.First().Value.Signals.First().Value.Comment); } [Test] @@ -247,13 +247,13 @@ public void CommentIsNotAddedToMissingSignalName() builder.AddSignal(signal); builder.AddSignalComment(234, "name2", "comment"); - var dbc = builder.Build(); + var dbc = builder.BuildImmutable(); Assert.IsEmpty(dbc.Nodes); Assert.AreEqual(1, dbc.Messages.Count()); Assert.AreEqual(234, dbc.Messages.First().Value.ID); - Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Name); - Assert.IsNull(dbc.Messages.First().Value.Signals.First().Comment); + Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name); + Assert.IsNull(dbc.Messages.First().Value.Signals.First().Value.Comment); } [Test] @@ -267,15 +267,15 @@ public void TableValuesAreAddedToSignal() var testValuesDict = new Dictionary() { { 1, "fake" } }; builder.LinkTableValuesToSignal(234, "name1", testValuesDict); - var dbc = builder.Build(); + var dbc = builder.BuildImmutable(); Assert.IsEmpty(dbc.Nodes); Assert.AreEqual(1, dbc.Messages.Count()); Assert.AreEqual(234, dbc.Messages.First().Value.ID); - Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Name); - Assert.AreEqual(testValuesDict, dbc.Messages.First().Value.Signals.First().ValueTableMap); - Assert.AreEqual(1, dbc.Messages.First().Value.Signals.First().ValueTableMap.Keys.First()); - Assert.AreEqual("fake", dbc.Messages.First().Value.Signals.First().ValueTableMap.Values.First()); + Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name); + Assert.AreEqual(testValuesDict, dbc.Messages.First().Value.Signals.First().Value.ValueTableMap); + Assert.AreEqual(1, dbc.Messages.First().Value.Signals.First().Value.ValueTableMap.Keys.First()); + Assert.AreEqual("fake", dbc.Messages.First().Value.Signals.First().Value.ValueTableMap.Values.First()); } [Test] @@ -289,15 +289,15 @@ public void TableValuesWithExtendedMessageIdAreAddedToSignal() var testValuesDict = new Dictionary() { { 1, "fake" } }; builder.LinkTableValuesToSignal(2566896411, "name1", testValuesDict); - var dbc = builder.Build(); + var dbc = builder.BuildImmutable(); Assert.IsEmpty(dbc.Nodes); Assert.AreEqual(1, dbc.Messages.Count()); Assert.AreEqual(message.ID, dbc.Messages.First().Value.ID); - Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Name); - Assert.AreEqual(testValuesDict, dbc.Messages.First().Value.Signals.First().ValueTableMap); - Assert.AreEqual(1, dbc.Messages.First().Value.Signals.First().ValueTableMap.Keys.First()); - Assert.AreEqual("fake", dbc.Messages.First().Value.Signals.First().ValueTableMap.Values.First()); + Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name); + Assert.AreEqual(testValuesDict, dbc.Messages.First().Value.Signals.First().Value.ValueTableMap); + Assert.AreEqual(1, dbc.Messages.First().Value.Signals.First().Value.ValueTableMap.Keys.First()); + Assert.AreEqual("fake", dbc.Messages.First().Value.Signals.First().Value.ValueTableMap.Values.First()); } [Test] @@ -311,13 +311,13 @@ public void TableValueIsNotAddedToMissingSignalMessageId() var testValuesDict = new Dictionary() { { 1, "fake" } }; builder.LinkTableValuesToSignal(235, "name1", testValuesDict); - var dbc = builder.Build(); + var dbc = builder.BuildImmutable(); Assert.IsEmpty(dbc.Nodes); Assert.AreEqual(1, dbc.Messages.Count()); Assert.AreEqual(234, dbc.Messages.First().Value.ID); - Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Name); - Assert.IsEmpty(dbc.Messages.First().Value.Signals.First().ValueTableMap); + Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name); + Assert.IsEmpty(dbc.Messages.First().Value.Signals.First().Value.ValueTableMap); } [Test] @@ -331,13 +331,13 @@ public void TableValueIsNotAddedToMissingSignalName() var testValuesDict = new Dictionary() { { 1, "fake" } }; builder.LinkTableValuesToSignal(234, "name2", testValuesDict); - var dbc = builder.Build(); + var dbc = builder.BuildImmutable(); Assert.IsEmpty(dbc.Nodes); Assert.AreEqual(1, dbc.Messages.Count()); Assert.AreEqual(234, dbc.Messages.First().Value.ID); - Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Name); - Assert.IsEmpty(dbc.Messages.First().Value.Signals.First().ValueTableMap); + Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name); + Assert.IsEmpty(dbc.Messages.First().Value.Signals.First().Value.ValueTableMap); } [Test] @@ -353,15 +353,15 @@ public void NamedTableValuesAreAddedToSignal() builder.AddNamedValueTable("aTableName", testValuesDict); builder.LinkNamedTableToSignal(234, "name1", "aTableName"); - var dbc = builder.Build(); + var dbc = builder.BuildImmutable(); Assert.IsEmpty(dbc.Nodes); Assert.AreEqual(1, dbc.Messages.Count()); Assert.AreEqual(234, dbc.Messages.First().Value.ID); - Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Name); - Assert.AreEqual(testValuesDict, dbc.Messages.First().Value.Signals.First().ValueTableMap); - Assert.AreEqual(1, dbc.Messages.First().Value.Signals.First().ValueTableMap.Keys.First()); - Assert.AreEqual("fake", dbc.Messages.First().Value.Signals.First().ValueTableMap.Values.First()); + Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name); + Assert.AreEqual(testValuesDict, dbc.Messages.First().Value.Signals.First().Value.ValueTableMap); + Assert.AreEqual(1, dbc.Messages.First().Value.Signals.First().Value.ValueTableMap.Keys.First()); + Assert.AreEqual("fake", dbc.Messages.First().Value.Signals.First().Value.ValueTableMap.Values.First()); } [Test] @@ -377,13 +377,13 @@ public void NamedTableValueIsNotAddedToMissingSignalMessageId() builder.AddNamedValueTable("aTableName", testValuesDict); builder.LinkNamedTableToSignal(235, "name1", "aTableName"); - var dbc = builder.Build(); + var dbc = builder.BuildImmutable(); Assert.IsEmpty(dbc.Nodes); Assert.AreEqual(1, dbc.Messages.Count()); Assert.AreEqual(234, dbc.Messages.First().Value.ID); - Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Name); - Assert.IsEmpty(dbc.Messages.First().Value.Signals.First().ValueTableMap); + Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name); + Assert.IsEmpty(dbc.Messages.First().Value.Signals.First().Value.ValueTableMap); } [Test] @@ -399,13 +399,13 @@ public void NamedTableValueIsNotAddedToMissingSignalName() builder.AddNamedValueTable("aTableName", testValuesDict); builder.LinkNamedTableToSignal(234, "name2", "aTableName"); - var dbc = builder.Build(); + var dbc = builder.BuildImmutable(); Assert.IsEmpty(dbc.Nodes); Assert.AreEqual(1, dbc.Messages.Count()); Assert.AreEqual(234, dbc.Messages.First().Value.ID); - Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Name); - Assert.IsEmpty(dbc.Messages.First().Value.Signals.First().ValueTableMap); + Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name); + Assert.IsEmpty(dbc.Messages.First().Value.Signals.First().Value.ValueTableMap); } [Test] @@ -418,13 +418,13 @@ public void NamedTableValueIsNotAddedIfTableNameDoesNotExist() builder.AddSignal(signal); builder.LinkNamedTableToSignal(234, "name1", "aTableName"); - var dbc = builder.Build(); + var dbc = builder.BuildImmutable(); Assert.IsEmpty(dbc.Nodes); Assert.AreEqual(1, dbc.Messages.Count()); Assert.AreEqual(234, dbc.Messages.First().Value.ID); - Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Name); - Assert.IsEmpty(dbc.Messages.First().Value.Signals.First().ValueTableMap); + Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name); + Assert.IsEmpty(dbc.Messages.First().Value.Signals.First().Value.ValueTableMap); } [Test] diff --git a/DbcParserLib.Tests/ParserTests.cs b/DbcParserLib.Tests/ParserTests.cs index 67bd806..14e202c 100644 --- a/DbcParserLib.Tests/ParserTests.cs +++ b/DbcParserLib.Tests/ParserTests.cs @@ -16,7 +16,7 @@ public void SimpleParseFileTest() var dbc = Parser.ParseFromPath(MainDbcFilePath); Assert.AreEqual(38, dbc.Messages.Count()); - Assert.AreEqual(485, dbc.Messages.Values.SelectMany(m => m.Signals).Count()); + Assert.AreEqual(485, dbc.Messages.SelectMany(m => m.Signals).Count()); Assert.AreEqual(15, dbc.Nodes.Count()); } [Test] @@ -31,7 +31,7 @@ public void ParseMessageWithStartBitGreaterThan255Test() var dbc = Parser.Parse(dbcString); Assert.AreEqual(1, dbc.Messages.Count()); - Assert.AreEqual(2, dbc.Messages.Values.SelectMany(m => m.Signals).Count()); + Assert.AreEqual(2, dbc.Messages.SelectMany(m => m.Signals).Count()); } [Test] @@ -39,9 +39,12 @@ public void ParsingTwiceClearsCollectionsTest() { // With the new code, this test is quite useless var dbc = Parser.ParseFromPath(MainDbcFilePath); + Assert.AreEqual(38, dbc.Messages.Count()); + Assert.AreEqual(485, dbc.Messages.SelectMany(m => m.Signals).Count()); + Assert.AreEqual(15, dbc.Nodes.Count()); dbc = Parser.ParseFromPath(MainDbcFilePath); Assert.AreEqual(38, dbc.Messages.Count()); - Assert.AreEqual(485, dbc.Messages.Values.SelectMany(m => m.Signals).Count()); + Assert.AreEqual(485, dbc.Messages.SelectMany(m => m.Signals).Count()); Assert.AreEqual(15, dbc.Nodes.Count()); } @@ -50,13 +53,13 @@ public void CheckMessagePropertiesTest() { var dbc = Parser.ParseFromPath(MainDbcFilePath); - var targetMessage = dbc.Messages.FirstOrDefault(x => x.Value.ID == 309); + var targetMessage = dbc.Messages.FirstOrDefault(x => x.ID == 309); Assert.IsNotNull(targetMessage); - Assert.AreEqual("ESP_135h", targetMessage.Value.Name); - Assert.AreEqual("ESP", targetMessage.Value.Transmitter); - Assert.AreEqual(5, targetMessage.Value.DLC); - Assert.AreEqual(19, targetMessage.Value.Signals.Count); + Assert.AreEqual("ESP_135h", targetMessage.Name); + Assert.AreEqual("ESP", targetMessage.Transmitter); + Assert.AreEqual(5, targetMessage.DLC); + Assert.AreEqual(19, targetMessage.Signals.Count); } [Test] @@ -64,12 +67,12 @@ public void CheckSignalPropertiesTest() { var dbc = Parser.ParseFromPath(MainDbcFilePath); - var targetMessage = dbc.Messages.FirstOrDefault(x => x.Value.ID == 1006); + var targetMessage = dbc.Messages.FirstOrDefault(x => x.ID == 1006); Assert.IsNotNull(targetMessage); - Assert.AreEqual(24, targetMessage.Value.Signals.Count); + Assert.AreEqual(24, targetMessage.Signals.Count); - var signal = targetMessage.Value.Signals.FirstOrDefault(x => x.Name.Equals("UI_camBlockBlurThreshold")); + var signal = targetMessage.Signals.Find(x => x.Name.Equals("UI_camBlockBlurThreshold")); Assert.IsNotNull(signal); Assert.AreEqual(DbcValueType.Unsigned, signal.ValueType); Assert.AreEqual(11, signal.StartBit); @@ -86,12 +89,12 @@ public void CheckOtherSignalPropertiesTest() { var dbc = Parser.ParseFromPath(MainDbcFilePath); - var targetMessage = dbc.Messages.FirstOrDefault(x => x.Value.ID == 264); + var targetMessage = dbc.Messages.FirstOrDefault(x => x.ID == 264); Assert.IsNotNull(targetMessage); - Assert.AreEqual(7, targetMessage.Value.Signals.Count); + Assert.AreEqual(7, targetMessage.Signals.Count); - var signal = targetMessage.Value.Signals.FirstOrDefault(x => x.Name.Equals("DI_torqueMotor")); + var signal = targetMessage.Signals.Find(x => x.Name.Equals("DI_torqueMotor")); Assert.IsNotNull(signal); Assert.AreEqual(DbcValueType.Signed, signal.ValueType); Assert.AreEqual("Nm", signal.Unit); @@ -142,12 +145,12 @@ public void SignalCommentIsProperlyAppliedWhenMultipleSignalsShareSameNameTest() for (var i = 0; i < messageIds.Length; ++i) { - var targetMessage = dbc.Messages.FirstOrDefault(x => x.Value.ID == messageIds[i]); + var targetMessage = dbc.Messages.FirstOrDefault(x => x.ID == messageIds[i]); Assert.IsNotNull(targetMessage); - Assert.AreEqual(signalCount[i], targetMessage.Value.Signals.Count); + Assert.AreEqual(signalCount[i], targetMessage.Signals.Count); - var signal = targetMessage.Value.Signals.FirstOrDefault(x => x.Name.Equals("COUNTER_ALT")); + var signal = targetMessage.Signals.Find(x => x.Name.Equals("COUNTER_ALT")); Assert.IsNotNull(signal); Assert.AreEqual("only increments on change", signal.Comment); } @@ -174,10 +177,10 @@ public void ManagingOtherKindOfCommentsTest() Assert.AreEqual(1, dbc.Messages.Count()); Assert.AreEqual(1, dbc.Nodes.Count()); - Assert.AreEqual("Message comment", dbc.Messages.First().Value.Comment); + Assert.AreEqual("Message comment", dbc.Messages.First().Comment); Assert.AreEqual("Node comment", dbc.Nodes.First().Comment); - var signal = dbc.Messages.Single().Value.Signals.FirstOrDefault(x => x.Name.Equals("COUNTER_ALT")); + var signal = dbc.Messages.Single().Signals.Find(x => x.Name.Equals("COUNTER_ALT")); Assert.IsNotNull(signal); Assert.AreEqual("only increments on change", signal.Comment); } @@ -205,10 +208,10 @@ second line Assert.AreEqual(1, dbc.Messages.Count()); Assert.AreEqual(1, dbc.Nodes.Count()); - Assert.AreEqual($"Message comment first line{Environment.NewLine}second line{Environment.NewLine}third line", dbc.Messages.First().Value.Comment); + Assert.AreEqual($"Message comment first line{Environment.NewLine}second line{Environment.NewLine}third line", dbc.Messages.First().Comment); Assert.AreEqual("Node comment", dbc.Nodes.First().Comment); - var signal = dbc.Messages.Single().Value.Signals.FirstOrDefault(x => x.Name.Equals("COUNTER_ALT")); + var signal = dbc.Messages.Single().Signals.Find(x => x.Name.Equals("COUNTER_ALT")); Assert.IsNotNull(signal); Assert.AreEqual("only increments on change", signal.Comment); } @@ -238,7 +241,7 @@ public void NamedValTableIsAppliedTest() Assert.AreEqual(1, dbc.Messages.Count()); Assert.AreEqual(0, dbc.Nodes.Count()); - var signal = dbc.Messages.Single().Value.Signals.Single(); + var signal = dbc.Messages.Single().Signals.Single(); Assert.IsNotNull(signal); Assert.AreEqual(expectedValueTableMap, signal.ValueTableMap); } @@ -266,7 +269,7 @@ public void ExplicitValTableIsAppliedTest() Assert.AreEqual(1, dbc.Messages.Count()); Assert.AreEqual(0, dbc.Nodes.Count()); - var signal = dbc.Messages.Single().Value.Signals.Single(); + var signal = dbc.Messages.Single().Signals.Single(); Assert.IsNotNull(signal); Assert.AreEqual(expectedValueTableMap, signal.ValueTableMap); } @@ -303,17 +306,17 @@ public void UserDefinedAttributesTest() Assert.AreEqual(1, dbc.Nodes.Count()); var node = dbc.Nodes.First(); - Assert.AreEqual(1, node.CustomProperties.Count()); + Assert.AreEqual(1, node.CustomProperties.Count); Assert.AreEqual(70, node.CustomProperties["HexAttribute"].HexCustomProperty.Value); var message = dbc.Messages.First(); - Assert.AreEqual(2, message.Value.CustomProperties.Count()); - Assert.AreEqual(7, message.Value.CustomProperties["IntegerAttribute"].IntegerCustomProperty.Value); - Assert.AreEqual(0.5, message.Value.CustomProperties["FloatAttribute"].FloatCustomProperty.Value); + Assert.AreEqual(2, message.CustomProperties.Count); + Assert.AreEqual(7, message.CustomProperties["IntegerAttribute"].IntegerCustomProperty.Value); + Assert.AreEqual(0.5, message.CustomProperties["FloatAttribute"].FloatCustomProperty.Value); - var signal = dbc.Messages.Single().Value.Signals.FirstOrDefault(x => x.Name.Equals("COUNTER_ALT")); + var signal = dbc.Messages.Single().Signals.Find(x => x.Name.Equals("COUNTER_ALT")); Assert.IsNotNull(signal); - Assert.AreEqual(2, signal.CustomProperties.Count()); + Assert.AreEqual(2, signal.CustomProperties.Count); Assert.AreEqual("ThirdVal", signal.CustomProperties["EnumAttributeName"].EnumCustomProperty.Value); Assert.AreEqual("DefaultString", signal.CustomProperties["StringAttribute"].StringCustomProperty.Value); } diff --git a/DbcParserLib.Tests/PropertiesDefaultParsingFailuresTests.cs b/DbcParserLib.Tests/PropertiesDefaultParsingFailuresTests.cs index d3950c7..81ecde6 100644 --- a/DbcParserLib.Tests/PropertiesDefaultParsingFailuresTests.cs +++ b/DbcParserLib.Tests/PropertiesDefaultParsingFailuresTests.cs @@ -232,7 +232,7 @@ public void DefaultCustomPropertyEnumWithIntegerValuesIsParsed() var dbc = Parser.Parse(dbcString); Assert.AreEqual(1, dbc.Messages.Count()); - Assert.AreEqual("3", dbc.Messages.First().Value.CustomProperties.Values.First().EnumCustomProperty.Value); + Assert.AreEqual("3", dbc.Messages.First().CustomProperties.Values.First().EnumCustomProperty.Value); } [Test] @@ -246,7 +246,7 @@ public void DefaultCustomPropertyEnumWithIntegerValuesByIndexIsParsed() var dbc = Parser.Parse(dbcString); Assert.AreEqual(1, dbc.Messages.Count()); - Assert.AreEqual("3", dbc.Messages.First().Value.CustomProperties.Values.First().EnumCustomProperty.Value); + Assert.AreEqual("3", dbc.Messages.First().CustomProperties.Values.First().EnumCustomProperty.Value); } } } \ No newline at end of file diff --git a/DbcParserLib.Tests/PropertiesLineParserTests.cs b/DbcParserLib.Tests/PropertiesLineParserTests.cs index 2a2dd57..7ff7eba 100644 --- a/DbcParserLib.Tests/PropertiesLineParserTests.cs +++ b/DbcParserLib.Tests/PropertiesLineParserTests.cs @@ -69,7 +69,7 @@ public void IntDefinitionCustomPropertyNoBoundariesIsParsedTest() Assert.IsTrue(ParseLine(@"BA_ ""AttributeName"" BO_ 2394947585 100;", msgCycleTimeLineParser, builder, nextLineProvider)); var dbc = builder.Build(); - Assert.AreEqual(true, dbc.Messages.First().Value.CustomProperties.TryGetValue("AttributeName", out var customProperty)); + Assert.AreEqual(true, dbc.Messages.First().CustomProperties.TryGetValue("AttributeName", out var customProperty)); Assert.AreEqual(100, customProperty!.IntegerCustomProperty.Value); } @@ -97,7 +97,7 @@ public void HexDefinitionCustomPropertyNoBoundariesIsParsedTest() Assert.IsTrue(ParseLine(@"BA_DEF_DEF_ ""AttributeName"" 150;", msgCycleTimeLineParser, builder, nextLineProvider)); var dbc = builder.Build(); - Assert.AreEqual(true, dbc.Messages.First().Value.CustomProperties.TryGetValue("AttributeName", out var customProperty)); + Assert.AreEqual(true, dbc.Messages.First().CustomProperties.TryGetValue("AttributeName", out var customProperty)); Assert.AreEqual(150, customProperty!.HexCustomProperty.Value); } @@ -125,7 +125,7 @@ public void FloatDefinitionCustomPropertyNoBoundariesIsParsedTest() Assert.IsTrue(ParseLine(@"BA_DEF_DEF_ ""AttributeName"" 150.0;", msgCycleTimeLineParser, builder, nextLineProvider)); var dbc = builder.Build(); - Assert.AreEqual(true, dbc.Messages.First().Value.CustomProperties.TryGetValue("AttributeName", out var customProperty)); + Assert.AreEqual(true, dbc.Messages.First().CustomProperties.TryGetValue("AttributeName", out var customProperty)); Assert.AreEqual(150, customProperty!.FloatCustomProperty.Value); } @@ -232,7 +232,7 @@ public void MsgCycleTimePropertyIsParsedTest() Assert.IsTrue(ParseLine(@"BA_DEF_DEF_ ""GenMsgCycleTime"" 150;", msgCycleTimeLineParser, builder, nextLineProvider)); Assert.IsTrue(ParseLine(@"BA_ ""GenMsgCycleTime"" BO_ 2394947585 100;", msgCycleTimeLineParser, builder, nextLineProvider)); - var dbc = builder.Build(); + var dbc = builder.BuildImmutable(); Assert.IsNotNull(dbc.Messages.First().Value.CycleTime); Assert.AreEqual(100, dbc.Messages.First().Value.CycleTime); } @@ -252,9 +252,9 @@ public void SigInitialValueIntegerPropertyIsParsedTest() Assert.IsTrue(ParseLine(@"BA_DEF_DEF_ ""GenSigStartValue"" 150;", sigInitialValueLineParser, builder, nextLineProvider)); Assert.IsTrue(ParseLine(@"BA_ ""GenSigStartValue"" SG_ 2394947585 sig_name 40;", sigInitialValueLineParser, builder, nextLineProvider)); - var dbc = builder.Build(); - Assert.IsNotNull(dbc.Messages.First().Value.Signals.First().InitialValue); - Assert.AreEqual(40, dbc.Messages.First().Value.Signals.First().InitialValue); + var dbc = builder.BuildImmutable(); + Assert.IsNotNull(dbc.Messages.First().Value.Signals.First().Value.InitialValue); + Assert.AreEqual(40, dbc.Messages.First().Value.Signals.First().Value.InitialValue); } [Test] @@ -272,9 +272,9 @@ public void SigInitialValueHexPropertyIsParsedTest() Assert.IsTrue(ParseLine(@"BA_DEF_DEF_ ""GenSigStartValue"" 150;", sigInitialValueLineParser, builder, nextLineProvider)); Assert.IsTrue(ParseLine(@"BA_ ""GenSigStartValue"" SG_ 2394947585 sig_name 40;", sigInitialValueLineParser, builder, nextLineProvider)); - var dbc = builder.Build(); - Assert.IsNotNull(dbc.Messages.First().Value.Signals.First().InitialValue); - Assert.AreEqual(40, dbc.Messages.First().Value.Signals.First().InitialValue); + var dbc = builder.BuildImmutable(); + Assert.IsNotNull(dbc.Messages.First().Value.Signals.First().Value.InitialValue); + Assert.AreEqual(40, dbc.Messages.First().Value.Signals.First().Value.InitialValue); } [Test] diff --git a/DbcParserLib.Tests/PropertiesParsingFailuresTests.cs b/DbcParserLib.Tests/PropertiesParsingFailuresTests.cs index 95bfb13..3fd75a1 100644 --- a/DbcParserLib.Tests/PropertiesParsingFailuresTests.cs +++ b/DbcParserLib.Tests/PropertiesParsingFailuresTests.cs @@ -339,7 +339,7 @@ public void DefaultCustomPropertyEnumWithIntegerValuesIsParsed() var dbc = Parser.Parse(dbcString); Assert.AreEqual(1, dbc.Messages.Count()); - Assert.AreEqual("3", dbc.Messages.First().Value.CustomProperties.Values.First().EnumCustomProperty.Value); + Assert.AreEqual("3", dbc.Messages.First().CustomProperties.Values.First().EnumCustomProperty.Value); } [Test] @@ -353,7 +353,7 @@ public void DefaultCustomPropertyEnumWithIntegerValuesByIndexIsParsed() var dbc = Parser.Parse(dbcString); Assert.AreEqual(1, dbc.Messages.Count()); - Assert.AreEqual("3", dbc.Messages.First().Value.CustomProperties.Values.First().EnumCustomProperty.Value); + Assert.AreEqual("3", dbc.Messages.First().CustomProperties.Values.First().EnumCustomProperty.Value); } } } \ No newline at end of file diff --git a/DbcParserLib.Tests/SignalLineParserTests.cs b/DbcParserLib.Tests/SignalLineParserTests.cs index 3df87a0..ea8e6d3 100644 --- a/DbcParserLib.Tests/SignalLineParserTests.cs +++ b/DbcParserLib.Tests/SignalLineParserTests.cs @@ -185,7 +185,7 @@ public void ParseSignalWithDifferentColonSpaces() var dbc = Parser.Parse(dbcString); Assert.AreEqual(1, dbc.Messages.Count()); - Assert.AreEqual(3, dbc.Messages.Values.SelectMany(m => m.Signals).Count()); + Assert.AreEqual(3, dbc.Messages.SelectMany(m => m.Signals).Count()); } [TestCase("SG_ qGearboxOilMin : 0|16@1+ (0.1,0) [0|6553.5] \"l/min\" \"NATEC\"")] diff --git a/DbcParserLib/Dbc.cs b/DbcParserLib/Dbc.cs index 05ba823..3b55733 100644 --- a/DbcParserLib/Dbc.cs +++ b/DbcParserLib/Dbc.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using DbcParserLib.Model; using System.Runtime.CompilerServices; @@ -6,17 +7,54 @@ [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] namespace DbcParserLib { - public class Dbc + public class ImmutableDbc { public IReadOnlyCollection Nodes {get;} public IReadOnlyDictionary Messages {get;} public IReadOnlyCollection EnvironmentVariables { get; } - public Dbc(List nodes, Dictionary messages, List environmentVariables) + internal ImmutableDbc(IReadOnlyCollection nodes, IReadOnlyDictionary messages, IReadOnlyCollection environmentVariables) + { + Nodes = nodes; + Messages = messages; + EnvironmentVariables = environmentVariables; + } + } + + public class Dbc + { + public IEnumerable Nodes {get;} + public IEnumerable Messages {get;} + public IEnumerable EnvironmentVariables { get; } + + public Dbc(IEnumerable nodes, IEnumerable messages, IEnumerable environmentVariables) { Nodes = nodes; Messages = messages; EnvironmentVariables = environmentVariables; } + + public ImmutableDbc CreateDbc() + { + var nodes = new List(); + foreach (var node in Nodes) + { + nodes.Add(node.CreateNode()); + } + + var messages = new List(); + foreach (var message in Messages) + { + messages.Add(message.CreateMessage()); + } + + var environmentVariables = new List(); + foreach (var environmentVariable in EnvironmentVariables) + { + environmentVariables.Add(environmentVariable.CreateEnvironmentVariable()); + } + + return new ImmutableDbc(nodes, messages.ToDictionary(x => x.ID, x => x), environmentVariables); + } } } \ No newline at end of file diff --git a/DbcParserLib/DbcBuilder.cs b/DbcParserLib/DbcBuilder.cs index 3d339cd..086d5a9 100644 --- a/DbcParserLib/DbcBuilder.cs +++ b/DbcParserLib/DbcBuilder.cs @@ -465,7 +465,7 @@ public Dbc Build() foreach (var message in internalMessages) { message.Value.Signals.Clear(); - if(internalSignals.TryGetValue(message.Key, out var signals) && signals != null) + if (internalSignals.TryGetValue(message.Key, out var signals) && signals != null) { message.Value.Signals.AddRange(signals.Values); } @@ -473,26 +473,13 @@ public Dbc Build() message.Value.AdjustExtendedId(); } - - var nodes = new List(); - foreach (var node in internalNodes) - { - nodes.Add(node.CreateNode()); - } - - var messages = new List(); - foreach (var message in internalMessages.Values) - { - messages.Add(message.CreateMessage()); - } - - var environmentVariables = new List(); - foreach (var environmentVariable in internalEnvironmentVariables.Values) - { - environmentVariables.Add(environmentVariable.CreateEnvironmentVariable()); - } - - return new Dbc(nodes, messages.ToDictionary(x => x.ID, x => x), environmentVariables); + return new Dbc(internalNodes, internalMessages.Values, internalEnvironmentVariables.Values); + } + + public ImmutableDbc BuildImmutable() + { + var dbc = Build(); + return dbc.CreateDbc(); } } diff --git a/DbcParserLib/Model/Message.cs b/DbcParserLib/Model/Message.cs index 1c7b5d6..134795f 100644 --- a/DbcParserLib/Model/Message.cs +++ b/DbcParserLib/Model/Message.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; namespace DbcParserLib.Model { @@ -12,10 +13,10 @@ public class ImmutableMessage public string Comment { get; } public int? CycleTime { get; } public bool IsMultiplexed { get; } - public IReadOnlyCollection Signals { get; } + public IReadOnlyDictionary Signals { get; } public IReadOnlyDictionary CustomProperties { get; } - internal ImmutableMessage(Message message, List signals) + internal ImmutableMessage(Message message, Dictionary signals) { var hasCycleTime = message.CycleTime(out var cycleTime); @@ -51,7 +52,7 @@ internal ImmutableMessage CreateMessage() { signals.Add(signal.CreateSignal()); } - return new ImmutableMessage(this, signals); + return new ImmutableMessage(this, signals.ToDictionary(x => x.Name)); } } } diff --git a/DbcParserLib/Model/Node.cs b/DbcParserLib/Model/Node.cs index 5ae95be..c17ed93 100644 --- a/DbcParserLib/Model/Node.cs +++ b/DbcParserLib/Model/Node.cs @@ -18,7 +18,7 @@ internal ImmutableNode(Node node, Dictionary