diff options
author | Rory& <root@rory.gay> | 2024-07-15 13:52:47 +0200 |
---|---|---|
committer | Rory& <root@rory.gay> | 2024-07-16 09:33:56 +0200 |
commit | f761990225fd98160b52ef90f88b769c0f6b0dc6 (patch) | |
tree | dc6e670d1b28e4ea9399f8584cf24156935b76af /Tests | |
parent | Import unit test fixes from dev/home-changes (diff) | |
download | LibMatrix-f761990225fd98160b52ef90f88b769c0f6b0dc6.tar.xz |
Working json canonicalisation github/dev/e2ee{canonical-json} dev/e2ee{canonical-json}
Diffstat (limited to 'Tests')
-rw-r--r-- | Tests/LibMatrix.Tests/Tests/CanonicalJsonTests.cs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/Tests/LibMatrix.Tests/Tests/CanonicalJsonTests.cs b/Tests/LibMatrix.Tests/Tests/CanonicalJsonTests.cs new file mode 100644 index 0000000..c7fde54 --- /dev/null +++ b/Tests/LibMatrix.Tests/Tests/CanonicalJsonTests.cs @@ -0,0 +1,53 @@ +using System.Collections.Frozen; +using System.Diagnostics; +using System.Text.Json; +using LibMatrix.Extensions; +using LibMatrix.Services; +using LibMatrix.Tests.Abstractions; +using LibMatrix.Tests.DataTests; +using LibMatrix.Tests.Fixtures; +using Xunit.Abstractions; +using Xunit.Microsoft.DependencyInjection.Abstracts; +using Xunit.Sdk; + +namespace LibMatrix.Tests.Tests; + +public class CanonicalJsonTests(ITestOutputHelper testOutputHelper, TestFixture fixture) : TestBed<TestFixture>(testOutputHelper, fixture) { + // Test cases from https://spec.matrix.org/v1.11/appendices/#examples + private static readonly FrozenDictionary<string, string> testCases = new Dictionary<string, string>() { + ["{}"] = "{}", + ["{\n \"one\": 1,\n \"two\": \"Two\"\n}\n"] = "{\"one\":1,\"two\":\"Two\"}", + ["{\n \"b\": \"2\",\n \"a\": \"1\"\n}\n"] = "{\"a\":\"1\",\"b\":\"2\"}", + ["{\"b\":\"2\",\"a\":\"1\"}"] = "{\"a\":\"1\",\"b\":\"2\"}", + ["{\n \"auth\": {\n \"success\": true,\n \"mxid\": \"@john.doe:example.com\",\n \"profile\": {\n \"display_name\": \"John Doe\",\n \"three_pids\": [\n {\n \"medium\": \"email\",\n \"address\": \"[email protected]\"\n },\n {\n \"medium\": \"msisdn\",\n \"address\": \"123456789\"\n }\n ]\n }\n }\n}\n"] = + "{\"auth\":{\"mxid\":\"@john.doe:example.com\",\"profile\":{\"display_name\":\"John Doe\",\"three_pids\":[{\"address\":\"[email protected]\",\"medium\":\"email\"},{\"address\":\"123456789\",\"medium\":\"msisdn\"}]},\"success\":true}}", + ["{\n \"a\": \"日本語\"\n}\n"] = "{\"a\":\"日本語\"}", + ["{\n \"本\": 2,\n \"日\": 1\n}\n"] = "{\"日\":1,\"本\":2}", + ["{\n \"a\": \"\\u65E5\"\n}\n"] = "{\"a\":\"日\"}", + ["{\n \"a\": null\n}\n"] = "{\"a\":null}", + ["{\n \"a\": -0,\n \"b\": 1e10\n}\n"] = "{\"a\":0,\"b\":10000000000}" + }.ToFrozenDictionary(); + + [Fact] + public void SpecTests() { + var i = 0; + foreach (var (input, expected) in testCases) { + var deserialised = JsonSerializer.Deserialize<Dictionary<string, object>>(input); + var actual = CanonicalJsonSerializer.Serialize(deserialised); + Assert.Equal(expected, actual); + // testOutputHelper.WriteLine($"Test case {i++} successful!"); + } + } + + [Fact] + public void RepeatTests() { + var sw = Stopwatch.StartNew(); + for (int i = 0; i < 1_000_000; i++) { + SpecTests(); + if (i % 10000 == 0) { + testOutputHelper.WriteLine($"{i} loops successful! Delta: {sw.Elapsed}"); + sw.Restart(); + } + } + } +} \ No newline at end of file |