Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
60 changes: 0 additions & 60 deletions src/Merge.Client.Test/Core/Json/EnumSerializerTests.cs

This file was deleted.

138 changes: 138 additions & 0 deletions src/Merge.Client.Test/Core/Json/StringEnumSerializerTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
using System.Text.Json;
using System.Text.Json.Serialization;
using Merge.Client.Core;
using NUnit.Framework;

namespace Merge.Client.Test.Core.Json;

[TestFixture]
[Parallelizable(ParallelScope.All)]
public class StringEnumSerializerTests
{
private static readonly JsonSerializerOptions JsonOptions = new() { WriteIndented = true };

private static readonly DummyEnum KnownEnumValue2 = DummyEnum.KnownValue2;
private static readonly DummyEnum UnknownEnumValue = DummyEnum.FromCustom("unknown_value");

private static readonly string JsonWithKnownEnum2 = $$"""
{
"enum_property": "{{KnownEnumValue2}}"
}
""";

private static readonly string JsonWithUnknownEnum = $$"""
{
"enum_property": "{{UnknownEnumValue}}"
}
""";

[Test]
public void ShouldParseKnownEnumValue2()
{
var obj = JsonSerializer.Deserialize<DummyObject>(JsonWithKnownEnum2, JsonOptions);
Assert.That(obj, Is.Not.Null);
Assert.That(obj.EnumProperty, Is.EqualTo(KnownEnumValue2));
}

[Test]
public void ShouldParseUnknownEnum()
{
var obj = JsonSerializer.Deserialize<DummyObject>(JsonWithUnknownEnum, JsonOptions);
Assert.That(obj, Is.Not.Null);
Assert.That(obj.EnumProperty, Is.EqualTo(UnknownEnumValue));
}

[Test]
public void ShouldSerializeKnownEnumValue2()
{
var json = JsonSerializer.SerializeToElement(
new DummyObject { EnumProperty = KnownEnumValue2 },
JsonOptions
);
TestContext.Out.WriteLine("Serialized JSON: \n" + json);
var enumString = json.GetProperty("enum_property").GetString();
Assert.That(enumString, Is.Not.Null);
Assert.That(enumString, Is.EqualTo(KnownEnumValue2));
}

[Test]
public void ShouldSerializeUnknownEnum()
{
var json = JsonSerializer.SerializeToElement(
new DummyObject { EnumProperty = UnknownEnumValue },
JsonOptions
);
TestContext.Out.WriteLine("Serialized JSON: \n" + json);
var enumString = json.GetProperty("enum_property").GetString();
Assert.That(enumString, Is.Not.Null);
Assert.That(enumString, Is.EqualTo(UnknownEnumValue));
}
}

public class DummyObject
{
[JsonPropertyName("enum_property")]
public DummyEnum EnumProperty { get; set; }
}

