Skip to content

Commit 4ddf522

Browse files
amibarZachBray
authored andcommitted
[C#] Avoid ToString() affect the message internal state
1 parent 64ce522 commit 4ddf522

File tree

2 files changed

+80
-5
lines changed

2 files changed

+80
-5
lines changed

csharp/sbe-tests/Issue992Tests.cs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using System;
2+
using Microsoft.VisualStudio.TestTools.UnitTesting;
3+
using Org.SbeTool.Sbe.Dll;
4+
using Mktdata;
5+
6+
namespace Org.SbeTool.Sbe.Tests
7+
{
8+
[TestClass]
9+
public class Issue992Tests
10+
{
11+
private const int Offset = 0;
12+
private DirectBuffer _buffer;
13+
private MessageHeader _messageHeader;
14+
15+
[TestInitialize]
16+
public void SetUp()
17+
{
18+
var byteArray = new byte[4096];
19+
_buffer = new DirectBuffer(byteArray);
20+
21+
_messageHeader = new MessageHeader();
22+
23+
_messageHeader.Wrap(_buffer, 0, MessageHeader.SbeSchemaVersion);
24+
_messageHeader.BlockLength = MDIncrementalRefreshBook46.BlockLength;
25+
_messageHeader.SchemaId = MDIncrementalRefreshBook46.SchemaId;
26+
_messageHeader.TemplateId = MDIncrementalRefreshBook46.TemplateId;
27+
_messageHeader.Version = MDIncrementalRefreshBook46.SchemaVersion;
28+
}
29+
30+
[TestMethod]
31+
public void CheckToStringDontMessWithGroupIteration()
32+
{
33+
var encoder = new MDIncrementalRefreshBook46()
34+
.WrapForEncodeAndApplyHeader(_buffer, Offset, _messageHeader);
35+
encoder.TransactTime = (ulong)new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks;
36+
var noMDEntries = encoder.NoMDEntriesCount(2);
37+
noMDEntries.Next();
38+
noMDEntries.MDEntryPx.Mantissa = 12;
39+
noMDEntries.MDEntrySize = 3;
40+
noMDEntries.Next();
41+
noMDEntries.MDEntryPx.Mantissa = 15;
42+
noMDEntries.MDEntrySize = 7;
43+
encoder.NoOrderIDEntriesCount(0);
44+
encoder.CheckEncodingIsComplete();
45+
46+
var expectedString = "[MDIncrementalRefreshBook46](sbeTemplateId=46|sbeSchemaId=1|sbeSchemaVersion=9|sbeBlockLength=11):TransactTime=630822816000000000|MatchEventIndicator={0}|NoMDEntries=[(MDEntryPx=(Mantissa=12|)|MDEntrySize=3|SecurityID=0|RptSeq=0|NumberOfOrders=0|MDPriceLevel=0|MDUpdateAction=New|MDEntryType=NULL_VALUE),(MDEntryPx=(Mantissa=15|)|MDEntrySize=7|SecurityID=0|RptSeq=0|NumberOfOrders=0|MDPriceLevel=0|MDUpdateAction=New|MDEntryType=NULL_VALUE)]|NoOrderIDEntries=[]";
47+
48+
var decoder = new MDIncrementalRefreshBook46()
49+
.WrapForDecodeAndApplyHeader(_buffer, Offset, _messageHeader);
50+
noMDEntries = decoder.NoMDEntries;
51+
Assert.AreEqual(expectedString, decoder.ToString());
52+
int counter = 0;
53+
while (noMDEntries.HasNext)
54+
{
55+
Assert.AreEqual(expectedString, decoder.ToString());
56+
++counter;
57+
noMDEntries.Next();
58+
Assert.AreEqual(expectedString, decoder.ToString());
59+
}
60+
61+
Assert.AreEqual(2, counter);
62+
Assert.AreEqual(expectedString, decoder.ToString());
63+
}
64+
}
65+
}

sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/csharp/CSharpGenerator.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ public void generate() throws IOException
181181
out.append(generateVarData(fieldPrecedenceModel, varData, BASE_INDENT + INDENT));
182182

183183
out.append(generateDisplay(toUpperFirstChar(msgToken.name()),
184-
fields, groups, varData, fieldPrecedenceModel));
184+
className, fields, groups, varData, fieldPrecedenceModel));
185185

186186
out.append(INDENT + "}\n");
187187
out.append("}\n");
@@ -2406,13 +2406,22 @@ private int writeTokenDisplay(
24062406
return lengthBeforeFieldSeparator;
24072407
}
24082408

2409-
private void appendToString(final StringBuilder sb, final String indent)
2409+
private void appendToString(final StringBuilder sb, final String indent, final String className)
24102410
{
24112411
sb.append('\n');
24122412
append(sb, indent, "public override string ToString()");
24132413
append(sb, indent, "{");
24142414
append(sb, indent, " var sb = new StringBuilder(100);");
2415-
append(sb, indent, " this.BuildString(sb);");
2415+
if(null != className)
2416+
{
2417+
append(sb, indent, " var m = new " + className + "();");
2418+
append(sb, indent, " m.WrapForDecode(_buffer, _offset, _actingBlockLength, _actingVersion);");
2419+
append(sb, indent, " m.BuildString(sb);");
2420+
}
2421+
else
2422+
{
2423+
append(sb, indent, " this.BuildString(sb);");
2424+
}
24162425
append(sb, indent, " return sb.ToString();");
24172426
append(sb, indent, "}");
24182427
}
@@ -2437,14 +2446,15 @@ private CharSequence generateChoiceDisplay(final String enumName)
24372446

24382447
private CharSequence generateDisplay(
24392448
final String name,
2449+
final String className,
24402450
final List<Token> tokens,
24412451
final List<Token> groups,
24422452
final List<Token> varData,
24432453
final FieldPrecedenceModel fieldPrecedenceModel)
24442454
{
24452455
final StringBuilder sb = new StringBuilder(100);
24462456

2447-
appendToString(sb, TWO_INDENT);
2457+
appendToString(sb, TWO_INDENT, className);
24482458
sb.append('\n');
24492459
append(sb, TWO_INDENT, "internal void BuildString(StringBuilder builder)");
24502460
append(sb, TWO_INDENT, "{");
@@ -2502,7 +2512,7 @@ private CharSequence generateCompositeDisplay(final List<Token> tokens)
25022512
{
25032513
final StringBuilder sb = new StringBuilder();
25042514

2505-
appendToString(sb, TWO_INDENT);
2515+
appendToString(sb, TWO_INDENT, null);
25062516
sb.append('\n');
25072517
append(sb, TWO_INDENT, "internal void BuildString(StringBuilder builder)");
25082518
append(sb, TWO_INDENT, "{");

0 commit comments

Comments
 (0)