Fix verification for C# unions (#7970)
* Fix verification for unions
* Run scripts\generate_code.py
---------
Co-authored-by: Michael Le <michael.le647@gmail.com>
diff --git a/src/idl_gen_csharp.cpp b/src/idl_gen_csharp.cpp
index 369460d..4e1c874 100644
--- a/src/idl_gen_csharp.cpp
+++ b/src/idl_gen_csharp.cpp
@@ -431,6 +431,10 @@
if (opts.generate_object_based_api) {
GenEnum_ObjectAPI(enum_def, code_ptr, opts);
}
+
+ if (enum_def.is_union) {
+ code += GenUnionVerify(enum_def.underlying_type);
+ }
}
bool HasUnionStringValue(const EnumDef &enum_def) const {
@@ -1755,8 +1759,6 @@
code += " }\n";
code += "}\n\n";
- code += GenUnionVerify(enum_def.underlying_type);
-
// JsonConverter
if (opts.cs_gen_json_serializer) {
if (enum_def.attributes.Lookup("private")) {
diff --git a/tests/FlatBuffers.Test/Assert.cs b/tests/FlatBuffers.Test/Assert.cs
index 7bb8004..b0ecb59 100644
--- a/tests/FlatBuffers.Test/Assert.cs
+++ b/tests/FlatBuffers.Test/Assert.cs
@@ -99,6 +99,26 @@
}
}
+ public static void ArrayEqual<T>(ArraySegment<T> expected, T[] actual)
+ {
+#if NETCOREAPP
+ ArrayEqual(expected.ToArray(), actual);
+#else
+ if (expected.Count != actual.Length)
+ {
+ throw new AssertFailedException(expected, actual);
+ }
+
+ for (var i = 0; i < expected.Count; ++i)
+ {
+ if (!expected.Array[expected.Offset + i].Equals(actual[i]))
+ {
+ throw new AssertArrayFailedException(i, expected, actual);
+ }
+ }
+#endif
+ }
+
public static void IsTrue(bool value)
{
if (!value)
diff --git a/tests/FlatBuffers.Test/ByteBufferTests.cs b/tests/FlatBuffers.Test/ByteBufferTests.cs
index 6bff2ac..f01c7ca 100644
--- a/tests/FlatBuffers.Test/ByteBufferTests.cs
+++ b/tests/FlatBuffers.Test/ByteBufferTests.cs
@@ -422,7 +422,7 @@
// Get the full array back out and ensure they are equivalent
var bbArray = uut.ToArray<T>(nOffset, data.Count);
- Assert.ArrayEqual(data.ToArray(), bbArray);
+ Assert.ArrayEqual(data, bbArray);
}
public unsafe void ByteBuffer_Put_IntPtr_Helper<T>(T[] data, int typeSize)
@@ -643,7 +643,7 @@
float[] data = null;
Assert.Throws<ArgumentNullException>(() => uut.Put(1024, data));
- ArraySegment<float> dataArraySegment = default;
+ ArraySegment<float> dataArraySegment = default(ArraySegment<float>);
Assert.Throws<ArgumentNullException>(() => uut.Put(1024, dataArraySegment));
IntPtr dataPtr = IntPtr.Zero;
diff --git a/tests/FlatBuffers.Test/FlatBufferBuilderTests.cs b/tests/FlatBuffers.Test/FlatBufferBuilderTests.cs
index 7fe9740..71fd1d0 100644
--- a/tests/FlatBuffers.Test/FlatBufferBuilderTests.cs
+++ b/tests/FlatBuffers.Test/FlatBufferBuilderTests.cs
@@ -15,6 +15,7 @@
*/
using System;
+using System.Diagnostics;
namespace Google.FlatBuffers.Test
{
@@ -586,12 +587,14 @@
[FlatBuffersTestMethod]
public void FlatBufferBuilder_Add_ArraySegment_Default_Throws()
{
- var fbb = CreateBuffer(false);
+#if NETCOREAPP
+ var fbb = CreateBuffer(false);
// Construct the data array
- ArraySegment<float> data = default;
+ ArraySegment<float> data = default(ArraySegment<float>);
Assert.Throws<ArgumentNullException>(() => fbb.Add(data));
+#endif
}
[FlatBuffersTestMethod]
diff --git a/tests/FlatBuffers.Test/FlatBuffers.Test.csproj b/tests/FlatBuffers.Test/FlatBuffers.Test.csproj
index 0f683cb..de129e1 100644
--- a/tests/FlatBuffers.Test/FlatBuffers.Test.csproj
+++ b/tests/FlatBuffers.Test/FlatBuffers.Test.csproj
@@ -66,6 +66,9 @@
<Compile Include="..\..\net\FlatBuffers\FlatBufferConstants.cs">
<Link>FlatBuffers\FlatBufferConstants.cs</Link>
</Compile>
+ <Compile Include="..\..\net\FlatBuffers\FlatBufferVerify.cs">
+ <Link>FlatBuffers\FlatBufferVerify.cs</Link>
+ </Compile>
<Compile Include="..\..\net\FlatBuffers\Struct.cs">
<Link>FlatBuffers\Struct.cs</Link>
</Compile>
@@ -120,6 +123,9 @@
<Compile Include="..\MyGame\Example\ArrayStruct.cs">
<Link>MyGame\Example\ArrayStruct.cs</Link>
</Compile>
+ <Compile Include="..\MyGame\Example\LongEnum.cs">
+ <Link>MyGame\Example\LongEnum.cs</Link>
+ </Compile>
<Compile Include="..\MyGame\Example\NestedStruct.cs">
<Link>MyGame\Example\NestedStruct.cs</Link>
</Compile>
@@ -220,4 +226,4 @@
<Target Name="AfterBuild">
</Target>
-->
-</Project>
\ No newline at end of file
+</Project>
diff --git a/tests/KeywordTest/KeywordsInUnion.cs b/tests/KeywordTest/KeywordsInUnion.cs
index d8a870f..3fccb13 100644
--- a/tests/KeywordTest/KeywordsInUnion.cs
+++ b/tests/KeywordTest/KeywordsInUnion.cs
@@ -37,28 +37,6 @@
}
}
-
-
-static public class KeywordsInUnionVerify
-{
- static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
- {
- bool result = true;
- switch((KeywordsInUnion)typeId)
- {
- case KeywordsInUnion.@static:
- result = KeywordTest.KeywordsInTableVerify.Verify(verifier, tablePos);
- break;
- case KeywordsInUnion.@internal:
- result = KeywordTest.KeywordsInTableVerify.Verify(verifier, tablePos);
- break;
- default: result = true;
- break;
- }
- return result;
- }
-}
-
public class KeywordsInUnionUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
public override bool CanConvert(System.Type objectType) {
return objectType == typeof(KeywordsInUnionUnion) || objectType == typeof(System.Collections.Generic.List<KeywordsInUnionUnion>);
@@ -102,4 +80,26 @@
}
+
+static public class KeywordsInUnionVerify
+{
+ static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+ {
+ bool result = true;
+ switch((KeywordsInUnion)typeId)
+ {
+ case KeywordsInUnion.@static:
+ result = KeywordTest.KeywordsInTableVerify.Verify(verifier, tablePos);
+ break;
+ case KeywordsInUnion.@internal:
+ result = KeywordTest.KeywordsInTableVerify.Verify(verifier, tablePos);
+ break;
+ default: result = true;
+ break;
+ }
+ return result;
+ }
+}
+
+
}
diff --git a/tests/MyGame/Example/Any.cs b/tests/MyGame/Example/Any.cs
index 021faa6..ce583f0 100644
--- a/tests/MyGame/Example/Any.cs
+++ b/tests/MyGame/Example/Any.cs
@@ -41,31 +41,6 @@
}
}
-
-
-static public class AnyVerify
-{
- static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
- {
- bool result = true;
- switch((Any)typeId)
- {
- case Any.Monster:
- result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
- break;
- case Any.TestSimpleTableWithEnum:
- result = MyGame.Example.TestSimpleTableWithEnumVerify.Verify(verifier, tablePos);
- break;
- case Any.MyGame_Example2_Monster:
- result = MyGame.Example2.MonsterVerify.Verify(verifier, tablePos);
- break;
- default: result = true;
- break;
- }
- return result;
- }
-}
-
public class AnyUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
public override bool CanConvert(System.Type objectType) {
return objectType == typeof(AnyUnion) || objectType == typeof(System.Collections.Generic.List<AnyUnion>);
@@ -110,4 +85,29 @@
}
+
+static public class AnyVerify
+{
+ static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+ {
+ bool result = true;
+ switch((Any)typeId)
+ {
+ case Any.Monster:
+ result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
+ break;
+ case Any.TestSimpleTableWithEnum:
+ result = MyGame.Example.TestSimpleTableWithEnumVerify.Verify(verifier, tablePos);
+ break;
+ case Any.MyGame_Example2_Monster:
+ result = MyGame.Example2.MonsterVerify.Verify(verifier, tablePos);
+ break;
+ default: result = true;
+ break;
+ }
+ return result;
+ }
+}
+
+
}
diff --git a/tests/MyGame/Example/AnyAmbiguousAliases.cs b/tests/MyGame/Example/AnyAmbiguousAliases.cs
index 3fb3d77..e85b055 100644
--- a/tests/MyGame/Example/AnyAmbiguousAliases.cs
+++ b/tests/MyGame/Example/AnyAmbiguousAliases.cs
@@ -41,31 +41,6 @@
}
}
-
-
-static public class AnyAmbiguousAliasesVerify
-{
- static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
- {
- bool result = true;
- switch((AnyAmbiguousAliases)typeId)
- {
- case AnyAmbiguousAliases.M1:
- result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
- break;
- case AnyAmbiguousAliases.M2:
- result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
- break;
- case AnyAmbiguousAliases.M3:
- result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
- break;
- default: result = true;
- break;
- }
- return result;
- }
-}
-
public class AnyAmbiguousAliasesUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
public override bool CanConvert(System.Type objectType) {
return objectType == typeof(AnyAmbiguousAliasesUnion) || objectType == typeof(System.Collections.Generic.List<AnyAmbiguousAliasesUnion>);
@@ -110,4 +85,29 @@
}
+
+static public class AnyAmbiguousAliasesVerify
+{
+ static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+ {
+ bool result = true;
+ switch((AnyAmbiguousAliases)typeId)
+ {
+ case AnyAmbiguousAliases.M1:
+ result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
+ break;
+ case AnyAmbiguousAliases.M2:
+ result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
+ break;
+ case AnyAmbiguousAliases.M3:
+ result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
+ break;
+ default: result = true;
+ break;
+ }
+ return result;
+ }
+}
+
+
}
diff --git a/tests/MyGame/Example/AnyUniqueAliases.cs b/tests/MyGame/Example/AnyUniqueAliases.cs
index 629edb6..099046d 100644
--- a/tests/MyGame/Example/AnyUniqueAliases.cs
+++ b/tests/MyGame/Example/AnyUniqueAliases.cs
@@ -41,31 +41,6 @@
}
}
-
-
-static public class AnyUniqueAliasesVerify
-{
- static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
- {
- bool result = true;
- switch((AnyUniqueAliases)typeId)
- {
- case AnyUniqueAliases.M:
- result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
- break;
- case AnyUniqueAliases.TS:
- result = MyGame.Example.TestSimpleTableWithEnumVerify.Verify(verifier, tablePos);
- break;
- case AnyUniqueAliases.M2:
- result = MyGame.Example2.MonsterVerify.Verify(verifier, tablePos);
- break;
- default: result = true;
- break;
- }
- return result;
- }
-}
-
public class AnyUniqueAliasesUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
public override bool CanConvert(System.Type objectType) {
return objectType == typeof(AnyUniqueAliasesUnion) || objectType == typeof(System.Collections.Generic.List<AnyUniqueAliasesUnion>);
@@ -110,4 +85,29 @@
}
+
+static public class AnyUniqueAliasesVerify
+{
+ static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+ {
+ bool result = true;
+ switch((AnyUniqueAliases)typeId)
+ {
+ case AnyUniqueAliases.M:
+ result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
+ break;
+ case AnyUniqueAliases.TS:
+ result = MyGame.Example.TestSimpleTableWithEnumVerify.Verify(verifier, tablePos);
+ break;
+ case AnyUniqueAliases.M2:
+ result = MyGame.Example2.MonsterVerify.Verify(verifier, tablePos);
+ break;
+ default: result = true;
+ break;
+ }
+ return result;
+ }
+}
+
+
}
diff --git a/tests/namespace_test/NamespaceA/NamespaceB/UnionInNestedNS.cs b/tests/namespace_test/NamespaceA/NamespaceB/UnionInNestedNS.cs
index 8105c3b..f44cd90 100644
--- a/tests/namespace_test/NamespaceA/NamespaceB/UnionInNestedNS.cs
+++ b/tests/namespace_test/NamespaceA/NamespaceB/UnionInNestedNS.cs
@@ -33,25 +33,6 @@
}
}
-
-
-static public class UnionInNestedNSVerify
-{
- static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
- {
- bool result = true;
- switch((UnionInNestedNS)typeId)
- {
- case UnionInNestedNS.TableInNestedNS:
- result = NamespaceA.NamespaceB.TableInNestedNSVerify.Verify(verifier, tablePos);
- break;
- default: result = true;
- break;
- }
- return result;
- }
-}
-
public class UnionInNestedNSUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
public override bool CanConvert(System.Type objectType) {
return objectType == typeof(UnionInNestedNSUnion) || objectType == typeof(System.Collections.Generic.List<UnionInNestedNSUnion>);
@@ -94,4 +75,23 @@
}
+
+static public class UnionInNestedNSVerify
+{
+ static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+ {
+ bool result = true;
+ switch((UnionInNestedNS)typeId)
+ {
+ case UnionInNestedNS.TableInNestedNS:
+ result = NamespaceA.NamespaceB.TableInNestedNSVerify.Verify(verifier, tablePos);
+ break;
+ default: result = true;
+ break;
+ }
+ return result;
+ }
+}
+
+
}
diff --git a/tests/union_value_collsion/union_value_collision_generated.cs b/tests/union_value_collsion/union_value_collision_generated.cs
index 7a38e86..e741e9a 100644
--- a/tests/union_value_collsion/union_value_collision_generated.cs
+++ b/tests/union_value_collsion/union_value_collision_generated.cs
@@ -37,25 +37,6 @@
}
}
-
-
-static public class ValueVerify
-{
- static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
- {
- bool result = true;
- switch((Value)typeId)
- {
- case Value.IntValue:
- result = union_value_collsion.IntValueVerify.Verify(verifier, tablePos);
- break;
- default: result = true;
- break;
- }
- return result;
- }
-}
-
public class ValueUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
public override bool CanConvert(System.Type objectType) {
return objectType == typeof(ValueUnion) || objectType == typeof(System.Collections.Generic.List<ValueUnion>);
@@ -97,6 +78,25 @@
}
}
+
+
+static public class ValueVerify
+{
+ static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+ {
+ bool result = true;
+ switch((Value)typeId)
+ {
+ case Value.IntValue:
+ result = union_value_collsion.IntValueVerify.Verify(verifier, tablePos);
+ break;
+ default: result = true;
+ break;
+ }
+ return result;
+ }
+}
+
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
public enum Other : byte
{
@@ -125,25 +125,6 @@
}
}
-
-
-static public class OtherVerify
-{
- static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
- {
- bool result = true;
- switch((Other)typeId)
- {
- case Other.IntValue:
- result = union_value_collsion.IntValueVerify.Verify(verifier, tablePos);
- break;
- default: result = true;
- break;
- }
- return result;
- }
-}
-
public class OtherUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
public override bool CanConvert(System.Type objectType) {
return objectType == typeof(OtherUnion) || objectType == typeof(System.Collections.Generic.List<OtherUnion>);
@@ -185,6 +166,25 @@
}
}
+
+
+static public class OtherVerify
+{
+ static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+ {
+ bool result = true;
+ switch((Other)typeId)
+ {
+ case Other.IntValue:
+ result = union_value_collsion.IntValueVerify.Verify(verifier, tablePos);
+ break;
+ default: result = true;
+ break;
+ }
+ return result;
+ }
+}
+
public struct IntValue : IFlatbufferObject
{
private Table __p;
diff --git a/tests/union_vector/Character.cs b/tests/union_vector/Character.cs
index f6e7c88..f2e7339 100644
--- a/tests/union_vector/Character.cs
+++ b/tests/union_vector/Character.cs
@@ -50,40 +50,6 @@
}
}
-
-
-static public class CharacterVerify
-{
- static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
- {
- bool result = true;
- switch((Character)typeId)
- {
- case Character.MuLan:
- result = AttackerVerify.Verify(verifier, tablePos);
- break;
- case Character.Rapunzel:
- result = verifier.VerifyUnionData(tablePos, 4, 4);
- break;
- case Character.Belle:
- result = verifier.VerifyUnionData(tablePos, 4, 4);
- break;
- case Character.BookFan:
- result = verifier.VerifyUnionData(tablePos, 4, 4);
- break;
- case Character.Other:
- result = verifier.VerifyUnionString(tablePos);
- break;
- case Character.Unused:
- result = verifier.VerifyUnionString(tablePos);
- break;
- default: result = true;
- break;
- }
- return result;
- }
-}
-
public class CharacterUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
public override bool CanConvert(System.Type objectType) {
return objectType == typeof(CharacterUnion) || objectType == typeof(System.Collections.Generic.List<CharacterUnion>);
@@ -130,3 +96,37 @@
}
}
+
+
+static public class CharacterVerify
+{
+ static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+ {
+ bool result = true;
+ switch((Character)typeId)
+ {
+ case Character.MuLan:
+ result = AttackerVerify.Verify(verifier, tablePos);
+ break;
+ case Character.Rapunzel:
+ result = verifier.VerifyUnionData(tablePos, 4, 4);
+ break;
+ case Character.Belle:
+ result = verifier.VerifyUnionData(tablePos, 4, 4);
+ break;
+ case Character.BookFan:
+ result = verifier.VerifyUnionData(tablePos, 4, 4);
+ break;
+ case Character.Other:
+ result = verifier.VerifyUnionString(tablePos);
+ break;
+ case Character.Unused:
+ result = verifier.VerifyUnionString(tablePos);
+ break;
+ default: result = true;
+ break;
+ }
+ return result;
+ }
+}
+
diff --git a/tests/union_vector/Gadget.cs b/tests/union_vector/Gadget.cs
index 32f0d81..883596e 100644
--- a/tests/union_vector/Gadget.cs
+++ b/tests/union_vector/Gadget.cs
@@ -34,28 +34,6 @@
}
}
-
-
-static public class GadgetVerify
-{
- static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
- {
- bool result = true;
- switch((Gadget)typeId)
- {
- case Gadget.FallingTub:
- result = verifier.VerifyUnionData(tablePos, 4, 4);
- break;
- case Gadget.HandFan:
- result = HandFanVerify.Verify(verifier, tablePos);
- break;
- default: result = true;
- break;
- }
- return result;
- }
-}
-
public class GadgetUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
public override bool CanConvert(System.Type objectType) {
return objectType == typeof(GadgetUnion) || objectType == typeof(System.Collections.Generic.List<GadgetUnion>);
@@ -98,3 +76,25 @@
}
}
+
+
+static public class GadgetVerify
+{
+ static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+ {
+ bool result = true;
+ switch((Gadget)typeId)
+ {
+ case Gadget.FallingTub:
+ result = verifier.VerifyUnionData(tablePos, 4, 4);
+ break;
+ case Gadget.HandFan:
+ result = HandFanVerify.Verify(verifier, tablePos);
+ break;
+ default: result = true;
+ break;
+ }
+ return result;
+ }
+}
+