Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#72 #69 #37 #14 #35 Redfine all Model classes to be readonly for public access. Use FinishUp method to calc useful properties and support for extended Multiplexing. #73

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
*.suo
*.user
*.sln.docstates
.idea
.vs

# Build results
Expand Down
112 changes: 56 additions & 56 deletions DbcParserLib.Tests/DbcBuilderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ public void NodeCommentIsSkippedIfNodeIsNotFound()

Assert.AreEqual(1, dbc.Nodes.Count());
Assert.AreEqual("nodeName", dbc.Nodes.First().Name);
Assert.IsNull(dbc.Nodes.First().Comment);
Assert.AreEqual(string.Empty, dbc.Nodes.First().Comment);
}

[Test]
Expand All @@ -105,8 +105,8 @@ public void MessageIsAdded()

Assert.IsEmpty(dbc.Nodes);
Assert.AreEqual(1, dbc.Messages.Count());
Assert.AreEqual(1, dbc.Messages.First().ID);
Assert.IsFalse(dbc.Messages.First().IsExtID);
Assert.AreEqual(1, dbc.Messages.First().Value.ID);
Assert.IsFalse(dbc.Messages.First().Value.IsExtID);
}

[Test]
Expand All @@ -119,8 +119,8 @@ public void ExtendedMessageIsAdded()

Assert.IsEmpty(dbc.Nodes);
Assert.AreEqual(1, dbc.Messages.Count());
Assert.AreEqual(1, dbc.Messages.First().ID);
Assert.IsTrue(dbc.Messages.First().IsExtID);
Assert.AreEqual(1, dbc.Messages.First().Value.ID);
Assert.IsTrue(dbc.Messages.First().Value.IsExtID);
}

[Test]
Expand All @@ -134,8 +134,8 @@ public void CommentIsAddedToMessage()

Assert.IsEmpty(dbc.Nodes);
Assert.AreEqual(1, dbc.Messages.Count());
Assert.AreEqual(234, dbc.Messages.First().ID);
Assert.AreEqual("comment", dbc.Messages.First().Comment);
Assert.AreEqual(234, dbc.Messages.First().Value.ID);
Assert.AreEqual("comment", dbc.Messages.First().Value.Comment);
}

[Test]
Expand All @@ -149,8 +149,8 @@ public void CommentIsNotAddedToMissingMessage()

Assert.IsEmpty(dbc.Nodes);
Assert.AreEqual(1, dbc.Messages.Count());
Assert.AreEqual(234, dbc.Messages.First().ID);
Assert.IsNull(dbc.Messages.First().Comment);
Assert.AreEqual(234, dbc.Messages.First().Value.ID);
Assert.AreEqual(string.Empty, dbc.Messages.First().Value.Comment);
}

[Test]
Expand Down Expand Up @@ -178,14 +178,14 @@ public void SignalIsAddedToCurrentMessage()
Assert.AreEqual(2, dbc.Messages.Count());

var messagesToArray = dbc.Messages.ToArray();
Assert.AreEqual(234, messagesToArray[0].ID);
Assert.AreEqual(1, messagesToArray[0].Signals.Count());
Assert.AreEqual("name1", messagesToArray[0].Signals.First().Name);

Assert.AreEqual(235, messagesToArray[1].ID);
Assert.AreEqual(2, messagesToArray[1].Signals.Count());
Assert.AreEqual("name2", messagesToArray[1].Signals.First().Name);
Assert.AreEqual("name3", messagesToArray[1].Signals.Skip(1).First().Name);
Assert.AreEqual(234, messagesToArray[0].Value.ID);
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().Value.Name);
Assert.AreEqual("name3", messagesToArray[1].Value.Signals.Skip(1).First().Value.Name);
}

[Test]
Expand Down Expand Up @@ -213,9 +213,9 @@ public void CommentIsAddedToSignal()

