From a14038db32bbe04bede3f9e54e203be235735c79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rio=20Silva?= Date: Mon, 1 Apr 2019 23:00:02 +0100 Subject: [PATCH] fix bug on vector of structs typedefs --- .../Providers/AbiSerializationProvider.cs | 61 ++++++++----------- .../EosTestCasesDef.t4 | 1 + .../EosUnitTestCases.cs | 42 +++++++++++++ .../EosUnitTests.cs | 19 ++++++ EosSharp/EosSharp.UnitTests/EosUnitTests.cs | 17 ++++++ EosSharp/EosSharp/EosSharp.csproj | 8 +-- 6 files changed, 109 insertions(+), 39 deletions(-) diff --git a/EosSharp/EosSharp.Core/Providers/AbiSerializationProvider.cs b/EosSharp/EosSharp.Core/Providers/AbiSerializationProvider.cs index c93f6d4..ceec6a5 100644 --- a/EosSharp/EosSharp.Core/Providers/AbiSerializationProvider.cs +++ b/EosSharp/EosSharp.Core/Providers/AbiSerializationProvider.cs @@ -678,14 +678,16 @@ private void WriteAction(MemoryStream ms, Core.Api.v1.Action action, Abi abi) private void WriteAbiType(MemoryStream ms, object value, string type, Abi abi) { + var uwtype = UnwrapTypeDef(abi, type); + //optional type - if(type.EndsWith("?")) + if (uwtype.EndsWith("?")) { WriteByte(ms, value != null ? 1 : 0); if(value != null) { WriteByte(ms, 1); - type.Substring(0, type.Length - 1); + uwtype.Substring(0, uwtype.Length - 1); } else { @@ -695,10 +697,10 @@ private void WriteAbiType(MemoryStream ms, object value, string type, Abi abi) } // array type - if(type.EndsWith("[]")) + if(uwtype.EndsWith("[]")) { var items = (ICollection)value; - var arrayType = type.Substring(0, type.Length - 2); + var arrayType = uwtype.Substring(0, uwtype.Length - 2); WriteVarUint32(ms, items.Count); foreach (var item in items) @@ -715,7 +717,7 @@ private void WriteAbiType(MemoryStream ms, object value, string type, Abi abi) } else { - var abiStruct = GetTypeAbiStruct(abi, type); + var abiStruct = abi.structs.FirstOrDefault(s => s.name == uwtype); if (abiStruct != null) { WriteAbiStruct(ms, value, abiStruct, abi); @@ -773,6 +775,17 @@ private void WriteAbiStruct(MemoryStream ms, object value, AbiStruct abiStruct, } } + private string UnwrapTypeDef(Abi abi, string type) + { + var wtype = abi.types.FirstOrDefault(t => t.new_type_name == type); + if(wtype != null && wtype.type != type) + { + return UnwrapTypeDef(abi, wtype.type); + } + + return type; + } + private TSerializer GetTypeSerializerAndCache(string type, Dictionary typeSerializers, Abi abi) { TSerializer nativeSerializer; @@ -781,11 +794,11 @@ private TSerializer GetTypeSerializerAndCache(string type, Dictiona return nativeSerializer; } - var abiType = abi.types.FirstOrDefault(t => t.new_type_name == type); + var abiTypeDef = abi.types.FirstOrDefault(t => t.new_type_name == type); - if(abiType != null) + if(abiTypeDef != null) { - var serializer = GetTypeSerializerAndCache(abiType.type, typeSerializers, abi); + var serializer = GetTypeSerializerAndCache(abiTypeDef.type, typeSerializers, abi); if(serializer != null) { @@ -796,29 +809,6 @@ private TSerializer GetTypeSerializerAndCache(string type, Dictiona return default(TSerializer); } - - private AbiStruct GetTypeAbiStruct(Abi abi, string type) - { - var abiType = abi.types.FirstOrDefault(t => t.new_type_name == type); - - if(abiType != null) - { - var abiStruct = abi.structs.FirstOrDefault(s => s.name == abiType.type); - if (abiStruct != null) - { - return abiStruct; - } - else - { - return GetTypeAbiStruct(abi, abiType.type); - } - } - else - { - return abi.structs.FirstOrDefault(s => s.name == type); - } - } - #endregion #region Reader Functions @@ -1227,9 +1217,10 @@ private List ReadAbiTableList(byte[] data, ref int readIndex) private object ReadAbiType(byte[] data, string type, Abi abi, ref int readIndex) { object value = null; + var uwtype = UnwrapTypeDef(abi, type); //optional type - if (type.EndsWith("?")) + if (uwtype.EndsWith("?")) { var opt = (byte)ReadByte(data, ref readIndex); @@ -1240,9 +1231,9 @@ private object ReadAbiType(byte[] data, string type, Abi abi, ref int readIndex) } // array type - if (type.EndsWith("[]")) + if (uwtype.EndsWith("[]")) { - var arrayType = type.Substring(0, type.Length - 2); + var arrayType = uwtype.Substring(0, uwtype.Length - 2); var size = Convert.ToInt32(ReadVarUint32(data, ref readIndex)); var items = new List(size); @@ -1262,7 +1253,7 @@ private object ReadAbiType(byte[] data, string type, Abi abi, ref int readIndex) } else { - var abiStruct = GetTypeAbiStruct(abi, type); + var abiStruct = abi.structs.FirstOrDefault(s => s.name == uwtype); if (abiStruct != null) { value = ReadAbiStruct(data, abiStruct, abi, ref readIndex); diff --git a/EosSharp/EosSharp.UnitTests.Core/EosTestCasesDef.t4 b/EosSharp/EosSharp.UnitTests.Core/EosTestCasesDef.t4 index bec6023..ff5eeb9 100644 --- a/EosSharp/EosSharp.UnitTests.Core/EosTestCasesDef.t4 +++ b/EosSharp/EosSharp.UnitTests.Core/EosTestCasesDef.t4 @@ -33,6 +33,7 @@ "GetProducers", "GetScheduledTransactions", "CreateTransactionArrayData", + "CreateTransactionActionArrayStructData", "CreateTransactionAnonymousObjectData", "CreateTransaction", "CreateNewAccount" diff --git a/EosSharp/EosSharp.UnitTests.Core/EosUnitTestCases.cs b/EosSharp/EosSharp.UnitTests.Core/EosUnitTestCases.cs index e6d766e..8862649 100644 --- a/EosSharp/EosSharp.UnitTests.Core/EosUnitTestCases.cs +++ b/EosSharp/EosSharp.UnitTests.Core/EosUnitTestCases.cs @@ -90,6 +90,48 @@ public Task CreateTransactionArrayData() }); } + public Task CreateTransactionActionArrayStructData() + { + var args = new List() + { + { + new Dictionary() + { + { "air_id", Convert.ToUInt64("8") }, + { "air_place", Convert.ToString("监测点8888") }, + { "air_pm2_5", Convert.ToString("pm2.5数值") }, + { "air_voc", Convert.ToString("voc数值") }, + { "air_carbon", Convert.ToString("碳数值") }, + { "air_nitrogen", Convert.ToString("氮数值") }, + { "air_sulfur", Convert.ToString("硫数值") }, + { "air_longitude", Convert.ToString("经度") }, + { "air_latitude", Convert.ToString("纬度") } + } + } + }; + + return Eos.CreateTransaction(new Transaction() + { + actions = new List() + { + new Core.Api.v1.Action() + { + account = "platform", + authorization = new List() + { + new PermissionLevel() {actor = "player1", permission = "active" } + }, + name = "airquality", + data = new { + aql = args, + a = args, + b = args + } + } + } + }); + } + public Task CreateTransactionAnonymousObjectData() { return Eos.CreateTransaction(new Transaction() diff --git a/EosSharp/EosSharp.UnitTests.Unity3D/EosUnitTests.cs b/EosSharp/EosSharp.UnitTests.Unity3D/EosUnitTests.cs index e8f7046..130f195 100644 --- a/EosSharp/EosSharp.UnitTests.Unity3D/EosUnitTests.cs +++ b/EosSharp/EosSharp.UnitTests.Unity3D/EosUnitTests.cs @@ -137,6 +137,24 @@ public async Task CreateTransactionArrayData() else Console.WriteLine("Test CreateTransactionArrayData run failed."); } + public async Task CreateTransactionActionArrayStructData() + { + bool success = false; + try + { + await EosUnitTestCases.CreateTransactionActionArrayStructData(); + success = true; + } + catch (Exception ex) + { + Console.WriteLine(JsonConvert.SerializeObject(ex)); + } + + if(success) + Console.WriteLine("Test CreateTransactionActionArrayStructData run successfuly."); + else + Console.WriteLine("Test CreateTransactionActionArrayStructData run failed."); + } public async Task CreateTransactionAnonymousObjectData() { bool success = false; @@ -200,6 +218,7 @@ public async Task TestAll() await GetProducers(); await GetScheduledTransactions(); await CreateTransactionArrayData(); + await CreateTransactionActionArrayStructData(); await CreateTransactionAnonymousObjectData(); await CreateTransaction(); await CreateNewAccount(); diff --git a/EosSharp/EosSharp.UnitTests/EosUnitTests.cs b/EosSharp/EosSharp.UnitTests/EosUnitTests.cs index 6facd9b..13f352a 100644 --- a/EosSharp/EosSharp.UnitTests/EosUnitTests.cs +++ b/EosSharp/EosSharp.UnitTests/EosUnitTests.cs @@ -137,6 +137,23 @@ public async Task CreateTransactionArrayData() } [TestMethod] [TestCategory("Eos Tests")] + public async Task CreateTransactionActionArrayStructData() + { + bool success = false; + try + { + await EosUnitTestCases.CreateTransactionActionArrayStructData(); + success = true; + } + catch (Exception ex) + { + Console.WriteLine(JsonConvert.SerializeObject(ex)); + } + + Assert.IsTrue(success); + } + [TestMethod] + [TestCategory("Eos Tests")] public async Task CreateTransactionAnonymousObjectData() { bool success = false; diff --git a/EosSharp/EosSharp/EosSharp.csproj b/EosSharp/EosSharp/EosSharp.csproj index 4473b11..4089a30 100644 --- a/EosSharp/EosSharp/EosSharp.csproj +++ b/EosSharp/EosSharp/EosSharp.csproj @@ -13,10 +13,10 @@ Copyright 2019 eos-sharp eos-sharp - 2.0.4.0 - 2.0.4.0 - 2.0.4 - Fix bug on specialized Array types + 2.0.5.0 + 2.0.5.0 + 2.0.5 + fix bug on vector of structs typedefs false