[JsonConverter(typeof(StringEnumSerializer<DummyEnum>))]
public readonly record struct DummyEnum : IStringEnum
{
public DummyEnum(string value)
{
Value = value;
}

/// <summary>
/// The string value of the enum.
/// </summary>
public string Value { get; }

public static readonly DummyEnum KnownValue1 = FromCustom(Values.KnownValue1);

public static readonly DummyEnum KnownValue2 = FromCustom(Values.KnownValue2);

/// <summary>
/// Constant strings for enum values
/// </summary>
public static class Values
{
public const string KnownValue1 = "known_value1";

public const string KnownValue2 = "known_value2";
}

/// <summary>
/// Create a string enum with the given value.
/// </summary>
public static DummyEnum FromCustom(string value)
{
return new DummyEnum(value);
}

/// <summary>
/// Returns the string value of the enum.
/// </summary>
public override string ToString()
{
return Value;
}

public bool Equals(string? other)
{
return Value.Equals(other);
}

public override int GetHashCode()
{
return Value.GetHashCode();
}

public static explicit operator string(DummyEnum value) => value.Value;

public static explicit operator DummyEnum(string value) => new(value);

public static bool operator ==(DummyEnum value1, string value2) => value1.Value.Equals(value2);

public static bool operator !=(DummyEnum value1, string value2) => !value1.Value.Equals(value2);
}
20 changes: 10 additions & 10 deletions src/Merge.Client.sln
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Merge.Client", "Merge.Client\Merge.Client.csproj", "{B9974C4A-50AA-421C-9D1A-3ECA565549D5}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Merge.Client", "Merge.Client\Merge.Client.csproj", "{761D23A6-ED8C-447F-BF2A-0E7D85AE4926}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Merge.Client.Test", "Merge.Client.Test\Merge.Client.Test.csproj", "{670C5472-26A2-4611-997C-CB314746291B}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Merge.Client.Test", "Merge.Client.Test\Merge.Client.Test.csproj", "{C13E421C-DED3-43D2-A89C-452C1FBB8AF0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand All @@ -16,13 +16,13 @@ Global
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B9974C4A-50AA-421C-9D1A-3ECA565549D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B9974C4A-50AA-421C-9D1A-3ECA565549D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B9974C4A-50AA-421C-9D1A-3ECA565549D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B9974C4A-50AA-421C-9D1A-3ECA565549D5}.Release|Any CPU.Build.0 = Release|Any CPU
{670C5472-26A2-4611-997C-CB314746291B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{670C5472-26A2-4611-997C-CB314746291B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{670C5472-26A2-4611-997C-CB314746291B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{670C5472-26A2-4611-997C-CB314746291B}.Release|Any CPU.Build.0 = Release|Any CPU
{761D23A6-ED8C-447F-BF2A-0E7D85AE4926}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{761D23A6-ED8C-447F-BF2A-0E7D85AE4926}.Debug|Any CPU.Build.0 = Debug|Any CPU
{761D23A6-ED8C-447F-BF2A-0E7D85AE4926}.Release|Any CPU.ActiveCfg = Release|Any CPU
{761D23A6-ED8C-447F-BF2A-0E7D85AE4926}.Release|Any CPU.Build.0 = Release|Any CPU
{C13E421C-DED3-43D2-A89C-452C1FBB8AF0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C13E421C-DED3-43D2-A89C-452C1FBB8AF0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C13E421C-DED3-43D2-A89C-452C1FBB8AF0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C13E421C-DED3-43D2-A89C-452C1FBB8AF0}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
Original file line number Diff line number Diff line change
@@ -1,18 +1,71 @@
using System.Runtime.Serialization;
using System.Text.Json.Serialization;
using Merge.Client.Core;

namespace Merge.Client.Accounting;

[JsonConverter(typeof(EnumSerializer<AccountsListRequestRemoteFields>))]
public enum AccountsListRequestRemoteFields
[JsonConverter(typeof(StringEnumSerializer<AccountsListRequestRemoteFields>))]
public readonly record struct AccountsListRequestRemoteFields : IStringEnum
{
[EnumMember(Value = "classification")]
Classification,
public static readonly AccountsListRequestRemoteFields Classification = new(
Values.Classification
);

[EnumMember(Value = "classification,status")]
ClassificationStatus,
public static readonly AccountsListRequestRemoteFields ClassificationStatus = new(
Values.ClassificationStatus
);

[EnumMember(Value = "status")]
Status,
public static readonly AccountsListRequestRemoteFields Status = new(Values.Status);

public AccountsListRequestRemoteFields(string value)
{
Value = value;
}

/// <summary>
/// The string value of the enum.
/// </summary>
public string Value { get; }

/// <summary>
/// Create a string enum with the given value.
/// </summary>
public static AccountsListRequestRemoteFields FromCustom(string value)
{
return new AccountsListRequestRemoteFields(value);
}

public bool Equals(string? other)
{
return Value.Equals(other);
}

/// <summary>
/// Returns the string value of the enum.
/// </summary>
public override string ToString()
{
return Value;
}

public static bool operator ==(AccountsListRequestRemoteFields value1, string value2) =>
value1.Value.Equals(value2);

public static bool operator !=(AccountsListRequestRemoteFields value1, string value2) =>
!value1.Value.Equals(value2);

public static explicit operator string(AccountsListRequestRemoteFields value) => value.Value;

public static explicit operator AccountsListRequestRemoteFields(string value) => new(value);

/// <summary>
/// Constant strings for enum values
/// </summary>
public static class Values
{
public const string Classification = "classification";

public const string ClassificationStatus = "classification,status";

public const string Status = "status";
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,71 @@
using System.Runtime.Serialization;
using System.Text.Json.Serialization;
using Merge.Client.Core;

namespace Merge.Client.Accounting;

[JsonConverter(typeof(EnumSerializer<AccountsListRequestShowEnumOrigins>))]
public enum AccountsListRequestShowEnumOrigins
[JsonConverter(typeof(StringEnumSerializer<AccountsListRequestShowEnumOrigins>))]
public readonly record struct AccountsListRequestShowEnumOrigins : IStringEnum
{
[EnumMember(Value = "classification")]
Classification,
public static readonly AccountsListRequestShowEnumOrigins Classification = new(
Values.Classification
);

[EnumMember(Value = "classification,status")]
ClassificationStatus,
public static readonly AccountsListRequestShowEnumOrigins ClassificationStatus = new(
Values.ClassificationStatus
);

[EnumMember(Value = "status")]
Status,
public static readonly AccountsListRequestShowEnumOrigins Status = new(Values.Status);

public AccountsListRequestShowEnumOrigins(string value)
{
Value = value;
}

/// <summary>
/// The string value of the enum.
/// </summary>
public string Value { get; }

/// <summary>
/// Create a string enum with the given value.
/// </summary>
public static AccountsListRequestShowEnumOrigins FromCustom(string value)
{
return new AccountsListRequestShowEnumOrigins(value);
}

public bool Equals(string? other)
{
return Value.Equals(other);
}

/// <summary>
/// Returns the string value of the enum.
/// </summary>
public override string ToString()
{
return Value;
}

public static bool operator ==(AccountsListRequestShowEnumOrigins value1, string value2) =>
value1.Value.Equals(value2);

public static bool operator !=(AccountsListRequestShowEnumOrigins value1, string value2) =>
!value1.Value.Equals(value2);

public static explicit operator string(AccountsListRequestShowEnumOrigins value) => value.Value;

public static explicit operator AccountsListRequestShowEnumOrigins(string value) => new(value);

/// <summary>
/// Constant strings for enum values
/// </summary>
public static class Values
{
public const string Classification = "classification";

public const string ClassificationStatus = "classification,status";

public const string Status = "status";
}
}
Loading
Loading