Assert.IsEmpty(dbc.Nodes);
Assert.AreEqual(1, dbc.Messages.Count());
Assert.AreEqual(234, dbc.Messages.First().ID);
Assert.AreEqual("name1", dbc.Messages.First().Signals.First().Name);
Assert.AreEqual("comment", dbc.Messages.First().Signals.First().Comment);
Assert.AreEqual(234, dbc.Messages.First().Value.ID);
Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name);
Assert.AreEqual("comment", dbc.Messages.First().Value.Signals.First().Value.Comment);
}

[Test]
Expand All @@ -232,9 +232,9 @@ public void CommentIsNotAddedToMissingSignalMessageId()

Assert.IsEmpty(dbc.Nodes);
Assert.AreEqual(1, dbc.Messages.Count());
Assert.AreEqual(234, dbc.Messages.First().ID);
Assert.AreEqual("name1", dbc.Messages.First().Signals.First().Name);
Assert.IsNull(dbc.Messages.First().Signals.First().Comment);
Assert.AreEqual(234, dbc.Messages.First().Value.ID);
Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name);
Assert.AreEqual(string.Empty, dbc.Messages.First().Value.Signals.First().Value.Comment);
}

[Test]
Expand All @@ -251,9 +251,9 @@ public void CommentIsNotAddedToMissingSignalName()

Assert.IsEmpty(dbc.Nodes);
Assert.AreEqual(1, dbc.Messages.Count());
Assert.AreEqual(234, dbc.Messages.First().ID);
Assert.AreEqual("name1", dbc.Messages.First().Signals.First().Name);
Assert.IsNull(dbc.Messages.First().Signals.First().Comment);
Assert.AreEqual(234, dbc.Messages.First().Value.ID);
Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name);
Assert.AreEqual(string.Empty, dbc.Messages.First().Value.Signals.First().Value.Comment);
}

[Test]
Expand All @@ -271,11 +271,11 @@ public void TableValuesAreAddedToSignal()

Assert.IsEmpty(dbc.Nodes);
Assert.AreEqual(1, dbc.Messages.Count());
Assert.AreEqual(234, dbc.Messages.First().ID);
Assert.AreEqual("name1", dbc.Messages.First().Signals.First().Name);
Assert.AreEqual(testValuesDict, dbc.Messages.First().Signals.First().ValueTableMap);
Assert.AreEqual(1, dbc.Messages.First().Signals.First().ValueTableMap.Keys.First());
Assert.AreEqual("fake", dbc.Messages.First().Signals.First().ValueTableMap.Values.First());
Assert.AreEqual(234, dbc.Messages.First().Value.ID);
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]
Expand All @@ -293,11 +293,11 @@ public void TableValuesWithExtendedMessageIdAreAddedToSignal()

Assert.IsEmpty(dbc.Nodes);
Assert.AreEqual(1, dbc.Messages.Count());
Assert.AreEqual(message.ID, dbc.Messages.First().ID);
Assert.AreEqual("name1", dbc.Messages.First().Signals.First().Name);
Assert.AreEqual(testValuesDict, dbc.Messages.First().Signals.First().ValueTableMap);
Assert.AreEqual(1, dbc.Messages.First().Signals.First().ValueTableMap.Keys.First());
Assert.AreEqual("fake", dbc.Messages.First().Signals.First().ValueTableMap.Values.First());
Assert.AreEqual(message.ID, dbc.Messages.First().Value.ID);
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]
Expand All @@ -315,9 +315,9 @@ public void TableValueIsNotAddedToMissingSignalMessageId()

Assert.IsEmpty(dbc.Nodes);
Assert.AreEqual(1, dbc.Messages.Count());
Assert.AreEqual(234, dbc.Messages.First().ID);
Assert.AreEqual("name1", dbc.Messages.First().Signals.First().Name);
Assert.IsEmpty(dbc.Messages.First().Signals.First().ValueTableMap);
Assert.AreEqual(234, dbc.Messages.First().Value.ID);
Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name);
Assert.IsEmpty(dbc.Messages.First().Value.Signals.First().Value.ValueTableMap);
}

