From 93d517eab768ff97c10595d9423cc1bef46fc134 Mon Sep 17 00:00:00 2001 From: Jedd Morgan <45512892+JR-Morgan@users.noreply.github.com> Date: Wed, 12 Mar 2025 08:29:30 +0000 Subject: [PATCH] test(objects): Verify tests for serialization (#227) * Objects Verify Tests * VerifyTests * Verify as array with deterministic order * lock * Updated verified --- tests/Speckle.Objects.Tests.Unit/Module.cs | 3 +- ...peckle.Objects.Geometry.Mesh.verified.json | 76 +++++++++++++++++++ ...eckle.Objects.Geometry.Point.verified.json | 11 +++ ...ckle.Objects.Geometry.Vector.verified.json | 12 +++ .../Serialization/ObjectsSerializationTest.cs | 33 ++++++++ .../Serialization/ObjectsTestData.cs | 46 +++++++++++ tests/Speckle.Sdk.Testing/SpeckleVerify.cs | 15 ++-- 7 files changed, 189 insertions(+), 7 deletions(-) create mode 100644 tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Mesh.verified.json create mode 100644 tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Point.verified.json create mode 100644 tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Vector.verified.json create mode 100644 tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.cs create mode 100644 tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsTestData.cs diff --git a/tests/Speckle.Objects.Tests.Unit/Module.cs b/tests/Speckle.Objects.Tests.Unit/Module.cs index 999f2e69..90adcf73 100644 --- a/tests/Speckle.Objects.Tests.Unit/Module.cs +++ b/tests/Speckle.Objects.Tests.Unit/Module.cs @@ -1,6 +1,7 @@ using System.Runtime.CompilerServices; using Speckle.Objects.Geometry; using Speckle.Sdk.Host; +using Speckle.Sdk.Models; using Speckle.Sdk.Testing; namespace Speckle.Objects.Tests.Unit; @@ -12,6 +13,6 @@ public static class Module { SpeckleVerify.Initialize(); TypeLoader.Reset(); - TypeLoader.Initialize(typeof(Polyline).Assembly); + TypeLoader.Initialize(typeof(Base).Assembly, typeof(Polyline).Assembly); } } diff --git a/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Mesh.verified.json b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Mesh.verified.json new file mode 100644 index 00000000..19724719 --- /dev/null +++ b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Mesh.verified.json @@ -0,0 +1,76 @@ +[ + { + "applicationId": null, + "data": [ + 3, + 0, + 1, + 2 + ], + "id": "13da8e855141b835e68bba721411046e", + "speckle_type": "Speckle.Core.Models.DataChunk" + }, + { + "__closure": { + "13da8e855141b835e68bba721411046e": 100, + "cc9d42395b317ed25947b1285bbd5103": 100, + "ede4848fc3abda9275a19fee3447ffbd": 100 + }, + "applicationId": "asdfasdf", + "area": 42.0, + "bbox": null, + "colors": [ + { + "__closure": null, + "referencedId": "cc9d42395b317ed25947b1285bbd5103", + "speckle_type": "reference" + } + ], + "faces": [ + { + "__closure": null, + "referencedId": "13da8e855141b835e68bba721411046e", + "speckle_type": "reference" + } + ], + "id": "85fdad62ca935832449ffb359ebed7b8", + "speckle_type": "Objects.Geometry.Mesh", + "textureCoordinates": [], + "units": "m", + "vertexNormals": [], + "vertices": [ + { + "__closure": null, + "referencedId": "ede4848fc3abda9275a19fee3447ffbd", + "speckle_type": "reference" + } + ], + "volume": 420.0 + }, + { + "applicationId": null, + "data": [ + -10185235, + -10185235, + -10185235 + ], + "id": "cc9d42395b317ed25947b1285bbd5103", + "speckle_type": "Speckle.Core.Models.DataChunk" + }, + { + "applicationId": null, + "data": [ + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 1.0, + 1.0, + 0.0 + ], + "id": "ede4848fc3abda9275a19fee3447ffbd", + "speckle_type": "Speckle.Core.Models.DataChunk" + } +] diff --git a/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Point.verified.json b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Point.verified.json new file mode 100644 index 00000000..5d326b0d --- /dev/null +++ b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Point.verified.json @@ -0,0 +1,11 @@ +[ + { + "applicationId": "iosdf;juasdfioj", + "id": "035cad79be39e59c765b7946c4ea5f0c", + "speckle_type": "Objects.Geometry.Point", + "units": "ft", + "x": 123.123, + "y": 111.222, + "z": -0.001 + } +] \ No newline at end of file diff --git a/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Vector.verified.json b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Vector.verified.json new file mode 100644 index 00000000..5eb1d8cd --- /dev/null +++ b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Vector.verified.json @@ -0,0 +1,12 @@ +[ + { + "applicationId": "iosdf;juasdfioj", + "bbox": null, + "id": "282d78f7ca1a2ec37bf3fcf3f24e7a27", + "speckle_type": "Objects.Geometry.Vector", + "units": "in", + "x": 321.321, + "y": 222.111, + "z": -1.001 + } +] \ No newline at end of file diff --git a/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.cs b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.cs new file mode 100644 index 00000000..7df8e299 --- /dev/null +++ b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.cs @@ -0,0 +1,33 @@ +using Speckle.Sdk.Models; +using Speckle.Sdk.Serialisation; +using Speckle.Sdk.Serialisation.V2.Send; +using Speckle.Sdk.Testing; + +namespace Speckle.Objects.SerializationTests; + +public sealed class ObjectsSerializationTest +{ + [Theory] + [MemberData(nameof(ObjectsTestData.TheoryData), MemberType = typeof(ObjectsTestData))] + public async Task SerializeAndVerify(Base testCase) + { + var serialized = Serialize(testCase); + + await VerifySerialized(serialized).UseParameters(testCase); + } + + private static IReadOnlyList<(Id, Json, Dictionary)> Serialize(Base data) + { + using var serializer = new ObjectSerializerFactory(new BasePropertyGatherer()).Create( + new Dictionary(), + default + ); + return serializer.Serialize(data).ToList(); + } + + private static SettingsTask VerifySerialized(IReadOnlyList<(Id, Json, Dictionary)> serializedResult) + { + var jsons = serializedResult.OrderBy(x => x.Item1.Value).Select(x => x.Item2).ToArray(); + return SpeckleVerify.VerifyJsons(jsons); + } +} diff --git a/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsTestData.cs b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsTestData.cs new file mode 100644 index 00000000..9365a3d9 --- /dev/null +++ b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsTestData.cs @@ -0,0 +1,46 @@ +using Speckle.Objects.Geometry; +using Speckle.Sdk.Common; +using Speckle.Sdk.Models; +using Point = Speckle.Objects.Geometry.Point; + +namespace Speckle.Objects.SerializationTests; + +public static class ObjectsTestData +{ + /// + /// Data set of simple valid Speckle Objects + /// Right now, we should have exactly one for each non-abstract object model. + /// + /// + private static IEnumerable Data() + { + yield return new Mesh() + { + vertices = [0d, 0d, 0d, 1d, 0d, 0d, 1d, 1d, 0d], + faces = [3, 0, 1, 2], + applicationId = "asdfasdf", + units = Units.Meters, + area = 42, + volume = 420, + colors = [-10185235, -10185235, -10185235], + }; + yield return new Point() + { + x = 123.123, + y = 111.222, + z = -0.001, + applicationId = "iosdf;juasdfioj", + units = Units.Feet, + }; + yield return new Vector() + { + x = 321.321, + y = 222.111, + z = -1.001, + applicationId = "iosdf;juasdfioj", + units = Units.Inches, + }; + } + + public static TheoryData TheoryData => new(Data()); +} diff --git a/tests/Speckle.Sdk.Testing/SpeckleVerify.cs b/tests/Speckle.Sdk.Testing/SpeckleVerify.cs index 4cb3946f..fda11211 100644 --- a/tests/Speckle.Sdk.Testing/SpeckleVerify.cs +++ b/tests/Speckle.Sdk.Testing/SpeckleVerify.cs @@ -42,16 +42,19 @@ public static class SpeckleVerify Converters = { new JsonStringSerializer() }, }; - private static async Task VerifyJsonObjects(IDictionary objects, string sourceFile) => - await VerifyJson(JObject.FromObject(objects, _jsonSerializer).ToString(), sourceFile: sourceFile); + private static SettingsTask VerifyJsonObjects(IDictionary objects, string sourceFile) => + VerifyJson(JObject.FromObject(objects, _jsonSerializer).ToString(), sourceFile: sourceFile); - public static async Task VerifyJsonDictionary( + public static SettingsTask VerifyJsonDictionary( IDictionary objects, [CallerFilePath] string sourceFile = "" - ) => await VerifyJsonObjects(objects.ToDictionary(x => x.Key, x => new Json(x.Value)), sourceFile); + ) => VerifyJsonObjects(objects.ToDictionary(x => x.Key, x => new Json(x.Value)), sourceFile); - public static async Task VerifyJsonDictionary( + public static SettingsTask VerifyJsonDictionary( IDictionary objects, [CallerFilePath] string sourceFile = "" - ) => await VerifyJsonObjects(objects.ToDictionary(x => x.Key.Value, x => x.Value), sourceFile); + ) => VerifyJsonObjects(objects.ToDictionary(x => x.Key.Value, x => x.Value), sourceFile); + + public static SettingsTask VerifyJsons(IReadOnlyCollection objects, [CallerFilePath] string sourceFile = "") => + VerifyJson(JArray.FromObject(objects, _jsonSerializer).ToString(), sourceFile: sourceFile); }