diff --git a/.editorconfig b/.editorconfig
index dcb0a171..a4ac5b64 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -316,3 +316,13 @@ dotnet_diagnostic.NUnit2039.severity = warning # Consider using Assert.That(actu
indent_style = space
indent_size = 2
tab_width = 2
+
+# Verify
+[*.{received,verified}.{json}]
+charset = utf-8-bom
+end_of_line = lf
+indent_size = unset
+indent_style = unset
+insert_final_newline = false
+tab_width = unset
+trim_trailing_whitespace = false
\ No newline at end of file
diff --git a/.gitattributes b/.gitattributes
index 0a96b77c..d87a165f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -2,4 +2,7 @@
* text=auto
# need original files to be windows
-*.txt text eol=crlf
\ No newline at end of file
+*.txt text eol=crlf
+
+# Verify
+*.verified.json text eol=lf working-tree-encoding=UTF-8
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 6e3d7b2a..190742b6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,4 +18,6 @@ tools
.DS_Store
*.snupkg
-coverage.xml
\ No newline at end of file
+coverage.xml
+
+*.received.*
\ No newline at end of file
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 945ae32b..d8baa777 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -25,11 +25,15 @@
+
+
+
+
-
+
\ No newline at end of file
diff --git a/tests/Speckle.Sdk.Serialization.Tests/DummyReceiveServerObjectManager.cs b/Speckle.Sdk.Testing/Framework/DummyReceiveServerObjectManager.cs
similarity index 97%
rename from tests/Speckle.Sdk.Serialization.Tests/DummyReceiveServerObjectManager.cs
rename to Speckle.Sdk.Testing/Framework/DummyReceiveServerObjectManager.cs
index fb4c09fb..b44c4f34 100644
--- a/tests/Speckle.Sdk.Serialization.Tests/DummyReceiveServerObjectManager.cs
+++ b/Speckle.Sdk.Testing/Framework/DummyReceiveServerObjectManager.cs
@@ -4,7 +4,7 @@ using Speckle.Sdk.Serialisation.V2;
using Speckle.Sdk.Serialisation.V2.Send;
using Speckle.Sdk.Transports;
-namespace Speckle.Sdk.Serialization.Tests;
+namespace Speckle.Sdk.Testing.Framework;
public class DummyReceiveServerObjectManager(Dictionary objects) : IServerObjectManager
{
diff --git a/tests/Speckle.Sdk.Serialization.Tests/DummySendServerObjectManager.cs b/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs
similarity index 96%
rename from tests/Speckle.Sdk.Serialization.Tests/DummySendServerObjectManager.cs
rename to Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs
index b0873527..0ae163c4 100644
--- a/tests/Speckle.Sdk.Serialization.Tests/DummySendServerObjectManager.cs
+++ b/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs
@@ -3,7 +3,7 @@ using Speckle.Sdk.Serialisation.V2;
using Speckle.Sdk.Serialisation.V2.Send;
using Speckle.Sdk.Transports;
-namespace Speckle.Sdk.Serialization.Tests;
+namespace Speckle.Sdk.Testing.Framework;
public class DummySendServerObjectManager(ConcurrentDictionary savedObjects) : IServerObjectManager
{
diff --git a/tests/Speckle.Sdk.Serialization.Tests/DummySqLiteReceiveManager.cs b/Speckle.Sdk.Testing/Framework/DummySqLiteReceiveManager.cs
similarity index 81%
rename from tests/Speckle.Sdk.Serialization.Tests/DummySqLiteReceiveManager.cs
rename to Speckle.Sdk.Testing/Framework/DummySqLiteReceiveManager.cs
index 797eacd9..b36e6076 100644
--- a/tests/Speckle.Sdk.Serialization.Tests/DummySqLiteReceiveManager.cs
+++ b/Speckle.Sdk.Testing/Framework/DummySqLiteReceiveManager.cs
@@ -1,8 +1,8 @@
using Speckle.Sdk.SQLite;
-namespace Speckle.Sdk.Serialization.Tests;
+namespace Speckle.Sdk.Testing.Framework;
-public class DummySqLiteReceiveManager(Dictionary savedObjects) : ISqLiteJsonCacheManager
+public sealed class DummySqLiteReceiveManager(Dictionary savedObjects) : ISqLiteJsonCacheManager
{
public void Dispose() { }
diff --git a/tests/Speckle.Sdk.Serialization.Tests/DummySqLiteSendManager.cs b/Speckle.Sdk.Testing/Framework/DummySqLiteSendManager.cs
similarity index 86%
rename from tests/Speckle.Sdk.Serialization.Tests/DummySqLiteSendManager.cs
rename to Speckle.Sdk.Testing/Framework/DummySqLiteSendManager.cs
index 0b93af62..68b37f7d 100644
--- a/tests/Speckle.Sdk.Serialization.Tests/DummySqLiteSendManager.cs
+++ b/Speckle.Sdk.Testing/Framework/DummySqLiteSendManager.cs
@@ -1,8 +1,8 @@
using Speckle.Sdk.SQLite;
-namespace Speckle.Sdk.Serialization.Tests;
+namespace Speckle.Sdk.Testing.Framework;
-public class DummySqLiteSendManager : ISqLiteJsonCacheManager
+public sealed class DummySqLiteSendManager : ISqLiteJsonCacheManager
{
public string? GetObject(string id) => throw new NotImplementedException();
diff --git a/Speckle.Sdk.Testing/Framework/IdStringSerializer.cs b/Speckle.Sdk.Testing/Framework/IdStringSerializer.cs
new file mode 100644
index 00000000..5a7e7258
--- /dev/null
+++ b/Speckle.Sdk.Testing/Framework/IdStringSerializer.cs
@@ -0,0 +1,24 @@
+using System.Diagnostics.CodeAnalysis;
+using Argon;
+using Speckle.Sdk.Common;
+using Speckle.Sdk.Serialisation;
+
+namespace Speckle.Sdk.Testing.Framework;
+
+[SuppressMessage("Design", "CA1062:Validate arguments of public methods")]
+public class IdStringSerializer : JsonConverter
+{
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ var id = (Id)value;
+ writer.WriteValue(id.Value);
+ }
+
+ public override object? ReadJson(JsonReader reader, Type type, object? existingValue, JsonSerializer serializer)
+ {
+ var json = reader.ReadAsString();
+ return new Id(json.NotNull());
+ }
+
+ public override bool CanConvert(Type type) => typeof(Id) == type;
+}
diff --git a/Speckle.Sdk.Testing/Framework/JsonStringSerializer.cs b/Speckle.Sdk.Testing/Framework/JsonStringSerializer.cs
new file mode 100644
index 00000000..11feb571
--- /dev/null
+++ b/Speckle.Sdk.Testing/Framework/JsonStringSerializer.cs
@@ -0,0 +1,24 @@
+using System.Diagnostics.CodeAnalysis;
+using Argon;
+using Speckle.Sdk.Common;
+using Speckle.Sdk.Serialisation;
+
+namespace Speckle.Sdk.Testing.Framework;
+
+[SuppressMessage("Design", "CA1062:Validate arguments of public methods")]
+public class JsonStringSerializer : JsonConverter
+{
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ var json = (Json)value;
+ writer.WriteRawValue(JObject.Parse(json.Value).ToString(Formatting.Indented));
+ }
+
+ public override object? ReadJson(JsonReader reader, Type type, object? existingValue, JsonSerializer serializer)
+ {
+ var json = reader.ReadAsString();
+ return new Json(json.NotNull());
+ }
+
+ public override bool CanConvert(Type type) => typeof(Json) == type;
+}
diff --git a/Speckle.Sdk.Testing/Global.cs b/Speckle.Sdk.Testing/Global.cs
new file mode 100644
index 00000000..c7fc3b1f
--- /dev/null
+++ b/Speckle.Sdk.Testing/Global.cs
@@ -0,0 +1 @@
+[assembly: CollectionBehavior(DisableTestParallelization = true)]
diff --git a/Speckle.Sdk.Testing/Speckle.Sdk.Testing.csproj b/Speckle.Sdk.Testing/Speckle.Sdk.Testing.csproj
new file mode 100644
index 00000000..ba4b54c6
--- /dev/null
+++ b/Speckle.Sdk.Testing/Speckle.Sdk.Testing.csproj
@@ -0,0 +1,19 @@
+
+
+
+ net8.0
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Speckle.Sdk.Testing/SpeckleVerify.cs b/Speckle.Sdk.Testing/SpeckleVerify.cs
new file mode 100644
index 00000000..97d276e5
--- /dev/null
+++ b/Speckle.Sdk.Testing/SpeckleVerify.cs
@@ -0,0 +1,45 @@
+using System.Runtime.CompilerServices;
+using Argon;
+using Speckle.Sdk.Serialisation;
+using Speckle.Sdk.Testing.Framework;
+
+namespace Speckle.Sdk.Testing;
+
+public static class SpeckleVerify
+{
+ [ModuleInitializer]
+ public static void Initialize()
+ {
+ VerifierSettings.DontScrubGuids();
+ VerifierSettings.DontScrubDateTimes();
+
+ VerifierSettings.UseStrictJson();
+ VerifierSettings.DontIgnoreEmptyCollections();
+ VerifierSettings.SortPropertiesAlphabetically();
+ VerifierSettings.SortJsonObjects();
+ if (!VerifyQuibble.Initialized)
+ {
+ VerifyQuibble.Initialize();
+ }
+ }
+
+ private static readonly JsonSerializer _jsonSerializer = new()
+ {
+ NullValueHandling = NullValueHandling.Include,
+ Formatting = Formatting.Indented,
+ Converters = { new JsonStringSerializer() },
+ };
+
+ private static async Task VerifyJsonObjects(IDictionary objects, string sourceFile) =>
+ await VerifyJson(JObject.FromObject(objects, _jsonSerializer).ToString(), sourceFile: sourceFile);
+
+ public static async Task VerifyJsonDictionary(
+ IDictionary objects,
+ [CallerFilePath] string sourceFile = ""
+ ) => await VerifyJsonObjects(objects.ToDictionary(x => x.Key, x => new Json(x.Value)), sourceFile);
+
+ public static async Task VerifyJsonDictionary(
+ IDictionary objects,
+ [CallerFilePath] string sourceFile = ""
+ ) => await VerifyJsonObjects(objects.ToDictionary(x => x.Key.Value, x => x.Value), sourceFile);
+}
diff --git a/Speckle.Sdk.Testing/VerifyTests.cs b/Speckle.Sdk.Testing/VerifyTests.cs
new file mode 100644
index 00000000..a303625d
--- /dev/null
+++ b/Speckle.Sdk.Testing/VerifyTests.cs
@@ -0,0 +1,7 @@
+namespace Speckle.Sdk.Testing;
+
+public class VerifyTests
+{
+ [Fact]
+ public Task TestVerify() => VerifyChecks.Run();
+}
diff --git a/Speckle.Sdk.Testing/packages.lock.json b/Speckle.Sdk.Testing/packages.lock.json
new file mode 100644
index 00000000..6664fe19
--- /dev/null
+++ b/Speckle.Sdk.Testing/packages.lock.json
@@ -0,0 +1,421 @@
+{
+ "version": 2,
+ "dependencies": {
+ "net8.0": {
+ "GitVersion.MsBuild": {
+ "type": "Direct",
+ "requested": "[5.12.0, )",
+ "resolved": "5.12.0",
+ "contentHash": "dJuigXycpJNOiLT9or7mkHSkGFHgGW3/p6cNNYEKZBa7Hhp1FdX/cvqYWWYhRLpfoZOedeA7aRbYiOB3vW/dvA=="
+ },
+ "Microsoft.NET.Test.Sdk": {
+ "type": "Direct",
+ "requested": "[17.12.0, )",
+ "resolved": "17.12.0",
+ "contentHash": "kt/PKBZ91rFCWxVIJZSgVLk+YR+4KxTuHf799ho8WNiK5ZQpJNAEZCAWX86vcKrs+DiYjiibpYKdGZP6+/N17w==",
+ "dependencies": {
+ "Microsoft.CodeCoverage": "17.12.0",
+ "Microsoft.TestPlatform.TestHost": "17.12.0"
+ }
+ },
+ "Microsoft.SourceLink.GitHub": {
+ "type": "Direct",
+ "requested": "[8.0.0, )",
+ "resolved": "8.0.0",
+ "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==",
+ "dependencies": {
+ "Microsoft.Build.Tasks.Git": "8.0.0",
+ "Microsoft.SourceLink.Common": "8.0.0"
+ }
+ },
+ "PolySharp": {
+ "type": "Direct",
+ "requested": "[1.15.0, )",
+ "resolved": "1.15.0",
+ "contentHash": "FbU0El+EEjdpuIX4iDbeS7ki1uzpJPx8vbqOzEtqnl1GZeAGJfq+jCbxeJL2y0EPnUNk8dRnnqR2xnYXg9Tf+g=="
+ },
+ "Speckle.InterfaceGenerator": {
+ "type": "Direct",
+ "requested": "[0.9.6, )",
+ "resolved": "0.9.6",
+ "contentHash": "HKH7tYrYYlCK1ct483hgxERAdVdMtl7gUKW9ijWXxA1UsYR4Z+TrRHYmzZ9qmpu1NnTycSrp005NYM78GDKV1w=="
+ },
+ "Verify.Quibble": {
+ "type": "Direct",
+ "requested": "[2.1.1, )",
+ "resolved": "2.1.1",
+ "contentHash": "Z8bVwFICa3Dog6Mcnx0wlrn4Y+CFpQXx1f+ijfLn6/v4q00q+jLm9Gu/nVyUFuc75cjn6ieI08UrqXKcR9fTYw==",
+ "dependencies": {
+ "Quibble": "0.3.1",
+ "System.Text.Json": "8.0.4",
+ "Verify": "26.1.1"
+ }
+ },
+ "Verify.Xunit": {
+ "type": "Direct",
+ "requested": "[28.9.0, )",
+ "resolved": "28.9.0",
+ "contentHash": "YlgbJzajNvnzTVqWtZuWdZFcShX4MyQqM4FJ28qSf7hY8wvB8G6y2EwHit+Wz/nYrdnCXWYK81JR7dxTxSeuDg==",
+ "dependencies": {
+ "Argon": "0.26.0",
+ "DiffEngine": "15.8.0",
+ "SimpleInfoName": "3.1.0",
+ "System.IO.Hashing": "9.0.0",
+ "Verify": "28.9.0",
+ "xunit.abstractions": "2.0.3",
+ "xunit.extensibility.execution": "2.9.3"
+ }
+ },
+ "xunit.runner.visualstudio": {
+ "type": "Direct",
+ "requested": "[3.0.1, )",
+ "resolved": "3.0.1",
+ "contentHash": "lbyYtsBxA8Pz8kaf5Xn/Mj1mL9z2nlBWdZhqFaj66nxXBa4JwiTDm4eGcpSMet6du9TOWI6bfha+gQR6+IHawg=="
+ },
+ "Argon": {
+ "type": "Transitive",
+ "resolved": "0.26.0",
+ "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw=="
+ },
+ "DiffEngine": {
+ "type": "Transitive",
+ "resolved": "15.8.0",
+ "contentHash": "+2cUvCcpUWziG6hnns6lwxkj6VVA+WsEGx3JqHIAt/1D7p+zpyWebqXihcfXzrZ5EqQmM4h+PpuUhYWH0TeCvQ==",
+ "dependencies": {
+ "EmptyFiles": "8.7.1",
+ "System.Management": "9.0.0"
+ }
+ },
+ "EmptyFiles": {
+ "type": "Transitive",
+ "resolved": "8.7.1",
+ "contentHash": "C8pvg0TvG2Mkn5LGNFGkFgFu8SUgYFwiu8U3y34qGQnnwKmGnlQTfTIUrtzfSjPxA4q7L/kRu09U5p32otZ2Aw=="
+ },
+ "FSharp.Core": {
+ "type": "Transitive",
+ "resolved": "7.0.300",
+ "contentHash": "8vvItREJ1l5lcp3vBCSJ1mFevVAhR48I34DuF/EoUa7o1KlFpQpagyuZkVYMAsHPIjdp47ZxM9sI4eqeXaeWkA=="
+ },
+ "GraphQL.Client.Abstractions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "h7uzWFORHZ+CCjwr/ThAyXMr0DPpzEANDa4Uo54wqCQ+j7qUKwqYTgOrb1W40sqbvNaZm9v/X7It31SUw0maHA==",
+ "dependencies": {
+ "GraphQL.Primitives": "6.0.0"
+ }
+ },
+ "GraphQL.Client.Abstractions.Websocket": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "Nr9bPf8gIOvLuXpqEpqr9z9jslYFJOvd0feHth3/kPqeR3uMbjF5pjiwh4jxyMcxHdr8Pb6QiXkV3hsSyt0v7A==",
+ "dependencies": {
+ "GraphQL.Client.Abstractions": "6.0.0"
+ }
+ },
+ "GraphQL.Primitives": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA=="
+ },
+ "Microsoft.Build.Tasks.Git": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
+ },
+ "Microsoft.CodeCoverage": {
+ "type": "Transitive",
+ "resolved": "17.12.0",
+ "contentHash": "4svMznBd5JM21JIG2xZKGNanAHNXplxf/kQDFfLHXQ3OnpJkayRK/TjacFjA+EYmoyuNXHo/sOETEfcYtAzIrA=="
+ },
+ "Microsoft.Data.Sqlite.Core": {
+ "type": "Transitive",
+ "resolved": "7.0.5",
+ "contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
+ "dependencies": {
+ "SQLitePCLRaw.core": "2.1.4"
+ }
+ },
+ "Microsoft.Extensions.Configuration": {
+ "type": "Transitive",
+ "resolved": "2.2.0",
+ "contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Abstractions": {
+ "type": "Transitive",
+ "resolved": "2.2.0",
+ "contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "2.2.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Binder": {
+ "type": "Transitive",
+ "resolved": "2.2.0",
+ "contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "2.2.0"
+ }
+ },
+ "Microsoft.Extensions.Logging.Abstractions": {
+ "type": "Transitive",
+ "resolved": "2.2.0",
+ "contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A=="
+ },
+ "Microsoft.Extensions.Options": {
+ "type": "Transitive",
+ "resolved": "2.2.0",
+ "contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
+ "Microsoft.Extensions.Primitives": "2.2.0",
+ "System.ComponentModel.Annotations": "4.5.0"
+ }
+ },
+ "Microsoft.Extensions.Primitives": {
+ "type": "Transitive",
+ "resolved": "2.2.0",
+ "contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==",
+ "dependencies": {
+ "System.Memory": "4.5.1",
+ "System.Runtime.CompilerServices.Unsafe": "4.5.1"
+ }
+ },
+ "Microsoft.SourceLink.Common": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
+ },
+ "Microsoft.TestPlatform.ObjectModel": {
+ "type": "Transitive",
+ "resolved": "17.12.0",
+ "contentHash": "TDqkTKLfQuAaPcEb3pDDWnh7b3SyZF+/W9OZvWFp6eJCIiiYFdSB6taE2I6tWrFw5ywhzOb6sreoGJTI6m3rSQ==",
+ "dependencies": {
+ "System.Reflection.Metadata": "1.6.0"
+ }
+ },
+ "Microsoft.TestPlatform.TestHost": {
+ "type": "Transitive",
+ "resolved": "17.12.0",
+ "contentHash": "MiPEJQNyADfwZ4pJNpQex+t9/jOClBGMiCiVVFuELCMSX2nmNfvUor3uFVxNNCg30uxDP8JDYfPnMXQzsfzYyg==",
+ "dependencies": {
+ "Microsoft.TestPlatform.ObjectModel": "17.12.0",
+ "Newtonsoft.Json": "13.0.1"
+ }
+ },
+ "Newtonsoft.Json": {
+ "type": "Transitive",
+ "resolved": "13.0.1",
+ "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A=="
+ },
+ "Quibble": {
+ "type": "Transitive",
+ "resolved": "0.3.1",
+ "contentHash": "LD6bz2p+4O/BQnmD4mqFZrmdN/IjsPo1wUvfmcH46Q05ng+dyMLl3d2ylj0x412F4fpJEtm0Z3EaCAx4FqgNuQ==",
+ "dependencies": {
+ "FSharp.Core": "7.0.300",
+ "System.Text.Json": "7.0.3"
+ }
+ },
+ "SimpleInfoName": {
+ "type": "Transitive",
+ "resolved": "3.1.0",
+ "contentHash": "j+ENh86NhxrgDc6T1ueqIR2QOdDkSJY2dbTFyPN/JvIXifB4GHAunlMw/x7P6m7XaXEHr3s+SMZfKBlmnmkO6g=="
+ },
+ "SQLitePCLRaw.bundle_e_sqlite3": {
+ "type": "Transitive",
+ "resolved": "2.1.4",
+ "contentHash": "EWI1olKDjFEBMJu0+3wuxwziIAdWDVMYLhuZ3Qs84rrz+DHwD00RzWPZCa+bLnHCf3oJwuFZIRsHT5p236QXww==",
+ "dependencies": {
+ "SQLitePCLRaw.lib.e_sqlite3": "2.1.4",
+ "SQLitePCLRaw.provider.e_sqlite3": "2.1.4"
+ }
+ },
+ "SQLitePCLRaw.core": {
+ "type": "Transitive",
+ "resolved": "2.1.4",
+ "contentHash": "inBjvSHo9UDKneGNzfUfDjK08JzlcIhn1+SP5Y3m6cgXpCxXKCJDy6Mka7LpgSV+UZmKSnC8rTwB0SQ0xKu5pA==",
+ "dependencies": {
+ "System.Memory": "4.5.3"
+ }
+ },
+ "SQLitePCLRaw.lib.e_sqlite3": {
+ "type": "Transitive",
+ "resolved": "2.1.4",
+ "contentHash": "2C9Q9eX7CPLveJA0rIhf9RXAvu+7nWZu1A2MdG6SD/NOu26TakGgL1nsbc0JAspGijFOo3HoN79xrx8a368fBg=="
+ },
+ "SQLitePCLRaw.provider.e_sqlite3": {
+ "type": "Transitive",
+ "resolved": "2.1.4",
+ "contentHash": "CSlb5dUp1FMIkez9Iv5EXzpeq7rHryVNqwJMWnpq87j9zWZexaEMdisDktMsnnrzKM6ahNrsTkjqNodTBPBxtQ==",
+ "dependencies": {
+ "SQLitePCLRaw.core": "2.1.4"
+ }
+ },
+ "System.CodeDom": {
+ "type": "Transitive",
+ "resolved": "9.0.0",
+ "contentHash": "oTE5IfuMoET8yaZP/vdvy9xO47guAv/rOhe4DODuFBN3ySprcQOlXqO3j+e/H/YpKKR5sglrxRaZ2HYOhNJrqA=="
+ },
+ "System.ComponentModel.Annotations": {
+ "type": "Transitive",
+ "resolved": "4.5.0",
+ "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg=="
+ },
+ "System.IO.Hashing": {
+ "type": "Transitive",
+ "resolved": "9.0.0",
+ "contentHash": "seeO8icDfED/Qwl9PDFUx2Gf/7xv7dPsMnw5PnRwNZuz4EWMpy0wIVohC4MfCcTIoJgp+KUrWG4WH3NPSusQOA=="
+ },
+ "System.Management": {
+ "type": "Transitive",
+ "resolved": "9.0.0",
+ "contentHash": "bVh4xAMI5grY5GZoklKcMBLirhC8Lqzp63Ft3zXJacwGAlLyFdF4k0qz4pnKIlO6HyL2Z4zqmHm9UkzEo6FFsA==",
+ "dependencies": {
+ "System.CodeDom": "9.0.0"
+ }
+ },
+ "System.Memory": {
+ "type": "Transitive",
+ "resolved": "4.5.3",
+ "contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA=="
+ },
+ "System.Reactive": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ=="
+ },
+ "System.Reflection.Metadata": {
+ "type": "Transitive",
+ "resolved": "1.6.0",
+ "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ=="
+ },
+ "System.Runtime.CompilerServices.Unsafe": {
+ "type": "Transitive",
+ "resolved": "4.5.1",
+ "contentHash": "Zh8t8oqolRaFa9vmOZfdQm/qKejdqz0J9kr7o2Fu0vPeoH3BL1EOXipKWwkWtLT1JPzjByrF19fGuFlNbmPpiw=="
+ },
+ "System.Text.Encodings.Web": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ=="
+ },
+ "System.Text.Json": {
+ "type": "Transitive",
+ "resolved": "8.0.4",
+ "contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==",
+ "dependencies": {
+ "System.Text.Encodings.Web": "8.0.0"
+ }
+ },
+ "xunit.abstractions": {
+ "type": "Transitive",
+ "resolved": "2.0.3",
+ "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg=="
+ },
+ "xunit.extensibility.core": {
+ "type": "Transitive",
+ "resolved": "2.9.3",
+ "contentHash": "kf3si0YTn2a8J8eZNb+zFpwfoyvIrQ7ivNk5ZYA5yuYk1bEtMe4DxJ2CF/qsRgmEnDr7MnW1mxylBaHTZ4qErA==",
+ "dependencies": {
+ "xunit.abstractions": "2.0.3"
+ }
+ },
+ "xunit.extensibility.execution": {
+ "type": "Transitive",
+ "resolved": "2.9.3",
+ "contentHash": "yMb6vMESlSrE3Wfj7V6cjQ3S4TXdXpRqYeNEI3zsX31uTsGMJjEw6oD5F5u1cHnMptjhEECnmZSsPxB6ChZHDQ==",
+ "dependencies": {
+ "xunit.extensibility.core": "[2.9.3]"
+ }
+ },
+ "speckle.sdk": {
+ "type": "Project",
+ "dependencies": {
+ "GraphQL.Client": "[6.0.0, )",
+ "Microsoft.CSharp": "[4.7.0, )",
+ "Microsoft.Data.Sqlite": "[7.0.5, 7.0.5]",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "[2.2.0, 2.2.0]",
+ "Microsoft.Extensions.Logging": "[2.2.0, 2.2.0]",
+ "Speckle.DoubleNumerics": "[4.0.1, )",
+ "Speckle.Newtonsoft.Json": "[13.0.2, )",
+ "Speckle.Sdk.Dependencies": "[1.0.0, )"
+ }
+ },
+ "speckle.sdk.dependencies": {
+ "type": "Project"
+ },
+ "GraphQL.Client": {
+ "type": "CentralTransitive",
+ "requested": "[6.0.0, )",
+ "resolved": "6.0.0",
+ "contentHash": "8yPNBbuVBpTptivyAlak4GZvbwbUcjeQTL4vN1HKHRuOykZ4r7l5fcLS6vpyPyLn0x8FsL31xbOIKyxbmR9rbA==",
+ "dependencies": {
+ "GraphQL.Client.Abstractions": "6.0.0",
+ "GraphQL.Client.Abstractions.Websocket": "6.0.0",
+ "System.Reactive": "5.0.0"
+ }
+ },
+ "Microsoft.CSharp": {
+ "type": "CentralTransitive",
+ "requested": "[4.7.0, )",
+ "resolved": "4.7.0",
+ "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA=="
+ },
+ "Microsoft.Data.Sqlite": {
+ "type": "CentralTransitive",
+ "requested": "[7.0.5, 7.0.5]",
+ "resolved": "7.0.5",
+ "contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
+ "dependencies": {
+ "Microsoft.Data.Sqlite.Core": "7.0.5",
+ "SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection.Abstractions": {
+ "type": "CentralTransitive",
+ "requested": "[2.2.0, 2.2.0]",
+ "resolved": "2.2.0",
+ "contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
+ },
+ "Microsoft.Extensions.Logging": {
+ "type": "CentralTransitive",
+ "requested": "[2.2.0, 2.2.0]",
+ "resolved": "2.2.0",
+ "contentHash": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Binder": "2.2.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
+ "Microsoft.Extensions.Logging.Abstractions": "2.2.0",
+ "Microsoft.Extensions.Options": "2.2.0"
+ }
+ },
+ "Speckle.DoubleNumerics": {
+ "type": "CentralTransitive",
+ "requested": "[4.0.1, )",
+ "resolved": "4.0.1",
+ "contentHash": "MzEQ1Im0zTja+tEsdRIk/WlPiKqb22NmTOJcR1ZKm/mz46pezyyID3/wRz6vJUELMpSLnG7LhsxBL+nxbr7V0w=="
+ },
+ "Speckle.Newtonsoft.Json": {
+ "type": "CentralTransitive",
+ "requested": "[13.0.2, )",
+ "resolved": "13.0.2",
+ "contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
+ },
+ "Verify": {
+ "type": "CentralTransitive",
+ "requested": "[28.9.0, )",
+ "resolved": "28.9.0",
+ "contentHash": "qni0zDkkYSPIhnYejZCOq5ueH+y0s7kEdpSbFXarcxP7rjZvZD0Yuc567KFVFMbVRAo9IORfv9zcXtTGFmpz8A==",
+ "dependencies": {
+ "Argon": "0.26.0",
+ "DiffEngine": "15.8.0",
+ "SimpleInfoName": "3.1.0",
+ "System.IO.Hashing": "9.0.0"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Speckle.Sdk.sln b/Speckle.Sdk.sln
index 90b5b90f..94d4b613 100644
--- a/Speckle.Sdk.sln
+++ b/Speckle.Sdk.sln
@@ -46,6 +46,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Speckle.Sdk.Serialization.T
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Speckle.Sdk.Dependencies", "src\Speckle.Sdk.Dependencies\Speckle.Sdk.Dependencies.csproj", "{27584AB4-8ACD-4850-8CC2-7E5BC739FB78}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Speckle.Sdk.Testing", "Speckle.Sdk.Testing\Speckle.Sdk.Testing.csproj", "{7B617C0D-2354-415C-993C-5071D4113E27}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "performance", "performance", "{FFB07238-87E8-463A-AA39-3B38AAAA94C1}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -96,6 +100,10 @@ Global
{27584AB4-8ACD-4850-8CC2-7E5BC739FB78}.Debug|Any CPU.Build.0 = Debug|Any CPU
{27584AB4-8ACD-4850-8CC2-7E5BC739FB78}.Release|Any CPU.ActiveCfg = Release|Any CPU
{27584AB4-8ACD-4850-8CC2-7E5BC739FB78}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7B617C0D-2354-415C-993C-5071D4113E27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7B617C0D-2354-415C-993C-5071D4113E27}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7B617C0D-2354-415C-993C-5071D4113E27}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7B617C0D-2354-415C-993C-5071D4113E27}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{A413E196-3696-4F48-B635-04B5F76BF9C9} = {5CB96C27-FC5B-4A41-86B6-951AF99B8116}
@@ -106,8 +114,9 @@ Global
{AA1E1E51-49AE-4F71-84B1-938E19695BE0} = {35047EE7-AD1D-4741-80A7-8F0E874718E9}
{4FB41A6D-D139-4111-8115-E3F9F6BEAF24} = {35047EE7-AD1D-4741-80A7-8F0E874718E9}
{B623BD21-5CAA-43F9-A539-1835276C220E} = {DA2AED52-58F9-471E-8AD8-102FD36129E3}
- {870E3396-E6F7-43AE-B120-E651FA4F46BD} = {35047EE7-AD1D-4741-80A7-8F0E874718E9}
- {FF922B6D-D416-4348-8CB8-0C8B28691070} = {35047EE7-AD1D-4741-80A7-8F0E874718E9}
{27584AB4-8ACD-4850-8CC2-7E5BC739FB78} = {5CB96C27-FC5B-4A41-86B6-951AF99B8116}
+ {7B617C0D-2354-415C-993C-5071D4113E27} = {35047EE7-AD1D-4741-80A7-8F0E874718E9}
+ {FF922B6D-D416-4348-8CB8-0C8B28691070} = {FFB07238-87E8-463A-AA39-3B38AAAA94C1}
+ {870E3396-E6F7-43AE-B120-E651FA4F46BD} = {FFB07238-87E8-463A-AA39-3B38AAAA94C1}
EndGlobalSection
EndGlobal
diff --git a/tests/Speckle.Objects.Tests.Unit/Geometry/ArcTests.cs b/tests/Speckle.Objects.Tests.Unit/Geometry/ArcTests.cs
index 6c9627ff..a7ab2d8c 100644
--- a/tests/Speckle.Objects.Tests.Unit/Geometry/ArcTests.cs
+++ b/tests/Speckle.Objects.Tests.Unit/Geometry/ArcTests.cs
@@ -1,7 +1,6 @@
using FluentAssertions;
using Speckle.Objects.Geometry;
using Speckle.Sdk.Common;
-using Xunit;
namespace Speckle.Objects.Tests.Unit.Geometry;
diff --git a/tests/Speckle.Objects.Tests.Unit/Geometry/BoxTests.CanCreateBox.verified.json b/tests/Speckle.Objects.Tests.Unit/Geometry/BoxTests.CanCreateBox.verified.json
new file mode 100644
index 00000000..25d25b00
--- /dev/null
+++ b/tests/Speckle.Objects.Tests.Unit/Geometry/BoxTests.CanCreateBox.verified.json
@@ -0,0 +1,90 @@
+{
+ "basePlane": {
+ "origin": {
+ "units": "m",
+ "speckle_type": "Objects.Geometry.Point",
+ "DynamicPropertyKeys": []
+ },
+ "normal": {
+ "units": "m",
+ "z": 1.0,
+ "Length": 1.0,
+ "speckle_type": "Objects.Geometry.Vector",
+ "DynamicPropertyKeys": []
+ },
+ "xdir": {
+ "units": "m",
+ "x": 1.0,
+ "Length": 1.0,
+ "speckle_type": "Objects.Geometry.Vector",
+ "DynamicPropertyKeys": []
+ },
+ "ydir": {
+ "units": "m",
+ "y": 1.0,
+ "Length": 1.0,
+ "speckle_type": "Objects.Geometry.Vector",
+ "DynamicPropertyKeys": []
+ },
+ "units": "m",
+ "speckle_type": "Objects.Geometry.Plane",
+ "DynamicPropertyKeys": []
+ },
+ "plane": {
+ "origin": {
+ "units": "m",
+ "speckle_type": "Objects.Geometry.Point",
+ "DynamicPropertyKeys": []
+ },
+ "normal": {
+ "units": "m",
+ "z": 1.0,
+ "Length": 1.0,
+ "speckle_type": "Objects.Geometry.Vector",
+ "DynamicPropertyKeys": []
+ },
+ "xdir": {
+ "units": "m",
+ "x": 1.0,
+ "Length": 1.0,
+ "speckle_type": "Objects.Geometry.Vector",
+ "DynamicPropertyKeys": []
+ },
+ "ydir": {
+ "units": "m",
+ "y": 1.0,
+ "Length": 1.0,
+ "speckle_type": "Objects.Geometry.Vector",
+ "DynamicPropertyKeys": []
+ },
+ "units": "m",
+ "speckle_type": "Objects.Geometry.Plane",
+ "DynamicPropertyKeys": []
+ },
+ "xSize": {
+ "start": -1.0,
+ "end": 1.0,
+ "Length": 2.0,
+ "speckle_type": "Objects.Primitive.Interval",
+ "DynamicPropertyKeys": []
+ },
+ "ySize": {
+ "start": -2.0,
+ "end": 2.0,
+ "Length": 4.0,
+ "speckle_type": "Objects.Primitive.Interval",
+ "DynamicPropertyKeys": []
+ },
+ "zSize": {
+ "start": -3.0,
+ "end": 3.0,
+ "Length": 6.0,
+ "speckle_type": "Objects.Primitive.Interval",
+ "DynamicPropertyKeys": []
+ },
+ "units": "m",
+ "area": 88.0,
+ "volume": 48.0,
+ "speckle_type": "Objects.Geometry.Box",
+ "DynamicPropertyKeys": []
+}
diff --git a/tests/Speckle.Objects.Tests.Unit/Geometry/BoxTests.cs b/tests/Speckle.Objects.Tests.Unit/Geometry/BoxTests.cs
index 79a73133..716ecd32 100644
--- a/tests/Speckle.Objects.Tests.Unit/Geometry/BoxTests.cs
+++ b/tests/Speckle.Objects.Tests.Unit/Geometry/BoxTests.cs
@@ -1,7 +1,5 @@
-using FluentAssertions;
using Speckle.Objects.Geometry;
using Speckle.Sdk.Common;
-using Xunit;
namespace Speckle.Objects.Tests.Unit.Geometry;
@@ -18,7 +16,7 @@ public class BoxTests
};
[Fact]
- public void CanCreateBox()
+ public async Task CanCreateBox()
{
const string UNITS = Units.Meters;
var box = new Box()
@@ -29,11 +27,6 @@ public class BoxTests
zSize = new() { start = -3, end = 3 },
units = UNITS,
};
-
- // Assert area
- box.area.Should().BeApproximately(2 * (2 * 4 + 2 * 6 + 4 * 6), 0.0001);
-
- // Assert volume
- box.volume.Should().BeApproximately(2 * 4 * 6, 0.0001);
+ await Verify(box);
}
}
diff --git a/tests/Speckle.Objects.Tests.Unit/Geometry/CircleTests.cs b/tests/Speckle.Objects.Tests.Unit/Geometry/CircleTests.cs
index 07bfe533..6b3af807 100644
--- a/tests/Speckle.Objects.Tests.Unit/Geometry/CircleTests.cs
+++ b/tests/Speckle.Objects.Tests.Unit/Geometry/CircleTests.cs
@@ -1,7 +1,6 @@
using FluentAssertions;
using Speckle.Objects.Geometry;
using Speckle.Sdk.Common;
-using Xunit;
namespace Speckle.Objects.Tests.Unit.Geometry;
diff --git a/tests/Speckle.Objects.Tests.Unit/Geometry/MeshTests.cs b/tests/Speckle.Objects.Tests.Unit/Geometry/MeshTests.cs
index bb5c9f6d..f1ec0d5e 100644
--- a/tests/Speckle.Objects.Tests.Unit/Geometry/MeshTests.cs
+++ b/tests/Speckle.Objects.Tests.Unit/Geometry/MeshTests.cs
@@ -1,7 +1,6 @@
using FluentAssertions;
using Speckle.Objects.Geometry;
using Speckle.Sdk.Common;
-using Xunit;
namespace Speckle.Objects.Tests.Unit.Geometry;
diff --git a/tests/Speckle.Objects.Tests.Unit/Geometry/PointTests.cs b/tests/Speckle.Objects.Tests.Unit/Geometry/PointTests.cs
index eabe68c6..3bd9d736 100644
--- a/tests/Speckle.Objects.Tests.Unit/Geometry/PointTests.cs
+++ b/tests/Speckle.Objects.Tests.Unit/Geometry/PointTests.cs
@@ -2,7 +2,6 @@ using System.Diagnostics.CodeAnalysis;
using FluentAssertions;
using Speckle.Objects.Geometry;
using Speckle.Sdk.Common;
-using Xunit;
namespace Speckle.Objects.Tests.Unit.Geometry;
diff --git a/tests/Speckle.Objects.Tests.Unit/Geometry/TransformTests.cs b/tests/Speckle.Objects.Tests.Unit/Geometry/TransformTests.cs
index 8581600c..ac9d61d8 100644
--- a/tests/Speckle.Objects.Tests.Unit/Geometry/TransformTests.cs
+++ b/tests/Speckle.Objects.Tests.Unit/Geometry/TransformTests.cs
@@ -2,7 +2,6 @@ using FluentAssertions;
using Speckle.DoubleNumerics;
using Speckle.Objects.Other;
using Speckle.Sdk.Common;
-using Xunit;
namespace Speckle.Objects.Tests.Unit.Geometry;
diff --git a/tests/Speckle.Objects.Tests.Unit/Global.cs b/tests/Speckle.Objects.Tests.Unit/Global.cs
new file mode 100644
index 00000000..c7fc3b1f
--- /dev/null
+++ b/tests/Speckle.Objects.Tests.Unit/Global.cs
@@ -0,0 +1 @@
+[assembly: CollectionBehavior(DisableTestParallelization = true)]
diff --git a/tests/Speckle.Objects.Tests.Unit/ModelPropertySupportedTypes.cs b/tests/Speckle.Objects.Tests.Unit/ModelPropertySupportedTypes.cs
index 70287fc2..c3e8e805 100644
--- a/tests/Speckle.Objects.Tests.Unit/ModelPropertySupportedTypes.cs
+++ b/tests/Speckle.Objects.Tests.Unit/ModelPropertySupportedTypes.cs
@@ -5,7 +5,6 @@ using Speckle.Newtonsoft.Json;
using Speckle.Sdk.Host;
using Speckle.Sdk.Models;
using Speckle.Sdk.Serialisation;
-using Xunit;
namespace Speckle.Objects.Tests.Unit;
diff --git a/tests/Speckle.Objects.Tests.Unit/Module.cs b/tests/Speckle.Objects.Tests.Unit/Module.cs
new file mode 100644
index 00000000..999f2e69
--- /dev/null
+++ b/tests/Speckle.Objects.Tests.Unit/Module.cs
@@ -0,0 +1,17 @@
+using System.Runtime.CompilerServices;
+using Speckle.Objects.Geometry;
+using Speckle.Sdk.Host;
+using Speckle.Sdk.Testing;
+
+namespace Speckle.Objects.Tests.Unit;
+
+public static class Module
+{
+ [ModuleInitializer]
+ public static void Initialize()
+ {
+ SpeckleVerify.Initialize();
+ TypeLoader.Reset();
+ TypeLoader.Initialize(typeof(Polyline).Assembly);
+ }
+}
diff --git a/tests/Speckle.Objects.Tests.Unit/ObjectBaseValidityTests.cs b/tests/Speckle.Objects.Tests.Unit/ObjectBaseValidityTests.cs
index e3eb68db..051ee49c 100644
--- a/tests/Speckle.Objects.Tests.Unit/ObjectBaseValidityTests.cs
+++ b/tests/Speckle.Objects.Tests.Unit/ObjectBaseValidityTests.cs
@@ -3,7 +3,6 @@ using Speckle.Objects.Geometry;
using Speckle.Objects.Geometry.Autocad;
using Speckle.Sdk.Host;
using Speckle.Sdk.Models;
-using Xunit;
using Point = Speckle.Objects.Geometry.Point;
namespace Speckle.Objects.Tests.Unit;
diff --git a/tests/Speckle.Objects.Tests.Unit/Speckle.Objects.Tests.Unit.csproj b/tests/Speckle.Objects.Tests.Unit/Speckle.Objects.Tests.Unit.csproj
index ce38ab83..2f11c503 100644
--- a/tests/Speckle.Objects.Tests.Unit/Speckle.Objects.Tests.Unit.csproj
+++ b/tests/Speckle.Objects.Tests.Unit/Speckle.Objects.Tests.Unit.csproj
@@ -10,11 +10,12 @@
-
+
+
diff --git a/tests/Speckle.Objects.Tests.Unit/Utils/MeshTriangulationHelperTests.cs b/tests/Speckle.Objects.Tests.Unit/Utils/MeshTriangulationHelperTests.cs
index 2baaf8cf..cdd3cf2a 100644
--- a/tests/Speckle.Objects.Tests.Unit/Utils/MeshTriangulationHelperTests.cs
+++ b/tests/Speckle.Objects.Tests.Unit/Utils/MeshTriangulationHelperTests.cs
@@ -3,7 +3,6 @@ using Speckle.Objects.Geometry;
using Speckle.Objects.Utils;
using Speckle.Sdk.Common;
using Speckle.Sdk.Dependencies;
-using Xunit;
namespace Speckle.Objects.Tests.Unit.Utils;
diff --git a/tests/Speckle.Objects.Tests.Unit/Utils/ShallowCopyTests.cs b/tests/Speckle.Objects.Tests.Unit/Utils/ShallowCopyTests.cs
index d27962e1..e7375eff 100644
--- a/tests/Speckle.Objects.Tests.Unit/Utils/ShallowCopyTests.cs
+++ b/tests/Speckle.Objects.Tests.Unit/Utils/ShallowCopyTests.cs
@@ -5,7 +5,6 @@ using Speckle.Objects.Geometry;
using Speckle.Sdk.Common;
using Speckle.Sdk.Host;
using Speckle.Sdk.Models;
-using Xunit;
namespace Speckle.Objects.Tests.Unit.Utils;
diff --git a/tests/Speckle.Objects.Tests.Unit/packages.lock.json b/tests/Speckle.Objects.Tests.Unit/packages.lock.json
index 17ffda18..6592052d 100644
--- a/tests/Speckle.Objects.Tests.Unit/packages.lock.json
+++ b/tests/Speckle.Objects.Tests.Unit/packages.lock.json
@@ -55,16 +55,11 @@
"resolved": "0.9.6",
"contentHash": "HKH7tYrYYlCK1ct483hgxERAdVdMtl7gUKW9ijWXxA1UsYR4Z+TrRHYmzZ9qmpu1NnTycSrp005NYM78GDKV1w=="
},
- "xunit": {
+ "xunit.assert": {
"type": "Direct",
"requested": "[2.9.3, )",
"resolved": "2.9.3",
- "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==",
- "dependencies": {
- "xunit.analyzers": "1.18.0",
- "xunit.assert": "2.9.3",
- "xunit.core": "[2.9.3]"
- }
+ "contentHash": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA=="
},
"xunit.runner.visualstudio": {
"type": "Direct",
@@ -72,6 +67,30 @@
"resolved": "3.0.1",
"contentHash": "lbyYtsBxA8Pz8kaf5Xn/Mj1mL9z2nlBWdZhqFaj66nxXBa4JwiTDm4eGcpSMet6du9TOWI6bfha+gQR6+IHawg=="
},
+ "Argon": {
+ "type": "Transitive",
+ "resolved": "0.26.0",
+ "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw=="
+ },
+ "DiffEngine": {
+ "type": "Transitive",
+ "resolved": "15.8.0",
+ "contentHash": "+2cUvCcpUWziG6hnns6lwxkj6VVA+WsEGx3JqHIAt/1D7p+zpyWebqXihcfXzrZ5EqQmM4h+PpuUhYWH0TeCvQ==",
+ "dependencies": {
+ "EmptyFiles": "8.7.1",
+ "System.Management": "9.0.0"
+ }
+ },
+ "EmptyFiles": {
+ "type": "Transitive",
+ "resolved": "8.7.1",
+ "contentHash": "C8pvg0TvG2Mkn5LGNFGkFgFu8SUgYFwiu8U3y34qGQnnwKmGnlQTfTIUrtzfSjPxA4q7L/kRu09U5p32otZ2Aw=="
+ },
+ "FSharp.Core": {
+ "type": "Transitive",
+ "resolved": "7.0.300",
+ "contentHash": "8vvItREJ1l5lcp3vBCSJ1mFevVAhR48I34DuF/EoUa7o1KlFpQpagyuZkVYMAsHPIjdp47ZxM9sI4eqeXaeWkA=="
+ },
"GraphQL.Client.Abstractions": {
"type": "Transitive",
"resolved": "6.0.0",
@@ -191,6 +210,20 @@
"resolved": "13.0.1",
"contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A=="
},
+ "Quibble": {
+ "type": "Transitive",
+ "resolved": "0.3.1",
+ "contentHash": "LD6bz2p+4O/BQnmD4mqFZrmdN/IjsPo1wUvfmcH46Q05ng+dyMLl3d2ylj0x412F4fpJEtm0Z3EaCAx4FqgNuQ==",
+ "dependencies": {
+ "FSharp.Core": "7.0.300",
+ "System.Text.Json": "7.0.3"
+ }
+ },
+ "SimpleInfoName": {
+ "type": "Transitive",
+ "resolved": "3.1.0",
+ "contentHash": "j+ENh86NhxrgDc6T1ueqIR2QOdDkSJY2dbTFyPN/JvIXifB4GHAunlMw/x7P6m7XaXEHr3s+SMZfKBlmnmkO6g=="
+ },
"SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.4",
@@ -221,6 +254,11 @@
"SQLitePCLRaw.core": "2.1.4"
}
},
+ "System.CodeDom": {
+ "type": "Transitive",
+ "resolved": "9.0.0",
+ "contentHash": "oTE5IfuMoET8yaZP/vdvy9xO47guAv/rOhe4DODuFBN3ySprcQOlXqO3j+e/H/YpKKR5sglrxRaZ2HYOhNJrqA=="
+ },
"System.ComponentModel.Annotations": {
"type": "Transitive",
"resolved": "4.5.0",
@@ -243,6 +281,19 @@
"Microsoft.Win32.SystemEvents": "6.0.0"
}
},
+ "System.IO.Hashing": {
+ "type": "Transitive",
+ "resolved": "9.0.0",
+ "contentHash": "seeO8icDfED/Qwl9PDFUx2Gf/7xv7dPsMnw5PnRwNZuz4EWMpy0wIVohC4MfCcTIoJgp+KUrWG4WH3NPSusQOA=="
+ },
+ "System.Management": {
+ "type": "Transitive",
+ "resolved": "9.0.0",
+ "contentHash": "bVh4xAMI5grY5GZoklKcMBLirhC8Lqzp63Ft3zXJacwGAlLyFdF4k0qz4pnKIlO6HyL2Z4zqmHm9UkzEo6FFsA==",
+ "dependencies": {
+ "System.CodeDom": "9.0.0"
+ }
+ },
"System.Memory": {
"type": "Transitive",
"resolved": "4.5.3",
@@ -282,6 +333,19 @@
"System.Windows.Extensions": "6.0.0"
}
},
+ "System.Text.Encodings.Web": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ=="
+ },
+ "System.Text.Json": {
+ "type": "Transitive",
+ "resolved": "8.0.4",
+ "contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==",
+ "dependencies": {
+ "System.Text.Encodings.Web": "8.0.0"
+ }
+ },
"System.Windows.Extensions": {
"type": "Transitive",
"resolved": "6.0.0",
@@ -295,25 +359,6 @@
"resolved": "2.0.3",
"contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg=="
},
- "xunit.analyzers": {
- "type": "Transitive",
- "resolved": "1.18.0",
- "contentHash": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ=="
- },
- "xunit.assert": {
- "type": "Transitive",
- "resolved": "2.9.3",
- "contentHash": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA=="
- },
- "xunit.core": {
- "type": "Transitive",
- "resolved": "2.9.3",
- "contentHash": "BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==",
- "dependencies": {
- "xunit.extensibility.core": "[2.9.3]",
- "xunit.extensibility.execution": "[2.9.3]"
- }
- },
"xunit.extensibility.core": {
"type": "Transitive",
"resolved": "2.9.3",
@@ -352,6 +397,16 @@
"speckle.sdk.dependencies": {
"type": "Project"
},
+ "speckle.sdk.testing": {
+ "type": "Project",
+ "dependencies": {
+ "Microsoft.NET.Test.Sdk": "[17.12.0, )",
+ "Speckle.Sdk": "[1.0.0, )",
+ "Verify.Quibble": "[2.1.1, )",
+ "Verify.Xunit": "[28.9.0, )",
+ "xunit.runner.visualstudio": "[3.0.1, )"
+ }
+ },
"GraphQL.Client": {
"type": "CentralTransitive",
"requested": "[6.0.0, )",
@@ -408,6 +463,44 @@
"requested": "[13.0.2, )",
"resolved": "13.0.2",
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
+ },
+ "Verify": {
+ "type": "CentralTransitive",
+ "requested": "[28.9.0, )",
+ "resolved": "28.9.0",
+ "contentHash": "qni0zDkkYSPIhnYejZCOq5ueH+y0s7kEdpSbFXarcxP7rjZvZD0Yuc567KFVFMbVRAo9IORfv9zcXtTGFmpz8A==",
+ "dependencies": {
+ "Argon": "0.26.0",
+ "DiffEngine": "15.8.0",
+ "SimpleInfoName": "3.1.0",
+ "System.IO.Hashing": "9.0.0"
+ }
+ },
+ "Verify.Quibble": {
+ "type": "CentralTransitive",
+ "requested": "[2.1.1, )",
+ "resolved": "2.1.1",
+ "contentHash": "Z8bVwFICa3Dog6Mcnx0wlrn4Y+CFpQXx1f+ijfLn6/v4q00q+jLm9Gu/nVyUFuc75cjn6ieI08UrqXKcR9fTYw==",
+ "dependencies": {
+ "Quibble": "0.3.1",
+ "System.Text.Json": "8.0.4",
+ "Verify": "26.1.1"
+ }
+ },
+ "Verify.Xunit": {
+ "type": "CentralTransitive",
+ "requested": "[28.9.0, )",
+ "resolved": "28.9.0",
+ "contentHash": "YlgbJzajNvnzTVqWtZuWdZFcShX4MyQqM4FJ28qSf7hY8wvB8G6y2EwHit+Wz/nYrdnCXWYK81JR7dxTxSeuDg==",
+ "dependencies": {
+ "Argon": "0.26.0",
+ "DiffEngine": "15.8.0",
+ "SimpleInfoName": "3.1.0",
+ "System.IO.Hashing": "9.0.0",
+ "Verify": "28.9.0",
+ "xunit.abstractions": "2.0.3",
+ "xunit.extensibility.execution": "2.9.3"
+ }
}
}
}
diff --git a/tests/Speckle.Sdk.Serialization.Tests/Assembly.cs b/tests/Speckle.Sdk.Serialization.Tests/Assembly.cs
deleted file mode 100644
index a4bcec54..00000000
--- a/tests/Speckle.Sdk.Serialization.Tests/Assembly.cs
+++ /dev/null
@@ -1,3 +0,0 @@
-using Xunit;
-
-[assembly: CollectionBehavior(DisableTestParallelization = true)]
diff --git a/tests/Speckle.Sdk.Serialization.Tests/BaseComparer.cs b/tests/Speckle.Sdk.Serialization.Tests/BaseComparer.cs
deleted file mode 100644
index a7db9618..00000000
--- a/tests/Speckle.Sdk.Serialization.Tests/BaseComparer.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using Speckle.Sdk.Models;
-
-namespace Speckle.Sdk.Serialization.Tests;
-
-public class BaseComparer : IEqualityComparer
-{
- public bool Equals(Base? x, Base? y)
- {
- if (ReferenceEquals(x, y))
- {
- return true;
- }
-
- if (x is null)
- {
- return false;
- }
-
- if (y is null)
- {
- return false;
- }
-
- Type type = x.GetType();
- if (type != y.GetType())
- {
- return false;
- }
-
- var types = DynamicBaseMemberType.Instance | DynamicBaseMemberType.Dynamic | DynamicBaseMemberType.SchemaIgnored;
- var membersX = x.GetMembers(types);
- var membersY = y.GetMembers(types);
- if (membersX.Count != membersY.Count)
- {
- return false;
- }
-
- foreach (var kvp in membersX)
- {
- var propertyInfo = type.GetProperty(kvp.Key);
- if (propertyInfo is not null && !propertyInfo.CanWrite)
- {
- continue;
- }
- if (y[kvp.Key] != kvp.Value)
- {
- return false;
- }
- }
- return x.id == y.id && x.applicationId == y.applicationId;
- }
-
- public int GetHashCode(Base obj)
- {
- return HashCode.Combine(obj.id, obj.applicationId);
- }
-}
diff --git a/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.CanSerialize_New_Detached.verified.json b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.CanSerialize_New_Detached.verified.json
new file mode 100644
index 00000000..77406846
--- /dev/null
+++ b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.CanSerialize_New_Detached.verified.json
@@ -0,0 +1,31 @@
+{
+ "9ff8efb13c62fa80f3d1c4519376ba13": {
+ "__closure": {
+ "d3dd4621b2f68c3058c2b9c023a9de19": 100
+ },
+ "applicationId": null,
+ "arr": null,
+ "attachedProp": {
+ "applicationId": null,
+ "id": "90d58b65c9036a8bc50743f4c71c1c2e",
+ "name": "attachedProp",
+ "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SamplePropBase"
+ },
+ "crazyProp": null,
+ "detachedProp": {
+ "__closure": null,
+ "referencedId": "d3dd4621b2f68c3058c2b9c023a9de19",
+ "speckle_type": "reference"
+ },
+ "dynamicProp": 123,
+ "id": "9ff8efb13c62fa80f3d1c4519376ba13",
+ "list": [],
+ "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SampleObjectBase"
+ },
+ "d3dd4621b2f68c3058c2b9c023a9de19": {
+ "applicationId": null,
+ "id": "d3dd4621b2f68c3058c2b9c023a9de19",
+ "name": "detachedProp",
+ "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SamplePropBase"
+ }
+}
diff --git a/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.CanSerialize_New_Detached2.verified.json b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.CanSerialize_New_Detached2.verified.json
new file mode 100644
index 00000000..be3c516f
--- /dev/null
+++ b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.CanSerialize_New_Detached2.verified.json
@@ -0,0 +1,187 @@
+{
+ "027a7c5ffcf8d8efe432899c729a954c": {
+ "__closure": {
+ "045cbee36837d589b17f9d8483c90763": 100,
+ "1afc694774efa5913d0077302cd37888": 100,
+ "32a385e7ddeda810e037b21ab26381b7": 100,
+ "4ba53b5e84e956fb076bc8b0a03ca879": 100,
+ "5b86b66b61c556ead500915b05852875": 100,
+ "8d27f5c7fac36d985d89bb6d6d8acddc": 100,
+ "c3858f47dd3e7a308a1b465375f1645f": 100
+ },
+ "applicationId": null,
+ "area": 0.0,
+ "bbox": null,
+ "closed": false,
+ "domain": {
+ "applicationId": null,
+ "end": 1.0,
+ "id": "4d47df83148d8bad7bd2657bd9158b4c",
+ "speckle_type": "Objects.Primitive.Interval",
+ "start": 0.0
+ },
+ "id": "027a7c5ffcf8d8efe432899c729a954c",
+ "length": 0.0,
+ "speckle_type": "Objects.Geometry.Polyline",
+ "units": "test",
+ "value": [
+ {
+ "__closure": null,
+ "referencedId": "5b86b66b61c556ead500915b05852875",
+ "speckle_type": "reference"
+ }
+ ]
+ },
+ "045cbee36837d589b17f9d8483c90763": {
+ "__closure": {
+ "1afc694774efa5913d0077302cd37888": 100
+ },
+ "applicationId": null,
+ "area": 0.0,
+ "bbox": null,
+ "closed": false,
+ "domain": {
+ "applicationId": null,
+ "end": 1.0,
+ "id": "4d47df83148d8bad7bd2657bd9158b4c",
+ "speckle_type": "Objects.Primitive.Interval",
+ "start": 0.0
+ },
+ "id": "045cbee36837d589b17f9d8483c90763",
+ "length": 0.0,
+ "speckle_type": "Objects.Geometry.Polyline",
+ "units": "test",
+ "value": [
+ {
+ "__closure": null,
+ "referencedId": "1afc694774efa5913d0077302cd37888",
+ "speckle_type": "reference"
+ }
+ ]
+ },
+ "1afc694774efa5913d0077302cd37888": {
+ "applicationId": null,
+ "data": [
+ 3.0,
+ 2.0
+ ],
+ "id": "1afc694774efa5913d0077302cd37888",
+ "speckle_type": "Speckle.Core.Models.DataChunk"
+ },
+ "2ebfd4f317754fce14cadd001151441e": {
+ "__closure": {
+ "027a7c5ffcf8d8efe432899c729a954c": 100,
+ "045cbee36837d589b17f9d8483c90763": 100,
+ "1afc694774efa5913d0077302cd37888": 100,
+ "32a385e7ddeda810e037b21ab26381b7": 100,
+ "4ba53b5e84e956fb076bc8b0a03ca879": 100,
+ "5b86b66b61c556ead500915b05852875": 100,
+ "8d27f5c7fac36d985d89bb6d6d8acddc": 100,
+ "c3858f47dd3e7a308a1b465375f1645f": 100
+ },
+ "applicationId": "1",
+ "arr": null,
+ "attachedProp": {
+ "applicationId": "4",
+ "id": "c5dd540ee1299c0349829d045c04ef2d",
+ "line": {
+ "__closure": null,
+ "referencedId": "027a7c5ffcf8d8efe432899c729a954c",
+ "speckle_type": "reference"
+ },
+ "name": "attachedProp",
+ "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SamplePropBase2"
+ },
+ "crazyProp": null,
+ "detachedProp": {
+ "__closure": null,
+ "referencedId": "32a385e7ddeda810e037b21ab26381b7",
+ "speckle_type": "reference"
+ },
+ "detachedProp2": {
+ "__closure": null,
+ "referencedId": "c3858f47dd3e7a308a1b465375f1645f",
+ "speckle_type": "reference"
+ },
+ "dynamicProp": 123,
+ "id": "2ebfd4f317754fce14cadd001151441e",
+ "list": [],
+ "list2": null,
+ "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SampleObjectBase2"
+ },
+ "32a385e7ddeda810e037b21ab26381b7": {
+ "__closure": {
+ "4ba53b5e84e956fb076bc8b0a03ca879": 100,
+ "8d27f5c7fac36d985d89bb6d6d8acddc": 100
+ },
+ "applicationId": "2",
+ "id": "32a385e7ddeda810e037b21ab26381b7",
+ "line": {
+ "__closure": null,
+ "referencedId": "4ba53b5e84e956fb076bc8b0a03ca879",
+ "speckle_type": "reference"
+ },
+ "name": "detachedProp",
+ "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SamplePropBase2"
+ },
+ "4ba53b5e84e956fb076bc8b0a03ca879": {
+ "__closure": {
+ "8d27f5c7fac36d985d89bb6d6d8acddc": 100
+ },
+ "applicationId": null,
+ "area": 0.0,
+ "bbox": null,
+ "closed": false,
+ "domain": {
+ "applicationId": null,
+ "end": 1.0,
+ "id": "4d47df83148d8bad7bd2657bd9158b4c",
+ "speckle_type": "Objects.Primitive.Interval",
+ "start": 0.0
+ },
+ "id": "4ba53b5e84e956fb076bc8b0a03ca879",
+ "length": 0.0,
+ "speckle_type": "Objects.Geometry.Polyline",
+ "units": "test",
+ "value": [
+ {
+ "__closure": null,
+ "referencedId": "8d27f5c7fac36d985d89bb6d6d8acddc",
+ "speckle_type": "reference"
+ }
+ ]
+ },
+ "5b86b66b61c556ead500915b05852875": {
+ "applicationId": null,
+ "data": [
+ 3.0,
+ 4.0
+ ],
+ "id": "5b86b66b61c556ead500915b05852875",
+ "speckle_type": "Speckle.Core.Models.DataChunk"
+ },
+ "8d27f5c7fac36d985d89bb6d6d8acddc": {
+ "applicationId": null,
+ "data": [
+ 1.0,
+ 2.0
+ ],
+ "id": "8d27f5c7fac36d985d89bb6d6d8acddc",
+ "speckle_type": "Speckle.Core.Models.DataChunk"
+ },
+ "c3858f47dd3e7a308a1b465375f1645f": {
+ "__closure": {
+ "045cbee36837d589b17f9d8483c90763": 100,
+ "1afc694774efa5913d0077302cd37888": 100
+ },
+ "applicationId": "3",
+ "id": "c3858f47dd3e7a308a1b465375f1645f",
+ "line": {
+ "__closure": null,
+ "referencedId": "045cbee36837d589b17f9d8483c90763",
+ "speckle_type": "reference"
+ },
+ "name": "detachedProp2",
+ "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SamplePropBase2"
+ }
+}
diff --git a/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.CanSerialize_New_Detached_With_DataChunks2.verified.json b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.CanSerialize_New_Detached_With_DataChunks2.verified.json
new file mode 100644
index 00000000..ec12e5c4
--- /dev/null
+++ b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.CanSerialize_New_Detached_With_DataChunks2.verified.json
@@ -0,0 +1,63 @@
+{
+ "0e61e61edee00404ec6e0f9f594bce24": {
+ "applicationId": null,
+ "data": [
+ 1.0,
+ 2.0,
+ 3.0,
+ 4.0,
+ 5.0,
+ 6.0,
+ 7.0,
+ 8.0,
+ 9.0,
+ 10.0
+ ],
+ "id": "0e61e61edee00404ec6e0f9f594bce24",
+ "speckle_type": "Speckle.Core.Models.DataChunk"
+ },
+ "525b1e9eef4d07165abb4ffc518395fc": {
+ "__closure": {
+ "0e61e61edee00404ec6e0f9f594bce24": 100,
+ "f70738e3e3e593ac11099a6ed6b71154": 100
+ },
+ "applicationId": "1",
+ "arr": [
+ {
+ "__closure": null,
+ "referencedId": "f70738e3e3e593ac11099a6ed6b71154",
+ "speckle_type": "reference"
+ }
+ ],
+ "attachedProp": null,
+ "crazyProp": null,
+ "detachedProp": null,
+ "detachedProp2": null,
+ "dynamicProp": 123,
+ "id": "525b1e9eef4d07165abb4ffc518395fc",
+ "list": [
+ {
+ "__closure": null,
+ "referencedId": "0e61e61edee00404ec6e0f9f594bce24",
+ "speckle_type": "reference"
+ }
+ ],
+ "list2": [
+ {
+ "__closure": null,
+ "referencedId": "f70738e3e3e593ac11099a6ed6b71154",
+ "speckle_type": "reference"
+ }
+ ],
+ "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SampleObjectBase2"
+ },
+ "f70738e3e3e593ac11099a6ed6b71154": {
+ "applicationId": null,
+ "data": [
+ 1.0,
+ 10.0
+ ],
+ "id": "f70738e3e3e593ac11099a6ed6b71154",
+ "speckle_type": "Speckle.Core.Models.DataChunk"
+ }
+}
diff --git a/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.CanSerialize_Old_Detached.verified.json b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.CanSerialize_Old_Detached.verified.json
new file mode 100644
index 00000000..f10c987a
--- /dev/null
+++ b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.CanSerialize_Old_Detached.verified.json
@@ -0,0 +1,31 @@
+{
+ "9ff8efb13c62fa80f3d1c4519376ba13": {
+ "__closure": {
+ "d3dd4621b2f68c3058c2b9c023a9de19": 1
+ },
+ "applicationId": null,
+ "arr": null,
+ "attachedProp": {
+ "applicationId": null,
+ "id": "90d58b65c9036a8bc50743f4c71c1c2e",
+ "name": "attachedProp",
+ "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SamplePropBase"
+ },
+ "crazyProp": null,
+ "detachedProp": {
+ "__closure": null,
+ "referencedId": "d3dd4621b2f68c3058c2b9c023a9de19",
+ "speckle_type": "reference"
+ },
+ "dynamicProp": 123,
+ "id": "9ff8efb13c62fa80f3d1c4519376ba13",
+ "list": [],
+ "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SampleObjectBase"
+ },
+ "d3dd4621b2f68c3058c2b9c023a9de19": {
+ "applicationId": null,
+ "id": "d3dd4621b2f68c3058c2b9c023a9de19",
+ "name": "detachedProp",
+ "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SamplePropBase"
+ }
+}
diff --git a/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.GetPropertiesExpected_All.verified.json b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.GetPropertiesExpected_All.verified.json
new file mode 100644
index 00000000..9525e06d
--- /dev/null
+++ b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.GetPropertiesExpected_All.verified.json
@@ -0,0 +1,88 @@
+[
+ {
+ "Name": "list",
+ "PropertyAttributeInfo": {
+ "ChunkSize": 1000,
+ "IsChunkable": true,
+ "IsDetachable": true
+ },
+ "Value": []
+ },
+ {
+ "Name": "arr",
+ "PropertyAttributeInfo": {
+ "ChunkSize": 300,
+ "IsChunkable": true,
+ "IsDetachable": true
+ }
+ },
+ {
+ "Name": "detachedProp",
+ "PropertyAttributeInfo": {
+ "ChunkSize": 1000,
+ "IsChunkable": false,
+ "IsDetachable": true
+ },
+ "Value": {
+ "name": "detachedProp",
+ "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SamplePropBase",
+ "DynamicPropertyKeys": []
+ }
+ },
+ {
+ "Name": "attachedProp",
+ "PropertyAttributeInfo": {
+ "ChunkSize": 1000,
+ "IsChunkable": false,
+ "IsDetachable": false
+ },
+ "Value": {
+ "name": "attachedProp",
+ "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SamplePropBase",
+ "DynamicPropertyKeys": []
+ }
+ },
+ {
+ "Name": "crazyProp",
+ "PropertyAttributeInfo": {
+ "ChunkSize": 1000,
+ "IsChunkable": false,
+ "IsDetachable": false
+ }
+ },
+ {
+ "Name": "applicationId",
+ "PropertyAttributeInfo": {
+ "ChunkSize": 1000,
+ "IsChunkable": false,
+ "IsDetachable": false
+ }
+ },
+ {
+ "Name": "speckle_type",
+ "PropertyAttributeInfo": {
+ "ChunkSize": 1000,
+ "IsChunkable": false,
+ "IsDetachable": false
+ },
+ "Value": "Speckle.Core.Tests.Unit.Models.BaseTests+SampleObjectBase"
+ },
+ {
+ "Name": "dynamicProp",
+ "PropertyAttributeInfo": {
+ "ChunkSize": 1000,
+ "IsChunkable": false,
+ "IsDetachable": false
+ },
+ "Value": 123
+ },
+ {
+ "Name": "@prop2",
+ "PropertyAttributeInfo": {
+ "ChunkSize": -1,
+ "IsChunkable": false,
+ "IsDetachable": true
+ },
+ "Value": 2
+ }
+]
diff --git a/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.GetPropertiesExpected_Detached.verified.json b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.GetPropertiesExpected_Detached.verified.json
new file mode 100644
index 00000000..0c3b268e
--- /dev/null
+++ b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.GetPropertiesExpected_Detached.verified.json
@@ -0,0 +1,41 @@
+[
+ {
+ "Name": "list",
+ "PropertyAttributeInfo": {
+ "ChunkSize": 1000,
+ "IsChunkable": true,
+ "IsDetachable": true
+ },
+ "Value": []
+ },
+ {
+ "Name": "arr",
+ "PropertyAttributeInfo": {
+ "ChunkSize": 300,
+ "IsChunkable": true,
+ "IsDetachable": true
+ }
+ },
+ {
+ "Name": "detachedProp",
+ "PropertyAttributeInfo": {
+ "ChunkSize": 1000,
+ "IsChunkable": false,
+ "IsDetachable": true
+ },
+ "Value": {
+ "name": "detachedProp",
+ "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SamplePropBase",
+ "DynamicPropertyKeys": []
+ }
+ },
+ {
+ "Name": "@prop2",
+ "PropertyAttributeInfo": {
+ "ChunkSize": -1,
+ "IsChunkable": false,
+ "IsDetachable": true
+ },
+ "Value": 2
+ }
+]
diff --git a/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.cs b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.cs
index 28bc847f..2a851a02 100644
--- a/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.cs
+++ b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.cs
@@ -10,7 +10,6 @@ using Speckle.Sdk.Serialisation.V2;
using Speckle.Sdk.Serialisation.V2.Send;
using Speckle.Sdk.SQLite;
using Speckle.Sdk.Transports;
-using Xunit;
namespace Speckle.Sdk.Serialization.Tests;
@@ -22,42 +21,9 @@ public class DetachedTests
TypeLoader.Initialize(typeof(Base).Assembly, typeof(DetachedTests).Assembly, typeof(Polyline).Assembly);
}
- [Fact(DisplayName = "Checks that all typed properties (including obsolete ones) are returned")]
+ [Fact]
public async Task CanSerialize_New_Detached()
{
- var expectedJson = """
- {
- "list": [],
- "arr": null,
- "detachedProp": {
- "speckle_type": "reference",
- "referencedId": "d3dd4621b2f68c3058c2b9c023a9de19",
- "__closure": null
- },
- "attachedProp": {
- "name": "attachedProp",
- "applicationId": null,
- "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SamplePropBase",
- "id": "90d58b65c9036a8bc50743f4c71c1c2e"
- },
- "crazyProp": null,
- "applicationId": null,
- "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SampleObjectBase",
- "dynamicProp": 123,
- "id": "9ff8efb13c62fa80f3d1c4519376ba13",
- "__closure": {
- "d3dd4621b2f68c3058c2b9c023a9de19": 100
- }
- }
- """;
- var detachedJson = """
- {
- "name": "detachedProp",
- "applicationId": null,
- "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SamplePropBase",
- "id": "d3dd4621b2f68c3058c2b9c023a9de19"
- }
- """;
var @base = new SampleObjectBase();
@base["dynamicProp"] = 123;
@base.detachedProp = new SamplePropBase() { name = "detachedProp" };
@@ -75,55 +41,12 @@ public class DetachedTests
);
await process2.Serialize(@base, default);
- objects.Count.Should().Be(2);
- objects.ContainsKey("9ff8efb13c62fa80f3d1c4519376ba13").Should().BeTrue();
- objects.ContainsKey("d3dd4621b2f68c3058c2b9c023a9de19").Should().BeTrue();
- JToken
- .DeepEquals(JObject.Parse(expectedJson), JObject.Parse(objects["9ff8efb13c62fa80f3d1c4519376ba13"]))
- .Should()
- .BeTrue();
- JToken
- .DeepEquals(JObject.Parse(detachedJson), JObject.Parse(objects["d3dd4621b2f68c3058c2b9c023a9de19"]))
- .Should()
- .BeTrue();
+ await VerifyJsonDictionary(objects);
}
- [Fact(DisplayName = "Checks that all typed properties (including obsolete ones) are returned")]
- public void CanSerialize_Old_Detached()
+ [Fact]
+ public async Task CanSerialize_Old_Detached()
{
- var expectedJson = """
- {
- "list": [],
- "arr": null,
- "detachedProp": {
- "speckle_type": "reference",
- "referencedId": "d3dd4621b2f68c3058c2b9c023a9de19",
- "__closure": null
- },
- "attachedProp": {
- "name": "attachedProp",
- "applicationId": null,
- "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SamplePropBase",
- "id": "90d58b65c9036a8bc50743f4c71c1c2e"
- },
- "crazyProp": null,
- "applicationId": null,
- "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SampleObjectBase",
- "dynamicProp": 123,
- "id": "9ff8efb13c62fa80f3d1c4519376ba13",
- "__closure": {
- "d3dd4621b2f68c3058c2b9c023a9de19": 1
- }
- }
- """;
- var detachedJson = """
- {
- "name": "detachedProp",
- "applicationId": null,
- "speckle_type": "Speckle.Core.Tests.Unit.Models.BaseTests+SamplePropBase",
- "id": "d3dd4621b2f68c3058c2b9c023a9de19"
- }
- """;
var @base = new SampleObjectBase();
@base["dynamicProp"] = 123;
@base.detachedProp = new SamplePropBase() { name = "detachedProp" };
@@ -131,27 +54,13 @@ public class DetachedTests
var objects = new ConcurrentDictionary();
var serializer = new SpeckleObjectSerializer(new[] { new MemoryTransport(objects) });
- var json = serializer.Serialize(@base);
+ serializer.Serialize(@base);
- objects.Count.Should().Be(2);
- objects.ContainsKey("9ff8efb13c62fa80f3d1c4519376ba13").Should().BeTrue();
- objects.ContainsKey("d3dd4621b2f68c3058c2b9c023a9de19").Should().BeTrue();
- JToken
- .DeepEquals(JObject.Parse(json), JObject.Parse(objects["9ff8efb13c62fa80f3d1c4519376ba13"]))
- .Should()
- .BeTrue();
- JToken
- .DeepEquals(JObject.Parse(expectedJson), JObject.Parse(objects["9ff8efb13c62fa80f3d1c4519376ba13"]))
- .Should()
- .BeTrue();
- JToken
- .DeepEquals(JObject.Parse(detachedJson), JObject.Parse(objects["d3dd4621b2f68c3058c2b9c023a9de19"]))
- .Should()
- .BeTrue();
+ await VerifyJsonDictionary(objects);
}
[Fact]
- public void GetPropertiesExpected_Detached()
+ public async Task GetPropertiesExpected_Detached()
{
var @base = new SampleObjectBase();
@base["dynamicProp"] = 123;
@@ -161,16 +70,11 @@ public class DetachedTests
@base.attachedProp = new SamplePropBase() { name = "attachedProp" };
var children = new BaseChildFinder(new BasePropertyGatherer()).GetChildProperties(@base).ToList();
-
- children.Count.Should().Be(4);
- children.First(x => x.Name == "detachedProp").PropertyAttributeInfo.IsDetachable.Should().BeTrue();
- children.First(x => x.Name == "list").PropertyAttributeInfo.IsDetachable.Should().BeTrue();
- children.First(x => x.Name == "arr").PropertyAttributeInfo.IsDetachable.Should().BeTrue();
- children.First(x => x.Name == "@prop2").PropertyAttributeInfo.IsDetachable.Should().BeTrue();
+ await Verify(children);
}
[Fact]
- public void GetPropertiesExpected_All()
+ public async Task GetPropertiesExpected_All()
{
var @base = new SampleObjectBase();
@base["dynamicProp"] = 123;
@@ -180,66 +84,12 @@ public class DetachedTests
@base.attachedProp = new SamplePropBase() { name = "attachedProp" };
var children = new BasePropertyGatherer().ExtractAllProperties(@base).ToList();
-
- children.Count.Should().Be(9);
- children.First(x => x.Name == "dynamicProp").PropertyAttributeInfo.IsDetachable.Should().BeFalse();
- children.First(x => x.Name == "attachedProp").PropertyAttributeInfo.IsDetachable.Should().BeFalse();
- children.First(x => x.Name == "crazyProp").PropertyAttributeInfo.IsDetachable.Should().BeFalse();
- children.First(x => x.Name == "speckle_type").PropertyAttributeInfo.IsDetachable.Should().BeFalse();
- children.First(x => x.Name == "applicationId").PropertyAttributeInfo.IsDetachable.Should().BeFalse();
-
- children.First(x => x.Name == "detachedProp").PropertyAttributeInfo.IsDetachable.Should().BeTrue();
- children.First(x => x.Name == "list").PropertyAttributeInfo.IsDetachable.Should().BeTrue();
- children.First(x => x.Name == "arr").PropertyAttributeInfo.IsDetachable.Should().BeTrue();
- children.First(x => x.Name == "@prop2").PropertyAttributeInfo.IsDetachable.Should().BeTrue();
+ await Verify(children);
}
- [Fact(DisplayName = "Checks that all typed properties (including obsolete ones) are returned")]
+ [Fact]
public async Task CanSerialize_New_Detached2()
{
- var root = """
- {
- "list" : [ ],
- "list2" : null,
- "arr" : null,
- "detachedProp" : {
- "speckle_type" : "reference",
- "referencedId" : "32a385e7ddeda810e037b21ab26381b7",
- "__closure" : null
- },
- "detachedProp2" : {
- "speckle_type" : "reference",
- "referencedId" : "c3858f47dd3e7a308a1b465375f1645f",
- "__closure" : null
- },
- "attachedProp" : {
- "name" : "attachedProp",
- "line" : {
- "speckle_type" : "reference",
- "referencedId" : "027a7c5ffcf8d8efe432899c729a954c",
- "__closure" : null
- },
- "applicationId" : "4",
- "speckle_type" : "Speckle.Core.Tests.Unit.Models.BaseTests+SamplePropBase2",
- "id" : "c5dd540ee1299c0349829d045c04ef2d"
- },
- "crazyProp" : null,
- "applicationId" : "1",
- "speckle_type" : "Speckle.Core.Tests.Unit.Models.BaseTests+SampleObjectBase2",
- "dynamicProp" : 123,
- "id" : "2ebfd4f317754fce14cadd001151441e",
- "__closure" : {
- "8d27f5c7fac36d985d89bb6d6d8acddc" : 100,
- "4ba53b5e84e956fb076bc8b0a03ca879" : 100,
- "32a385e7ddeda810e037b21ab26381b7" : 100,
- "1afc694774efa5913d0077302cd37888" : 100,
- "045cbee36837d589b17f9d8483c90763" : 100,
- "c3858f47dd3e7a308a1b465375f1645f" : 100,
- "5b86b66b61c556ead500915b05852875" : 100,
- "027a7c5ffcf8d8efe432899c729a954c" : 100
- }
- }
- """;
var @base = new SampleObjectBase2();
@base["dynamicProp"] = 123;
@base.applicationId = "1";
@@ -274,15 +124,10 @@ public class DetachedTests
);
var results = await process2.Serialize(@base, default);
- objects.Count.Should().Be(9);
- var x = JObject.Parse(objects["2ebfd4f317754fce14cadd001151441e"]);
- JToken.DeepEquals(JObject.Parse(root), x).Should().BeTrue();
-
- results.RootId.Should().Be(@base.id);
- results.ConvertedReferences.Count.Should().Be(2);
+ await VerifyJsonDictionary(objects);
}
- [Fact(DisplayName = "Checks that all typed properties (including obsolete ones) are returned")]
+ [Fact]
public async Task CanSerialize_New_Detached_With_DataChunks()
{
var root = """
@@ -358,57 +203,9 @@ public class DetachedTests
JToken.DeepEquals(JObject.Parse(list2), x).Should().BeTrue();
}
- [Fact(DisplayName = "Checks that all typed properties (including obsolete ones) are returned")]
+ [Fact]
public async Task CanSerialize_New_Detached_With_DataChunks2()
{
- var root = """
- {
- "list" : [ {
- "speckle_type" : "reference",
- "referencedId" : "0e61e61edee00404ec6e0f9f594bce24",
- "__closure" : null
- } ],
- "list2" : [ {
- "speckle_type" : "reference",
- "referencedId" : "f70738e3e3e593ac11099a6ed6b71154",
- "__closure" : null
- } ],
- "arr" : [ {
- "speckle_type" : "reference",
- "referencedId" : "f70738e3e3e593ac11099a6ed6b71154",
- "__closure" : null
- } ],
- "detachedProp" : null,
- "detachedProp2" : null,
- "attachedProp" : null,
- "crazyProp" : null,
- "applicationId" : "1",
- "speckle_type" : "Speckle.Core.Tests.Unit.Models.BaseTests+SampleObjectBase2",
- "dynamicProp" : 123,
- "id" : "525b1e9eef4d07165abb4ffc518395fc",
- "__closure" : {
- "0e61e61edee00404ec6e0f9f594bce24" : 100,
- "f70738e3e3e593ac11099a6ed6b71154" : 100
- }
- }
- """;
-
- var list1 = """
- {
- "data" : [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 ],
- "applicationId" : null,
- "speckle_type" : "Speckle.Core.Models.DataChunk",
- "id" : "0e61e61edee00404ec6e0f9f594bce24"
- }
- """;
- var list2 = """
- {
- "data" : [ 1.0, 10.0 ],
- "applicationId" : null,
- "speckle_type" : "Speckle.Core.Models.DataChunk",
- "id" : "f70738e3e3e593ac11099a6ed6b71154"
- }
- """;
var @base = new SampleObjectBase2();
@base["dynamicProp"] = 123;
@base.applicationId = "1";
@@ -427,16 +224,7 @@ public class DetachedTests
new SerializeProcessOptions(false, false, true, true)
);
var results = await process2.Serialize(@base, default);
-
- objects.Count.Should().Be(3);
- var x = JObject.Parse(objects["525b1e9eef4d07165abb4ffc518395fc"]);
- JToken.DeepEquals(JObject.Parse(root), x).Should().BeTrue();
-
- x = JObject.Parse(objects["0e61e61edee00404ec6e0f9f594bce24"]);
- JToken.DeepEquals(JObject.Parse(list1), x).Should().BeTrue();
-
- x = JObject.Parse(objects["f70738e3e3e593ac11099a6ed6b71154"]);
- JToken.DeepEquals(JObject.Parse(list2), x).Should().BeTrue();
+ await VerifyJsonDictionary(objects);
}
}
diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.Test_ExtractAllProperties.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.Test_ExtractAllProperties.verified.json
new file mode 100644
index 00000000..d4b13fa0
--- /dev/null
+++ b/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.Test_ExtractAllProperties.verified.json
@@ -0,0 +1,28 @@
+[
+ {
+ "Name": "RegularProperty",
+ "PropertyAttributeInfo": {
+ "ChunkSize": 1000,
+ "IsChunkable": false,
+ "IsDetachable": false
+ },
+ "Value": "Hello"
+ },
+ {
+ "Name": "applicationId",
+ "PropertyAttributeInfo": {
+ "ChunkSize": 1000,
+ "IsChunkable": false,
+ "IsDetachable": false
+ }
+ },
+ {
+ "Name": "speckle_type",
+ "PropertyAttributeInfo": {
+ "ChunkSize": 1000,
+ "IsChunkable": false,
+ "IsDetachable": false
+ },
+ "Value": "Speckle.Core.Serialisation.TestClass"
+ }
+]
diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.Test_Json.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.Test_Json.verified.json
new file mode 100644
index 00000000..b3a68535
--- /dev/null
+++ b/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.Test_Json.verified.json
@@ -0,0 +1,8 @@
+{
+ "daaa67cfd73a957247cf2d631b7ca4f3": {
+ "applicationId": null,
+ "id": "daaa67cfd73a957247cf2d631b7ca4f3",
+ "RegularProperty": "Hello",
+ "speckle_type": "Speckle.Core.Serialisation.TestClass"
+ }
+}
diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.cs
index 63f77daf..6c037413 100644
--- a/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.cs
+++ b/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.cs
@@ -1,21 +1,18 @@
-using FluentAssertions;
-using Speckle.Sdk.Host;
+using Speckle.Sdk.Host;
using Speckle.Sdk.Models;
using Speckle.Sdk.Serialisation.V2.Send;
-using Xunit;
namespace Speckle.Sdk.Serialization.Tests;
public class ExplicitInterfaceTests
{
- // Constructor to replace [SetUp]
public ExplicitInterfaceTests()
{
TypeLoader.Reset();
TypeLoader.Initialize(typeof(Base).Assembly, typeof(TestClass).Assembly);
}
- [Fact] // Replaces [Test]
+ [Fact]
public async Task Test_Json()
{
var testClass = new TestClass() { RegularProperty = "Hello" };
@@ -32,25 +29,17 @@ public class ExplicitInterfaceTests
await process2.Serialize(testClass, default);
- objects.Count.Should().Be(1);
- objects["daaa67cfd73a957247cf2d631b7ca4f3"]
- .Should()
- .Be(
- "{\"RegularProperty\":\"Hello\",\"applicationId\":null,\"speckle_type\":\"Speckle.Core.Serialisation.TestClass\",\"id\":\"daaa67cfd73a957247cf2d631b7ca4f3\"}"
- );
+ await VerifyJsonDictionary(objects);
}
- [Fact] // Replaces [Test]
- public void Test_ExtractAllProperties()
+ [Fact]
+ public async Task Test_ExtractAllProperties()
{
var testClass = new TestClass() { RegularProperty = "Hello" };
var gatherer = new BasePropertyGatherer();
var properties = gatherer.ExtractAllProperties(testClass).ToList();
-
- properties.Count.Should().Be(3);
- properties.Select(x => x.Name).Should().Contain("RegularProperty");
- properties.Select(x => x.Name).Should().NotContain("TestProperty");
+ await Verify(properties);
}
}
diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExternalIdTests.ExternalIdTest_Detached.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ExternalIdTests.ExternalIdTest_Detached.verified.json
new file mode 100644
index 00000000..04349a0b
--- /dev/null
+++ b/tests/Speckle.Sdk.Serialization.Tests/ExternalIdTests.ExternalIdTest_Detached.verified.json
@@ -0,0 +1,38 @@
+{
+ "8d27f5c7fac36d985d89bb6d6d8acddc": {
+ "applicationId": null,
+ "data": [
+ 1.0,
+ 2.0
+ ],
+ "id": "8d27f5c7fac36d985d89bb6d6d8acddc",
+ "speckle_type": "Speckle.Core.Models.DataChunk"
+ },
+ "cfaf7ae0dfc5a7cf3343bb6db46ed238": {
+ "__closure": {
+ "8d27f5c7fac36d985d89bb6d6d8acddc": 100
+ },
+ "applicationId": null,
+ "area": 0.0,
+ "bbox": null,
+ "closed": false,
+ "domain": {
+ "applicationId": null,
+ "end": 1.0,
+ "id": "4d47df83148d8bad7bd2657bd9158b4c",
+ "speckle_type": "Objects.Primitive.Interval",
+ "start": 0.0
+ },
+ "id": "cfaf7ae0dfc5a7cf3343bb6db46ed238",
+ "length": 0.0,
+ "speckle_type": "Objects.Geometry.Polyline",
+ "units": "cm",
+ "value": [
+ {
+ "__closure": null,
+ "referencedId": "8d27f5c7fac36d985d89bb6d6d8acddc",
+ "speckle_type": "reference"
+ }
+ ]
+ }
+}
diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExternalIdTests.ExternalIdTest_Detached_Nested.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ExternalIdTests.ExternalIdTest_Detached_Nested.verified.json
new file mode 100644
index 00000000..f7db9127
--- /dev/null
+++ b/tests/Speckle.Sdk.Serialization.Tests/ExternalIdTests.ExternalIdTest_Detached_Nested.verified.json
@@ -0,0 +1,70 @@
+{
+ "8d27f5c7fac36d985d89bb6d6d8acddc": {
+ "applicationId": null,
+ "data": [
+ 1.0,
+ 2.0
+ ],
+ "id": "8d27f5c7fac36d985d89bb6d6d8acddc",
+ "speckle_type": "Speckle.Core.Models.DataChunk"
+ },
+ "93737bb0800970f29d68748ee206399d": {
+ "__closure": {
+ "8d27f5c7fac36d985d89bb6d6d8acddc": 100,
+ "cfaf7ae0dfc5a7cf3343bb6db46ed238": 100
+ },
+ "applicationId": null,
+ "area": 0.0,
+ "bbox": null,
+ "closed": false,
+ "degree": 1,
+ "displayValue": {
+ "__closure": null,
+ "referencedId": "cfaf7ae0dfc5a7cf3343bb6db46ed238",
+ "speckle_type": "reference"
+ },
+ "domain": {
+ "applicationId": null,
+ "end": 1.0,
+ "id": "4d47df83148d8bad7bd2657bd9158b4c",
+ "speckle_type": "Objects.Primitive.Interval",
+ "start": 0.0
+ },
+ "id": "93737bb0800970f29d68748ee206399d",
+ "knots": [],
+ "length": 0.0,
+ "periodic": false,
+ "points": [],
+ "rational": false,
+ "speckle_type": "Objects.Geometry.Curve",
+ "units": "cm",
+ "weights": []
+ },
+ "cfaf7ae0dfc5a7cf3343bb6db46ed238": {
+ "__closure": {
+ "8d27f5c7fac36d985d89bb6d6d8acddc": 100
+ },
+ "applicationId": null,
+ "area": 0.0,
+ "bbox": null,
+ "closed": false,
+ "domain": {
+ "applicationId": null,
+ "end": 1.0,
+ "id": "4d47df83148d8bad7bd2657bd9158b4c",
+ "speckle_type": "Objects.Primitive.Interval",
+ "start": 0.0
+ },
+ "id": "cfaf7ae0dfc5a7cf3343bb6db46ed238",
+ "length": 0.0,
+ "speckle_type": "Objects.Geometry.Polyline",
+ "units": "cm",
+ "value": [
+ {
+ "__closure": null,
+ "referencedId": "8d27f5c7fac36d985d89bb6d6d8acddc",
+ "speckle_type": "reference"
+ }
+ ]
+ }
+}
diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExternalIdTests.ExternalIdTest_Detached_Nested_More.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ExternalIdTests.ExternalIdTest_Detached_Nested_More.verified.json
new file mode 100644
index 00000000..96d651cd
--- /dev/null
+++ b/tests/Speckle.Sdk.Serialization.Tests/ExternalIdTests.ExternalIdTest_Detached_Nested_More.verified.json
@@ -0,0 +1,89 @@
+{
+ "050585d98934e7a4d199e07bd92598a5": {
+ "__closure": {
+ "8d27f5c7fac36d985d89bb6d6d8acddc": 100,
+ "cfaf7ae0dfc5a7cf3343bb6db46ed238": 100
+ },
+ "applicationId": null,
+ "area": 0.0,
+ "bbox": null,
+ "closed": false,
+ "domain": {
+ "applicationId": null,
+ "end": 1.0,
+ "id": "4d47df83148d8bad7bd2657bd9158b4c",
+ "speckle_type": "Objects.Primitive.Interval",
+ "start": 0.0
+ },
+ "id": "050585d98934e7a4d199e07bd92598a5",
+ "length": 0.0,
+ "segments": [
+ {
+ "applicationId": null,
+ "area": 0.0,
+ "bbox": null,
+ "closed": false,
+ "degree": 1,
+ "displayValue": {
+ "__closure": null,
+ "referencedId": "cfaf7ae0dfc5a7cf3343bb6db46ed238",
+ "speckle_type": "reference"
+ },
+ "domain": {
+ "applicationId": null,
+ "end": 1.0,
+ "id": "4d47df83148d8bad7bd2657bd9158b4c",
+ "speckle_type": "Objects.Primitive.Interval",
+ "start": 0.0
+ },
+ "id": "93737bb0800970f29d68748ee206399d",
+ "knots": [],
+ "length": 0.0,
+ "periodic": false,
+ "points": [],
+ "rational": false,
+ "speckle_type": "Objects.Geometry.Curve",
+ "units": "cm",
+ "weights": []
+ }
+ ],
+ "speckle_type": "Objects.Geometry.Polycurve",
+ "units": "cm"
+ },
+ "8d27f5c7fac36d985d89bb6d6d8acddc": {
+ "applicationId": null,
+ "data": [
+ 1.0,
+ 2.0
+ ],
+ "id": "8d27f5c7fac36d985d89bb6d6d8acddc",
+ "speckle_type": "Speckle.Core.Models.DataChunk"
+ },
+ "cfaf7ae0dfc5a7cf3343bb6db46ed238": {
+ "__closure": {
+ "8d27f5c7fac36d985d89bb6d6d8acddc": 100
+ },
+ "applicationId": null,
+ "area": 0.0,
+ "bbox": null,
+ "closed": false,
+ "domain": {
+ "applicationId": null,
+ "end": 1.0,
+ "id": "4d47df83148d8bad7bd2657bd9158b4c",
+ "speckle_type": "Objects.Primitive.Interval",
+ "start": 0.0
+ },
+ "id": "cfaf7ae0dfc5a7cf3343bb6db46ed238",
+ "length": 0.0,
+ "speckle_type": "Objects.Geometry.Polyline",
+ "units": "cm",
+ "value": [
+ {
+ "__closure": null,
+ "referencedId": "8d27f5c7fac36d985d89bb6d6d8acddc",
+ "speckle_type": "reference"
+ }
+ ]
+ }
+}
diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExternalIdTests.ExternalIdTest_Detached_Nested_More_Too.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ExternalIdTests.ExternalIdTest_Detached_Nested_More_Too.verified.json
new file mode 100644
index 00000000..2b821b93
--- /dev/null
+++ b/tests/Speckle.Sdk.Serialization.Tests/ExternalIdTests.ExternalIdTest_Detached_Nested_More_Too.verified.json
@@ -0,0 +1,104 @@
+{
+ "050585d98934e7a4d199e07bd92598a5": {
+ "__closure": {
+ "8d27f5c7fac36d985d89bb6d6d8acddc": 100,
+ "cfaf7ae0dfc5a7cf3343bb6db46ed238": 100
+ },
+ "applicationId": null,
+ "area": 0.0,
+ "bbox": null,
+ "closed": false,
+ "domain": {
+ "applicationId": null,
+ "end": 1.0,
+ "id": "4d47df83148d8bad7bd2657bd9158b4c",
+ "speckle_type": "Objects.Primitive.Interval",
+ "start": 0.0
+ },
+ "id": "050585d98934e7a4d199e07bd92598a5",
+ "length": 0.0,
+ "segments": [
+ {
+ "applicationId": null,
+ "area": 0.0,
+ "bbox": null,
+ "closed": false,
+ "degree": 1,
+ "displayValue": {
+ "__closure": null,
+ "referencedId": "cfaf7ae0dfc5a7cf3343bb6db46ed238",
+ "speckle_type": "reference"
+ },
+ "domain": {
+ "applicationId": null,
+ "end": 1.0,
+ "id": "4d47df83148d8bad7bd2657bd9158b4c",
+ "speckle_type": "Objects.Primitive.Interval",
+ "start": 0.0
+ },
+ "id": "93737bb0800970f29d68748ee206399d",
+ "knots": [],
+ "length": 0.0,
+ "periodic": false,
+ "points": [],
+ "rational": false,
+ "speckle_type": "Objects.Geometry.Curve",
+ "units": "cm",
+ "weights": []
+ }
+ ],
+ "speckle_type": "Objects.Geometry.Polycurve",
+ "units": "cm"
+ },
+ "4314c177603b00228261d6f0f4686395": {
+ "__closure": {
+ "050585d98934e7a4d199e07bd92598a5": 100,
+ "8d27f5c7fac36d985d89bb6d6d8acddc": 100,
+ "cfaf7ae0dfc5a7cf3343bb6db46ed238": 100
+ },
+ "@profile": {
+ "__closure": null,
+ "referencedId": "050585d98934e7a4d199e07bd92598a5",
+ "speckle_type": "reference"
+ },
+ "applicationId": null,
+ "id": "4314c177603b00228261d6f0f4686395",
+ "speckle_type": "Base"
+ },
+ "8d27f5c7fac36d985d89bb6d6d8acddc": {
+ "applicationId": null,
+ "data": [
+ 1.0,
+ 2.0
+ ],
+ "id": "8d27f5c7fac36d985d89bb6d6d8acddc",
+ "speckle_type": "Speckle.Core.Models.DataChunk"
+ },
+ "cfaf7ae0dfc5a7cf3343bb6db46ed238": {
+ "__closure": {
+ "8d27f5c7fac36d985d89bb6d6d8acddc": 100
+ },
+ "applicationId": null,
+ "area": 0.0,
+ "bbox": null,
+ "closed": false,
+ "domain": {
+ "applicationId": null,
+ "end": 1.0,
+ "id": "4d47df83148d8bad7bd2657bd9158b4c",
+ "speckle_type": "Objects.Primitive.Interval",
+ "start": 0.0
+ },
+ "id": "cfaf7ae0dfc5a7cf3343bb6db46ed238",
+ "length": 0.0,
+ "speckle_type": "Objects.Geometry.Polyline",
+ "units": "cm",
+ "value": [
+ {
+ "__closure": null,
+ "referencedId": "8d27f5c7fac36d985d89bb6d6d8acddc",
+ "speckle_type": "reference"
+ }
+ ]
+ }
+}
diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExternalIdTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ExternalIdTests.cs
index d3d7baed..ea228242 100644
--- a/tests/Speckle.Sdk.Serialization.Tests/ExternalIdTests.cs
+++ b/tests/Speckle.Sdk.Serialization.Tests/ExternalIdTests.cs
@@ -1,14 +1,10 @@
-using FluentAssertions;
-using Speckle.Newtonsoft.Json.Linq;
-using Speckle.Objects.Geometry;
+using Speckle.Objects.Geometry;
using Speckle.Objects.Primitive;
-using Speckle.Sdk.Common;
using Speckle.Sdk.Host;
using Speckle.Sdk.Models;
using Speckle.Sdk.Models.Extensions;
using Speckle.Sdk.Serialisation;
using Speckle.Sdk.Serialisation.V2.Send;
-using Xunit;
namespace Speckle.Sdk.Serialization.Tests;
@@ -20,27 +16,21 @@ public class ExternalIdTests
TypeLoader.Initialize(typeof(Base).Assembly, typeof(Polyline).Assembly);
}
- [Theory]
- [InlineData("cfaf7ae0dfc5a7cf3343bb6db46ed238", "8d27f5c7fac36d985d89bb6d6d8acddc")]
- public void ExternalIdTest_Detached(string lineId, string valueId)
+ [Fact]
+ public async Task ExternalIdTest_Detached()
{
var p = new Polyline() { units = "cm", value = [1, 2] };
using var serializer = new ObjectSerializerFactory(new BasePropertyGatherer()).Create(
new Dictionary(),
default
);
- var list = serializer.Serialize(p).ToDictionary(x => x.Item1, x => x.Item2);
- list.ContainsKey(new Id(lineId)).Should().BeTrue();
- var json = list[new Id(lineId)];
- var jObject = JObject.Parse(json.Value);
- jObject.ContainsKey("__closure").Should().BeTrue();
- var closures = (JObject)jObject["__closure"].NotNull();
- closures.ContainsKey(valueId).Should().BeTrue();
+ var objects = serializer.Serialize(p).ToDictionary(x => x.Item1, x => x.Item2);
+
+ await VerifyJsonDictionary(objects);
}
- [Theory]
- [InlineData("cfaf7ae0dfc5a7cf3343bb6db46ed238", "8d27f5c7fac36d985d89bb6d6d8acddc")]
- public void ExternalIdTest_Detached_Nested(string lineId, string valueId)
+ [Fact]
+ public async Task ExternalIdTest_Detached_Nested()
{
var curve = new Curve()
{
@@ -59,18 +49,13 @@ public class ExternalIdTests
new Dictionary(),
default
);
- var list = serializer.Serialize(curve).ToDictionary(x => x.Item1, x => x.Item2);
- list.ContainsKey(new Id(lineId)).Should().BeTrue();
- var json = list[new Id(lineId)];
- var jObject = JObject.Parse(json.Value);
- jObject.ContainsKey("__closure").Should().BeTrue();
- var closures = (JObject)jObject["__closure"].NotNull();
- closures.ContainsKey(valueId).Should().BeTrue();
+ var objects = serializer.Serialize(curve).ToDictionary(x => x.Item1, x => x.Item2);
+
+ await VerifyJsonDictionary(objects);
}
- [Theory]
- [InlineData("cfaf7ae0dfc5a7cf3343bb6db46ed238", "8d27f5c7fac36d985d89bb6d6d8acddc")]
- public void ExternalIdTest_Detached_Nested_More(string lineId, string valueId)
+ [Fact]
+ public async Task ExternalIdTest_Detached_Nested_More()
{
var curve = new Curve()
{
@@ -90,18 +75,13 @@ public class ExternalIdTests
new Dictionary(),
default
);
- var list = serializer.Serialize(polycurve).ToDictionary(x => x.Item1, x => x.Item2);
- list.ContainsKey(new Id(lineId)).Should().BeTrue();
- var json = list[new Id(lineId)];
- var jObject = JObject.Parse(json.Value);
- jObject.ContainsKey("__closure").Should().BeTrue();
- var closures = (JObject)jObject["__closure"].NotNull();
- closures.ContainsKey(valueId).Should().BeTrue();
+ var objects = serializer.Serialize(polycurve).ToDictionary(x => x.Item1, x => x.Item2);
+
+ await VerifyJsonDictionary(objects);
}
- [Theory]
- [InlineData("cfaf7ae0dfc5a7cf3343bb6db46ed238", "8d27f5c7fac36d985d89bb6d6d8acddc")]
- public void ExternalIdTest_Detached_Nested_More_Too(string lineId, string valueId)
+ [Fact]
+ public async Task ExternalIdTest_Detached_Nested_More_Too()
{
var curve = new Curve()
{
@@ -123,12 +103,7 @@ public class ExternalIdTests
new Dictionary(),
default
);
- var list = serializer.Serialize(@base).ToDictionary(x => x.Item1, x => x.Item2);
- list.ContainsKey(new Id(lineId)).Should().BeTrue();
- var json = list[new Id(lineId)];
- var jObject = JObject.Parse(json.Value);
- jObject.ContainsKey("__closure").Should().BeTrue();
- var closures = (JObject)jObject["__closure"].NotNull();
- closures.ContainsKey(valueId).Should().BeTrue();
+ var objects = serializer.Serialize(@base).ToDictionary(x => x.Item1, x => x.Item2);
+ await VerifyJsonDictionary(objects);
}
}
diff --git a/tests/Speckle.Objects.Tests.Unit/Assembly.cs b/tests/Speckle.Sdk.Serialization.Tests/Global.cs
similarity index 53%
rename from tests/Speckle.Objects.Tests.Unit/Assembly.cs
rename to tests/Speckle.Sdk.Serialization.Tests/Global.cs
index a4bcec54..0dee07ae 100644
--- a/tests/Speckle.Objects.Tests.Unit/Assembly.cs
+++ b/tests/Speckle.Sdk.Serialization.Tests/Global.cs
@@ -1,3 +1,3 @@
-using Xunit;
+global using static Speckle.Sdk.Testing.SpeckleVerify;
[assembly: CollectionBehavior(DisableTestParallelization = true)]
diff --git a/tests/Speckle.Sdk.Serialization.Tests/Module.cs b/tests/Speckle.Sdk.Serialization.Tests/Module.cs
new file mode 100644
index 00000000..51b9682e
--- /dev/null
+++ b/tests/Speckle.Sdk.Serialization.Tests/Module.cs
@@ -0,0 +1,13 @@
+using System.Runtime.CompilerServices;
+using Speckle.Sdk.Testing;
+
+namespace Speckle.Sdk.Serialization.Tests;
+
+public static class Module
+{
+ [ModuleInitializer]
+ public static void Initialize()
+ {
+ SpeckleVerify.Initialize();
+ }
+}
diff --git a/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs b/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs
index c562fd08..58c087db 100644
--- a/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs
+++ b/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs
@@ -12,7 +12,7 @@ using Speckle.Sdk.Serialisation;
using Speckle.Sdk.Serialisation.Utilities;
using Speckle.Sdk.Serialisation.V2.Receive;
using Speckle.Sdk.Serialisation.V2.Send;
-using Xunit;
+using Speckle.Sdk.Testing.Framework;
namespace Speckle.Sdk.Serialization.Tests;
diff --git a/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj b/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj
index b8028ef4..a95ca09a 100644
--- a/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj
+++ b/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj
@@ -4,19 +4,17 @@
net8.0
true
System.Runtime.CompilerServices.IsExternalInit;System.Runtime.CompilerServices.RequiresLocationAttribute
- Speckle.Sdk.Serialization.Tests
-
-
+
diff --git a/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json b/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json
index 17ffda18..5ad46e73 100644
--- a/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json
+++ b/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json
@@ -55,23 +55,36 @@
"resolved": "0.9.6",
"contentHash": "HKH7tYrYYlCK1ct483hgxERAdVdMtl7gUKW9ijWXxA1UsYR4Z+TrRHYmzZ9qmpu1NnTycSrp005NYM78GDKV1w=="
},
- "xunit": {
- "type": "Direct",
- "requested": "[2.9.3, )",
- "resolved": "2.9.3",
- "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==",
- "dependencies": {
- "xunit.analyzers": "1.18.0",
- "xunit.assert": "2.9.3",
- "xunit.core": "[2.9.3]"
- }
- },
"xunit.runner.visualstudio": {
"type": "Direct",
"requested": "[3.0.1, )",
"resolved": "3.0.1",
"contentHash": "lbyYtsBxA8Pz8kaf5Xn/Mj1mL9z2nlBWdZhqFaj66nxXBa4JwiTDm4eGcpSMet6du9TOWI6bfha+gQR6+IHawg=="
},
+ "Argon": {
+ "type": "Transitive",
+ "resolved": "0.26.0",
+ "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw=="
+ },
+ "DiffEngine": {
+ "type": "Transitive",
+ "resolved": "15.8.0",
+ "contentHash": "+2cUvCcpUWziG6hnns6lwxkj6VVA+WsEGx3JqHIAt/1D7p+zpyWebqXihcfXzrZ5EqQmM4h+PpuUhYWH0TeCvQ==",
+ "dependencies": {
+ "EmptyFiles": "8.7.1",
+ "System.Management": "9.0.0"
+ }
+ },
+ "EmptyFiles": {
+ "type": "Transitive",
+ "resolved": "8.7.1",
+ "contentHash": "C8pvg0TvG2Mkn5LGNFGkFgFu8SUgYFwiu8U3y34qGQnnwKmGnlQTfTIUrtzfSjPxA4q7L/kRu09U5p32otZ2Aw=="
+ },
+ "FSharp.Core": {
+ "type": "Transitive",
+ "resolved": "7.0.300",
+ "contentHash": "8vvItREJ1l5lcp3vBCSJ1mFevVAhR48I34DuF/EoUa7o1KlFpQpagyuZkVYMAsHPIjdp47ZxM9sI4eqeXaeWkA=="
+ },
"GraphQL.Client.Abstractions": {
"type": "Transitive",
"resolved": "6.0.0",
@@ -191,6 +204,20 @@
"resolved": "13.0.1",
"contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A=="
},
+ "Quibble": {
+ "type": "Transitive",
+ "resolved": "0.3.1",
+ "contentHash": "LD6bz2p+4O/BQnmD4mqFZrmdN/IjsPo1wUvfmcH46Q05ng+dyMLl3d2ylj0x412F4fpJEtm0Z3EaCAx4FqgNuQ==",
+ "dependencies": {
+ "FSharp.Core": "7.0.300",
+ "System.Text.Json": "7.0.3"
+ }
+ },
+ "SimpleInfoName": {
+ "type": "Transitive",
+ "resolved": "3.1.0",
+ "contentHash": "j+ENh86NhxrgDc6T1ueqIR2QOdDkSJY2dbTFyPN/JvIXifB4GHAunlMw/x7P6m7XaXEHr3s+SMZfKBlmnmkO6g=="
+ },
"SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive",
"resolved": "2.1.4",
@@ -221,6 +248,11 @@
"SQLitePCLRaw.core": "2.1.4"
}
},
+ "System.CodeDom": {
+ "type": "Transitive",
+ "resolved": "9.0.0",
+ "contentHash": "oTE5IfuMoET8yaZP/vdvy9xO47guAv/rOhe4DODuFBN3ySprcQOlXqO3j+e/H/YpKKR5sglrxRaZ2HYOhNJrqA=="
+ },
"System.ComponentModel.Annotations": {
"type": "Transitive",
"resolved": "4.5.0",
@@ -243,6 +275,19 @@
"Microsoft.Win32.SystemEvents": "6.0.0"
}
},
+ "System.IO.Hashing": {
+ "type": "Transitive",
+ "resolved": "9.0.0",
+ "contentHash": "seeO8icDfED/Qwl9PDFUx2Gf/7xv7dPsMnw5PnRwNZuz4EWMpy0wIVohC4MfCcTIoJgp+KUrWG4WH3NPSusQOA=="
+ },
+ "System.Management": {
+ "type": "Transitive",
+ "resolved": "9.0.0",
+ "contentHash": "bVh4xAMI5grY5GZoklKcMBLirhC8Lqzp63Ft3zXJacwGAlLyFdF4k0qz4pnKIlO6HyL2Z4zqmHm9UkzEo6FFsA==",
+ "dependencies": {
+ "System.CodeDom": "9.0.0"
+ }
+ },
"System.Memory": {
"type": "Transitive",
"resolved": "4.5.3",
@@ -282,6 +327,19 @@
"System.Windows.Extensions": "6.0.0"
}
},
+ "System.Text.Encodings.Web": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ=="
+ },
+ "System.Text.Json": {
+ "type": "Transitive",
+ "resolved": "8.0.4",
+ "contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==",
+ "dependencies": {
+ "System.Text.Encodings.Web": "8.0.0"
+ }
+ },
"System.Windows.Extensions": {
"type": "Transitive",
"resolved": "6.0.0",
@@ -295,25 +353,6 @@
"resolved": "2.0.3",
"contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg=="
},
- "xunit.analyzers": {
- "type": "Transitive",
- "resolved": "1.18.0",
- "contentHash": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ=="
- },
- "xunit.assert": {
- "type": "Transitive",
- "resolved": "2.9.3",
- "contentHash": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA=="
- },
- "xunit.core": {
- "type": "Transitive",
- "resolved": "2.9.3",
- "contentHash": "BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==",
- "dependencies": {
- "xunit.extensibility.core": "[2.9.3]",
- "xunit.extensibility.execution": "[2.9.3]"
- }
- },
"xunit.extensibility.core": {
"type": "Transitive",
"resolved": "2.9.3",
@@ -352,6 +391,16 @@
"speckle.sdk.dependencies": {
"type": "Project"
},
+ "speckle.sdk.testing": {
+ "type": "Project",
+ "dependencies": {
+ "Microsoft.NET.Test.Sdk": "[17.12.0, )",
+ "Speckle.Sdk": "[1.0.0, )",
+ "Verify.Quibble": "[2.1.1, )",
+ "Verify.Xunit": "[28.9.0, )",
+ "xunit.runner.visualstudio": "[3.0.1, )"
+ }
+ },
"GraphQL.Client": {
"type": "CentralTransitive",
"requested": "[6.0.0, )",
@@ -408,6 +457,44 @@
"requested": "[13.0.2, )",
"resolved": "13.0.2",
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
+ },
+ "Verify": {
+ "type": "CentralTransitive",
+ "requested": "[28.9.0, )",
+ "resolved": "28.9.0",
+ "contentHash": "qni0zDkkYSPIhnYejZCOq5ueH+y0s7kEdpSbFXarcxP7rjZvZD0Yuc567KFVFMbVRAo9IORfv9zcXtTGFmpz8A==",
+ "dependencies": {
+ "Argon": "0.26.0",
+ "DiffEngine": "15.8.0",
+ "SimpleInfoName": "3.1.0",
+ "System.IO.Hashing": "9.0.0"
+ }
+ },
+ "Verify.Quibble": {
+ "type": "CentralTransitive",
+ "requested": "[2.1.1, )",
+ "resolved": "2.1.1",
+ "contentHash": "Z8bVwFICa3Dog6Mcnx0wlrn4Y+CFpQXx1f+ijfLn6/v4q00q+jLm9Gu/nVyUFuc75cjn6ieI08UrqXKcR9fTYw==",
+ "dependencies": {
+ "Quibble": "0.3.1",
+ "System.Text.Json": "8.0.4",
+ "Verify": "26.1.1"
+ }
+ },
+ "Verify.Xunit": {
+ "type": "CentralTransitive",
+ "requested": "[28.9.0, )",
+ "resolved": "28.9.0",
+ "contentHash": "YlgbJzajNvnzTVqWtZuWdZFcShX4MyQqM4FJ28qSf7hY8wvB8G6y2EwHit+Wz/nYrdnCXWYK81JR7dxTxSeuDg==",
+ "dependencies": {
+ "Argon": "0.26.0",
+ "DiffEngine": "15.8.0",
+ "SimpleInfoName": "3.1.0",
+ "System.IO.Hashing": "9.0.0",
+ "Verify": "28.9.0",
+ "xunit.abstractions": "2.0.3",
+ "xunit.extensibility.execution": "2.9.3"
+ }
}
}
}
diff --git a/tests/Speckle.Sdk.Tests.Integration/packages.lock.json b/tests/Speckle.Sdk.Tests.Integration/packages.lock.json
index efc056b0..d78a6413 100644
--- a/tests/Speckle.Sdk.Tests.Integration/packages.lock.json
+++ b/tests/Speckle.Sdk.Tests.Integration/packages.lock.json
@@ -291,11 +291,6 @@
"resolved": "1.18.0",
"contentHash": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ=="
},
- "xunit.assert": {
- "type": "Transitive",
- "resolved": "2.9.3",
- "contentHash": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA=="
- },
"xunit.core": {
"type": "Transitive",
"resolved": "2.9.3",
@@ -424,6 +419,12 @@
"requested": "[13.0.2, )",
"resolved": "13.0.2",
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
+ },
+ "xunit.assert": {
+ "type": "CentralTransitive",
+ "requested": "[2.9.3, )",
+ "resolved": "2.9.3",
+ "contentHash": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA=="
}
}
}
diff --git a/tests/Speckle.Sdk.Tests.Unit/packages.lock.json b/tests/Speckle.Sdk.Tests.Unit/packages.lock.json
index 34637c07..8f7ae228 100644
--- a/tests/Speckle.Sdk.Tests.Unit/packages.lock.json
+++ b/tests/Speckle.Sdk.Tests.Unit/packages.lock.json
@@ -315,11 +315,6 @@
"resolved": "1.18.0",
"contentHash": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ=="
},
- "xunit.assert": {
- "type": "Transitive",
- "resolved": "2.9.3",
- "contentHash": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA=="
- },
"xunit.core": {
"type": "Transitive",
"resolved": "2.9.3",
@@ -411,6 +406,12 @@
"requested": "[13.0.2, )",
"resolved": "13.0.2",
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
+ },
+ "xunit.assert": {
+ "type": "CentralTransitive",
+ "requested": "[2.9.3, )",
+ "resolved": "2.9.3",
+ "contentHash": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA=="
}
}
}