[Test]
Expand All @@ -335,9 +335,9 @@ public void TableValueIsNotAddedToMissingSignalName()

Assert.IsEmpty(dbc.Nodes);
Assert.AreEqual(1, dbc.Messages.Count());
Assert.AreEqual(234, dbc.Messages.First().ID);
Assert.AreEqual("name1", dbc.Messages.First().Signals.First().Name);
Assert.IsEmpty(dbc.Messages.First().Signals.First().ValueTableMap);
Assert.AreEqual(234, dbc.Messages.First().Value.ID);
Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name);
Assert.IsEmpty(dbc.Messages.First().Value.Signals.First().Value.ValueTableMap);
}

[Test]
Expand All @@ -357,11 +357,11 @@ public void NamedTableValuesAreAddedToSignal()

Assert.IsEmpty(dbc.Nodes);
Assert.AreEqual(1, dbc.Messages.Count());
Assert.AreEqual(234, dbc.Messages.First().ID);
Assert.AreEqual("name1", dbc.Messages.First().Signals.First().Name);
Assert.AreEqual(testValuesDict, dbc.Messages.First().Signals.First().ValueTableMap);
Assert.AreEqual(1, dbc.Messages.First().Signals.First().ValueTableMap.Keys.First());
Assert.AreEqual("fake", dbc.Messages.First().Signals.First().ValueTableMap.Values.First());
Assert.AreEqual(234, dbc.Messages.First().Value.ID);
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]
Expand All @@ -381,9 +381,9 @@ public void NamedTableValueIsNotAddedToMissingSignalMessageId()

Assert.IsEmpty(dbc.Nodes);
Assert.AreEqual(1, dbc.Messages.Count());
Assert.AreEqual(234, dbc.Messages.First().ID);
Assert.AreEqual("name1", dbc.Messages.First().Signals.First().Name);
Assert.IsEmpty(dbc.Messages.First().Signals.First().ValueTableMap);
Assert.AreEqual(234, dbc.Messages.First().Value.ID);
Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name);
Assert.IsEmpty(dbc.Messages.First().Value.Signals.First().Value.ValueTableMap);
}

[Test]
Expand All @@ -403,9 +403,9 @@ public void NamedTableValueIsNotAddedToMissingSignalName()

Assert.IsEmpty(dbc.Nodes);
Assert.AreEqual(1, dbc.Messages.Count());
Assert.AreEqual(234, dbc.Messages.First().ID);
Assert.AreEqual("name1", dbc.Messages.First().Signals.First().Name);
Assert.IsEmpty(dbc.Messages.First().Signals.First().ValueTableMap);
Assert.AreEqual(234, dbc.Messages.First().Value.ID);
Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name);
Assert.IsEmpty(dbc.Messages.First().Value.Signals.First().Value.ValueTableMap);
}

[Test]
Expand All @@ -422,9 +422,9 @@ public void NamedTableValueIsNotAddedIfTableNameDoesNotExist()

Assert.IsEmpty(dbc.Nodes);
Assert.AreEqual(1, dbc.Messages.Count());
Assert.AreEqual(234, dbc.Messages.First().ID);
Assert.AreEqual("name1", dbc.Messages.First().Signals.First().Name);
Assert.IsEmpty(dbc.Messages.First().Signals.First().ValueTableMap);
Assert.AreEqual(234, dbc.Messages.First().Value.ID);
Assert.AreEqual("name1", dbc.Messages.First().Value.Signals.First().Value.Name);
Assert.IsEmpty(dbc.Messages.First().Value.Signals.First().Value.ValueTableMap);
}

[Test]
Expand Down
3 changes: 1 addition & 2 deletions DbcParserLib.Tests/DbcParserLib.Tests.csproj
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>

<TargetFramework>net8.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>

