From 69b237c99d4fe97d1239952caf0993dd46b26769 Mon Sep 17 00:00:00 2001 From: billsegall Date: Wed, 27 Jun 2018 14:25:09 +1000 Subject: [PATCH] [CSharp] Issue560 fix. Constant enums were incorrectly being indexed in messages as for for non-constant enums. The getter now returns a constant value and the setter is removed. --- .gitignore | 1 + .../Bench/SBE/MarketDataBenchmark.cs | 6 +- csharp/sbe-generated/sbe-generated.csproj | 4 ++ csharp/sbe-tests/Issue560Tests.cs | 55 ++++++++++++++ .../generation/csharp/CSharpGenerator.java | 71 ++++++++++++------- 5 files changed, 109 insertions(+), 28 deletions(-) create mode 100644 csharp/sbe-tests/Issue560Tests.cs diff --git a/.gitignore b/.gitignore index 734a34bf85..41f4464ce4 100644 --- a/.gitignore +++ b/.gitignore @@ -100,6 +100,7 @@ csharp/sbe-generated/baseline-bigendian csharp/sbe-generated/extension csharp/sbe-generated/issue435 csharp/sbe-generated/issue483 +csharp/sbe-generated/issue560 csharp/sbe-generated/since-deprecated csharp/sbe-generated/mktdata/*.cs csharp/sbe-generated/uk_co_real_logic_sbe_benchmarks_fix diff --git a/csharp/sbe-benchmarks/Bench/SBE/MarketDataBenchmark.cs b/csharp/sbe-benchmarks/Bench/SBE/MarketDataBenchmark.cs index 28e54d102e..5797fbb493 100644 --- a/csharp/sbe-benchmarks/Bench/SBE/MarketDataBenchmark.cs +++ b/csharp/sbe-benchmarks/Bench/SBE/MarketDataBenchmark.cs @@ -32,8 +32,7 @@ public static class MarketDataBenchmark mdIncGrp.MdUpdateAction = MDUpdateAction.NEW; mdIncGrp.RptSeq = 1; mdIncGrp.AggressorSide = Side.BUY; - mdIncGrp.MdEntryType = MDEntryType.BID; - + mdIncGrp.Next(); mdIncGrp.TradeId = 1234L; mdIncGrp.SecurityId = 56789L; @@ -43,8 +42,7 @@ public static class MarketDataBenchmark mdIncGrp.MdUpdateAction = MDUpdateAction.NEW; mdIncGrp.RptSeq = 1; mdIncGrp.AggressorSide = Side.SELL; - mdIncGrp.MdEntryType = MDEntryType.OFFER; - + return marketData.Size; } diff --git a/csharp/sbe-generated/sbe-generated.csproj b/csharp/sbe-generated/sbe-generated.csproj index 6a534d0e35..0e39871b8b 100644 --- a/csharp/sbe-generated/sbe-generated.csproj +++ b/csharp/sbe-generated/sbe-generated.csproj @@ -11,5 +11,9 @@ + + + + diff --git a/csharp/sbe-tests/Issue560Tests.cs b/csharp/sbe-tests/Issue560Tests.cs new file mode 100644 index 0000000000..d86aa74f88 --- /dev/null +++ b/csharp/sbe-tests/Issue560Tests.cs @@ -0,0 +1,55 @@ +// Copyright (C) 2018 Bill Segall +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Org.SbeTool.Sbe.Dll; + +namespace Org.SbeTool.Sbe.Tests +{ + [TestClass] + public unsafe class Issue560Tests + { + private byte[] _buffer; + private DirectBuffer _directBuffer; + private Issue560.MessageHeader _messageHeader; + private Issue560.Issue560 _issue560; + + //public Issue560.Issue560 Issue560 { get => _issue560; set => _issue560 = value; } + + [TestInitialize] + public void SetUp() + { + _buffer = new Byte[4096]; + _directBuffer = new DirectBuffer(_buffer); + _issue560 = new Issue560.Issue560(); + _messageHeader = new Issue560.MessageHeader(); + + _messageHeader.Wrap(_directBuffer, 0, Issue560.Issue560.SchemaVersion); + _messageHeader.BlockLength = Issue560.Issue560.BlockLength; + _messageHeader.SchemaId = Issue560.Issue560.SchemaId; + _messageHeader.TemplateId = Issue560.Issue560.TemplateId; + _messageHeader.Version = Issue560.Issue560.SchemaVersion; + + } + + [TestMethod] + public void Issue560Test() + { + Assert.AreEqual(_issue560.DiscountedModel, Issue560.Model.C, "Incorrect const enum valueref"); + + } + + } +} diff --git a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/csharp/CSharpGenerator.java b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/csharp/CSharpGenerator.java index e00c0aff8d..6fc5628bf3 100644 --- a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/csharp/CSharpGenerator.java +++ b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/csharp/CSharpGenerator.java @@ -466,7 +466,7 @@ private CharSequence generateCompositePropertyElements(final List tokens, break; case BEGIN_ENUM: - sb.append(generateEnumProperty(propertyName, token, indent)); + sb.append(generateEnumProperty(propertyName, token, null, indent)); break; case BEGIN_SET: @@ -1039,7 +1039,7 @@ private CharSequence generateFields(final List tokens, final String inden break; case BEGIN_ENUM: - sb.append(generateEnumProperty(propertyName, encodingToken, indent)); + sb.append(generateEnumProperty(propertyName, encodingToken, signalToken, indent)); break; case BEGIN_SET: @@ -1109,7 +1109,11 @@ private CharSequence generateEnumFieldNotPresentCondition( enumName); } - private CharSequence generateEnumProperty(final String propertyName, final Token token, final String indent) + private CharSequence generateEnumProperty( + final String propertyName, + final Token token, + final Token signalToken, + final String indent) { final String enumName = formatClassName(token.applicableTypeName()); final String typePrefix = toUpperFirstChar(token.encoding().primitiveType().primitiveName()); @@ -1118,27 +1122,46 @@ private CharSequence generateEnumProperty(final String propertyName, final Token final ByteOrder byteOrder = token.encoding().byteOrder(); final String byteOrderStr = generateByteOrder(byteOrder, token.encoding().primitiveType().size()); - return String.format("\n" + - indent + INDENT + "public %1$s %2$s\n" + - indent + INDENT + "{\n" + - indent + INDENT + INDENT + "get\n" + - indent + INDENT + INDENT + "{\n" + - "%3$s" + - indent + INDENT + INDENT + INDENT + "return (%4$s)_buffer.%5$sGet%7$s(_offset + %6$d);\n" + - indent + INDENT + INDENT + "}\n" + - indent + INDENT + INDENT + "set\n" + - indent + INDENT + INDENT + "{\n" + - indent + INDENT + INDENT + INDENT + "_buffer.%5$sPut%7$s(_offset + %6$d, (%8$s)value);\n" + - indent + INDENT + INDENT + "}\n" + - indent + INDENT + "}\n\n", - enumName, - toUpperFirstChar(propertyName), - generateEnumFieldNotPresentCondition(token.version(), enumName, indent), - enumName, - typePrefix, - offset, - byteOrderStr, - enumUnderlyingType); + if (signalToken != null && signalToken.isConstantEncoding()) + { + final String constValue = signalToken.encoding().constValue().toString(); + + return String.format("\n" + + indent + INDENT + "public %1$s %2$s\n" + + indent + INDENT + "{\n" + + indent + INDENT + INDENT + "get\n" + + indent + INDENT + INDENT + "{\n" + + indent + INDENT + INDENT + INDENT + "return %3$s;\n" + + indent + INDENT + INDENT + "}\n" + + indent + INDENT + "}\n\n", + enumName, + toUpperFirstChar(propertyName), + constValue); + } + else + { + return String.format("\n" + + indent + INDENT + "public %1$s %2$s\n" + + indent + INDENT + "{\n" + + indent + INDENT + INDENT + "get\n" + + indent + INDENT + INDENT + "{\n" + + "%3$s" + + indent + INDENT + INDENT + INDENT + "return (%4$s)_buffer.%5$sGet%7$s(_offset + %6$d);\n" + + indent + INDENT + INDENT + "}\n" + + indent + INDENT + INDENT + "set\n" + + indent + INDENT + INDENT + "{\n" + + indent + INDENT + INDENT + INDENT + "_buffer.%5$sPut%7$s(_offset + %6$d, (%8$s)value);\n" + + indent + INDENT + INDENT + "}\n" + + indent + INDENT + "}\n\n", + enumName, + toUpperFirstChar(propertyName), + generateEnumFieldNotPresentCondition(token.version(), enumName, indent), + enumName, + typePrefix, + offset, + byteOrderStr, + enumUnderlyingType); + } } private String generateBitSetProperty(final String propertyName, final Token token, final String indent)