Expand Down
105 changes: 105 additions & 0 deletions DbcParserLib.Tests/ExtendedMultiplexorParserTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
using System.Linq;
using DbcParserLib.Model;
using NUnit.Framework;

namespace DbcParserLib.Tests;

internal class ExtendedMultiplexorParserTests
{
[Test]
public void ParseSignalExtendedMultiplexingCase1()
{
var dbcString = @"
BO_ 2024 OBD2: 8 Vector__XXX
SG_ S1_PID_0D_VehicleSpeed m13 : 31|8@0+ (1,0) [0|255] ""km/h"" Vector__XXX
SG_ S1_PID_11_ThrottlePosition m17 : 31|8@0+ (0.39216,0) [0|100] ""%"" Vector__XXX
SG_ S1 m1M : 23|8@0+ (1,0) [0|255] """" Vector__XXX
SG_ Service M : 11|4@0+ (1,0) [0|15] """" Vector__XXX

SG_MUL_VAL_ 2024 S1_PID_0D_VehicleSpeed S1 13-13;
SG_MUL_VAL_ 2024 S1_PID_11_ThrottlePosition S1 17-17;
SG_MUL_VAL_ 2024 S1 Service 1-1;";


var dbc = Parser.Parse(dbcString);

Assert.AreEqual(1, dbc.Messages.Count());
Assert.AreEqual(4, dbc.Messages.SelectMany(m => m.Value.Signals).Count());

var signal1 = dbc.Messages.First().Value.Signals.First(x => x.Key.Equals("S1_PID_0D_VehicleSpeed"));
var signal2 = dbc.Messages.First().Value.Signals.First(x => x.Key.Equals("S1_PID_11_ThrottlePosition"));
var signal3 = dbc.Messages.First().Value.Signals.First(x => x.Key.Equals("S1"));
var signal4 = dbc.Messages.First().Value.Signals.First(x => x.Key.Equals("Service"));

Assert.AreEqual(MultiplexingRole.Multiplexed, signal1.Value.MultiplexingInfo.Role);
Assert.IsNotNull(signal1.Value.MultiplexingInfo.Multiplexing);
Assert.AreEqual("S1", signal1.Value.MultiplexingInfo.Multiplexing.MultiplexorSignal);
Assert.AreEqual(1, signal1.Value.MultiplexingInfo.Multiplexing.MultiplexorRanges.Count);
Assert.AreEqual(13, signal1.Value.MultiplexingInfo.Multiplexing.MultiplexorRanges.First().Lower);

Assert.AreEqual(MultiplexingRole.Multiplexed, signal2.Value.MultiplexingInfo.Role);
Assert.IsNotNull(signal2.Value.MultiplexingInfo.Multiplexing);
Assert.AreEqual("S1", signal2.Value.MultiplexingInfo.Multiplexing!.MultiplexorSignal);
Assert.AreEqual(1, signal2.Value.MultiplexingInfo.Multiplexing!.MultiplexorRanges.Count);
Assert.AreEqual(17, signal2.Value.MultiplexingInfo.Multiplexing!.MultiplexorRanges.First().Lower);

Assert.AreEqual(MultiplexingRole.MultiplexedMultiplexor, signal3.Value.MultiplexingInfo.Role);
Assert.IsNotNull(signal3.Value.MultiplexingInfo.Multiplexing);
Assert.AreEqual("Service", signal3.Value.MultiplexingInfo.Multiplexing!.MultiplexorSignal);
Assert.AreEqual(1, signal3.Value.MultiplexingInfo.Multiplexing!.MultiplexorRanges.Count);
Assert.AreEqual(1, signal3.Value.MultiplexingInfo.Multiplexing!.MultiplexorRanges.First().Lower);

Assert.AreEqual(MultiplexingRole.Multiplexor, signal4.Value.MultiplexingInfo.Role);
Assert.IsNotNull(signal4.Value.MultiplexingInfo.Multiplexing);
}

[Test]
public void ParseSignalExtendedMultiplexingCase2()
{
var dbcString = @"
BO_ 100 MuxMsg: 1 Vector__XXX
SG_ Mux_4 m2 : 6|2@1+ (1,0) [0|0] """" Vector__XXX
SG_ Mux_3 m3M : 4|2@1+ (1,0) [0|0] """" Vector__XXX
SG_ Mux_2 m3M : 2|2@1+ (1,0) [0|0] """" Vector__XXX
SG_ Mux_1 M : 0|2@1+ (1,0) [0|0] """" Vector__XXX

SG_MUL_VAL_ 100 Mux_2 Mux_1 3-3, 5-10;
SG_MUL_VAL_ 100 Mux_3 Mux_2 3-3;
SG_MUL_VAL_ 100 Mux_4 Mux_3 2-2;";


var dbc = Parser.Parse(dbcString);

Assert.AreEqual(1, dbc.Messages.Count());
Assert.AreEqual(4, dbc.Messages.SelectMany(m => m.Value.Signals).Count());

var signal1 = dbc.Messages.First().Value.Signals.First(x => x.Key.Equals("Mux_1"));
var signal2 = dbc.Messages.First().Value.Signals.First(x => x.Key.Equals("Mux_2"));
var signal3 = dbc.Messages.First().Value.Signals.First(x => x.Key.Equals("Mux_3"));
var signal4 = dbc.Messages.First().Value.Signals.First(x => x.Key.Equals("Mux_4"));

Assert.AreEqual(MultiplexingRole.Multiplexor, signal1.Value.MultiplexingInfo.Role);
Assert.IsNotNull(signal1.Value.MultiplexingInfo.Multiplexing);

Assert.AreEqual(MultiplexingRole.MultiplexedMultiplexor, signal2.Value.MultiplexingInfo.Role);
Assert.IsNotNull(signal2.Value.MultiplexingInfo.Multiplexing);
Assert.AreEqual("Mux_1", signal2.Value.MultiplexingInfo.Multiplexing!.MultiplexorSignal);
Assert.AreEqual(2, signal2.Value.MultiplexingInfo.Multiplexing!.MultiplexorRanges.Count);
Assert.AreEqual(3, signal2.Value.MultiplexingInfo.Multiplexing!.MultiplexorRanges.First().Lower);
Assert.AreEqual(3, signal2.Value.MultiplexingInfo.Multiplexing!.MultiplexorRanges.First().Upper);
Assert.AreEqual(5, signal2.Value.MultiplexingInfo.Multiplexing!.MultiplexorRanges.Last().Lower);
Assert.AreEqual(10, signal2.Value.MultiplexingInfo.Multiplexing!.MultiplexorRanges.Last().Upper);

Assert.AreEqual(MultiplexingRole.MultiplexedMultiplexor, signal3.Value.MultiplexingInfo.Role);
Assert.IsNotNull(signal3.Value.MultiplexingInfo.Multiplexing);
Assert.AreEqual("Mux_2", signal3.Value.MultiplexingInfo.Multiplexing!.MultiplexorSignal);
Assert.AreEqual(1, signal3.Value.MultiplexingInfo.Multiplexing!.MultiplexorRanges.Count);
Assert.AreEqual(3, signal3.Value.MultiplexingInfo.Multiplexing!.MultiplexorRanges.First().Lower);

Assert.AreEqual(MultiplexingRole.Multiplexed, signal4.Value.MultiplexingInfo.Role);
Assert.IsNotNull(signal4.Value.MultiplexingInfo.Multiplexing);
Assert.AreEqual("Mux_3", signal4.Value.MultiplexingInfo.Multiplexing!.MultiplexorSignal);
Assert.AreEqual(1, signal4.Value.MultiplexingInfo.Multiplexing!.MultiplexorRanges.Count);
Assert.AreEqual(2, signal4.Value.MultiplexingInfo.Multiplexing!.MultiplexorRanges.First().Lower);
}
}
Loading
Loading